diff --git a/_maps/map_files/rift/rift-03-underground1.dmm b/_maps/map_files/rift/rift-03-underground1.dmm
index 5d7cf5dd165..e9fd3d72e06 100644
--- a/_maps/map_files/rift/rift-03-underground1.dmm
+++ b/_maps/map_files/rift/rift-03-underground1.dmm
@@ -8222,10 +8222,6 @@
/turf/simulated/floor/plating,
/area/maintenance/engineering)
"Gm" = (
-/obj/item/circuitboard/body_designer{
- pixel_x = -3;
- pixel_y = 3
- },
/obj/item/circuitboard/resleeving_control{
pixel_x = -1;
pixel_y = 1
diff --git a/_maps/map_files/rift/rift-05-surface2.dmm b/_maps/map_files/rift/rift-05-surface2.dmm
index 03e238fa6bf..0c7f04fdc55 100644
--- a/_maps/map_files/rift/rift-05-surface2.dmm
+++ b/_maps/map_files/rift/rift-05-surface2.dmm
@@ -9370,10 +9370,6 @@
pixel_x = -2;
pixel_y = -2
},
-/obj/item/storage/box/body_record_disk{
- pixel_x = 6;
- pixel_y = -4
- },
/obj/structure/table/reinforced,
/obj/effect/floor_decal/corner/paleblue{
dir = 10
diff --git a/_maps/map_files/rift/rift-11-orbital.dmm b/_maps/map_files/rift/rift-11-orbital.dmm
index 0271b2bbd88..a18b5ae8242 100644
--- a/_maps/map_files/rift/rift-11-orbital.dmm
+++ b/_maps/map_files/rift/rift-11-orbital.dmm
@@ -5952,9 +5952,6 @@
/turf/simulated/floor/tiled/white,
/area/centcom/simulated/medical)
"rf" = (
-/obj/machinery/computer/transhuman/designer{
- dir = 8
- },
/obj/effect/floor_decal/borderfloorwhite{
dir = 4
},
diff --git a/_maps/map_files/tether/tether-02-surface2.dmm b/_maps/map_files/tether/tether-02-surface2.dmm
index 667722b2698..50032e987d3 100644
--- a/_maps/map_files/tether/tether-02-surface2.dmm
+++ b/_maps/map_files/tether/tether-02-surface2.dmm
@@ -1401,7 +1401,6 @@
/obj/effect/floor_decal/corner/paleblue/border{
dir = 1
},
-/obj/machinery/computer/transhuman/designer,
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/resleeving)
"ace" = (
@@ -3354,9 +3353,6 @@
/obj/effect/floor_decal/corner/pink/border{
dir = 8
},
-/obj/machinery/computer/transhuman/designer{
- dir = 4
- },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/examroom)
"afp" = (
diff --git a/_maps/map_files/tether/tether-03-surface3.dmm b/_maps/map_files/tether/tether-03-surface3.dmm
index 08ea42b190d..2a7b093f5a6 100644
--- a/_maps/map_files/tether/tether-03-surface3.dmm
+++ b/_maps/map_files/tether/tether-03-surface3.dmm
@@ -24733,10 +24733,6 @@
pixel_x = 10;
pixel_y = 14
},
-/obj/item/storage/box/body_record_disk{
- pixel_x = -3;
- pixel_y = -3
- },
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/lobby)
"aTL" = (
@@ -32786,7 +32782,6 @@
name = "Body Designer Note"
},
/obj/item/sleevemate,
-/obj/item/storage/box/body_record_disk,
/obj/machinery/light{
dir = 4
},
@@ -32826,9 +32821,6 @@
/turf/simulated/floor/tiled/white,
/area/tether/surfacebase/medical/admin)
"bke" = (
-/obj/machinery/computer/transhuman/designer{
- dir = 8
- },
/obj/effect/floor_decal/borderfloorwhite{
dir = 4
},
diff --git a/_maps/map_files/tether/tether-06-station2.dmm b/_maps/map_files/tether/tether-06-station2.dmm
index be625b686a6..af5311a4320 100644
--- a/_maps/map_files/tether/tether-06-station2.dmm
+++ b/_maps/map_files/tether/tether-06-station2.dmm
@@ -2840,10 +2840,6 @@
/area/storage/tech)
"amD" = (
/obj/structure/table/rack/steel,
-/obj/item/circuitboard/body_designer{
- pixel_x = -3;
- pixel_y = 3
- },
/obj/item/circuitboard/resleeving_control{
pixel_x = -1;
pixel_y = 1
diff --git a/_maps/map_files/tether/tether_misc.dmm b/_maps/map_files/tether/tether_misc.dmm
index 4613679305d..ef9f8f2f78e 100644
--- a/_maps/map_files/tether/tether_misc.dmm
+++ b/_maps/map_files/tether/tether_misc.dmm
@@ -6509,9 +6509,6 @@
/turf/simulated/floor/tiled/white,
/area/centcom/simulated/medical)
"Zd" = (
-/obj/machinery/computer/transhuman/designer{
- dir = 8
- },
/obj/effect/floor_decal/borderfloorwhite{
dir = 4
},
diff --git a/_maps/map_files/triumph/triumph-01-deck1.dmm b/_maps/map_files/triumph/triumph-01-deck1.dmm
index 97f8e25352a..384ee7d7180 100644
--- a/_maps/map_files/triumph/triumph-01-deck1.dmm
+++ b/_maps/map_files/triumph/triumph-01-deck1.dmm
@@ -13830,10 +13830,6 @@
/obj/item/circuitboard/resleeving_control{
pixel_y = 1
},
-/obj/item/circuitboard/body_designer{
- pixel_x = 1;
- pixel_y = -1
- },
/obj/item/circuitboard/med_data{
pixel_x = 5;
pixel_y = -3
diff --git a/_maps/templates/admin/dhael_centcom.dmm b/_maps/templates/admin/dhael_centcom.dmm
index ab0b821a156..7b8d742eb68 100644
--- a/_maps/templates/admin/dhael_centcom.dmm
+++ b/_maps/templates/admin/dhael_centcom.dmm
@@ -6793,7 +6793,6 @@
/obj/effect/floor_decal/corner_steel_grid{
dir = 10
},
-/obj/machinery/computer/transhuman/designer,
/turf/unsimulated/floor/steel{
icon_state = "white"
},
diff --git a/_maps/templates/shuttles/overmaps/generic/cruiser.dmm b/_maps/templates/shuttles/overmaps/generic/cruiser.dmm
index deaa965eada..b9e5a33db21 100644
--- a/_maps/templates/shuttles/overmaps/generic/cruiser.dmm
+++ b/_maps/templates/shuttles/overmaps/generic/cruiser.dmm
@@ -4171,9 +4171,6 @@
/turf/simulated/floor/tiled/steel_grid,
/area/mothership/processing)
"jp" = (
-/obj/machinery/computer/transhuman/designer{
- dir = 4
- },
/turf/simulated/floor/tiled/white,
/area/mothership/resleeving)
"jq" = (
@@ -4580,7 +4577,6 @@
/obj/structure/closet/medical_wall{
pixel_y = -32
},
-/obj/item/storage/box/body_record_disk,
/obj/item/storage/firstaid/clotting,
/obj/item/storage/firstaid/bonemed,
/obj/item/storage/firstaid/adv{
diff --git a/citadel.dme b/citadel.dme
index b57b734249b..b3f3841e25f 100644
--- a/citadel.dme
+++ b/citadel.dme
@@ -196,6 +196,7 @@
#include "code\__DEFINES\mobs\mobility.dm"
#include "code\__DEFINES\mobs\organs.dm"
#include "code\__DEFINES\mobs\silicon_privileges.dm"
+#include "code\__DEFINES\mobs\sprite_accessories.dm"
#include "code\__DEFINES\power\power.dm"
#include "code\__DEFINES\preferences\data_keys_character.dm"
#include "code\__DEFINES\preferences\data_keys_global.dm"
@@ -317,28 +318,28 @@
#include "code\__HELPERS\vfx\color_animations.dm"
#include "code\__HELPERS\vfx\see_anywhere.dm"
#include "code\__HELPERS\vfx\shake_camera.dm"
+#include "code\_globals\bitfields.dm"
+#include "code\_globals\configuration.dm"
+#include "code\_globals\debug.dm"
+#include "code\_globals\loadout.dm"
+#include "code\_globals\logging.dm"
+#include "code\_globals\machines.dm"
+#include "code\_globals\mobs.dm"
#include "code\_globals\regexes.dm"
-#include "code\_globalvars\bitfields.dm"
-#include "code\_globalvars\configuration.dm"
-#include "code\_globalvars\debug.dm"
-#include "code\_globalvars\loadout.dm"
-#include "code\_globalvars\logging.dm"
-#include "code\_globalvars\machines.dm"
-#include "code\_globalvars\mobs.dm"
-#include "code\_globalvars\religion.dm"
-#include "code\_globalvars\sensitive.dm"
-#include "code\_globalvars\text_macros.dm"
-#include "code\_globalvars\tgui.dm"
-#include "code\_globalvars\time_vars.dm"
-#include "code\_globalvars\traits.dm"
-#include "code\_globalvars\lists\clients.dm"
-#include "code\_globalvars\lists\keybindings.dm"
-#include "code\_globalvars\lists\mapping.dm"
-#include "code\_globalvars\lists\medical.dm"
-#include "code\_globalvars\lists\misc.dm"
-#include "code\_globalvars\lists\mobs.dm"
-#include "code\_globalvars\lists\names.dm"
-#include "code\_globalvars\lists\objects.dm"
+#include "code\_globals\religion.dm"
+#include "code\_globals\sensitive.dm"
+#include "code\_globals\text_macros.dm"
+#include "code\_globals\tgui.dm"
+#include "code\_globals\time_vars.dm"
+#include "code\_globals\traits.dm"
+#include "code\_globals\lists\clients.dm"
+#include "code\_globals\lists\keybindings.dm"
+#include "code\_globals\lists\mapping.dm"
+#include "code\_globals\lists\medical.dm"
+#include "code\_globals\lists\misc.dm"
+#include "code\_globals\lists\mobs.dm"
+#include "code\_globals\lists\names.dm"
+#include "code\_globals\lists\objects.dm"
#include "code\_js\byjax.dm"
#include "code\_js\menus.dm"
#include "code\_onclick\adjacency.dm"
@@ -3812,7 +3813,6 @@
#include "code\modules\research\designs\circuits\disks.dm"
#include "code\modules\resleeving\circuitboards.dm"
#include "code\modules\resleeving\computers.dm"
-#include "code\modules\resleeving\designer.dm"
#include "code\modules\resleeving\documents.dm"
#include "code\modules\resleeving\implant.dm"
#include "code\modules\resleeving\infocore_records.dm"
@@ -3978,25 +3978,53 @@
#include "code\modules\spells\targeted\projectile\fireball.dm"
#include "code\modules\spells\targeted\projectile\magic_missile.dm"
#include "code\modules\spells\targeted\projectile\projectile.dm"
-#include "code\modules\sprite_accessories\body_markings.dm"
#include "code\modules\sprite_accessories\sprite_accessories.dm"
-#include "code\modules\sprite_accessories\facial_hair\facial_hair.dm"
-#include "code\modules\sprite_accessories\facial_hair\tajaran_facial_hair.dm"
-#include "code\modules\sprite_accessories\facial_hair\teshari_facial_hair.dm"
-#include "code\modules\sprite_accessories\facial_hair\unathi_facial_hair.dm"
-#include "code\modules\sprite_accessories\facial_hair\vox_facial_hair.dm"
-#include "code\modules\sprite_accessories\facial_hair\vulpakin_facial_hair.dm"
-#include "code\modules\sprite_accessories\hair\hair.dm"
-#include "code\modules\sprite_accessories\hair\sergal_hair.dm"
+#include "code\modules\sprite_accessories\ears\_ears.dm"
+#include "code\modules\sprite_accessories\ears\antenna.dm"
+#include "code\modules\sprite_accessories\ears\horns.dm"
+#include "code\modules\sprite_accessories\ears\misc.dm"
+#include "code\modules\sprite_accessories\ears\animal\avian.dm"
+#include "code\modules\sprite_accessories\ears\animal\bee.dm"
+#include "code\modules\sprite_accessories\ears\animal\bovine.dm"
+#include "code\modules\sprite_accessories\ears\animal\canid.dm"
+#include "code\modules\sprite_accessories\ears\animal\cervid.dm"
+#include "code\modules\sprite_accessories\ears\animal\equine.dm"
+#include "code\modules\sprite_accessories\ears\animal\feline.dm"
+#include "code\modules\sprite_accessories\ears\animal\lepid.dm"
+#include "code\modules\sprite_accessories\ears\animal\leporid.dm"
+#include "code\modules\sprite_accessories\ears\animal\murid.dm"
+#include "code\modules\sprite_accessories\ears\animal\mushroom.dm"
+#include "code\modules\sprite_accessories\ears\animal\sciurid.dm"
+#include "code\modules\sprite_accessories\ears\animal\ursid.dm"
+#include "code\modules\sprite_accessories\ears\fictional\deathclaw.dm"
+#include "code\modules\sprite_accessories\ears\fictional\demon.dm"
+#include "code\modules\sprite_accessories\ears\fictional\draconic.dm"
+#include "code\modules\sprite_accessories\ears\fictional\elf.dm"
+#include "code\modules\sprite_accessories\ears\fictional\jackalope.dm"
+#include "code\modules\sprite_accessories\ears\fictional\oni.dm"
+#include "code\modules\sprite_accessories\ears\fictional\otie.dm"
+#include "code\modules\sprite_accessories\ears\fictional\pokemon.dm"
+#include "code\modules\sprite_accessories\ears\fictional\sergal.dm"
+#include "code\modules\sprite_accessories\ears\fictional\shadekin.dm"
+#include "code\modules\sprite_accessories\ears\fictional\teshari.dm"
+#include "code\modules\sprite_accessories\facial_hair\_facial_hair.dm"
+#include "code\modules\sprite_accessories\facial_hair\tajaran.dm"
+#include "code\modules\sprite_accessories\facial_hair\teshari.dm"
+#include "code\modules\sprite_accessories\facial_hair\unathi.dm"
+#include "code\modules\sprite_accessories\facial_hair\vox.dm"
+#include "code\modules\sprite_accessories\facial_hair\vulpkanin.dm"
+#include "code\modules\sprite_accessories\hair\_hair.dm"
+#include "code\modules\sprite_accessories\hair\sergal.dm"
#include "code\modules\sprite_accessories\hair\shadekin.dm"
-#include "code\modules\sprite_accessories\hair\skrell_hair.dm"
-#include "code\modules\sprite_accessories\hair\tajaran_hair.dm"
-#include "code\modules\sprite_accessories\hair\teshari_hair.dm"
-#include "code\modules\sprite_accessories\hair\unathi_hair.dm"
-#include "code\modules\sprite_accessories\hair\unathidigi_hair.dm"
-#include "code\modules\sprite_accessories\hair\vox_hair.dm"
-#include "code\modules\sprite_accessories\hair\vulpakin_hair.dm"
-#include "code\modules\sprite_accessories\hair\xenomorph_hybrid_domes.dm"
+#include "code\modules\sprite_accessories\hair\skrell.dm"
+#include "code\modules\sprite_accessories\hair\tajaran.dm"
+#include "code\modules\sprite_accessories\hair\teshari.dm"
+#include "code\modules\sprite_accessories\hair\unathi.dm"
+#include "code\modules\sprite_accessories\hair\unathi_digitigrade.dm"
+#include "code\modules\sprite_accessories\hair\vox.dm"
+#include "code\modules\sprite_accessories\hair\vulpkanin.dm"
+#include "code\modules\sprite_accessories\hair\xenomorph.dm"
+#include "code\modules\sprite_accessories\markings\_markings.dm"
#include "code\modules\sprite_accessories\markings\diona_stuff.dm"
#include "code\modules\sprite_accessories\markings\eye_stuff.dm"
#include "code\modules\sprite_accessories\markings\panda.dm"
@@ -4008,9 +4036,50 @@
#include "code\modules\sprite_accessories\markings\tesh.dm"
#include "code\modules\sprite_accessories\markings\unathi.dm"
#include "code\modules\sprite_accessories\markings\vox.dm"
-#include "code\modules\sprite_accessories\markings\vulp.dm"
+#include "code\modules\sprite_accessories\markings\vulpkanin.dm"
#include "code\modules\sprite_accessories\markings\werebeast.dm"
#include "code\modules\sprite_accessories\markings\zorren.dm"
+#include "code\modules\sprite_accessories\tail\_tail.dm"
+#include "code\modules\sprite_accessories\tail\bearlike.dm"
+#include "code\modules\sprite_accessories\tail\bird.dm"
+#include "code\modules\sprite_accessories\tail\bovine.dm"
+#include "code\modules\sprite_accessories\tail\bunny.dm"
+#include "code\modules\sprite_accessories\tail\canid.dm"
+#include "code\modules\sprite_accessories\tail\equine.dm"
+#include "code\modules\sprite_accessories\tail\feline.dm"
+#include "code\modules\sprite_accessories\tail\insects.dm"
+#include "code\modules\sprite_accessories\tail\misc.dm"
+#include "code\modules\sprite_accessories\tail\pokemon.dm"
+#include "code\modules\sprite_accessories\tail\rodents_and_adjacent.dm"
+#include "code\modules\sprite_accessories\tail\scalies.dm"
+#include "code\modules\sprite_accessories\tail\snake.dm"
+#include "code\modules\sprite_accessories\tail\synthetic.dm"
+#include "code\modules\sprite_accessories\tail\taurs.dm"
+#include "code\modules\sprite_accessories\tail\weird_shadow_creature_ocs.dm"
+#include "code\modules\sprite_accessories\tail\species\akula.dm"
+#include "code\modules\sprite_accessories\tail\species\monkey.dm"
+#include "code\modules\sprite_accessories\tail\species\naramadi.dm"
+#include "code\modules\sprite_accessories\tail\species\nevrean.dm"
+#include "code\modules\sprite_accessories\tail\species\shadekin.dm"
+#include "code\modules\sprite_accessories\tail\species\tajaran.dm"
+#include "code\modules\sprite_accessories\tail\species\teshari.dm"
+#include "code\modules\sprite_accessories\tail\species\unathi.dm"
+#include "code\modules\sprite_accessories\tail\species\vox.dm"
+#include "code\modules\sprite_accessories\tail\species\vulpkanin.dm"
+#include "code\modules\sprite_accessories\tail\species\xenomorph.dm"
+#include "code\modules\sprite_accessories\tail\species\zorren.dm"
+#include "code\modules\sprite_accessories\wings\_wings.dm"
+#include "code\modules\sprite_accessories\wings\bat.dm"
+#include "code\modules\sprite_accessories\wings\draconic_furries.dm"
+#include "code\modules\sprite_accessories\wings\feathered.dm"
+#include "code\modules\sprite_accessories\wings\insect_not_really_wings.dm"
+#include "code\modules\sprite_accessories\wings\misc.dm"
+#include "code\modules\sprite_accessories\wings\moth.dm"
+#include "code\modules\sprite_accessories\wings\non_moth_insects.dm"
+#include "code\modules\sprite_accessories\wings\pokemon.dm"
+#include "code\modules\sprite_accessories\wings\synthetic.dm"
+#include "code\modules\sprite_accessories\wings\weird_shadow_creature_ocs.dm"
+#include "code\modules\sprite_accessories\wings\xenomorph.dm"
#include "code\modules\stockmarket\articles.dm"
#include "code\modules\stockmarket\computer.dm"
#include "code\modules\stockmarket\events.dm"
@@ -4153,8 +4222,6 @@
#include "code\modules\vore\lick_wounds.dm"
#include "code\modules\vore\trycatch_vr.dm"
#include "code\modules\vore\appearance\spider_taur_powers_vr.dm"
-#include "code\modules\vore\appearance\sprite_accessories_taur_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_dat_vr.dm"
#include "code\modules\vore\eating\belly_obj_vr.dm"
diff --git a/code/__DEFINES/items_clothing.dm b/code/__DEFINES/items_clothing.dm
index 42e333b72fa..4053ccf656b 100644
--- a/code/__DEFINES/items_clothing.dm
+++ b/code/__DEFINES/items_clothing.dm
@@ -77,7 +77,3 @@
#define FIRE_MAX_STACKS 25
/// If the number of stacks goes above this firesuits won't protect you anymore. If not, you can walk around while on fire like a badass.
#define FIRE_MAX_FIRESUIT_STACKS 20
-
-// Hair Defines
-#define HAIR_VERY_SHORT 0x1
-#define HAIR_TIEABLE 0x4
diff --git a/code/__DEFINES/mobs/sprite_accessories.dm b/code/__DEFINES/mobs/sprite_accessories.dm
new file mode 100644
index 00000000000..f6ebc867f7e
--- /dev/null
+++ b/code/__DEFINES/mobs/sprite_accessories.dm
@@ -0,0 +1,9 @@
+//! hair flags
+#define HAIR_VERY_SHORT (1<<0)
+#define HAIR_TIEABLE (1<<1)
+
+DEFINE_BITFIELD(hair_flags, list(
+ BITFIELD(HAIR_VERY_SHORT),
+ BITFIELD(HAIR_TIEABLE),
+))
+// Hair Defines
diff --git a/code/__DEFINES/preferences/savefiles.dm b/code/__DEFINES/preferences/savefiles.dm
index 92888c7e14d..c0c0476011f 100644
--- a/code/__DEFINES/preferences/savefiles.dm
+++ b/code/__DEFINES/preferences/savefiles.dm
@@ -11,6 +11,6 @@
//* no reason to need it for global loading, and global migrations
//* should be low level anyways
#define CHARACTER_VERSION_MIN -1
-#define CHARACTER_VERSION_MAX 2
+#define CHARACTER_VERSION_MAX 3
/// what nulled version fields are considered; this basically makes them go through all migrations
#define CHARACTER_VERSION_LEGACY 0
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index f96fc2185c6..d39f825e7d3 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -37,27 +37,6 @@ var/global/list/NT_poster_designs = list()
var/list/obj/item/uplink/world_uplinks = list()
//* Preferences stuff *//
-//!Hairstyles
-/// Stores /datum/sprite_accessory/hair indexed by name
-var/global/list/hair_styles_list = list()
-var/global/list/hair_styles_male_list = list()
-var/global/list/hair_styles_female_list = list()
-/// Stores /datum/sprite_accessory/facial_hair indexed by name
-var/global/list/facial_hair_styles_list = list()
-var/global/list/facial_hair_styles_male_list = list()
-var/global/list/facial_hair_styles_female_list = list()
-//!Misc styles
-var/global/list/skin_styles_female_list = list() //unused
-/// Stores /datum/sprite_accessory/marking indexed by name
-var/global/list/body_marking_styles_list = list()
-/// Stores /datum/sprite_accessory/ears indexed by type
-var/global/list/ear_styles_list = list()
-/// Stores /datum/sprite_accessory/tail indexed by type
-var/global/list/tail_styles_list = list()
-/// Stores /datum/sprite_accessory/wing indexed by type
-var/global/list/wing_styles_list = list()
-/// Stores /datum/sprite_accessory/ears again indexed by type
-var/global/list/horn_styles_list = list()
//!Underwear
var/datum/category_collection/underwear/global_underwear = new()
//!Backpacks - The load order here is important to maintain. Don't go swapping these around.
@@ -136,61 +115,6 @@ GLOBAL_LIST_EMPTY(mannequins)
var/list/paths
- //Hair - Initialise all /datum/sprite_accessory/hair into an list indexed by hair-style name
- paths = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair
- hair_styles_list = list()
- for(var/path in paths)
- var/datum/sprite_accessory/hair/H = new path
- if(!istext(H.name))
- qdel(H)
- continue
- if(hair_styles_list[H.name])
- stack_trace("Duplicate name [H.name] detected - [hair_styles_list[H.name]] vs [H]")
- continue
- hair_styles_list[H.name] = H
- switch(H.gender)
- if(MALE) hair_styles_male_list += H.name
- if(FEMALE) hair_styles_female_list += H.name
- else
- hair_styles_male_list += H.name
- hair_styles_female_list += H.name
- tim_sort(hair_styles_list, /proc/cmp_name_asc, associative = TRUE)
-
- //Facial Hair - Initialise all /datum/sprite_accessory/facial_hair into an list indexed by facialhair-style name
- paths = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair
- facial_hair_styles_list = list()
- for(var/path in paths)
- var/datum/sprite_accessory/facial_hair/H = new path()
- if(!istext(H.name))
- qdel(H)
- continue
- if(facial_hair_styles_list[H.name])
- stack_trace("Duplicate name [H.name] detected - [facial_hair_styles_list[H.name]] vs [H]")
- continue
- facial_hair_styles_list[H.name] = H
- switch(H.gender)
- if(MALE) facial_hair_styles_male_list += H.name
- if(FEMALE) facial_hair_styles_female_list += H.name
- else
- facial_hair_styles_male_list += H.name
- facial_hair_styles_female_list += H.name
- tim_sort(facial_hair_styles_list, /proc/cmp_name_asc, associative = TRUE)
-
- //Body markings - Initialise all /datum/sprite_accessory/marking into an list indexed by marking name
- paths = typesof(/datum/sprite_accessory/marking) - /datum/sprite_accessory/marking
- body_marking_styles_list = list()
- for(var/path in paths)
- var/datum/sprite_accessory/marking/M = new path()
- if(!istext(M.name))
- qdel(M)
- continue
- if(body_marking_styles_list[M.name])
- stack_trace("Duplicate name [M.name] detected - [body_marking_styles_list[M.name]] vs [M]")
- continue
-
- body_marking_styles_list[M.name] = M
- tim_sort(body_marking_styles_list, /proc/cmp_name_asc, associative = TRUE)
-
//Posters
paths = typesof(/datum/poster) - /datum/poster
paths -= typesof(/datum/poster/nanotrasen)
@@ -203,27 +127,6 @@ GLOBAL_LIST_EMPTY(mannequins)
var/datum/poster/P = new T
NT_poster_designs += P
- //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
-
- //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 Ears2 -- Repathing was deemed worse than this I'm so sorry
- horn_styles_list = LAZYCOPY(ear_styles_list)
-
// Custom species traits
paths = typesof(/datum/trait) - /datum/trait - /datum/trait/negative - /datum/trait/neutral - /datum/trait/positive
for(var/path in paths)
diff --git a/code/__HELPERS/lists/traverse.dm b/code/__HELPERS/lists/traverse.dm
index 5188590e69d..5cb4e2b77f6 100644
--- a/code/__HELPERS/lists/traverse.dm
+++ b/code/__HELPERS/lists/traverse.dm
@@ -21,3 +21,31 @@
else
i--
return L[i]
+
+/**
+ * Returns the next item in a list.
+ */
+/proc/next_list_item_safe(item, list/L)
+ var/i
+ i = L.Find(item)
+ if(!i)
+ return
+ if(i == L.len)
+ i = 1
+ else
+ i++
+ return L[i]
+
+/**
+ * Returns the previous item in a list.
+ */
+/proc/previous_list_item_safe(item, list/L)
+ var/i
+ i = L.Find(item)
+ if(!i)
+ return
+ if(i == 1)
+ i = L.len
+ else
+ i--
+ return L[i]
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 91e964c8b16..210992e23a1 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -34,43 +34,26 @@
return mobs
/proc/random_hair_style(gender, species = SPECIES_HUMAN)
- var/h_style = "Bald"
-
- var/list/valid_hairstyles = list()
- for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
+ var/list/valid = list()
+ for(var/id in GLOB.sprite_accessory_hair)
+ var/datum/sprite_accessory/hair/S = GLOB.sprite_accessory_hair[id]
+ if(S.gender != NEUTER && gender != S.gender)
continue
if(S.apply_restrictions && !(species in S.species_allowed))
continue
- valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
-
- if(valid_hairstyles.len)
- h_style = pick(valid_hairstyles)
-
- return h_style
+ valid += id
+ return SAFEPICK(valid)
/proc/random_facial_hair_style(gender, species = SPECIES_HUMAN)
- var/f_style = "Shaved"
-
- var/list/valid_facialhairstyles = list()
- for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(gender == MALE && S.gender == FEMALE)
- continue
- if(gender == FEMALE && S.gender == MALE)
+ var/list/valid = list()
+ for(var/id in GLOB.sprite_accessory_facial_hair)
+ var/datum/sprite_accessory/facial_hair/S = GLOB.sprite_accessory_facial_hair[id]
+ if(S.gender != NEUTER && gender != S.gender)
continue
if(S.apply_restrictions && !(species in S.species_allowed))
continue
-
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
-
- if(valid_facialhairstyles.len)
- f_style = pick(valid_facialhairstyles)
-
- return f_style
+ valid += id
+ return SAFEPICK(valid)
/proc/sanitize_name(name, species = SPECIES_HUMAN)
var/datum/species/current_species
diff --git a/code/_globalvars/bitfields.dm b/code/_globals/bitfields.dm
similarity index 100%
rename from code/_globalvars/bitfields.dm
rename to code/_globals/bitfields.dm
diff --git a/code/_globalvars/configuration.dm b/code/_globals/configuration.dm
similarity index 100%
rename from code/_globalvars/configuration.dm
rename to code/_globals/configuration.dm
diff --git a/code/_globalvars/debug.dm b/code/_globals/debug.dm
similarity index 100%
rename from code/_globalvars/debug.dm
rename to code/_globals/debug.dm
diff --git a/code/_globalvars/lists/clients.dm b/code/_globals/lists/clients.dm
similarity index 100%
rename from code/_globalvars/lists/clients.dm
rename to code/_globals/lists/clients.dm
diff --git a/code/_globalvars/lists/keybindings.dm b/code/_globals/lists/keybindings.dm
similarity index 100%
rename from code/_globalvars/lists/keybindings.dm
rename to code/_globals/lists/keybindings.dm
diff --git a/code/_globalvars/lists/mapping.dm b/code/_globals/lists/mapping.dm
similarity index 100%
rename from code/_globalvars/lists/mapping.dm
rename to code/_globals/lists/mapping.dm
diff --git a/code/_globalvars/lists/medical.dm b/code/_globals/lists/medical.dm
similarity index 100%
rename from code/_globalvars/lists/medical.dm
rename to code/_globals/lists/medical.dm
diff --git a/code/_globalvars/lists/misc.dm b/code/_globals/lists/misc.dm
similarity index 100%
rename from code/_globalvars/lists/misc.dm
rename to code/_globals/lists/misc.dm
diff --git a/code/_globals/lists/mobs.dm b/code/_globals/lists/mobs.dm
new file mode 100644
index 00000000000..33a58955dc9
--- /dev/null
+++ b/code/_globals/lists/mobs.dm
@@ -0,0 +1,163 @@
+/// all player mobs (not clients!)
+GLOBAL_LIST_EMPTY(player_list)
+
+/// by id
+GLOBAL_LIST_INIT(sprite_accessory_hair, all_hair_styles())
+/// by id
+GLOBAL_LIST_INIT(sprite_accessory_ears, all_ear_styles())
+/// by id
+GLOBAL_LIST_INIT(sprite_accessory_tails, all_tail_styles())
+/// by id
+GLOBAL_LIST_INIT(sprite_accessory_wings, all_wing_styles())
+/// by id
+GLOBAL_LIST_INIT(sprite_accessory_facial_hair, all_facial_hair_styles())
+/// by id
+GLOBAL_LIST_INIT(sprite_accessory_markings, all_marking_styles())
+
+// todo: most uses of these should either be a direct ref under new marking system or
+// todo: an id to ref.
+// todo: however, there are some legitimate cases of needing fast name lookup,
+// todo: like non-tgui interfaces that let you choose markings
+// todo: do not blindly kill these lists, we'll deal with everything as we go.
+
+// by name
+GLOBAL_LIST(legacy_hair_lookup)
+// by id
+GLOBAL_LIST(legacy_ears_lookup)
+// by id
+GLOBAL_LIST(legacy_wing_lookup)
+// by id
+GLOBAL_LIST(legacy_tail_lookup)
+// by name
+GLOBAL_LIST(legacy_facial_hair_lookup)
+// by name
+GLOBAL_LIST(legacy_marking_lookup)
+
+/proc/all_hair_styles()
+ . = list()
+ var/list/by_name = list()
+ for(var/path in subtypesof(/datum/sprite_accessory/hair))
+ var/datum/sprite_accessory/S = path
+ if(initial(S.abstract_type) == path)
+ continue
+ S = new path
+ if(!S.id)
+ stack_trace("no id on [path]")
+ continue
+ if(.[S.id])
+ stack_trace("duplicate id [S.id] on [path] and [.[S.id]]")
+ continue
+ if(by_name[S.name])
+ stack_trace("duplicate name [S.name] on [path]")
+ continue
+ .[S.id] = S
+ by_name[S.name] = S
+ tim_sort(by_name, /proc/cmp_text_asc, associative = FALSE)
+ GLOB.legacy_hair_lookup = by_name
+ tim_sort(., /proc/cmp_name_asc, associative = TRUE)
+
+/proc/all_ear_styles()
+ . = list()
+ var/list/by_type = list()
+ for(var/path in subtypesof(/datum/sprite_accessory/ears))
+ var/datum/sprite_accessory/S = path
+ if(initial(S.abstract_type) == path)
+ continue
+ S = new path
+ if(!S.id)
+ stack_trace("no id on [path]")
+ continue
+ if(.[S.id])
+ stack_trace("duplicate id [S.id] on [path] and [.[S.id]]")
+ continue
+ .[S.id] = S
+ by_type[S.type] = S
+ tim_sort(by_type, /proc/cmp_name_asc, associative = TRUE)
+ GLOB.legacy_ears_lookup = by_type
+ tim_sort(., /proc/cmp_name_asc, associative = TRUE)
+
+/proc/all_wing_styles()
+ . = list()
+ var/list/by_type = list()
+ for(var/path in subtypesof(/datum/sprite_accessory/wing))
+ var/datum/sprite_accessory/S = path
+ if(initial(S.abstract_type) == path)
+ continue
+ S = new path
+ if(!S.id)
+ stack_trace("no id on [path]")
+ continue
+ if(.[S.id])
+ stack_trace("duplicate id [S.id] on [path] and [.[S.id]]")
+ continue
+ .[S.id] = S
+ by_type[S.type] = S
+ tim_sort(by_type, /proc/cmp_name_asc, associative = TRUE)
+ GLOB.legacy_wing_lookup = by_type
+ tim_sort(., /proc/cmp_name_asc, associative = TRUE)
+
+/proc/all_tail_styles()
+ . = list()
+ var/list/by_type = list()
+ for(var/path in subtypesof(/datum/sprite_accessory/tail))
+ var/datum/sprite_accessory/S = path
+ if(initial(S.abstract_type) == path)
+ continue
+ S = new path
+ if(!S.id)
+ stack_trace("no id on [path]")
+ continue
+ if(.[S.id])
+ stack_trace("duplicate id [S.id] on [path] and [.[S.id]]")
+ continue
+ .[S.id] = S
+ by_type[S.type] = S
+ tim_sort(by_type, /proc/cmp_name_asc, associative = TRUE)
+ GLOB.legacy_tail_lookup = by_type
+ tim_sort(., /proc/cmp_name_asc, associative = TRUE)
+
+/proc/all_facial_hair_styles()
+ . = list()
+ var/list/by_name = list()
+ for(var/path in subtypesof(/datum/sprite_accessory/facial_hair))
+ var/datum/sprite_accessory/S = path
+ if(initial(S.abstract_type) == path)
+ continue
+ S = new path
+ if(!S.id)
+ stack_trace("no id on [path]")
+ continue
+ if(.[S.id])
+ stack_trace("duplicate id [S.id] on [path] and [.[S.id]]")
+ continue
+ if(by_name[S.name])
+ stack_trace("duplicate name [S.name] on [path]")
+ continue
+ .[S.id] = S
+ by_name[S.name] = S
+ tim_sort(by_name, /proc/cmp_text_asc, associative = FALSE)
+ GLOB.legacy_facial_hair_lookup = by_name
+ tim_sort(., /proc/cmp_name_asc, associative = TRUE)
+
+/proc/all_marking_styles()
+ . = list()
+ var/list/by_name = list()
+ for(var/path in subtypesof(/datum/sprite_accessory/marking))
+ var/datum/sprite_accessory/S = path
+ if(initial(S.abstract_type) == path)
+ continue
+ S = new path
+ if(!S.id)
+ stack_trace("no id on [path]")
+ continue
+ if(.[S.id])
+ stack_trace("duplicate id [S.id] on [path] and [.[S.id]]")
+ continue
+ if(by_name[S.name])
+ stack_trace("duplicate name [S.name] on [path]")
+ continue
+ .[S.id] = S
+ by_name[S.name] = S
+ tim_sort(by_name, /proc/cmp_text_asc, associative = FALSE)
+ GLOB.legacy_marking_lookup = by_name
+ tim_sort(., /proc/cmp_name_asc, associative = TRUE)
diff --git a/code/_globalvars/lists/names.dm b/code/_globals/lists/names.dm
similarity index 100%
rename from code/_globalvars/lists/names.dm
rename to code/_globals/lists/names.dm
diff --git a/code/_globalvars/lists/objects.dm b/code/_globals/lists/objects.dm
similarity index 100%
rename from code/_globalvars/lists/objects.dm
rename to code/_globals/lists/objects.dm
diff --git a/code/_globalvars/lists/typecache.dm b/code/_globals/lists/typecache.dm
similarity index 100%
rename from code/_globalvars/lists/typecache.dm
rename to code/_globals/lists/typecache.dm
diff --git a/code/_globalvars/loadout.dm b/code/_globals/loadout.dm
similarity index 100%
rename from code/_globalvars/loadout.dm
rename to code/_globals/loadout.dm
diff --git a/code/_globalvars/logging.dm b/code/_globals/logging.dm
similarity index 100%
rename from code/_globalvars/logging.dm
rename to code/_globals/logging.dm
diff --git a/code/_globalvars/machines.dm b/code/_globals/machines.dm
similarity index 100%
rename from code/_globalvars/machines.dm
rename to code/_globals/machines.dm
diff --git a/code/_globalvars/mobs.dm b/code/_globals/mobs.dm
similarity index 100%
rename from code/_globalvars/mobs.dm
rename to code/_globals/mobs.dm
diff --git a/code/_globalvars/religion.dm b/code/_globals/religion.dm
similarity index 100%
rename from code/_globalvars/religion.dm
rename to code/_globals/religion.dm
diff --git a/code/_globalvars/sensitive.dm b/code/_globals/sensitive.dm
similarity index 100%
rename from code/_globalvars/sensitive.dm
rename to code/_globals/sensitive.dm
diff --git a/code/_globalvars/text_macros.dm b/code/_globals/text_macros.dm
similarity index 100%
rename from code/_globalvars/text_macros.dm
rename to code/_globals/text_macros.dm
diff --git a/code/_globalvars/tgui.dm b/code/_globals/tgui.dm
similarity index 100%
rename from code/_globalvars/tgui.dm
rename to code/_globals/tgui.dm
diff --git a/code/_globalvars/time_vars.dm b/code/_globals/time_vars.dm
similarity index 100%
rename from code/_globalvars/time_vars.dm
rename to code/_globals/time_vars.dm
diff --git a/code/_globalvars/traits.dm b/code/_globals/traits.dm
similarity index 100%
rename from code/_globalvars/traits.dm
rename to code/_globals/traits.dm
diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm
deleted file mode 100644
index 6c5fa8de683..00000000000
--- a/code/_globalvars/lists/mobs.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/// all player mobs (not clients!)
-GLOBAL_LIST_EMPTY(player_list)
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 8d8d0216498..0957f6671f7 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -189,27 +189,27 @@ var/global/list/datum/gene/dna_genes[0]
// FIXME: Species-specific defaults pls
if(!character.h_style)
character.h_style = "Skinhead"
- var/hair = hair_styles_list.Find(character.h_style)
+ var/hair = GLOB.legacy_hair_lookup.Find(character.h_style)
//! Facial Hair
if(!character.f_style)
character.f_style = "Shaved"
- var/beard = facial_hair_styles_list.Find(character.f_style)
+ var/beard = GLOB.legacy_facial_hair_lookup.Find(character.f_style)
//! Demi Ears
var/ear_style = 0
if(character.ear_style)
- ear_style = ear_styles_list.Find(character.ear_style.type)
+ ear_style = GLOB.legacy_ears_lookup.Find(character.ear_style.type)
//! Demi Tails
var/tail_style = 0
if(character.tail_style)
- tail_style = tail_styles_list.Find(character.tail_style.type)
+ tail_style = GLOB.legacy_tail_lookup.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)
+ wing_style = GLOB.legacy_wing_lookup.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
@@ -232,10 +232,10 @@ var/global/list/datum/gene/dna_genes[0]
// +1 to account for the none-of-the-above possibility
- 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_EAR_STYLE, ear_style + 1, GLOB.legacy_ears_lookup.len + 1, 1)
+ SetUIValueRange(DNA_UI_TAIL_STYLE, tail_style + 1, GLOB.legacy_tail_lookup.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_WING_STYLE, wing_style + 1, GLOB.legacy_wing_lookup.len + 1, 1)
// DNA BLOCK VALUE MAX MIN
SetUIValueRange(DNA_UI_TAIL_R, character.r_tail, 255, 1)
@@ -294,8 +294,8 @@ var/global/list/datum/gene/dna_genes[0]
SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1)
- SetUIValueRange(DNA_UI_HAIR_STYLE, hair, hair_styles_list.len, 1)
- SetUIValueRange(DNA_UI_BEARD_STYLE, beard, facial_hair_styles_list.len,1)
+ SetUIValueRange(DNA_UI_HAIR_STYLE, hair, GLOB.legacy_hair_lookup.len, 1)
+ SetUIValueRange(DNA_UI_BEARD_STYLE, beard, GLOB.legacy_facial_hair_lookup.len,1)
body_markings.Cut()
//s_base = character.s_base //doesn't work, fuck me
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 91d8322ed7e..5e80590cdf0 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -190,21 +190,21 @@
E.markings = marklist.Copy()
//! Hair
- var/hair = dna.GetUIValueRange(DNA_UI_HAIR_STYLE,hair_styles_list.len)
- if((0 < hair) && (hair <= hair_styles_list.len))
- H.h_style = hair_styles_list[hair]
+ var/hair = dna.GetUIValueRange(DNA_UI_HAIR_STYLE, GLOB.legacy_hair_lookup.len)
+ if((0 < hair) && (hair <= GLOB.legacy_hair_lookup.len))
+ H.h_style = GLOB.legacy_hair_lookup[hair]
//! Facial Hair
- var/beard = dna.GetUIValueRange(DNA_UI_BEARD_STYLE,facial_hair_styles_list.len)
- if((0 < beard) && (beard <= facial_hair_styles_list.len))
- H.f_style = facial_hair_styles_list[beard]
+ var/beard = dna.GetUIValueRange(DNA_UI_BEARD_STYLE, GLOB.legacy_facial_hair_lookup.len)
+ if((0 < beard) && (beard <= GLOB.legacy_facial_hair_lookup.len))
+ H.f_style = GLOB.legacy_facial_hair_lookup[beard]
//! Ears
- var/ears = dna.GetUIValueRange(DNA_UI_EAR_STYLE, ear_styles_list.len + 1) - 1
+ var/ears = dna.GetUIValueRange(DNA_UI_EAR_STYLE, GLOB.legacy_ears_lookup.len + 1) - 1
if(ears <= 1)
H.ear_style = null
- else if((0 < ears) && (ears <= ear_styles_list.len))
- H.ear_style = ear_styles_list[ear_styles_list[ears]]
+ else if((0 < ears) && (ears <= GLOB.legacy_ears_lookup.len))
+ H.ear_style = GLOB.legacy_ears_lookup[GLOB.legacy_ears_lookup[ears]]
//! Ear Color
H.r_ears = dna.GetUIValueRange(DNA_UI_EARS_R, 255)
@@ -218,18 +218,18 @@
H.b_ears3 = dna.GetUIValueRange(DNA_UI_EARS3_B, 255)
//! Tail
- var/tail = dna.GetUIValueRange(DNA_UI_TAIL_STYLE, tail_styles_list.len + 1) - 1
+ var/tail = dna.GetUIValueRange(DNA_UI_TAIL_STYLE, GLOB.legacy_tail_lookup.len + 1) - 1
if(tail <= 1)
H.tail_style = null
- else if((0 < tail) && (tail <= tail_styles_list.len))
- H.tail_style = tail_styles_list[tail_styles_list[tail]]
+ else if((0 < tail) && (tail <= GLOB.legacy_tail_lookup.len))
+ H.tail_style = GLOB.legacy_tail_lookup[GLOB.legacy_tail_lookup[tail]]
//! Wing
- var/wing = dna.GetUIValueRange(DNA_UI_WING_STYLE, wing_styles_list.len + 1) - 1
+ var/wing = dna.GetUIValueRange(DNA_UI_WING_STYLE, GLOB.legacy_wing_lookup.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]]
+ else if((0 < wing) && (wing <= GLOB.legacy_wing_lookup.len))
+ H.wing_style = GLOB.legacy_wing_lookup[GLOB.legacy_wing_lookup[wing]]
//! Wing Color
H.r_wing = dna.GetUIValueRange(DNA_UI_WING_R, 255)
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 18a859e6561..e9117e19859 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -987,12 +987,12 @@ var/list/admin_verbs_event_manager = list(
M.s_tone = -M.s_tone + 35
// hair
- var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in hair_styles_list
+ var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in GLOB.legacy_hair_lookup
if(new_hstyle)
M.h_style = new_hstyle
// facial hair
- var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in facial_hair_styles_list
+ var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in GLOB.legacy_facial_hair_lookup
if(new_fstyle)
M.f_style = new_fstyle
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 8b2e905a497..00fd0440ae8 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -40,7 +40,7 @@
if(h_style == hair_style)
return
- if(!(hair_style in hair_styles_list))
+ if(!(hair_style in GLOB.legacy_hair_lookup))
return
h_style = hair_style
@@ -85,7 +85,7 @@
if(f_style == facial_hair_style)
return
- if(!(facial_hair_style in facial_hair_styles_list))
+ if(!(facial_hair_style in GLOB.legacy_facial_hair_lookup))
return
f_style = facial_hair_style
@@ -208,8 +208,8 @@
if(H) use_species = H.species.get_bodytype_legacy(src)
var/list/valid_hairstyles = new()
- for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
+ for(var/hairstyle in GLOB.legacy_hair_lookup)
+ var/datum/sprite_accessory/S = GLOB.legacy_hair_lookup[hairstyle]
if(check_gender && gender != NEUTER)
if(gender == MALE && S.gender == FEMALE)
@@ -230,8 +230,8 @@
if(H) use_species = H.species.get_bodytype_legacy(src)
var/list/valid_facial_hairstyles = new()
- for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
+ for(var/facialhairstyle in GLOB.legacy_facial_hair_lookup)
+ var/datum/sprite_accessory/S = GLOB.legacy_facial_hair_lookup[facialhairstyle]
if(gender != NEUTER)
if(gender == MALE && S.gender == FEMALE)
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index 02befea8ecb..9637379e974 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -11,16 +11,16 @@
return
if(h_style)
- var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style]
+ var/datum/sprite_accessory/hair/hair_style = GLOB.legacy_hair_lookup[h_style]
var/selected_string
- if(!(hair_style.flags & HAIR_TIEABLE))
+ if(!(hair_style.hair_flags & HAIR_TIEABLE))
to_chat(src, SPAN_WARNING("Your hair isn't long enough to tie."))
return
else
var/list/datum/sprite_accessory/hair/valid_hairstyles = list()
- for(var/hair_string in hair_styles_list)
- var/datum/sprite_accessory/hair/test = hair_styles_list[hair_string]
- if(test.flags & HAIR_TIEABLE)
+ for(var/hair_string in GLOB.legacy_hair_lookup)
+ var/datum/sprite_accessory/hair/test = GLOB.legacy_hair_lookup[hair_string]
+ if(test.hair_flags & HAIR_TIEABLE)
valid_hairstyles.Add(hair_string)
selected_string = input("Select a new hairstyle", "Your hairstyle", hair_style) as null|anything in valid_hairstyles
if(incapacitated())
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 7c6da4c5a55..bacbe0f7e2b 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -390,7 +390,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
var/icon/face_standing = icon(icon = 'icons/mob/human_face.dmi', icon_state = "bald_s")
if(f_style)
- var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
+ var/datum/sprite_accessory/facial_hair_style = GLOB.legacy_facial_hair_lookup[f_style]
if(facial_hair_style && (!facial_hair_style.apply_restrictions || (src.species.get_bodytype_legacy(src) 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)
@@ -399,10 +399,10 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
face_standing.Blend(facial_s, ICON_OVERLAY)
if(h_style)
- var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style]
+ var/datum/sprite_accessory/hair/hair_style = GLOB.legacy_hair_lookup[h_style]
if(head && (head.flags_inv & BLOCKHEADHAIR))
- if(!(hair_style.flags & HAIR_VERY_SHORT))
- hair_style = hair_styles_list["Short Hair"]
+ if(!(hair_style.hair_flags & HAIR_VERY_SHORT))
+ hair_style = GLOB.legacy_hair_lookup["Short Hair"]
if(hair_style && (!hair_style.apply_restrictions || (src.species.get_bodytype_legacy(src) in hair_style.species_allowed)))
var/icon/grad_s
diff --git a/code/modules/organs/external/_external_icons.dm b/code/modules/organs/external/_external_icons.dm
index a26148e981d..6841a47add5 100644
--- a/code/modules/organs/external/_external_icons.dm
+++ b/code/modules/organs/external/_external_icons.dm
@@ -119,7 +119,7 @@ GLOBAL_LIST_EMPTY(limb_icon_cache)
var/image/res = image('icons/mob/human_face.dmi',"bald_s")
//Facial hair
if(owner.f_style)
- var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style]
+ var/datum/sprite_accessory/facial_hair_style = GLOB.legacy_facial_hair_lookup[owner.f_style]
if(facial_hair_style && (!facial_hair_style.apply_restrictions || (species.get_bodytype_legacy(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)
@@ -129,10 +129,10 @@ GLOBAL_LIST_EMPTY(limb_icon_cache)
//Head hair
if(owner.h_style)
var/style = owner.h_style
- var/datum/sprite_accessory/hair/hair_style = hair_styles_list[style]
+ var/datum/sprite_accessory/hair/hair_style = GLOB.legacy_hair_lookup[style]
if(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))
- if(!(hair_style.flags & HAIR_VERY_SHORT))
- hair_style = hair_styles_list["Short Hair"]
+ if(!(hair_style.hair_flags & HAIR_VERY_SHORT))
+ hair_style = GLOB.legacy_hair_lookup["Short Hair"]
if(hair_style && (!hair_style.apply_restrictions || (species.get_bodytype_legacy(owner) in hair_style.species_allowed)))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s")
diff --git a/code/modules/organs/external/standard_vr.dm b/code/modules/organs/external/standard_vr.dm
index 05348b13764..f9dd58d46e5 100644
--- a/code/modules/organs/external/standard_vr.dm
+++ b/code/modules/organs/external/standard_vr.dm
@@ -33,7 +33,7 @@
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]
+ var/datum/sprite_accessory/facial_hair_style = GLOB.legacy_facial_hair_lookup[owner.f_style]
if(facial_hair_style && (!facial_hair_style.apply_restrictions || (species.get_bodytype_legacy(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)
@@ -41,7 +41,7 @@
overlays |= image(facial_s, "pixel_y" = head_offset)
if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR)))
- var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style]
+ var/datum/sprite_accessory/hair_style = GLOB.legacy_hair_lookup[owner.h_style]
if(hair_style && (!hair_style.apply_restrictions || (species.get_bodytype_legacy(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)
diff --git a/code/modules/preferences/_preferences.dm b/code/modules/preferences/_preferences.dm
index ca4e3175bb0..813088567ac 100644
--- a/code/modules/preferences/_preferences.dm
+++ b/code/modules/preferences/_preferences.dm
@@ -79,7 +79,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
/// PDA type.
var/pdachoice = 1
/// Hair type.
- var/h_style = "Bald"
+ var/h_style_id
/// Hair color.
var/r_hair = 0
/// Hair color.
@@ -97,7 +97,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
/// Gradient style.
var/grad_wingstyle = "None"
/// Face hair type.
- var/f_style = "Shaved"
+ var/f_style_id
/// Face hair color.
var/r_facial = 0
/// Face hair color.
@@ -181,7 +181,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
/// Set to 1 when altering limb states. fix for prosthetic > normal changes not working on preview.
var/regen_limbs = 0
- var/list/body_markings = list() //? "name" = "#rgbcolor"
+ var/list/body_marking_ids = list() //? "id" = "#rgbcolor"
var/list/flavor_texts = list()
var/list/flavour_texts_robot = list()
@@ -263,6 +263,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
key_bindings = deep_copy_list(GLOB.hotkey_keybinding_list_by_key) // give them default keybinds and update their movement keys
client?.update_movement_keys(src)
+ LAZYINITLIST(character)
+ LAZYINITLIST(options)
+ LAZYINITLIST(skin)
initialized = TRUE
/datum/preferences/proc/block_until_initialized()
diff --git a/code/modules/preferences/migration.dm b/code/modules/preferences/migration.dm
index c76247b5183..6552f07937d 100644
--- a/code/modules/preferences/migration.dm
+++ b/code/modules/preferences/migration.dm
@@ -4,10 +4,15 @@
* - current_version - the version it's at
* - errors - put errors into this list to be displayed to the player
* - options - the loaded global options list
+ * - prefs - prefs if any; if null, we're probably doing a clientless migration.
*/
-/datum/preferences/proc/perform_global_migrations(savefile/S, current_version, list/errors, list/options)
+/datum/controller/subsystem/characters/proc/perform_global_migrations(savefile/S, current_version, list/errors, list/options, datum/preferences/prefs)
if(current_version < 13)
- addtimer(CALLBACK(src, .proc/force_reset_keybindings), 5 SECONDS)
+ if(prefs)
+ addtimer(CALLBACK(prefs, /datum/preferences/proc/force_reset_keybindings), 5 SECONDS)
+ else
+ var/list/new_bindings = deep_copy_list(GLOB.hotkey_keybinding_list_by_key) // give them default keybinds
+ WRITE_FILE(S["key_bindings"], new_bindings)
if(current_version < 15)
var/list/language_prefixes
S["language_prefixes"] >> language_prefixes
@@ -21,8 +26,9 @@
* - current_version - the version it's at
* - errors - put errors into this list to be displayed to the player
* - options - the loaded character options list
+ * - prefs - prefs if any; if null, we're probably doing a clientless migration.
*/
-/datum/preferences/proc/perform_character_migrations(savefile/S, current_version, list/errors, list/character)
+/datum/controller/subsystem/characters/proc/perform_character_migrations(savefile/S, current_version, list/errors, list/character, datum/preferences/prefs)
if(current_version < 1)
// MIGRATE JOBS
var/alternative_option
@@ -108,6 +114,8 @@
character[CHARACTER_DATA_CHAR_SPECIES] = RS.uid
else
errors?.Add(SPAN_DANGER("Species migration failed - no species datum. Report this to a coder."))
+ // GRAB CHARACTER SPECIES - WE'LL NEED IT
+ var/datum/character_species/CS = SScharacters.resolve_character_species(RS.uid)
// MIGRATE LANGUAGES
var/list/alternate_languages
S["language"] >> alternate_languages
@@ -115,12 +123,125 @@
alternate_languages = list()
var/list/translated_languages = list()
character[CHARACTER_DATA_LANGUAGES] = translated_languages
- var/list/innate = innate_language_ids()
+ var/list/innate = CS.get_intrinsic_language_ids()
for(var/name in alternate_languages)
var/datum/language/L = SScharacters.resolve_language_name(name)
if(L.id in innate)
continue
translated_languages += L.id
- translated_languages.len = clamp(translated_languages.len, 0, extraneous_languages_max())
+ translated_languages.len = clamp(translated_languages.len, 0, CS.get_max_additional_languages())
if(current_version < 2)
character -= GLOBAL_DATA_LANGUAGE_PREFIX
+ if(current_version < 3)
+ // hair_style_name
+ // facial_style_name
+ // ear_style (type)
+ // horn_style (type)
+ // tail_style (type)
+ // wing_style (type)
+ // body_markings (list[name = color])
+ //! get
+ var/old_hname
+ var/old_fname
+ var/old_etype
+ var/old_htype
+ var/old_ttype
+ var/old_wtype
+ var/old_mnames_colors
+ READ_FILE(S["hair_style_name"], old_hname)
+ READ_FILE(S["facial_style_name"], old_fname)
+ READ_FILE(S["ear_style"], old_etype)
+ READ_FILE(S["horn_style"], old_htype)
+ READ_FILE(S["wing_style"], old_wtype)
+ READ_FILE(S["tail_style"], old_ttype)
+ READ_FILE(S["body_markings"], old_mnames_colors)
+ old_mnames_colors = sanitize_islist(old_mnames_colors)
+ //! gather
+ var/datum/sprite_accessory/resolved_hair = GLOB.legacy_hair_lookup[old_hname]
+ var/datum/sprite_accessory/resolved_facial = GLOB.legacy_facial_hair_lookup[old_fname]
+ var/datum/sprite_accessory/resolved_ears = GLOB.legacy_ears_lookup[old_etype]
+ var/datum/sprite_accessory/resolved_horns = GLOB.legacy_ears_lookup[old_htype]
+ var/datum/sprite_accessory/resolved_tail = GLOB.legacy_tail_lookup[old_ttype]
+ var/datum/sprite_accessory/resolved_wings = GLOB.legacy_wing_lookup[old_wtype]
+ var/list/resolved_markings = list()
+ for(var/name in old_mnames_colors)
+ var/datum/sprite_accessory/resolved_marking = GLOB.legacy_marking_lookup[name]
+ if(!resolved_marking)
+ continue
+ resolved_markings[resolved_marking.id] = old_mnames_colors[name]
+ //! write
+ WRITE_FILE(S["hair_style"], resolved_hair?.id)
+ WRITE_FILE(S["facial_style"], resolved_facial?.id)
+ WRITE_FILE(S["ear_style_id"], resolved_ears?.id)
+ WRITE_FILE(S["wing_style_id"], resolved_wings?.id)
+ WRITE_FILE(S["tail_style_id"], resolved_tail?.id)
+ WRITE_FILE(S["horn_style_id"], resolved_horns?.id)
+ WRITE_FILE(S["body_marking_ids"], resolved_markings)
+
+
+/**
+ * clientless migration of savefiles
+ */
+/datum/controller/subsystem/characters/proc/migrate_savefile(path, list/errors = list())
+ var/savefile/S
+ if(istype(path, /savefile))
+ S = path
+ else
+ S = new(path)
+ // perform global - we should be on / when migrations fire
+ S.cd = "/"
+ var/global_version
+ READ_FILE(S["version"], global_version)
+ if(!isnum(global_version))
+ // no version? assume we don't have one.
+ global_version = SAVEFILE_VERSION_MAX
+ var/list/global_data
+ READ_FILE(S["global"], global_data)
+ global_data = sanitize_islist(global_data)
+ perform_global_migrations(S, global_version, errors, global_data, null)
+ // save global
+ global_version = SAVEFILE_VERSION_MAX
+ WRITE_FILE(S["version"], global_version)
+ WRITE_FILE(S["global"], global_data)
+ // migrate all slots
+ for(var/i in 1 to config_legacy.character_slots)
+ // perform character slot migrations - we should be on /character[slot] when migrations fire
+ S.cd = "/"
+ var/list/character_data
+ var/character_version
+ READ_FILE(S["slot_[i]"], character_data)
+ character_data = sanitize_islist(character_data)
+ character_version = character_data[CHARACTER_DATA_VERSION]
+ if(!isnum(character_version))
+ // no version? assume it's a legacy file as all new files should have one.
+ character_version = CHARACTER_VERSION_LEGACY
+ S.cd = "/character[i]"
+ perform_character_migrations(S, character_version, errors, character_data, null)
+ character_data[CHARACTER_DATA_VERSION] = CHARACTER_VERSION_MAX
+ // save character
+ S.cd = "/"
+ WRITE_FILE(S["slot_[i]"], character_data)
+
+// the oh god oh fuck proc that migrates every file at once
+/*
+/proc/___migrate_all_savefiles()
+ // oh fuck you
+ . = 0
+ var/timer = REALTIMEOFDAY
+ to_chat(world, SPAN_DANGER("Migrating all savefiles. Please do not attempt to use character setup, lest you risk data loss."))
+ for(var/path in directory_walk(list("data/player_saves/")))
+ var/list/split = splittext(path, "/")
+ if(!split.len || (split[split.len] != "preferences.sav"))
+ continue
+ var/list/what_fucked_up = list()
+ SScharacters.migrate_savefile(path, what_fucked_up)
+ ++.
+ if(!(. % 100))
+ to_chat(world, SPAN_DANGER("Count: [.]"))
+ if(length(what_fucked_up))
+ SScharacters.subsystem_log("Migration errored for [path]:\n\t[jointext(what_fucked_up, "\n\t")]")
+ CHECK_TICK
+ var/took = REALTIMEOFDAY - timer
+ to_chat(world, SPAN_DANGER("Migrated [.] savefiles in [round(took * 0.1, 0.1)] seconds."))
+*/
+
diff --git a/code/modules/preferences/preference_setup/general/03_body.dm b/code/modules/preferences/preference_setup/general/03_body.dm
index 45e5140ab8a..b36c0344baa 100644
--- a/code/modules/preferences/preference_setup/general/03_body.dm
+++ b/code/modules/preferences/preference_setup/general/03_body.dm
@@ -24,8 +24,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["skin_red"] >> pref.r_skin
S["skin_green"] >> pref.g_skin
S["skin_blue"] >> pref.b_skin
- S["hair_style_name"] >> pref.h_style
- S["facial_style_name"] >> pref.f_style
+ S["hair_style"] >> pref.h_style_id
+ S["facial_style"] >> pref.f_style_id
S["grad_style_name"] >> pref.grad_style
S["grad_wingstyle_name"]>> pref.grad_wingstyle
S["eyes_red"] >> pref.r_eyes
@@ -36,7 +36,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["mirror"] >> pref.mirror
S["organ_data"] >> pref.organ_data
S["rlimb_data"] >> pref.rlimb_data
- S["body_markings"] >> pref.body_markings
+ S["body_marking_ids"] >> pref.body_marking_ids
S["synth_color"] >> pref.synth_color
S["synth_red"] >> pref.r_synth
S["synth_green"] >> pref.g_synth
@@ -61,8 +61,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["skin_red"] << pref.r_skin
S["skin_green"] << pref.g_skin
S["skin_blue"] << pref.b_skin
- S["hair_style_name"] << pref.h_style
- S["facial_style_name"] << pref.f_style
+ S["hair_style"] << pref.h_style_id
+ S["facial_style"] << pref.f_style_id
S["grad_style_name"] << pref.grad_style
S["grad_wingstyle_name"]<< pref.grad_wingstyle
S["eyes_red"] << pref.r_eyes
@@ -73,7 +73,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
S["mirror"] << pref.mirror
S["organ_data"] << pref.organ_data
S["rlimb_data"] << pref.rlimb_data
- S["body_markings"] << pref.body_markings
+ S["body_marking_ids"] << pref.body_marking_ids
S["synth_color"] << pref.synth_color
S["synth_red"] << pref.r_synth
S["synth_green"] << pref.g_synth
@@ -97,8 +97,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.r_skin = sanitize_integer(pref.r_skin, 0, 255, initial(pref.r_skin))
pref.g_skin = sanitize_integer(pref.g_skin, 0, 255, initial(pref.g_skin))
pref.b_skin = sanitize_integer(pref.b_skin, 0, 255, initial(pref.b_skin))
- pref.h_style = sanitize_inlist(pref.h_style, hair_styles_list, initial(pref.h_style))
- pref.f_style = sanitize_inlist(pref.f_style, facial_hair_styles_list, initial(pref.f_style))
+ pref.h_style_id = sanitize_inlist(pref.h_style_id, GLOB.sprite_accessory_hair)
+ pref.f_style_id = sanitize_inlist(pref.f_style_id, GLOB.sprite_accessory_facial_hair)
pref.grad_style = sanitize_inlist(pref.grad_style, GLOB.hair_gradients, initial(pref.grad_style))
pref.grad_wingstyle = sanitize_inlist(pref.grad_wingstyle, GLOB.hair_gradients, initial(pref.grad_wingstyle))
pref.r_eyes = sanitize_integer(pref.r_eyes, 0, 255, initial(pref.r_eyes))
@@ -107,12 +107,13 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.b_type = sanitize_istext(pref.b_type, initial(pref.b_type))
if(pref.mirror == null)
pref.mirror = TRUE
-
pref.disabilities = sanitize_integer(pref.disabilities, 0, 65535, initial(pref.disabilities))
- if(!pref.organ_data) pref.organ_data = list()
- if(!pref.rlimb_data) pref.rlimb_data = list()
- if(!pref.body_markings) pref.body_markings = list()
- else pref.body_markings &= body_marking_styles_list
+ if(!pref.organ_data)
+ pref.organ_data = list()
+ if(!pref.rlimb_data)
+ pref.rlimb_data = list()
+ pref.body_marking_ids = sanitize_islist(pref.body_marking_ids)
+ pref.body_marking_ids &= GLOB.sprite_accessory_markings
if(!pref.bgstate || !(pref.bgstate in pref.bgstate_options))
pref.bgstate = "000"
@@ -142,8 +143,10 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
character.g_skin = pref.g_skin
character.b_skin = pref.b_skin
character.s_tone = pref.s_tone
- character.h_style = pref.h_style
- character.f_style = pref.f_style
+ var/datum/sprite_accessory/S = GLOB.sprite_accessory_hair[pref.h_style_id]
+ character.h_style = S.name
+ S = GLOB.sprite_accessory_facial_hair[pref.f_style_id]
+ character.f_style = S.name
character.grad_style = pref.grad_style
character.grad_wingstyle = pref.grad_wingstyle
character.b_type = pref.b_type
@@ -218,14 +221,14 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
continue
O.markings.Cut()
- for(var/name in pref.body_markings)
- var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[name]
- var/mark_color = "[pref.body_markings[name]]"
+ for(var/id in pref.body_marking_ids)
+ var/datum/sprite_accessory/marking/mark_datum = GLOB.sprite_accessory_markings[id]
+ var/mark_color = "[pref.body_marking_ids[id]]"
for(var/BP in mark_datum.body_parts)
var/obj/item/organ/external/O = character.organs_by_name[BP]
if(O)
- O.markings[name] = list("color" = mark_color, "datum" = mark_datum)
+ O.markings[id] = list("color" = mark_color, "datum" = mark_datum)
var/list/last_descriptors = list()
if(islist(pref.body_descriptors))
@@ -379,16 +382,18 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "Hair
"
if(has_flag(mob_species, HAS_HAIR_COLOR))
. += "Change Color [color_square(pref.r_hair, pref.g_hair, pref.b_hair)] "
- . += " Style: < > [pref.h_style]
" //The < & > in this line is correct-- those extra characters are the arrows you click to switch between styles.
+ var/datum/sprite_accessory/current_hair = GLOB.sprite_accessory_hair[pref.h_style_id]
+ . += " Style: < > [current_hair.name]
" //The < & > in this line is correct-- those extra characters are the arrows you click to switch between styles.
. += "Gradient
"
. += "Change Color [color_square(pref.r_grad, pref.g_grad, pref.b_grad)] "
- . += " Style: < > [pref.grad_style]
"
+ . += " Style: < > [pref.grad_style]
"
. += "
Facial
"
if(has_flag(mob_species, HAS_HAIR_COLOR))
. += "Change Color [color_square(pref.r_facial, pref.g_facial, pref.b_facial)] "
- . += " Style: < > [pref.f_style]
" //Same as above with the extra > & < characters
+ var/datum/sprite_accessory/current_face_hair = GLOB.sprite_accessory_facial_hair[pref.f_style_id]
+ . += " Style: < > [current_face_hair.name]
" //Same as above with the extra > & < characters
if(has_flag(mob_species, HAS_EYE_COLOR))
. += "
Eyes
"
@@ -400,8 +405,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
. += "
Body Markings +
"
. += "
"
- for(var/M in pref.body_markings)
- . += "| [M] | [pref.body_markings.len > 1 ? "˄ ˅ mv " : ""]- Color[color_square(hex = pref.body_markings[M])] |
"
+ for(var/M in pref.body_marking_ids)
+ var/datum/sprite_accessory/S = GLOB.sprite_accessory_markings[M]
+ . += "| [S.name] | [pref.body_marking_ids.len > 1 ? "˄ ˅ mv " : ""]- Color[color_square(hex = pref.body_marking_ids[M])] |
"
. += "
"
. += "
"
@@ -464,32 +470,19 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
else if(href_list["hair_style"])
var/list/valid_hairstyles = pref.get_valid_hairstyles()
-
- var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference", pref.h_style) as null|anything in valid_hairstyles
+ var/datum/sprite_accessory/current = GLOB.sprite_accessory_hair[pref.h_style_id]
+ var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference", current.name) as null|anything in valid_hairstyles
if(new_h_style && CanUseTopic(user))
- pref.h_style = new_h_style
+ var/datum/sprite_accessory/S = valid_hairstyles[new_h_style]
+ pref.h_style_id = S.id
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["hair_style_left"])
- var/H = href_list["hair_style_left"]
- var/list/valid_hairstyles = pref.get_valid_hairstyles()
- var/start = valid_hairstyles.Find(H)
-
- if(start != 1) //If we're not the beginning of the list, become the previous element.
- pref.h_style = valid_hairstyles[start-1]
- else //But if we ARE, become the final element.
- pref.h_style = valid_hairstyles[valid_hairstyles.len]
+ pref.h_style_id = previous_list_item_safe(pref.h_style_id, GLOB.sprite_accessory_hair) || GLOB.sprite_accessory_hair[1]
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["hair_style_right"])
- var/H = href_list["hair_style_right"]
- var/list/valid_hairstyles = pref.get_valid_hairstyles()
- var/start = valid_hairstyles.Find(H)
-
- if(start != valid_hairstyles.len) //If we're not the end of the list, become the next element.
- pref.h_style = valid_hairstyles[start+1]
- else //But if we ARE, become the first element.
- pref.h_style = valid_hairstyles[1]
+ pref.h_style_id = next_list_item_safe(pref.h_style_id, GLOB.sprite_accessory_hair) || GLOB.sprite_accessory_hair[1]
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["grad_style"])
@@ -501,25 +494,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["grad_style_left"])
- var/G = href_list["grad_style_left"]
- var/list/valid_gradients = GLOB.hair_gradients
- var/start = valid_gradients.Find(G)
-
- if(start != 1) //If we're not the beginning of the list, become the previous element.
- pref.grad_style = valid_gradients[start-1]
- else //But if we ARE, become the final element.
- pref.grad_style = valid_gradients[valid_gradients.len]
+ pref.grad_style = previous_list_item_safe(pref.grad_style, GLOB.hair_gradients) || GLOB.hair_gradients[1]
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["grad_style_right"])
- var/G = href_list["grad_style_right"]
- var/list/valid_gradients = GLOB.hair_gradients
- var/start = valid_gradients.Find(G)
-
- if(start != valid_gradients.len) //If we're not the end of the list, become the next element.
- pref.grad_style = valid_gradients[start+1]
- else //But if we ARE, become the first element.
- pref.grad_style = valid_gradients[1]
+ pref.grad_style = next_list_item_safe(pref.grad_style, GLOB.hair_gradients) || GLOB.hair_gradients[1]
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["eye_color"])
@@ -570,82 +549,78 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
else if(href_list["facial_style"])
var/list/valid_facialhairstyles = pref.get_valid_facialhairstyles()
-
- var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference", pref.f_style) as null|anything in valid_facialhairstyles
+ var/datum/sprite_accessory/current = GLOB.sprite_accessory_facial_hair[pref.f_style_id]
+ var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference", current.name) as null|anything in valid_facialhairstyles
if(new_f_style && CanUseTopic(user))
- pref.f_style = new_f_style
+ var/datum/sprite_accessory/S = valid_facialhairstyles[new_f_style]
+ pref.f_style_id = S.id
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["facial_style_left"])
- var/F = href_list["facial_style_left"]
- var/list/valid_facialhairstyles = pref.get_valid_facialhairstyles()
- var/start = valid_facialhairstyles.Find(F)
-
- if(start != 1) //If we're not the beginning of the list, become the previous element.
- pref.f_style = valid_facialhairstyles[start-1]
- else //But if we ARE, become the final element.
- pref.f_style = valid_facialhairstyles[valid_facialhairstyles.len]
+ pref.f_style_id = previous_list_item_safe(pref.f_style_id, GLOB.sprite_accessory_facial_hair) || GLOB.sprite_accessory_facial_hair[1]
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["facial_style_right"])
- var/F = href_list["facial_style_right"]
- var/list/valid_facialhairstyles = pref.get_valid_facialhairstyles()
- var/start = valid_facialhairstyles.Find(F)
-
- if(start != valid_facialhairstyles.len) //If we're not the end of the list, become the next element.
- pref.f_style = valid_facialhairstyles[start+1]
- else //But if we ARE, become the first element.
- pref.f_style = valid_facialhairstyles[1]
+ pref.f_style_id = next_list_item_safe(pref.f_style_id, GLOB.sprite_accessory_facial_hair) || GLOB.sprite_accessory_facial_hair[1]
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["marking_style"])
- var/list/usable_markings = pref.body_markings.Copy() ^ body_marking_styles_list.Copy()
- var/new_marking = input(user, "Choose a body marking:", "Character Preference") as null|anything in usable_markings
+ var/list/usable_markings = pref.body_marking_ids ^ GLOB.sprite_accessory_markings
+ var/list/translated = list()
+ for(var/id in usable_markings)
+ var/datum/sprite_accessory/S = GLOB.sprite_accessory_markings[id]
+ translated[S.name] = id
+ var/new_marking = input(user, "Choose a body marking:", "Character Preference") as null|anything in translated
if(new_marking && CanUseTopic(user))
- pref.body_markings[new_marking] = "#000000" //New markings start black
+ pref.body_marking_ids[translated[new_marking]] = "#000000" //New markings start black
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["marking_up"])
var/M = href_list["marking_up"]
- var/start = pref.body_markings.Find(M)
+ var/start = pref.body_marking_ids.Find(M)
if(start != 1) //If we're not the beginning of the list, swap with the previous element.
- move_element(pref.body_markings, start, start-1)
+ move_element(pref.body_marking_ids, start, start-1)
else //But if we ARE, become the final element -ahead- of everything else.
- move_element(pref.body_markings, start, pref.body_markings.len+1)
+ move_element(pref.body_marking_ids, start, pref.body_marking_ids.len+1)
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["marking_down"])
var/M = href_list["marking_down"]
- var/start = pref.body_markings.Find(M)
- if(start != pref.body_markings.len) //If we're not the end of the list, swap with the next element.
- move_element(pref.body_markings, start, start+2)
+ var/start = pref.body_marking_ids.Find(M)
+ if(start != pref.body_marking_ids.len) //If we're not the end of the list, swap with the next element.
+ move_element(pref.body_marking_ids, start, start+2)
else //But if we ARE, become the first element -behind- everything else.
- move_element(pref.body_markings, start, 1)
+ move_element(pref.body_marking_ids, start, 1)
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["marking_move"])
var/M = href_list["marking_move"]
- var/start = pref.body_markings.Find(M)
- var/list/move_locs = pref.body_markings - M
+ var/start = pref.body_marking_ids.Find(M)
+ var/list/move_locs = pref.body_marking_ids - M
if(start != 1)
- move_locs -= pref.body_markings[start-1]
+ move_locs -= pref.body_marking_ids[start-1]
+ var/list/translated = list()
+ for(var/id in move_locs)
+ var/datum/sprite_accessory/S = GLOB.sprite_accessory_markings[id]
+ translated[S.name] = id
- var/inject_after = input(user, "Move [M] ahead of...", "Character Preference") as null|anything in move_locs //Move ahead of any marking that isn't the current or previous one.
- var/newpos = pref.body_markings.Find(inject_after)
+ var/inject_after = input(user, "Move [M] ahead of...", "Character Preference") as null|anything in translated //Move ahead of any marking that isn't the current or previous one.
+ var/newpos = pref.body_marking_ids.Find(translated[inject_after])
if(newpos)
- move_element(pref.body_markings, start, newpos+1)
+ move_element(pref.body_marking_ids, start, newpos+1)
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["marking_remove"])
var/M = href_list["marking_remove"]
- pref.body_markings -= M
+ pref.body_marking_ids -= M
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["marking_color"])
var/M = href_list["marking_color"]
- var/mark_color = input(user, "Choose the [M] color: ", "Character Preference", pref.body_markings[M]) as color|null
+ var/datum/sprite_accessory/S = GLOB.sprite_accessory_markings[M]
+ var/mark_color = input(user, "Choose the [S.name]'s color: ", "Character Preference", pref.body_marking_ids[M]) as color|null
if(mark_color && CanUseTopic(user))
- pref.body_markings[M] = "[mark_color]"
+ pref.body_marking_ids[M] = "[mark_color]"
return PREFERENCES_REFRESH_UPDATE_PREVIEW
else if(href_list["reset_limbs"])
diff --git a/code/modules/preferences/preference_setup/helpers/species_pick.dm b/code/modules/preferences/preference_setup/helpers/species_pick.dm
index 1831662bc73..5b148ef9206 100644
--- a/code/modules/preferences/preference_setup/helpers/species_pick.dm
+++ b/code/modules/preferences/preference_setup/helpers/species_pick.dm
@@ -54,15 +54,17 @@
// hair/fhair
var/list/valid_hair = get_valid_hairstyles()
var/list/valid_fhair = get_valid_facialhairstyles()
- if(!(h_style in valid_hair))
+ var/datum/sprite_accessory/HS = GLOB.sprite_accessory_hair[h_style_id]
+ var/datum/sprite_accessory/FS = GLOB.sprite_accessory_facial_hair[f_style_id]
+ if(!(HS.name in valid_hair))
var/datum/sprite_accessory/hair/H = /datum/sprite_accessory/hair/bald
- h_style = initial(H.name)
- if(!(f_style in valid_fhair))
+ h_style_id = initial(H.id)
+ if(!(FS.name in valid_fhair))
var/datum/sprite_accessory/facial_hair/FH = /datum/sprite_accessory/facial_hair/shaved
- f_style = initial(FH.name)
+ f_style_id = initial(FH.id)
// limbs/markings
reset_limbs()
- body_markings.Cut()
+ body_marking_ids.Cut()
// age
age = clamp(age, CS.min_age, CS.max_age)
//! END
diff --git a/code/modules/preferences/preference_setup/vore/01_ears.dm b/code/modules/preferences/preference_setup/vore/01_ears.dm
index 71b265c72b8..41af2b98042 100644
--- a/code/modules/preferences/preference_setup/vore/01_ears.dm
+++ b/code/modules/preferences/preference_setup/vore/01_ears.dm
@@ -6,7 +6,7 @@
// Define a place to save appearance in character setup
/datum/preferences
- var/ear_style // Type of selected ear style
+ var/ear_style_id // Type of selected ear style
var/r_ears = 30 // Ear color.
var/g_ears = 30 // Ear color
var/b_ears = 30 // Ear color
@@ -16,7 +16,7 @@
var/r_ears3 = 30 // Ear tertiary color.
var/g_ears3 = 30 // Ear tertiary color
var/b_ears3 = 30 // Ear tertiary color
- var/horn_style // Type of selected horn style
+ var/horn_style_id // Type of selected horn style
var/r_horn = 30 // Horn color.
var/g_horn = 30 // Horn color
var/b_horn = 30 // Horn color
@@ -26,7 +26,7 @@
var/r_horn3 = 30 // Horn tertiary color.
var/g_horn3 = 30 // Horn tertiary color
var/b_horn3 = 30 // Horn tertiary color
- var/tail_style // Type of selected tail style
+ var/tail_style_id // 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
@@ -36,7 +36,7 @@
var/r_tail3 = 30 // For tertiary overlay.
var/g_tail3 = 30 // For tertiary overlay.
var/b_tail3 = 30 // For tertiary overlay.
- var/wing_style // Type of selected wing style
+ var/wing_style_id // Type of selected wing style
var/r_wing = 30 // Wing color
var/g_wing = 30 // Wing color
var/b_wing = 30 // Wing color
@@ -56,7 +56,7 @@
sort_order = 1
/datum/category_item/player_setup_item/vore/ears/load_character(var/savefile/S)
- S["ear_style"] >> pref.ear_style
+ S["ear_style_id"] >> pref.ear_style_id
S["r_ears"] >> pref.r_ears
S["g_ears"] >> pref.g_ears
S["b_ears"] >> pref.b_ears
@@ -66,7 +66,7 @@
S["r_ears3"] >> pref.r_ears3
S["g_ears3"] >> pref.g_ears3
S["b_ears3"] >> pref.b_ears3
- S["horn_style"] >> pref.horn_style
+ S["horn_style_id"] >> pref.horn_style_id
S["r_horn"] >> pref.r_horn
S["g_horn"] >> pref.g_horn
S["b_horn"] >> pref.b_horn
@@ -76,7 +76,7 @@
S["r_horn3"] >> pref.r_horn3
S["g_horn3"] >> pref.g_horn3
S["b_horn3"] >> pref.b_horn3
- S["tail_style"] >> pref.tail_style
+ S["tail_style_id"] >> pref.tail_style_id
S["r_tail"] >> pref.r_tail
S["g_tail"] >> pref.g_tail
S["b_tail"] >> pref.b_tail
@@ -86,7 +86,7 @@
S["r_tail3"] >> pref.r_tail3
S["g_tail3"] >> pref.g_tail3
S["b_tail3"] >> pref.b_tail3
- S["wing_style"] >> pref.wing_style
+ S["wing_style_id"] >> pref.wing_style_id
S["r_wing"] >> pref.r_wing
S["g_wing"] >> pref.g_wing
S["b_wing"] >> pref.b_wing
@@ -101,7 +101,7 @@
S["b_gradwing"] >> pref.b_gradwing
/datum/category_item/player_setup_item/vore/ears/save_character(var/savefile/S)
- S["ear_style"] << pref.ear_style
+ S["ear_style_id"] << pref.ear_style_id
S["r_ears"] << pref.r_ears
S["g_ears"] << pref.g_ears
S["b_ears"] << pref.b_ears
@@ -111,7 +111,7 @@
S["r_ears3"] << pref.r_ears3
S["g_ears3"] << pref.g_ears3
S["b_ears3"] << pref.b_ears3
- S["horn_style"] << pref.horn_style
+ S["horn_style_id"] << pref.horn_style_id
S["r_horn"] << pref.r_horn
S["g_horn"] << pref.g_horn
S["b_horn"] << pref.b_horn
@@ -121,7 +121,7 @@
S["r_horn3"] << pref.r_horn3
S["g_horn3"] << pref.g_horn3
S["b_horn3"] << pref.b_horn3
- S["tail_style"] << pref.tail_style
+ S["tail_style_id"] << pref.tail_style_id
S["r_tail"] << pref.r_tail
S["g_tail"] << pref.g_tail
S["b_tail"] << pref.b_tail
@@ -131,7 +131,7 @@
S["r_tail3"] << pref.r_tail3
S["g_tail3"] << pref.g_tail3
S["b_tail3"] << pref.b_tail3
- S["wing_style"] << pref.wing_style
+ S["wing_style_id"] << pref.wing_style_id
S["r_wing"] << pref.r_wing
S["g_wing"] << pref.g_wing
S["b_wing"] << pref.b_wing
@@ -189,33 +189,41 @@
var/datum/species/S = pref.real_species_datum()
var/species_name = S.name
- if(pref.ear_style)
- pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style))
- var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style]
- if(temp_ear_style.apply_restrictions && (!(species_name in temp_ear_style.species_allowed)))
- pref.ear_style = initial(pref.ear_style)
- if(pref.horn_style)
- pref.horn_style = sanitize_inlist(pref.horn_style, horn_styles_list, initial(pref.horn_style))
- var/datum/sprite_accessory/temp_horn_style = horn_styles_list[pref.horn_style]
- if(temp_horn_style.apply_restrictions && (!(species_name in temp_horn_style.species_allowed)))
- pref.horn_style = initial(pref.horn_style)
- if(pref.tail_style)
- pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style))
- var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style]
- if(temp_tail_style.apply_restrictions && (!(species_name in temp_tail_style.species_allowed)))
- pref.tail_style = initial(pref.tail_style)
- if(pref.wing_style)
- pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style))
- var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style]
- if(temp_wing_style.apply_restrictions && (!(species_name in temp_wing_style.species_allowed)))
- pref.wing_style = initial(pref.wing_style)
+ if(pref.ear_style_id)
+ pref.ear_style_id = sanitize_inlist(pref.ear_style_id, GLOB.sprite_accessory_ears, initial(pref.ear_style_id))
+ var/datum/sprite_accessory/temp_ear_style_id = GLOB.sprite_accessory_ears[pref.ear_style_id]
+ if(temp_ear_style_id.apply_restrictions && (!(species_name in temp_ear_style_id.species_allowed)))
+ pref.ear_style_id = initial(pref.ear_style_id)
+ if(pref.horn_style_id)
+ pref.horn_style_id = sanitize_inlist(pref.horn_style_id, GLOB.sprite_accessory_ears, initial(pref.horn_style_id))
+ var/datum/sprite_accessory/temp_horn_style_id = GLOB.sprite_accessory_ears[pref.horn_style_id]
+ if(temp_horn_style_id.apply_restrictions && (!(species_name in temp_horn_style_id.species_allowed)))
+ pref.horn_style_id = initial(pref.horn_style_id)
+ if(pref.tail_style_id)
+ pref.tail_style_id = sanitize_inlist(pref.tail_style_id, GLOB.sprite_accessory_tails, initial(pref.tail_style_id))
+ var/datum/sprite_accessory/temp_tail_style_id = GLOB.sprite_accessory_tails[pref.tail_style_id]
+ if(temp_tail_style_id.apply_restrictions && (!(species_name in temp_tail_style_id.species_allowed)))
+ pref.tail_style_id = initial(pref.tail_style_id)
+ if(pref.wing_style_id)
+ pref.wing_style_id = sanitize_inlist(pref.wing_style_id, GLOB.sprite_accessory_wings, initial(pref.wing_style_id))
+ var/datum/sprite_accessory/temp_wing_style_id = GLOB.sprite_accessory_wings[pref.wing_style_id]
+ if(temp_wing_style_id.apply_restrictions && (!(species_name in temp_wing_style_id.species_allowed)))
+ pref.wing_style_id = initial(pref.wing_style_id)
/datum/category_item/player_setup_item/vore/ears/copy_to_mob(datum/preferences/prefs, mob/M, data, flags)
// todo: this is just a shim
if(!ishuman(M))
return TRUE
var/mob/living/carbon/human/character = M
- character.ear_style = ear_styles_list[pref.ear_style]
+ var/datum/sprite_accessory/S = GLOB.sprite_accessory_ears[pref.ear_style_id]
+ character.ear_style = S
+ S = GLOB.sprite_accessory_tails[pref.tail_style_id]
+ character.tail_style = S
+ S = GLOB.sprite_accessory_wings[pref.wing_style_id]
+ character.wing_style = S
+ S = GLOB.sprite_accessory_ears[pref.horn_style_id]
+ character.horn_style = S
+
character.r_ears = pref.r_ears
character.b_ears = pref.b_ears
character.g_ears = pref.g_ears
@@ -225,7 +233,7 @@
character.r_ears3 = pref.r_ears3
character.b_ears3 = pref.b_ears3
character.g_ears3 = pref.g_ears3
- character.horn_style = horn_styles_list[pref.horn_style]
+
character.r_horn = pref.r_horn
character.b_horn = pref.b_horn
character.g_horn = pref.g_horn
@@ -235,7 +243,7 @@
character.r_horn3 = pref.r_horn3
character.b_horn3 = pref.b_horn3
character.g_horn3 = pref.g_horn3
- 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
@@ -245,7 +253,7 @@
character.r_tail3 = pref.r_tail3
character.b_tail3 = pref.b_tail3
character.g_tail3 = pref.g_tail3
- 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
@@ -263,80 +271,82 @@
/datum/category_item/player_setup_item/vore/ears/content(datum/preferences/prefs, mob/user, data)
. += "Appearance and Custom Species Settings
"
- var/ear_display = "Normal"
- 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
+ var/datum/sprite_accessory/rendering
- else if(pref.ear_style)
- ear_display = "REQUIRES UPDATE"
+ var/ear_display = "Normal"
+ if(pref.ear_style_id)
+ rendering = GLOB.sprite_accessory_ears[pref.ear_style_id]
+ if(rendering)
+ ear_display = rendering.name
+ else
+ 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)
+ if(rendering)
+ if(rendering.do_colouration)
. += "Change Color
"
- if(ear.extra_overlay)
+ if(rendering.extra_overlay)
. += "Change Secondary Color
"
- if(ear.extra_overlay2)
+ if(rendering.extra_overlay2)
. += "Change Tertiary Color [color_square(pref.r_ears3, pref.g_ears3, pref.b_ears3)]
"
+ rendering = null
var/horn_display = "Normal"
- if(pref.horn_style && (pref.horn_style in horn_styles_list))
- var/datum/sprite_accessory/ears/instance = horn_styles_list[pref.horn_style]
- horn_display = instance.name
-
- else if(pref.horn_style)
- horn_display = "REQUIRES UPDATE"
+ if(pref.horn_style_id)
+ rendering = GLOB.sprite_accessory_ears[pref.horn_style_id]
+ if(rendering)
+ horn_display = rendering.name
+ else
+ horn_display = "REQUIRES UPDATE"
. += "Secondary Ears
"
. += " Style: [horn_display]
"
- if(horn_styles_list[pref.horn_style])
- var/datum/sprite_accessory/ears/ear2 = horn_styles_list[pref.horn_style]
- if(ear2.do_colouration)
+ if(rendering)
+ if(rendering.do_colouration)
. += "Change Color
"
- if(ear2.extra_overlay)
+ if(rendering.extra_overlay)
. += "Change Secondary Color
"
- if(ear2.extra_overlay2)
+ if(rendering.extra_overlay2)
. += "Change Tertiary Color [color_square(pref.r_horn3, pref.g_horn3, pref.b_horn3)]
"
+ rendering = null
var/tail_display = "Normal"
- if(pref.tail_style && (pref.tail_style in tail_styles_list))
- var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style]
- tail_display = instance.name
- else if(pref.tail_style)
- tail_display = "REQUIRES UPDATE"
+ if(pref.tail_style_id)
+ rendering = GLOB.sprite_accessory_tails[pref.tail_style_id]
+ if(rendering)
+ tail_display = rendering.name
+ else
+ tail_display = "REQUIRES UPDATE"
. += "Tail
"
. += " Style: [tail_display]
"
-
- if(tail_styles_list[pref.tail_style])
- var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style]
- if(T.do_colouration)
+ if(rendering)
+ if(rendering.do_colouration)
. += "Change Color
"
- if(T.extra_overlay)
+ if(rendering.extra_overlay)
. += "Change Secondary Color
"
- if(T.extra_overlay2)
+ if(rendering.extra_overlay2)
. += "Change Tertiary Color [color_square(pref.r_tail3, pref.g_tail3, pref.b_tail3)]
"
+ rendering = null
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"
+ if(pref.wing_style_id)
+ rendering = GLOB.sprite_accessory_wings[pref.wing_style_id]
+ if(rendering)
+ wing_display = rendering.name
+ else
+ wing_display = "REQUIRES UPDATE"
. += "Wing
"
. += " Style: [wing_display]
"
-
- if(wing_styles_list[pref.wing_style])
- var/datum/sprite_accessory/wing/W = wing_styles_list[pref.wing_style]
- if(W.do_colouration)
+ if(rendering)
+ if(rendering.do_colouration)
. += "Change Color
"
. += "Gradient
"
. += "Change Color [color_square(pref.r_gradwing, pref.g_gradwing, pref.b_gradwing)] "
. += " Style: [pref.grad_wingstyle]
"
- if(W.extra_overlay)
+ if(rendering.extra_overlay)
. += "Change Secondary Color
"
- if (W.extra_overlay2)
+ if(rendering.extra_overlay2)
. += "Change Secondary Color [color_square(pref.r_wing3, pref.g_wing3, pref.b_wing3)]
"
+ rendering = null
/datum/category_item/player_setup_item/vore/ears/OnTopic(var/href,var/list/href_list, var/mob/user)
@@ -349,15 +359,16 @@
else if(href_list["ear_style"])
// Construct the list of names allowed for this user.
var/list/pretty_ear_styles = list("Normal" = null)
- for(var/path in ear_styles_list)
- var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
+ var/datum/sprite_accessory/ears/current = pref.ear_style_id && GLOB.sprite_accessory_ears[pref.ear_style_id]
+ for(var/id in GLOB.sprite_accessory_ears)
+ var/datum/sprite_accessory/ears/instance = GLOB.sprite_accessory_ears[id]
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (species_name in instance.species_allowed)))
- pretty_ear_styles[instance.name] = path
+ pretty_ear_styles[instance.name] = id
// Present choice to user
- var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles
+ var/new_ear_style = input(user, "Pick ears", "Character Preference", current?.name) as null|anything in pretty_ear_styles
if(new_ear_style)
- pref.ear_style = pretty_ear_styles[new_ear_style]
+ pref.ear_style_id = pretty_ear_styles[new_ear_style]
return PREFERENCES_REFRESH_UPDATE_PREVIEW
@@ -391,15 +402,16 @@
else if(href_list["horn_style"])
// Construct the list of names allowed for this user.
var/list/pretty_horn_styles = list("Normal" = null)
- for(var/path in horn_styles_list)
- var/datum/sprite_accessory/ears/instance = horn_styles_list[path]
+ var/datum/sprite_accessory/ears/current = pref.horn_style_id && GLOB.sprite_accessory_ears[pref.horn_style_id]
+ for(var/id in GLOB.sprite_accessory_ears)
+ var/datum/sprite_accessory/ears/instance = GLOB.sprite_accessory_ears[id]
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (species_name in instance.species_allowed)))
- pretty_horn_styles[instance.name] = path
+ pretty_horn_styles[instance.name] = id
// Present choice to user
- var/new_horn_style = input(user, "Pick Secondary Ears", "Character Preference", pref.horn_style) as null|anything in pretty_horn_styles
+ var/new_horn_style = input(user, "Pick Secondary Ears", "Character Preference", current?.name) as null|anything in pretty_horn_styles
if(new_horn_style)
- pref.horn_style = pretty_horn_styles[new_horn_style]
+ pref.horn_style_id = pretty_horn_styles[new_horn_style]
return PREFERENCES_REFRESH_UPDATE_PREVIEW
@@ -433,15 +445,16 @@
else if(href_list["tail_style"])
// Construct the list of names allowed for this user.
var/list/pretty_tail_styles = list("Normal" = null)
- for(var/path in tail_styles_list)
- var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
+ var/datum/sprite_accessory/tail/current = pref.tail_style_id && GLOB.sprite_accessory_tails[pref.tail_style_id]
+ for(var/id in GLOB.sprite_accessory_tails)
+ var/datum/sprite_accessory/tail/instance = GLOB.sprite_accessory_tails[id]
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (species_name in instance.species_allowed)))
- pretty_tail_styles[instance.name] = path
+ pretty_tail_styles[instance.name] = id
// Present choice to user
- var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles
+ var/new_tail_style = input(user, "Pick tails", "Character Preference", current?.name) as null|anything in pretty_tail_styles
if(new_tail_style)
- pref.tail_style = pretty_tail_styles[new_tail_style]
+ pref.tail_style_id = pretty_tail_styles[new_tail_style]
return PREFERENCES_REFRESH_UPDATE_PREVIEW
@@ -475,15 +488,16 @@
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]
+ var/datum/sprite_accessory/wing/current = pref.wing_style_id && GLOB.sprite_accessory_wings[pref.wing_style_id]
+ for(var/id in GLOB.sprite_accessory_wings)
+ var/datum/sprite_accessory/wing/instance = GLOB.sprite_accessory_wings[id]
if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (species_name in instance.species_allowed)))
- pretty_wing_styles[instance.name] = path
+ pretty_wing_styles[instance.name] = id
// Present choice to user
- var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles
+ var/new_wing_style = input(user, "Pick wings", "Character Preference", current?.name) as null|anything in pretty_wing_styles
if(new_wing_style)
- pref.wing_style = pretty_wing_styles[new_wing_style]
+ pref.wing_style_id = pretty_wing_styles[new_wing_style]
return PREFERENCES_REFRESH_UPDATE_PREVIEW
diff --git a/code/modules/preferences/preferences_savefile.dm b/code/modules/preferences/preferences_savefile.dm
index 37f037d9be6..eb7ec7c9507 100644
--- a/code/modules/preferences/preferences_savefile.dm
+++ b/code/modules/preferences/preferences_savefile.dm
@@ -32,7 +32,7 @@
// todo: wipe
savefile_version = SAVEFILE_VERSION_MAX
else if(savefile_version < SAVEFILE_VERSION_MAX)
- perform_global_migrations(S, savefile_version, io_errors, options)
+ SScharacters.perform_global_migrations(S, savefile_version, io_errors, options, src)
savefile_version = SAVEFILE_VERSION_MAX
// don't flush immediately incase they want to cancel/ahelp about something breaking
// save_preferences()
@@ -147,7 +147,7 @@
// todo: wipe slot
current_version = CHARACTER_VERSION_MAX
else if(current_version < CHARACTER_VERSION_MAX)
- perform_character_migrations(S, current_version, io_errors, character)
+ SScharacters.perform_character_migrations(S, current_version, io_errors, character, src)
current_version = CHARACTER_VERSION_MAX
queue_errors(io_errors, "error while migrating slot [slot]:")
character[CHARACTER_DATA_VERSION] = current_version
diff --git a/code/modules/preferences/preferences_setup.dm b/code/modules/preferences/preferences_setup.dm
index 6f109733277..c9a002536bc 100644
--- a/code/modules/preferences/preferences_setup.dm
+++ b/code/modules/preferences/preferences_setup.dm
@@ -4,8 +4,8 @@
var/datum/species/current_species = real_species_datum()
set_biological_gender(pick(current_species.genders))
- h_style = random_hair_style(biological_gender, current_species.name)
- f_style = random_facial_hair_style(biological_gender, current_species.name)
+ h_style_id = random_hair_style(biological_gender, current_species.name)
+ f_style_id = random_facial_hair_style(biological_gender, current_species.name)
if(current_species)
if(current_species.species_appearance_flags & HAS_SKIN_TONE)
s_tone = random_skin_tone()
@@ -28,7 +28,6 @@
var/datum/category_item/underwear/WRI = pick(WRC.items)
all_underwear[WRC.name] = WRI.name
-
backbag = rand(1, 7)
pdachoice = rand(1, 7)
age = rand(current_species.min_age, current_species.max_age)
@@ -36,7 +35,6 @@
if(H)
copy_to(H)
-
/datum/preferences/proc/randomize_hair_color(var/target = "hair")
if(prob (75) && target == "facial") // Chance to inherit hair color
r_facial = r_hair
@@ -255,20 +253,20 @@
/datum/preferences/proc/get_valid_hairstyles()
var/list/valid_hairstyles = list()
var/species_name = real_species_name()
- for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
+ for(var/hairstyle in GLOB.legacy_hair_lookup)
+ var/datum/sprite_accessory/S = GLOB.legacy_hair_lookup[hairstyle]
if(S.apply_restrictions && !(species_name in S.species_allowed) && (!custom_base || !(custom_base in S.species_allowed))) //Custom species base species allowance
continue
- valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
+ valid_hairstyles[hairstyle] = GLOB.legacy_hair_lookup[hairstyle]
return valid_hairstyles
/datum/preferences/proc/get_valid_facialhairstyles()
var/list/valid_facialhairstyles = list()
var/datum/species/RS = real_species_datum()
- for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
+ for(var/facialhairstyle in GLOB.legacy_facial_hair_lookup)
+ var/datum/sprite_accessory/S = GLOB.legacy_facial_hair_lookup[facialhairstyle]
if(biological_gender == MALE && S.gender == FEMALE)
continue
if(biological_gender == FEMALE && S.gender == MALE)
@@ -276,7 +274,7 @@
if(S.apply_restrictions && !(RS.name in S.species_allowed) && (!custom_base || !(custom_base in S.species_allowed))) //Custom species base species allowance
continue
- valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
+ valid_facialhairstyles[facialhairstyle] = GLOB.legacy_facial_hair_lookup[facialhairstyle]
return valid_facialhairstyles
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index aa0d00f1bb6..ab9ac2a5fc7 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -98,12 +98,11 @@
overlays += I
/obj/structure/bigDelivery/examine(mob/user)
- if(..(user, 4))
- if(sortTag)
- to_chat(user, "It is labeled \"[sortTag]\"")
- if(examtext)
- to_chat(user, "It has a note attached which reads, \"[examtext]\"")
- return
+ . = ..()
+ if(sortTag)
+ . += "It is labeled \"[sortTag]\""
+ if(examtext)
+ . += "It has a note attached which reads, \"[examtext]\""
/obj/structure/bigDelivery/Destroy()
if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0
@@ -216,12 +215,11 @@
overlays += I
/obj/item/smallDelivery/examine(mob/user)
- if(..(user, 4))
- if(sortTag)
- to_chat(user, "It is labeled \"[sortTag]\"")
- if(examtext)
- to_chat(user, "It has a note attached which reads, \"[examtext]\"")
- return
+ . = ..()
+ if(sortTag)
+ . += "It is labeled \"[sortTag]\""
+ if(examtext)
+ . += "It has a note attached which reads, \"[examtext]\""
/obj/item/packageWrap
name = "package wrapper"
@@ -314,10 +312,8 @@
return
/obj/item/packageWrap/examine(mob/user)
- if(..(user, 0))
- to_chat(user, "There are [amount] units of package wrap left!")
-
- return
+ . = ..()
+ . += "There are [amount] units of package wrap left!"
/obj/item/destTagger
name = "destination tagger"
diff --git a/code/modules/research/designs/circuits/circuits_vr.dm b/code/modules/research/designs/circuits/circuits_vr.dm
index 715cf66197a..98ebaf2072b 100644
--- a/code/modules/research/designs/circuits/circuits_vr.dm
+++ b/code/modules/research/designs/circuits/circuits_vr.dm
@@ -111,13 +111,6 @@
build_path = /obj/item/circuitboard/resleeving_control
sort_string = "HAADE"
-/datum/design/circuit/body_designer
- name = "Body design console"
- id = "body_designer"
- req_tech = list(TECH_DATA = 5)
- build_path = /obj/item/circuitboard/body_designer
- sort_string = "HAADF"
-
/datum/design/circuit/partslathe
name = "Parts lathe"
id = "partslathe"
diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm
index 51822d05525..ad2a89b2c04 100644
--- a/code/modules/research/designs_vr.dm
+++ b/code/modules/research/designs_vr.dm
@@ -139,13 +139,6 @@
build_path = /obj/item/circuitboard/resleeving_control
sort_string = "HAADE"
-/datum/design/circuit/body_designer
- name = "Body design console"
- id = "body_designer"
- req_tech = list(TECH_DATA = 5)
- build_path = /obj/item/circuitboard/body_designer
- sort_string = "HAADF"
-
/datum/design/circuit/partslathe
name = "Parts lathe"
id = "partslathe"
diff --git a/code/modules/resleeving/circuitboards.dm b/code/modules/resleeving/circuitboards.dm
index 23b3a7bf62f..90f5d19aab8 100644
--- a/code/modules/resleeving/circuitboards.dm
+++ b/code/modules/resleeving/circuitboards.dm
@@ -39,9 +39,3 @@
name = T_BOARD("resleeving control console")
build_path = /obj/machinery/computer/transhuman/resleeving
origin_tech = list(TECH_DATA = 5)
-
-
-/obj/item/circuitboard/body_designer
- name = T_BOARD("body design console")
- build_path = /obj/machinery/computer/transhuman/designer
- origin_tech = list(TECH_DATA = 5)
diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm
index 9594161a727..d16ed3d0b2a 100644
--- a/code/modules/resleeving/computers.dm
+++ b/code/modules/resleeving/computers.dm
@@ -78,15 +78,15 @@
return
disk = W
to_chat(user, "You insert \the [W] into \the [src].")
- if(istype(W, /obj/item/disk/body_record))
- var/obj/item/disk/body_record/brDisk = W
- if(!brDisk.stored)
- to_chat(user, "\The [W] does not contain a stored body record.")
- return
- active_br = new /datum/transhuman/body_record(brDisk.stored) // Loads a COPY!
- menu = 4
- to_chat(user, "\The [src] loads the body record from \the [W] before ejecting it.")
- attack_hand(user)
+ // if(istype(W, /obj/item/disk/body_record))
+ // var/obj/item/disk/body_record/brDisk = W
+ // if(!brDisk.stored)
+ // to_chat(user, "\The [W] does not contain a stored body record.")
+ // return
+ // active_br = new /datum/transhuman/body_record(brDisk.stored) // Loads a COPY!
+ // menu = 4
+ // to_chat(user, "\The [src] loads the body record from \the [W] before ejecting it.")
+ // attack_hand(user)
if(istype(W, /obj/item/implant/mirror))
if(!user.attempt_insert_item_for_installation(W, src))
return
diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm
deleted file mode 100644
index 9c8999d3976..00000000000
--- a/code/modules/resleeving/designer.dm
+++ /dev/null
@@ -1,398 +0,0 @@
-// Little define makes it cleaner to read the tripple color values out of mobs.
-#define MOB_HEX_COLOR(M, V) "#[num2hex(M.r_##V, 2)][num2hex(M.g_##V, 2)][num2hex(M.b_##V, 2)]"
-
-// todo: this entire file is no longer maintained and probably doesn't work
-// it's a shame but frankly all of this is shitcode and therefore there's no point
-// in maintaining it ~silicons
-
-// if you want in game bodymodding, please, talk with us so we can make a new system together.
-
-/obj/machinery/computer/transhuman/designer
- name = "body design console"
- catalogue_data = list(///datum/category_item/catalogue/information/organization/vey_med,
- /datum/category_item/catalogue/technology/resleeving)
- icon = 'icons/obj/computer.dmi'
- icon_keyboard = "med_key"
- icon_screen = "explosive"
- light_color = "#315ab4"
- circuit = /obj/item/circuitboard/body_designer
- req_access = list(access_medical) // Used for loading people's designs
- var/temp = ""
- var/menu = 1 //Which menu screen to display
- var/datum/transhuman/body_record/active_br = null
- var/icon/preview_icon = null
- // Mannequins are somewhat expensive to create, so cache it
- var/mob/living/carbon/human/dummy/mannequin/mannequin = null
- var/obj/item/disk/body_record/disk = null
-
-/obj/machinery/computer/transhuman/designer/Destroy()
- active_br = null
- preview_icon = null
- mannequin = null
- disk = null
- return ..()
-
-/obj/machinery/computer/transhuman/designer/dismantle()
- if(disk)
- disk.forceMove(get_turf(src))
- disk = null
- ..()
-
-/obj/machinery/computer/transhuman/designer/attackby(obj/item/W as obj, mob/user as mob)
- if(istype(W, /obj/item/disk/body_record))
- if(!user.attempt_insert_item_for_installation(W, src))
- return
- disk = W
- to_chat(user, "You insert \the [W] into \the [src].")
- updateUsrDialog()
- else
- ..()
-
-/obj/machinery/computer/transhuman/designer/attack_ai(mob/user as mob)
- return attack_hand(user)
-
-/obj/machinery/computer/transhuman/designer/attack_hand(mob/user as mob)
- add_fingerprint(user)
- if(inoperable())
- return
- nano_ui_interact(user)
-
-/obj/machinery/computer/transhuman/designer/nano_ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
- // log_debug(SPAN_DEBUG("designer.nano_ui_interact([user], force_open = [force_open])"))
- user.set_machine(src)
-
- var/data[0]
-
- if(menu == "2")
- var/bodyrecords_list_ui[0]
- for(var/N in SStranscore.body_scans)
- var/datum/transhuman/body_record/BR = SStranscore.body_scans[N]
- bodyrecords_list_ui[++bodyrecords_list_ui.len] = list("name" = N, "recref" = "\ref[BR]")
- if(bodyrecords_list_ui.len)
- data["bodyrecords"] = bodyrecords_list_ui
-
- if(menu == "3")
- var/stock_bodyrecords_list_ui[0]
- for (var/datum/species/S in SScharacters.all_static_species_meta())
- if((S.species_spawn_flags & (SPECIES_SPAWN_WHITELISTED|SPECIES_SPAWN_CHARACTER)) != SPECIES_SPAWN_CHARACTER)
- continue
- stock_bodyrecords_list_ui += S
- if(stock_bodyrecords_list_ui.len)
- data["stock_bodyrecords"] = stock_bodyrecords_list_ui
-
- if(active_br)
- data["activeBodyRecord"] = list(
- "real_name" = active_br.mydna.name,
- "speciesname" = active_br.speciesname ? active_br.speciesname : active_br.mydna.dna.species,
- "gender" = active_br.bodygender,
- "synthetic" = active_br.synthetic ? "Yes" : "No",
- "locked" = active_br.locked ? "Low" : "High",
- "scale" = player_size_name(active_br.sizemult),
- "booc" = active_br.body_oocnotes,
- "styles" = list()
- )
- if(!preview_icon)
- update_preview_icon()
- force_open = 1 // Force a refresh to send the new image
- data["previewIconUrl"] = "body_preview_icon.png"
- user << browse_rsc(preview_icon, "body_preview_icon.png")
-
- var/list/styles = data["activeBodyRecord"]["styles"]
- var/list/temp
-
- temp = list("styleHref" = "ear_style", "style" = "Normal")
- if(mannequin.ear_style)
- temp["style"] = mannequin.ear_style.name
- styles["Ears"] = temp
-
- temp = list("styleHref" = "tail_style", "style" = "Normal")
- if(mannequin.tail_style)
- temp["style"] = mannequin.tail_style.name
- if(mannequin.tail_style.do_colouration)
- temp["color"] = MOB_HEX_COLOR(mannequin, tail)
- 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["Wing"] = temp
-
- temp = list("styleHref" = "hair_style", "style" = mannequin.h_style)
- if(mannequin.species && (mannequin.species.species_appearance_flags & HAS_HAIR_COLOR))
- temp["color"] = MOB_HEX_COLOR(mannequin, hair)
- temp["colorHref"] = "hair_color"
- styles["Hair"] = temp
-
- temp = list("styleHref" = "facial_style", "style" = mannequin.f_style)
- if(mannequin.species && (mannequin.species.species_appearance_flags & HAS_HAIR_COLOR))
- temp["color"] = MOB_HEX_COLOR(mannequin, facial)
- temp["colorHref"] = "facial_color"
- styles["Facial"] = temp
-
- if(mannequin.species && (mannequin.species.species_appearance_flags & HAS_EYE_COLOR))
- styles["Eyes"] = list("colorHref" = "eye_color", "color" = MOB_HEX_COLOR(mannequin, eyes))
-
- if(mannequin.species && (mannequin.species.species_appearance_flags & HAS_SKIN_COLOR))
- styles["Body Color"] = list("colorHref" = "skin_color", "color" = MOB_HEX_COLOR(mannequin, skin))
-
- var/datum/preferences/designer/P = new()
- apply_markings_to_prefs(mannequin, P)
- data["activeBodyRecord"]["markings"] = P.body_markings
-
- data["menu"] = menu
- data["temp"] = temp
- data["disk"] = disk ? 1 : 0
- data["diskStored"] = disk && disk.stored ? 1 : 0
-
- ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
- ui = new(user, src, ui_key, "body_designer.tmpl", "Body Design Console", 400, 600)
- ui.set_initial_data(data)
- ui.open()
-
-/obj/machinery/computer/transhuman/designer/Topic(href, href_list)
- if(..())
- return 1
-
- else if(href_list["debug_load_my_body"])
- active_br = new /datum/transhuman/body_record(usr, FALSE, FALSE)
- preview_icon = null
-
- else if (href_list["view_brec"])
- var/datum/transhuman/body_record/BR = locate(href_list["view_brec"])
- if(BR && istype(BR.mydna))
- if(allowed(usr) || BR.ckey == usr.ckey)
- active_br = new /datum/transhuman/body_record(BR) // Load a COPY!
- preview_icon = null
- menu = 4
- else
- active_br = null
- temp = "Access denied: Body records are confidential."
- else
- active_br = null
- temp = "ERROR: Record missing."
-
- else if(href_list["view_stock_brec"])
- var/datum/species/S = SScharacters.resolve_species_name(href_list["view_stock_brec"])
- if(S && (S.species_spawn_flags & (SPECIES_SPAWN_WHITELISTED|SPECIES_SPAWN_CHARACTER)) == SPECIES_SPAWN_CHARACTER)
- // Generate body record from species!
- mannequin = new(null, S.name)
- mannequin.real_name = "Stock [S.name] Body"
- mannequin.name = mannequin.real_name
- mannequin.dna.real_name = mannequin.real_name
- active_br = new(mannequin, FALSE, FALSE)
- active_br.speciesname = "Custom Sleeve"
- preview_icon = null
- menu = 4
- else
- active_br = null
- temp = "ERROR: Stock Record missing."
-
- else if (href_list["boocnotes"])
- menu = 6
-
- else if (href_list["loadfromdisk"])
- if(disk && disk.stored)
- active_br = new /datum/transhuman/body_record(disk.stored) // Loads a COPY!
- preview_icon = null
-
- else if (href_list["savetodisk"])
- if(disk && active_br)
- disk.stored = new /datum/transhuman/body_record(active_br) // Saves a COPY!
- disk.name = "[initial(disk.name)] ([active_br.mydna.name])"
- disk.forceMove(get_turf(src))
- disk = null
-
- else if (href_list["ejectdisk"])
- disk.forceMove(get_turf(src))
- disk = null
-
- else if (href_list["menu"])
- menu = href_list["menu"]
- temp = ""
- else
- OnTopic(href, href_list, usr)
-
- add_fingerprint(usr)
- return 1 // Return 1 to refresh UI
-
-//
-// Code below is for generating preview icons based on a body_record
-//
-
-// Based on /datum/preferences/proc/update_preview_icon()
-/obj/machinery/computer/transhuman/designer/proc/update_preview_icon()
- if(!mannequin)
- mannequin = new ()
-
- mannequin.delete_inventory(TRUE)
- update_preview_mob(mannequin)
-
- preview_icon = icon('icons/effects/effects.dmi', "nothing")
- preview_icon.Scale(48+32, 16+32)
-
- mannequin.dir = NORTH
- var/icon/stamp = get_flat_icon(mannequin)
- preview_icon.Blend(stamp, ICON_OVERLAY, 25, 17)
-
- mannequin.dir = WEST
- stamp = get_flat_icon(mannequin)
- preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9)
-
- mannequin.dir = SOUTH
- stamp = get_flat_icon(mannequin)
- preview_icon.Blend(stamp, ICON_OVERLAY, 49, 1)
-
- preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser.
- return preview_icon
-
-/obj/machinery/computer/transhuman/designer/proc/update_preview_mob(var/mob/living/carbon/human/H)
- ASSERT(!QDELETED(H))
- ASSERT(!QDELETED(active_br))
- //log_debug(SPAN_DEBUG("designer.update_preview_mob([H]) active_br = \ref[active_br]"))
- //Get the DNA and generate a new mob
- var/datum/dna2/record/R = active_br.mydna
- H.set_species(R.dna.species) // This needs to happen before anything else becuase it sets some variables.
-
- // Update the external organs
- for(var/part in active_br.limb_data)
- var/status = active_br.limb_data[part]
- if(status == null) continue //Species doesn't have limb? Child of amputated limb?
-
- var/obj/item/organ/external/O = H.organs_by_name[part]
- if(!O) continue //Not an organ. Perhaps another amputation removed it already.
-
- if(status == 1) //Normal limbs
- continue
- else if(status == 0) //Missing limbs
- O.remove_rejuv()
- else if(status) //Anything else is a manufacturer
- if(active_br.synthetic)
- O.robotize(status)
- else
- O.remove_rejuv()
-
- // Then the internal organs. I think only O_EYES acutally counts, but lets do all just in case
- for(var/part in active_br.organ_data)
- var/status = active_br.organ_data[part]
- if(status == null) continue //Species doesn't have organ? Child of missing part?
-
- var/obj/item/organ/I = H.internal_organs_by_name[part]
- if(!I) continue//Not an organ. Perhaps external conversion changed it already?
-
- if(status == 0) //Normal organ
- continue
- else if(status == 1) //Assisted organ
- I.mechassist()
- else if(status == 2) //Mechanical organ
- I.robotize()
- else if(status == 3) //Digital organ
- I.digitize()
-
- // Apply DNA
- H.dna = R.dna.Clone()
- H.UpdateAppearance() // Update all appearance stuff from the DNA record
- H.sync_organ_dna() // Do this because sprites depend on DNA-gender of organs (chest etc)
- H.resize(active_br.sizemult, FALSE)
-
- // And as for clothing...
- // We don't actually dress them! This is a medical machine, handle the nakedness DOCTOR!
-
- H.regenerate_icons()
- return 0 // Success!
-
-// HORROR SHOW BELOW
-// In order to avoid duplicating the many lines of code in player_setup that handle customizing
-// body setup, we acutally are invoking those methods in order to let people customize the body here.
-// Problem is, those procs save their data to /datum/preferences, not a body_record.
-// Luckily the procs to convert from body_record to /datum/preferences and back already exist.
-// Its ugly, but I think its still better than duplicating and maintaining all that code.
-/obj/machinery/computer/transhuman/designer/proc/OnTopic(var/href,var/list/href_list, var/mob/user)
- if(!mannequin || !preview_icon || !active_br)
- return
-
- if(href_list["size_multiplier"])
- var/new_size = input(user, "Choose your character's size, ranging from 25% to 200%", "Character Preference") as num|null
- if(new_size && ISINRANGE(new_size,25,200))
- active_br.sizemult = (new_size/100)
- preview_icon = null
- return 1
-
- // The black magic horror show begins
- var/datum/preferences/designer/P = new()
-
- // We did DNA to mob, now mob to prefs!
- P.set_character_data(CHARACTER_DATA_REAL_SPECIES, mannequin.species.id)
- apply_coloration_to_prefs(mannequin, P)
- apply_organs_to_prefs(mannequin, P)
- apply_markings_to_prefs(mannequin, P)
- apply_ears_to_prefs(mannequin, P)
-
- // Now we start using the player_setup objects to do stuff!
- var/datum/category_collection/CC = P.player_setup
- var/datum/category_group/CG = CC.categories_by_name["General"]
- var/datum/category_item/player_setup_item/general/body/B = CG.items_by_name["Body"]
- ASSERT(istype(B))
- var/datum/category_item/player_setup_item/general/basic/G = CG.items_by_name["Basic"]
- ASSERT(istype(G))
- CG = CC.categories_by_name["Species Customization"]
- var/datum/category_item/player_setup_item/vore/ears/E = CG.items_by_name["Appearance"]
- ASSERT(istype(E))
-
- if(href_list["bio_gender"])
- var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", active_br.bodygender) as null|anything in G.get_genders()
- if(new_gender)
- active_br.bodygender = new_gender
- active_br.mydna.dna.SetUIState(DNA_UI_GENDER, new_gender!=MALE, 1)
- preview_icon = null
- return 1
-
- var/action = 0
- action = B.OnTopic(href, href_list, user)
- if(action & PREFERENCES_UPDATE_PREVIEW && mannequin && active_br)
- B.copy_to_mob(mannequin)
- active_br.mydna.dna.ResetUIFrom(mannequin)
- preview_icon = null
- return 1
- action = E.OnTopic(href, href_list, user)
- if(action & PREFERENCES_UPDATE_PREVIEW && mannequin && active_br)
- E.copy_to_mob(mannequin)
- active_br.mydna.dna.ResetUIFrom(mannequin)
- preview_icon = null
- return 1
-
-// Fake subtype of preferences we can use to steal code from player_setup
-/datum/preferences/designer/New()
- player_setup = new(src)
- // Do NOT call ..(), it expects real stuff
-
-// Disk for manually moving body records between the designer and sleever console etc.
-/obj/item/disk/body_record
- name = "Body Design Disk"
- desc = "It has a small label: \n\
- \"Portable Body Record Storage Disk. \n\
- Insert into resleeving control console\""
- icon = 'icons/obj/cloning.dmi'
- icon_state = "datadisk2"
- item_state = "card-id"
- w_class = ITEMSIZE_SMALL
- var/datum/transhuman/body_record/stored = null
-
-/*
- * Diskette Box
- */
-
-/obj/item/storage/box/body_record_disk
- name = "body record disk box"
- desc = "A box of body record disks, apparently."
- icon_state = "disk_kit"
-
-/obj/item/storage/box/body_record_disk/PopulateContents()
- for(var/i = 0 to 7)
- new /obj/item/disk/body_record(src)
-
-#undef MOB_HEX_COLOR
diff --git a/code/modules/species/species_shapeshift.dm b/code/modules/species/species_shapeshift.dm
index 7b2d2cd661e..12fc5124c1c 100644
--- a/code/modules/species/species_shapeshift.dm
+++ b/code/modules/species/species_shapeshift.dm
@@ -108,8 +108,8 @@ var/list/wrapped_species_by_ref = list()
var/list/valid_hairstyles = list()
var/list/valid_facialhairstyles = list()
var/list/valid_gradstyles = GLOB.hair_gradients
- for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
+ for(var/hairstyle in GLOB.legacy_hair_lookup)
+ var/datum/sprite_accessory/S = GLOB.legacy_hair_lookup[hairstyle]
if(gender == MALE && S.gender == FEMALE)
continue
if(gender == FEMALE && S.gender == MALE)
@@ -117,8 +117,8 @@ var/list/wrapped_species_by_ref = list()
if(S.apply_restrictions && !(species.get_bodytype_legacy(src) in S.species_allowed))
continue
valid_hairstyles += hairstyle
- for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
+ for(var/facialhairstyle in GLOB.legacy_facial_hair_lookup)
+ var/datum/sprite_accessory/S = GLOB.legacy_facial_hair_lookup[facialhairstyle]
if(gender == MALE && S.gender == FEMALE)
continue
if(gender == FEMALE && S.gender == MALE)
@@ -303,8 +303,8 @@ var/list/wrapped_species_by_ref = list()
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_ear_styles = list("Normal" = null)
- for(var/path in ear_styles_list)
- var/datum/sprite_accessory/ears/instance = ear_styles_list[path]
+ for(var/path in GLOB.legacy_ears_lookup)
+ var/datum/sprite_accessory/ears/instance = GLOB.legacy_ears_lookup[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_ear_styles[instance.name] = path
@@ -314,7 +314,7 @@ var/list/wrapped_species_by_ref = list()
return
//Set new style
- ear_style = ear_styles_list[pretty_ear_styles[new_ear_style]]
+ ear_style = GLOB.legacy_ears_lookup[pretty_ear_styles[new_ear_style]]
//Allow color picks
var/current_pri_color = rgb(r_ears,g_ears,b_ears)
@@ -357,8 +357,8 @@ var/list/wrapped_species_by_ref = list()
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_tail_styles = list("Normal" = null)
- for(var/path in tail_styles_list)
- var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
+ for(var/path in GLOB.legacy_tail_lookup)
+ var/datum/sprite_accessory/tail/instance = GLOB.legacy_tail_lookup[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_tail_styles[instance.name] = path
@@ -368,7 +368,7 @@ var/list/wrapped_species_by_ref = list()
return
//Set new style
- tail_style = tail_styles_list[pretty_tail_styles[new_tail_style]]
+ tail_style = GLOB.legacy_tail_lookup[pretty_tail_styles[new_tail_style]]
//Allow color picks
var/current_pri_color = rgb(r_tail,g_tail,b_tail)
@@ -411,8 +411,8 @@ var/list/wrapped_species_by_ref = list()
last_special = world.time + 10
// Construct the list of names allowed for this user.
var/list/pretty_wing_styles = list("None" = null)
- for(var/path in wing_styles_list)
- var/datum/sprite_accessory/wing/instance = wing_styles_list[path]
+ for(var/path in GLOB.legacy_wing_lookup)
+ var/datum/sprite_accessory/wing/instance = GLOB.legacy_wing_lookup[path]
if((!instance.ckeys_allowed) || (ckey in instance.ckeys_allowed))
pretty_wing_styles[instance.name] = path
@@ -422,7 +422,7 @@ var/list/wrapped_species_by_ref = list()
return
//Set new style
- wing_style = wing_styles_list[pretty_wing_styles[new_wing_style]]
+ wing_style = GLOB.legacy_wing_lookup[pretty_wing_styles[new_wing_style]]
//Allow color picks
var/current_color = rgb(r_wing,g_wing,b_wing)
diff --git a/code/modules/sprite_accessories/ears/_ears.dm b/code/modules/sprite_accessories/ears/_ears.dm
new file mode 100644
index 00000000000..6f62acd2bed
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/_ears.dm
@@ -0,0 +1,14 @@
+/datum/sprite_accessory/ears
+ abstract_type = /datum/sprite_accessory/ears
+ name = "You should not see this..."
+ icon = 'icons/mob/sprite_accessories/ears.dmi'
+ do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color
+
+ color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
+ var/desc = "You should not see this..."
+
+// todo: sort ears by something that makes sense
+// todo: tgui choice menu should be modular
+// todo: and include way to do categories
+//! right now the categories are way too sparse, we'll combine them later.
+
diff --git a/code/modules/sprite_accessories/ears/animal/avian.dm b/code/modules/sprite_accessories/ears/animal/avian.dm
new file mode 100644
index 00000000000..cabe416bfa4
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/avian.dm
@@ -0,0 +1 @@
+// holder file
diff --git a/code/modules/sprite_accessories/ears/animal/bee.dm b/code/modules/sprite_accessories/ears/animal/bee.dm
new file mode 100644
index 00000000000..6c347e19223
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/bee.dm
@@ -0,0 +1,5 @@
+//! this file is not to convention because i'm not typing out "hyman.dm"
+/datum/sprite_accessory/ears/bee
+ name = "bee antennae"
+ id = "ears_bee"
+ icon_state = "bee"
diff --git a/code/modules/sprite_accessories/ears/animal/bovine.dm b/code/modules/sprite_accessories/ears/animal/bovine.dm
new file mode 100644
index 00000000000..1f1011f5884
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/bovine.dm
@@ -0,0 +1,27 @@
+//? cow
+/datum/sprite_accessory/ears/cow
+ name = "cow, horns"
+ id = "ears_cow"
+ icon_state = "cow"
+
+/datum/sprite_accessory/ears/cowc
+ name = "cow, horns, colorable"
+ id = "ears_cow_colorable"
+ icon_state = "cow-c"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/cow_nohorns
+ name = "cow, no horns"
+ id = "ears_cow_nohorns"
+ icon_state = "cow-nohorns"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+//? sheep
+/datum/sprite_accessory/ears/ram
+ name = "ram horns"
+ id = "ears_ram"
+ icon_state = "ram"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/animal/canid.dm b/code/modules/sprite_accessories/ears/animal/canid.dm
new file mode 100644
index 00000000000..1ceb9801807
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/canid.dm
@@ -0,0 +1,91 @@
+//? fox
+/datum/sprite_accessory/ears/fenears
+ name = "flatland zorren ears"
+ id = "ears_zorren_flat"
+ icon_state = "fenears"
+
+/datum/sprite_accessory/ears/fenearshc
+ name = "flatland zorren ears, colorable"
+ id = "ears_zorren_flat_color"
+ icon_state = "fenearshc"
+ extra_overlay = "fenears-inner"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/foxears
+ name = "highlander zorren ears"
+ id = "ears_zorren_high"
+ icon_state = "foxears"
+
+/datum/sprite_accessory/ears/foxearshc
+ name = "highlander zorren ears, colorable"
+ id = "ears_zorren_high_color"
+ icon_state = "foxearshc"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/sandfox
+ name = "Sandfox Ears"
+ id = "ears_sandfox"
+ icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
+ icon_state = "sandfox"
+ extra_overlay = "sandfox-inner"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+//? vulp
+/datum/sprite_accessory/ears/vulp
+ name = "vulpkanin, dual-color"
+ id = "ears_vulp_dual"
+ icon_state = "vulp"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "vulp-inner"
+
+/datum/sprite_accessory/ears/vulp_jackal
+ name = "vulpkanin thin, dual-color"
+ id = "ears_vulp_thin_dual"
+ icon_state = "vulp_jackal"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "vulp_jackal-inner"
+
+/datum/sprite_accessory/ears/vulp_short
+ name = "vulpkanin short"
+ id = "ears_vulp_short"
+ icon_state = "vulp_terrier"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/vulp_short_dc
+ name = "vulpkanin short, dual-color"
+ id = "ears_vulp_short_dual"
+ icon_state = "vulp_terrier"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "vulp_terrier-inner"
+
+//? wolf
+/datum/sprite_accessory/ears/wisewolf
+ name = "wolf, wise"
+ id = "ears_wolf_wise"
+ icon_state = "wolf-wise"
+
+/datum/sprite_accessory/ears/wolfhc
+ name = "wolf, colorable"
+ id = "ears_wolf_color"
+ icon_state = "wolf"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "wolfinner"
+
+/datum/sprite_accessory/ears/wolf_green
+ name = "wolf, green"
+ id = "ears_wolf_green"
+ icon_state = "wolf-green"
+
+/datum/sprite_accessory/ears/wolf_grey
+ name = "wolf, grey"
+ id = "ears_wolf_grey"
+ icon_state = "wolf-grey"
+
diff --git a/code/modules/sprite_accessories/ears/animal/cervid.dm b/code/modules/sprite_accessories/ears/animal/cervid.dm
new file mode 100644
index 00000000000..519ca41609a
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/cervid.dm
@@ -0,0 +1,53 @@
+//? generic antlers
+/datum/sprite_accessory/ears/antlercrown
+ name = "antler crown"
+ id = "ears_antlers_crown"
+ icon_state = "antlercrown"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/antlers
+ name = "antlers"
+ id = "ears_antlers"
+ icon_state = "antlers"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/antlers_e
+ name = "antlers with ears"
+ id = "ears_antlers_nohorns"
+ icon_state = "cow-nohorns"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "antlers_mark"
+
+/datum/sprite_accessory/ears/antlers_large
+ name = "Antlers (large)"
+ id = "ears_antlers_large"
+ icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
+ icon_state = "antlers_large"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/smallantlers
+ name = "small antlers"
+ id = "ears_antlers_small"
+ icon_state = "smallantlers"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/smallantlers_e
+ name = "small antlers with ears"
+ id = "ears_antlers_small_ear"
+ icon_state = "smallantlers"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "deer"
+
+//? deer
+/datum/sprite_accessory/ears/deer
+ name = "deer ears"
+ id = "ears_deer"
+ icon_state = "deer"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/animal/equine.dm b/code/modules/sprite_accessories/ears/animal/equine.dm
new file mode 100644
index 00000000000..0cff4f18bae
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/equine.dm
@@ -0,0 +1,8 @@
+//? donkey
+/datum/sprite_accessory/ears/donkey
+ name = "donkey, colorable"
+ id = "ears_donkey"
+ icon_state = "donkey"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "otie-inner"
diff --git a/code/modules/sprite_accessories/ears/animal/feline.dm b/code/modules/sprite_accessories/ears/animal/feline.dm
new file mode 100644
index 00000000000..69c2cf40c9e
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/feline.dm
@@ -0,0 +1,18 @@
+// cat
+/datum/sprite_accessory/ears/kittyhc
+ name = "kitty, colorable"
+ id = "ears_kitty_color"
+ icon_state = "kitty"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "kittyinner"
+
+/datum/sprite_accessory/ears/kittyr
+ name = "kitty right only, colorable"
+ id = "ears_kitty_right_color"
+ icon = 'icons/mob/sprite_accessories/ears_uneven.dmi'
+ icon_state = "kittyrinner"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "kittyr"
+
diff --git a/code/modules/sprite_accessories/ears/animal/lepid.dm b/code/modules/sprite_accessories/ears/animal/lepid.dm
new file mode 100644
index 00000000000..bda9f350416
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/lepid.dm
@@ -0,0 +1,80 @@
+//? moth
+/datum/sprite_accessory/ears/moth_antenna_fluff_burnt
+ name = "burnt moth antennae and fluff"
+ id = "ears_moth_burnt"
+ icon_state = "moth_antenna_fluff_burnt"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_deathhead
+ name = "death's-head hawkmoth antennae and fluff"
+ id = "ears_moth_deathhead"
+ icon_state = "moth_antenna_fluff_deathhead"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_firewatch
+ name = "firewatch moth antennae and fluff"
+ id = "ears_moth_firewatch"
+ icon_state = "moth_antenna_fluff_firewatch"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_gothic
+ name = "gothic moth antennae and fluff"
+ id = "ears_moth_gothic"
+ icon_state = "moth_antenna_fluff_goth"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_jungle
+ name = "jungle moth antennae and fluff"
+ id = "ears_moth_jungle"
+ icon_state = "moth_antenna_fluff_jungle"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_lovers
+ name = "lovers moth antennae and fluff"
+ id = "ears_moth_lovers"
+ icon_state = "moth_antenna_fluff_lovers"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_moonfly
+ name = "moonfly moth antennae and fluff"
+ id = "ears_moth_moonfly"
+ icon_state = "moth_antenna_fluff_moonfly"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_oakworm
+ name = "oakworm moth antennae and fluff"
+ id = "ears_moth_oakworm"
+ icon_state = "moth_antenna_fluff_oakworm"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_plain
+ name = "plain moth antennae and fluff"
+ id = "ears_moth_plain"
+ icon_state = "moth_antenna_fluff_plain"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_poison
+ name = "poison moth antennae and fluff"
+ id = "ears_moth_poison"
+ icon_state = "moth_antenna_fluff_poison"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_ragged
+ name = "ragged moth antennae and fluff"
+ id = "ears_moth_ragged"
+ icon_state = "moth_antenna_fluff_ragged"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_red
+ name = "red moth antennae and fluff"
+ id = "ears_moth_red"
+ icon_state = "moth_antenna_fluff_red"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_royal
+ name = "royal moth antennae and fluff"
+ id = "ears_moth_royal"
+ icon_state = "moth_antenna_fluff_royal"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_snowy
+ name = "snowy moth antennae and fluff"
+ id = "ears_moth_snowy"
+ icon_state = "moth_antenna_fluff_snowy"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_whitefly
+ name = "whitefly moth antennae and fluff"
+ id = "ears_moth_whitefly"
+ icon_state = "moth_antenna_fluff_whitefly"
+
+/datum/sprite_accessory/ears/moth_antenna_fluff_witchwing
+ name = "witchwing moth antennae and fluff"
+ id = "ears_moth_witchwing"
+ icon_state = "moth_antenna_fluff_witchwing"
diff --git a/code/modules/sprite_accessories/ears/animal/leporid.dm b/code/modules/sprite_accessories/ears/animal/leporid.dm
new file mode 100644
index 00000000000..569023d9c8a
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/leporid.dm
@@ -0,0 +1,71 @@
+//? rabbit
+/datum/sprite_accessory/ears/bnnuy //bnnuy
+ name = "Bnnuy Ears"
+ id = "ears_bunny"
+ icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
+ icon_state = "bnnuy"
+ extra_overlay = "bnnuy-inner"
+ extra_overlay2 = "bnnuy-tips"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/bnnuy2
+ name = "Bnnuy Ears 2"
+ id = "ears_bunny_2"
+ icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
+ icon_state = "bnnuy2"
+ extra_overlay = "bnnuy-inner"
+ extra_overlay2 = "bnnuy-tips2"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/bunnyalt
+ name = "bunny 2, dual-color"
+ id = "ears_bunny_colorable_2"
+ icon_state = "bunny-alt"
+ extra_overlay = "bunny-alt-inner"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/bunnyhc
+ name = "bunny, colorable"
+ id = "ears_bunny_colorable"
+ icon_state = "bunny"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/bunny_floppy
+ name = "floppy bunny ears (colorable)"
+ id = "ears_bunny_floppy"
+ icon_state = "floppy_bun"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/bunny_tall
+ name = "Bunny Tall Ears"
+ id = "ears_bunny_tall"
+ icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
+ icon_state = "bunny-tall"
+ extra_overlay = "bunny-tall-inner"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/bunny_white
+ name = "bunny, white"
+ id = "ears_bunny_white"
+ icon_state = "bunny"
+
+/datum/sprite_accessory/ears/rabbit_swept
+ name = "Rabbit Ears (swept back)"
+ id = "ears_rabbit_back"
+ icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
+ icon_state = "rabbit-swept"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/swooped_bunny
+ name = "Swooped bunny ears (colorable)"
+ id = "ears_bunny_swoop"
+ icon_state = "swooped_bunny"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/animal/murid.dm b/code/modules/sprite_accessories/ears/animal/murid.dm
new file mode 100644
index 00000000000..69bc7e472c5
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/murid.dm
@@ -0,0 +1,20 @@
+//? mice
+/datum/sprite_accessory/ears/mousehc
+ name = "mouse, colorable"
+ id = "ears_mouse"
+ icon_state = "mouse"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "mouseinner"
+
+/datum/sprite_accessory/ears/mousehcno
+ name = "mouse, colorable, no inner"
+ id = "ears_mouse_outer"
+ icon_state = "mouse"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/mouse_grey
+ name = "mouse, grey"
+ id = "ears_mouse_grey"
+ icon_state = "mouse-grey"
diff --git a/code/modules/sprite_accessories/ears/animal/mushroom.dm b/code/modules/sprite_accessories/ears/animal/mushroom.dm
new file mode 100644
index 00000000000..cb7ed6be09c
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/mushroom.dm
@@ -0,0 +1,11 @@
+/datum/sprite_accessory/ears/fungal_muscaria
+ name = "fungal muscaria cap"
+ id = "ears_mushroom_muscaria"
+ desc = ""
+ icon_state = "fungal_muscaria"
+
+/datum/sprite_accessory/ears/fungal_polypore
+ name = "fungal polyporous cap"
+ id = "ears_mushroom_polyporous"
+ desc = ""
+ icon_state = "fungal_polypore"
diff --git a/code/modules/sprite_accessories/ears/animal/sciurid.dm b/code/modules/sprite_accessories/ears/animal/sciurid.dm
new file mode 100644
index 00000000000..19c2691fd25
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/sciurid.dm
@@ -0,0 +1,17 @@
+//? squirrels
+/datum/sprite_accessory/ears/squirrelhc
+ name = "squirrel, colorable"
+ id = "ears_squirrel_color"
+ icon_state = "squirrel"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/squirrel_orange
+ name = "squirel, orange"
+ id = "ears_squirrel_orange"
+ icon_state = "squirrel-orange"
+
+/datum/sprite_accessory/ears/squirrel_red
+ name = "squirrel, red"
+ id = "ears_squirrel_red"
+ icon_state = "squirrel-red"
diff --git a/code/modules/sprite_accessories/ears/animal/ursid.dm b/code/modules/sprite_accessories/ears/animal/ursid.dm
new file mode 100644
index 00000000000..b808873fd15
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/animal/ursid.dm
@@ -0,0 +1,24 @@
+//? bear
+/datum/sprite_accessory/ears/bear_brown
+ name = "bear, brown"
+ id = "ears_bear_brown"
+ icon_state = "bear-brown"
+
+/datum/sprite_accessory/ears/bear_panda
+ name = "bear, panda"
+ id = "ears_bear_panda"
+ icon_state = "panda"
+
+/datum/sprite_accessory/ears/bearhc
+ name = "bear, colorable"
+ id = "ears_bear_colorable"
+ icon_state = "bear"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/smallbear
+ name = "small bear"
+ id = "ears_bear_small"
+ icon_state = "smallbear"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/antenna.dm b/code/modules/sprite_accessories/ears/antenna.dm
new file mode 100644
index 00000000000..1d7624df62b
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/antenna.dm
@@ -0,0 +1,34 @@
+/datum/sprite_accessory/ears/antennae
+ name = "antennae, colorable"
+ id = "ears_antenna"
+ icon_state = "antennae"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/curly_bug
+ name = "curly antennae, colorable"
+ id = "ears_antenna_curly"
+ icon_state = "curly_bug"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/dual_robot
+ name = "synth antennae, colorable"
+ id = "ears_antenna_synth_dual"
+ icon_state = "dual_robot_antennae"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/left_robot
+ name = "left synth, colorable"
+ id = "ears_antenna_synth_left"
+ icon_state = "left_robot_antennae"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/right_robot
+ name = "right synth, colorable"
+ id = "ears_antenna_synth_right"
+ icon_state = "right_robot_antennae"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/fictional/deathclaw.dm b/code/modules/sprite_accessories/ears/fictional/deathclaw.dm
new file mode 100644
index 00000000000..bc426672c43
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/deathclaw.dm
@@ -0,0 +1,4 @@
+/datum/sprite_accessory/ears/molenar_deathclaw
+ name = "deathclaw ears"
+ id = "ears_deathclaw"
+ icon_state = "molenar-deathclaw"
diff --git a/code/modules/sprite_accessories/ears/fictional/demon.dm b/code/modules/sprite_accessories/ears/fictional/demon.dm
new file mode 100644
index 00000000000..841ec4656c0
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/demon.dm
@@ -0,0 +1,40 @@
+/datum/sprite_accessory/ears/demon_horns1
+ name = "demon horns"
+ id = "ears_demon"
+ icon_state = "demon-horns1"
+
+/datum/sprite_accessory/ears/demon_horns1_c
+ name = "demon horns, colorable"
+ id = "ears_demon_colorable"
+ icon_state = "demon-horns1_c"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/demon_horns2
+ name = "demon horns, colorable(outward)"
+ id = "ears_demon_colorable_out"
+ icon_state = "demon-horns2"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/demon_horns3
+ name = "demon horns, colorable(upward)"
+ id = "ears_demon_colorable_up"
+ icon_state = "demon-horns3"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/demon_horns4
+ name = "demon horns, colorable ring(upward)"
+ id = "ears_demon_colorable_up2"
+ icon_state = "demon-horns4"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "demon-horns4-ring"
+
+/datum/sprite_accessory/ears/demon_horns5
+ name = "demon horns, colorable (stubby)"
+ id = "ears_demon_colorable_stub"
+ icon_state = "demon-horns5"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/fictional/draconic.dm b/code/modules/sprite_accessories/ears/fictional/draconic.dm
new file mode 100644
index 00000000000..83064997721
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/draconic.dm
@@ -0,0 +1,20 @@
+/datum/sprite_accessory/ears/dragon_horns
+ name = "dragon horns, colorable"
+ id = "ears_dragon"
+ icon_state = "dragon-horns"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/drake
+ name = "drake frills"
+ id = "ears_drake"
+ icon_state = "drake"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/large_dragon
+ name = "vary large dragon horns"
+ id = "ears_dragon_verybig"
+ icon_state = "big_liz"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/fictional/elf.dm b/code/modules/sprite_accessories/ears/fictional/elf.dm
new file mode 100644
index 00000000000..e4f0c670cc7
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/elf.dm
@@ -0,0 +1,20 @@
+/datum/sprite_accessory/ears/elfs
+ name = "elven ears"
+ id = "ears_elf"
+ icon_state = "elfs"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/elfshort
+ name = "elven ears (short)"
+ id = "ears_elf_short"
+ icon_state = "elfshort"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/floppyelf
+ name = "floppy elven ears"
+ id = "ears_elf_floppy"
+ icon_state = "floppy-elf"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/fictional/jackalope.dm b/code/modules/sprite_accessories/ears/fictional/jackalope.dm
new file mode 100644
index 00000000000..3b964e5b421
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/jackalope.dm
@@ -0,0 +1,8 @@
+/datum/sprite_accessory/ears/jackalope
+ name = "Jackalope Ears and Antlers"
+ id = "ears_jackalope_antlers"
+ icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
+ icon_state = "jackalope"
+ extra_overlay = "jackalope-antlers"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/fictional/oni.dm b/code/modules/sprite_accessories/ears/fictional/oni.dm
new file mode 100644
index 00000000000..9e4d2639083
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/oni.dm
@@ -0,0 +1,11 @@
+/datum/sprite_accessory/ears/oni_h1
+ name = "oni horns"
+ id = "ears_oni"
+ icon_state = "oni-h1"
+
+/datum/sprite_accessory/ears/oni_h1_c
+ name = "oni horns, colorable"
+ id = "ears_oni_color"
+ icon_state = "oni-h1_c"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/fictional/otie.dm b/code/modules/sprite_accessories/ears/fictional/otie.dm
new file mode 100644
index 00000000000..e5b6e55f23a
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/otie.dm
@@ -0,0 +1,7 @@
+/datum/sprite_accessory/ears/otie
+ name = "otie, colorable"
+ id = "ears_otie"
+ icon_state = "otie"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "otie-inner"
diff --git a/code/modules/sprite_accessories/ears/fictional/pokemon.dm b/code/modules/sprite_accessories/ears/fictional/pokemon.dm
new file mode 100644
index 00000000000..b921d4b46a9
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/pokemon.dm
@@ -0,0 +1,4 @@
+/datum/sprite_accessory/ears/leafeon
+ name = "Leaf Ears"
+ id = "ears_leafeon"
+ icon_state = "leaf_ears"
diff --git a/code/modules/sprite_accessories/ears/fictional/sergal.dm b/code/modules/sprite_accessories/ears/fictional/sergal.dm
new file mode 100644
index 00000000000..bc241a3f1a2
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/sergal.dm
@@ -0,0 +1,11 @@
+/datum/sprite_accessory/ears/sergal //Redundant
+ name = "Sergal ears"
+ id = "ears_sergal"
+ icon_state = "serg_plain_s"
+
+/datum/sprite_accessory/ears/sergalhc
+ name = "Sergal ears, colorable"
+ id = "ears_sergal_color"
+ icon_state = "serg_plain_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/ears/fictional/shadekin.dm b/code/modules/sprite_accessories/ears/fictional/shadekin.dm
new file mode 100644
index 00000000000..603ed6152f1
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/shadekin.dm
@@ -0,0 +1,8 @@
+/datum/sprite_accessory/ears/shadekin
+ name = "Shadekin Ears, colorable"
+ id = "ears_shadekin"
+ icon_state = "shadekin"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ apply_restrictions = TRUE
+ species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
diff --git a/code/modules/sprite_accessories/ears/fictional/teshari.dm b/code/modules/sprite_accessories/ears/fictional/teshari.dm
new file mode 100644
index 00000000000..757a09632bf
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/fictional/teshari.dm
@@ -0,0 +1,39 @@
+/datum/sprite_accessory/ears/teshari
+ name = "Teshari ears (colorable)"
+ id = "ears_teshari"
+ icon_state = "teshari"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "teshariinner"
+
+/datum/sprite_accessory/ears/tesharihigh
+ name = "Teshari upper ears (colorable)"
+ id = "ears_teshari_upper"
+ icon_state = "tesharihigh"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "tesharihighinner"
+
+/datum/sprite_accessory/ears/tesharilow
+ name = "Teshari lower ears (colorable)"
+ id = "ears_teshari_lower"
+ icon_state = "tesharilow"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "tesharilowinner"
+
+/datum/sprite_accessory/ears/tesh_pattern_ear_male
+ name = "Teshari male ear pattern (colorable)"
+ id = "ears_teshari_male"
+ icon_state = "teshari"
+ color_blend_mode = ICON_MULTIPLY
+ do_colouration = 1
+ extra_overlay = "teshari_male_pattern"
+
+/datum/sprite_accessory/ears/tesh_pattern_ear_female
+ name = "Teshari female ear pattern (colorable)"
+ id = "ears_teshari_female"
+ icon_state = "teshari"
+ color_blend_mode = ICON_MULTIPLY
+ do_colouration = 1
+ extra_overlay = "teshari_female_pattern"
diff --git a/code/modules/sprite_accessories/ears/horns.dm b/code/modules/sprite_accessories/ears/horns.dm
new file mode 100644
index 00000000000..c783e074f02
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/horns.dm
@@ -0,0 +1,22 @@
+/datum/sprite_accessory/ears/synthhorns_curly
+ name = "Synth horns, curly"
+ id = "ears_horns_synth_curly"
+ icon_state = "synthhorns_curled"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/synthhorns_plain
+ name = "Synth horns, plain"
+ id = "ears_horns_synth_plain"
+ icon_state = "synthhorns_plain"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "synthhorns_plain_light"
+
+/datum/sprite_accessory/ears/synthhorns_thick
+ name = "Synth horns, thick"
+ id = "ears_horns_synth_thick"
+ icon_state = "synthhorns_thick"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "synthhorns_thick_light"
diff --git a/code/modules/sprite_accessories/ears/misc.dm b/code/modules/sprite_accessories/ears/misc.dm
new file mode 100644
index 00000000000..66825b1b97d
--- /dev/null
+++ b/code/modules/sprite_accessories/ears/misc.dm
@@ -0,0 +1,62 @@
+/datum/sprite_accessory/ears/caprahorns
+ name = "caprine horns"
+ id = "ears_capra_horns"
+ icon_state = "caprahorns"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/inkling
+ name = "colorable mature inkling tentacles"
+ id = "ears_inkling_tentacle"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_state = "inkling-colorable"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/peekinghuman
+ name = "peeking ears"
+ id = "ears_peeking"
+ icon_state = "earpeek"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/sleek
+ name = "sleek ears"
+ id = "ears_sleek"
+ icon_state = "sleek"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/teppiears
+ name = "Teppi Ears"
+ id = "ears_teppi_ear"
+ icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
+ icon_state = "teppi_ears"
+ extra_overlay = "teppi_ears_inner"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/teppihorns
+ name = "Teppi Horns"
+ id = "ears_teppi_horn"
+ icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
+ icon_state = "teppi_horns"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/teppiearshorns
+ name = "Teppi Ears and Horns"
+ id = "ears_teppi_both"
+ icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
+ icon_state = "teppi_ears"
+ extra_overlay = "teppi_ears_inner"
+ extra_overlay2 = "teppi_horns"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/ears/zears
+ name = "jagged ears"
+ id = "ears_jagged"
+ icon_state = "zears"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/facial_hair/facial_hair.dm b/code/modules/sprite_accessories/facial_hair/_facial_hair.dm
similarity index 83%
rename from code/modules/sprite_accessories/facial_hair/facial_hair.dm
rename to code/modules/sprite_accessories/facial_hair/_facial_hair.dm
index df1e4dcf054..a3a56feadd5 100644
--- a/code/modules/sprite_accessories/facial_hair/facial_hair.dm
+++ b/code/modules/sprite_accessories/facial_hair/_facial_hair.dm
@@ -7,142 +7,176 @@
*/
/datum/sprite_accessory/facial_hair
+ abstract_type = /datum/sprite_accessory/facial_hair
icon = 'icons/mob/human_face_or_vr.dmi'
color_blend_mode = ICON_MULTIPLY
apply_restrictions = FALSE
/datum/sprite_accessory/facial_hair/shaved
name = "Shaved"
+ id = "fhair_shaved"
icon_state = "bald"
gender = NEUTER
/datum/sprite_accessory/facial_hair/neck_fluff
name = "Neck Fluff"
+ id = "fhair_neckfluff"
icon = 'icons/mob/human_face_or_vr.dmi'
icon_state = "facial_neckfluff"
gender = NEUTER
/datum/sprite_accessory/facial_hair/watson
name = "Watson Mustache"
+ id = "fhair_watson"
icon_state = "facial_watson"
/datum/sprite_accessory/facial_hair/hogan
name = "Hulk Hogan Mustache"
+ id = "fhair_hogan"
icon_state = "facial_hogan" //-Neek
/datum/sprite_accessory/facial_hair/vandyke
name = "Van Dyke Mustache"
+ id = "fhair_vandyke"
icon_state = "facial_vandyke"
/datum/sprite_accessory/facial_hair/chaplin
name = "Square Mustache"
+ id = "fhair_square"
icon_state = "facial_chaplin"
/datum/sprite_accessory/facial_hair/selleck
name = "Selleck Mustache"
+ id = "fhair_selleck"
icon_state = "facial_selleck"
/datum/sprite_accessory/facial_hair/neckbeard
name = "Neckbeard"
+ id = "fhair_neck"
icon_state = "facial_neckbeard"
/datum/sprite_accessory/facial_hair/fullbeard
name = "Full Beard"
+ id = "fhair_full"
icon_state = "facial_fullbeard"
/datum/sprite_accessory/facial_hair/longbeard
name = "Long Beard"
+ id = "fhair_long"
icon_state = "facial_longbeard"
/datum/sprite_accessory/facial_hair/vlongbeard
name = "Very Long Beard"
+ id = "fhair_verylong"
icon_state = "facial_wise"
/datum/sprite_accessory/facial_hair/elvis
name = "Elvis Sideburns"
+ id = "fhair_elvis"
icon_state = "facial_elvis"
//Fuck it, everyone is Elvis. species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN,SPECIES_UNATHI)
/datum/sprite_accessory/facial_hair/abe
name = "Abraham Lincoln Beard"
+ id = "fhair_lincoln"
icon_state = "facial_abe"
/datum/sprite_accessory/facial_hair/chinstrap
name = "Chinstrap"
+ id = "fhair_chinstrap"
icon_state = "facial_chin"
/datum/sprite_accessory/facial_hair/hip
name = "Hipster Beard"
+ id = "fhair_hipster"
icon_state = "facial_hip"
/datum/sprite_accessory/facial_hair/gt
name = "Goatee"
+ id = "fhair_goatee"
icon_state = "facial_gt"
/datum/sprite_accessory/facial_hair/jensen
name = "Adam Jensen Beard"
+ id = "fhair_jensen"
icon_state = "facial_jensen"
/datum/sprite_accessory/facial_hair/volaju
name = "Volaju"
+ id = "fhair_volaju"
icon_state = "facial_volaju"
/datum/sprite_accessory/facial_hair/dwarf
name = "Dwarf Beard"
+ id = "fhair_dwarf"
icon_state = "facial_dwarf"
/datum/sprite_accessory/facial_hair/threeOclock
name = "3 O'clock Shadow"
+ id = "fhair_3oclock"
icon_state = "facial_3oclock"
/datum/sprite_accessory/facial_hair/threeOclockstache
name = "3 O'clock Shadow and Moustache"
+ id = "fhair_3oclock_mous"
icon_state = "facial_3oclockmoustache"
/datum/sprite_accessory/facial_hair/fiveOclock
name = "5 O'clock Shadow"
+ id = "fhair_5oclock"
icon_state = "facial_5oclock"
/datum/sprite_accessory/facial_hair/fiveOclockstache
name = "5 O'clock Shadow and Moustache"
+ id = "fhair_5oclock_mous"
icon_state = "facial_5oclockmoustache"
/datum/sprite_accessory/facial_hair/sevenOclock
name = "7 O'clock Shadow"
+ id = "fhair_7oclock"
icon_state = "facial_7oclock"
/datum/sprite_accessory/facial_hair/sevenOclockstache
name = "7 O'clock Shadow and Moustache"
+ id = "fhair_7oclock_mous"
icon_state = "facial_7oclockmoustache"
/datum/sprite_accessory/facial_hair/mutton
name = "Mutton Chops"
+ id = "fhair_mutton"
icon_state = "facial_mutton"
/datum/sprite_accessory/facial_hair/muttonstache
name = "Mutton Chops and Moustache"
+ id = "fhair_mutton_mous"
icon_state = "facial_muttonmus"
/datum/sprite_accessory/facial_hair/walrus
name = "Walrus Moustache"
+ id = "fhair_walrus"
icon_state = "facial_walrus"
/datum/sprite_accessory/facial_hair/croppedbeard
name = "Full Cropped Beard"
+ id = "fhair_fullcrop"
icon_state = "facial_croppedfullbeard"
/datum/sprite_accessory/facial_hair/chinless
name = "Chinless Beard"
+ id = "fhair_chinless"
icon_state = "facial_chinlessbeard"
/datum/sprite_accessory/facial_hair/tribeard
name = "Tribeard"
+ id = "fhair_tribeard"
icon_state = "facial_tribeard"
/datum/sprite_accessory/facial_hair/moonshiner
name = "Moonshiner"
+ id = "fhair_moonshiner"
icon_state = "facial_moonshiner"
/datum/sprite_accessory/facial_hair/martial
name = "Martial Artist"
+ id = "fhair_martial"
icon_state = "facial_martialartist"
diff --git a/code/modules/sprite_accessories/facial_hair/tajaran_facial_hair.dm b/code/modules/sprite_accessories/facial_hair/tajaran.dm
similarity index 84%
rename from code/modules/sprite_accessories/facial_hair/tajaran_facial_hair.dm
rename to code/modules/sprite_accessories/facial_hair/tajaran.dm
index cf99e0f4f5d..f5b70e434a8 100644
--- a/code/modules/sprite_accessories/facial_hair/tajaran_facial_hair.dm
+++ b/code/modules/sprite_accessories/facial_hair/tajaran.dm
@@ -1,35 +1,41 @@
/datum/sprite_accessory/facial_hair/taj_sideburns
name = "Tajaran Sideburns"
+ id = "fhair_tajaran_sideburns"
icon_state = "facial_sideburns"
species_allowed = list(SPECIES_TAJ)
apply_restrictions = TRUE
/datum/sprite_accessory/facial_hair/taj_mutton
name = "Tajaran Mutton"
+ id = "fhair_tajaran_mutton"
icon_state = "facial_mutton"
species_allowed = list(SPECIES_TAJ)
apply_restrictions = TRUE
/datum/sprite_accessory/facial_hair/taj_pencilstache
name = "Tajaran Pencilstache"
+ id = "fhair_tajaran_pencilstache"
icon_state = "facial_pencilstache"
species_allowed = list(SPECIES_TAJ)
apply_restrictions = TRUE
/datum/sprite_accessory/facial_hair/taj_moustache
name = "Tajaran Moustache"
+ id = "fhair_tajaran_moustache"
icon_state = "facial_moustache"
species_allowed = list(SPECIES_TAJ)
apply_restrictions = TRUE
/datum/sprite_accessory/facial_hair/taj_goatee
name = "Tajaran Goatee"
+ id = "fhair_tajaran_goatee"
icon_state = "facial_goatee"
species_allowed = list(SPECIES_TAJ)
apply_restrictions = TRUE
/datum/sprite_accessory/facial_hair/taj_smallstache
name = "Tajaran Smallsatche"
+ id = "fhair_tajaran_smallstache"
icon_state = "facial_smallstache"
species_allowed = list(SPECIES_TAJ)
apply_restrictions = TRUE
diff --git a/code/modules/sprite_accessories/facial_hair/teshari_facial_hair.dm b/code/modules/sprite_accessories/facial_hair/teshari.dm
similarity index 87%
rename from code/modules/sprite_accessories/facial_hair/teshari_facial_hair.dm
rename to code/modules/sprite_accessories/facial_hair/teshari.dm
index ecaede506f8..fdba2cc9fa9 100644
--- a/code/modules/sprite_accessories/facial_hair/teshari_facial_hair.dm
+++ b/code/modules/sprite_accessories/facial_hair/teshari.dm
@@ -2,6 +2,7 @@
/datum/sprite_accessory/facial_hair/teshari_beard
name = "Teshari Beard"
+ id = "fhair_teshari_chin"
icon_state = "teshari_chin"
species_allowed = list(SPECIES_TESHARI)
apply_restrictions = TRUE
@@ -9,6 +10,7 @@
/datum/sprite_accessory/facial_hair/teshari_scraggly
name = "Teshari Scraggly"
+ id = "fhair_teshari_scraggly"
icon_state = "teshari_scraggly"
species_allowed = list(SPECIES_TESHARI)
apply_restrictions = TRUE
@@ -16,6 +18,7 @@
/datum/sprite_accessory/facial_hair/teshari_chops
name = "Teshari Chops"
+ id = "fhair_teshari_chops"
icon_state = "teshari_gap"
species_allowed = list(SPECIES_TESHARI)
apply_restrictions = TRUE
diff --git a/code/modules/sprite_accessories/facial_hair/unathi_facial_hair.dm b/code/modules/sprite_accessories/facial_hair/unathi.dm
similarity index 84%
rename from code/modules/sprite_accessories/facial_hair/unathi_facial_hair.dm
rename to code/modules/sprite_accessories/facial_hair/unathi.dm
index 331aa7c543a..f05b1dbff7f 100644
--- a/code/modules/sprite_accessories/facial_hair/unathi_facial_hair.dm
+++ b/code/modules/sprite_accessories/facial_hair/unathi.dm
@@ -2,20 +2,24 @@
/datum/sprite_accessory/facial_hair/una_chinhorn
name = "Unathi Chin Horn"
+ id = "fhair_unathi_chin"
icon_state = "facial_chinhorns"
species_allowed = list(SPECIES_UNATHI)
/datum/sprite_accessory/facial_hair/una_hornadorns
name = "Unathi Horn Adorns"
+ id = "fhair_unathi_adorns"
icon_state = "facial_hornadorns"
species_allowed = list(SPECIES_UNATHI)
/datum/sprite_accessory/facial_hair/una_spinespikes
name = "Unathi Spine Spikes"
+ id = "fhair_unathi_spikes"
icon_state = "facial_spikes"
species_allowed = list(SPECIES_UNATHI)
/datum/sprite_accessory/facial_hair/una_dorsalfrill
name = "Unathi Dorsal Frill"
+ id = "fhair_unathi_dorsalfrill"
icon_state = "facial_dorsalfrill"
species_allowed = list(SPECIES_UNATHI)
diff --git a/code/modules/sprite_accessories/facial_hair/vox_facial_hair.dm b/code/modules/sprite_accessories/facial_hair/vox.dm
similarity index 87%
rename from code/modules/sprite_accessories/facial_hair/vox_facial_hair.dm
rename to code/modules/sprite_accessories/facial_hair/vox.dm
index 5192af0e075..647f2624697 100644
--- a/code/modules/sprite_accessories/facial_hair/vox_facial_hair.dm
+++ b/code/modules/sprite_accessories/facial_hair/vox.dm
@@ -2,36 +2,42 @@
/datum/sprite_accessory/facial_hair/vox_face_colonel
name = "Vox Colonel"
+ id = "fhair_vox_colonel"
icon_state = "vox_colonel"
species_allowed = list(SPECIES_VOX)
apply_restrictions = TRUE
/datum/sprite_accessory/facial_hair/vox_face_fu
name = "Quill Fu"
+ id = "fhair_vox_quillfu"
icon_state = "vox_fu"
species_allowed = list(SPECIES_VOX)
apply_restrictions = TRUE
/datum/sprite_accessory/facial_hair/vox_face_neck
name = "Neck Quills"
+ id = "fhair_vox_neck"
icon_state = "vox_neck"
species_allowed = list(SPECIES_VOX)
apply_restrictions = TRUE
/datum/sprite_accessory/facial_hair/vox_face_beard
name = "Quill Beard"
+ id = "fhair_vox_beard"
icon_state = "vox_beard"
species_allowed = list(SPECIES_VOX)
apply_restrictions = TRUE
/datum/sprite_accessory/facial_hair/vox_ruff_beard
name = "Ruff Beard"
+ id = "fhair_vox_ruff"
icon_state = "vox_ruff_beard"
species_allowed = list(SPECIES_VOX)
apply_restrictions = TRUE
/datum/sprite_accessory/facial_hair/vox_shaved_beard
name = "Vox Shaved"
+ id = "fhair_vox_shaved"
icon_state = "vox_bald"
species_allowed = list(SPECIES_VOX)
apply_restrictions = TRUE
diff --git a/code/modules/sprite_accessories/facial_hair/vulpakin_facial_hair.dm b/code/modules/sprite_accessories/facial_hair/vulpkanin.dm
similarity index 91%
rename from code/modules/sprite_accessories/facial_hair/vulpakin_facial_hair.dm
rename to code/modules/sprite_accessories/facial_hair/vulpkanin.dm
index 6665dfdb48a..3ec4b24b299 100644
--- a/code/modules/sprite_accessories/facial_hair/vulpakin_facial_hair.dm
+++ b/code/modules/sprite_accessories/facial_hair/vulpkanin.dm
@@ -1,5 +1,6 @@
/datum/sprite_accessory/facial_hair/vulp_none
name = "None"
+ id = "fhair_vulp_none"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "none"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
@@ -8,6 +9,7 @@
/datum/sprite_accessory/facial_hair/vulp_blaze
name = "Blaze"
+ id = "fhair_vulp_blaze"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "vulp_facial_blaze"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
@@ -16,6 +18,7 @@
/datum/sprite_accessory/facial_hair/vulp_vulpine
name = "Vulpine"
+ id = "fhair_vulp_vulpine"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "vulp_facial_vulpine"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
@@ -24,6 +27,7 @@
/datum/sprite_accessory/facial_hair/vulp_earfluff
name = "Earfluff"
+ id = "fhair_vulp_earfluff"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "vulp_facial_earfluff"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
@@ -32,6 +36,7 @@
/datum/sprite_accessory/facial_hair/vulp_mask
name = "Mask"
+ id = "fhair_vulp_mask"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "vulp_facial_mask"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
@@ -40,6 +45,7 @@
/datum/sprite_accessory/facial_hair/vulp_patch
name = "Patch"
+ id = "fhair_vulp_patch"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "vulp_facial_patch"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
@@ -48,6 +54,7 @@
/datum/sprite_accessory/facial_hair/vulp_ruff
name = "Ruff"
+ id = "fhair_vulp_ruff"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "vulp_facial_ruff"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
@@ -56,6 +63,7 @@
/datum/sprite_accessory/facial_hair/vulp_kita
name = "Kita"
+ id = "fhair_vulp_kita"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "vulp_facial_kita"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
@@ -64,6 +72,7 @@
/datum/sprite_accessory/facial_hair/vulp_swift
name = "Swift"
+ id = "fhair_vulp_swift"
icon = 'icons/mob/human_face_vr.dmi'
icon_state = "vulp_facial_swift"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
diff --git a/code/modules/sprite_accessories/hair/hair.dm b/code/modules/sprite_accessories/hair/_hair.dm
similarity index 70%
rename from code/modules/sprite_accessories/hair/hair.dm
rename to code/modules/sprite_accessories/hair/_hair.dm
index 7cf14c7b766..ef79dc15142 100644
--- a/code/modules/sprite_accessories/hair/hair.dm
+++ b/code/modules/sprite_accessories/hair/_hair.dm
@@ -7,946 +7,1118 @@
*/
/datum/sprite_accessory/hair
+ abstract_type = /datum/sprite_accessory/hair
icon = 'icons/mob/human_face_m.dmi' // default icon for all hairs
var/icon_add = 'icons/mob/human_face.dmi'
//Enhanced colours and hair for all
color_blend_mode = ICON_MULTIPLY
apply_restrictions = FALSE
- var/flags
+ var/hair_flags
/datum/sprite_accessory/hair/eighties
name = "80's"
+ id = "hair_80s"
icon_state = "hair_80s"
/datum/sprite_accessory/hair/fluffyshort
name = "Fluffy Short"
+ id = "hair_fluffyshort"
icon_state = "hair_fluffy_short"
/datum/sprite_accessory/hair/eighties_alt
name = "80's (Alternative)"
+ id = "hair_80s_alt"
icon_state = "hair_80s_alt"
/datum/sprite_accessory/hair/afro
name = "Afro"
+ id = "hair_afro"
icon_state = "hair_afro"
/datum/sprite_accessory/hair/afro2
name = "Afro 2"
+ id = "hair_afro2"
icon_state = "hair_afro2"
/datum/sprite_accessory/hair/afro_large
name = "Big Afro"
+ id = "hair_afro_big"
icon_state = "hair_bigafro"
/datum/sprite_accessory/hair/ahoge
name = "Ahoge"
+ id = "hair_ahoge"
icon_state = "hair_ahoge"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = null
/datum/sprite_accessory/hair/bald //Everyone goes bald.
name = "Bald"
+ id = "hair_bald"
icon_state = "bald"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/baldfade
name = "Balding Fade"
+ id = "hair_balding_fade"
icon_state = "hair_baldfade"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/balding
name = "Balding Hair"
+ id = "hair_balding"
icon_state = "hair_e"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/bedhead
name = "Bedhead"
+ id = "hair_bedhead"
icon_state = "hair_bedhead"
/datum/sprite_accessory/hair/bedhead2
name = "Bedhead 2"
+ id = "hair_bedhead2"
icon_state = "hair_bedheadv2"
/datum/sprite_accessory/hair/bedhead3
name = "Bedhead 3"
+ id = "hair_bedhead3"
icon_state = "hair_bedheadv3"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/bedheadlong
name = "Bedhead Long"
+ id = "hair_bedhead_long"
icon_state = "hair_long_bedhead"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/beehive
name = "Beehive"
+ id = "hair_beehive"
icon_state = "hair_beehive"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/beehive2
name = "Beehive 2"
+ id = "hair_beehive2"
icon_state = "hair_beehive2"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/belenko
name = "Belenko"
+ id = "hair_balenko"
icon_state = "hair_belenko"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/belenkotied
name = "Belenko Tied"
+ id = "hair_balenko_tied"
icon_state = "hair_belenkotied"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/bob
name = "Bob"
+ id = "hair_bob"
icon_state = "hair_bobcut"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/bobcutalt
name = "Bob Chin Length"
+ id = "hair_bob_chin"
icon_state = "hair_bobcutalt"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/bobcurl
name = "Bobcurl"
+ id = "hair_bob_curl"
icon_state = "hair_bobcurl"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/bowl
name = "Bowl"
+ id = "hair_bowlcut"
icon_state = "hair_bowlcut"
/datum/sprite_accessory/hair/bowlcut2
name = "Bowl 2"
+ id = "hair_bowlcut2"
icon_state = "hair_bowlcut2"
/datum/sprite_accessory/hair/grandebraid
name = "Braid Grande"
+ id = "hair_braid_grande"
icon_state = "hair_grande"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/braid2
name = "Braid Long"
+ id = "hair_braid_long"
icon_state = "hair_hbraid"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/mbraid
name = "Braid Medium"
+ id = "hair_braid_medium"
icon_state = "hair_shortbraid"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/braid
name = "Floorlength Braid"
+ id = "hair_braid_floorlength"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "hair_braid"
/datum/sprite_accessory/hair/bun
name = "Bun"
+ id = "hair_bun"
icon_state = "hair_bun"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/bun2
name = "Bun 2"
+ id = "hair_bun2"
icon_state = "hair_bun2"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/bun3
name = "Bun 3"
+ id = "hair_bun3"
icon_state = "hair_bun3"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/bun
name = "Bun Casual"
+ id = "hair_bun_casual"
icon_state = "hair_bun"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/doublebun
name = "Bun Double"
+ id = "hair_bun_double"
icon_state = "hair_doublebun"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/tightbun
name = "Bun Tight"
+ id = "hair_bun_tight"
icon_state = "hair_tightbun"
gender = FEMALE
- flags = HAIR_VERY_SHORT | HAIR_TIEABLE
+ hair_flags = HAIR_VERY_SHORT | HAIR_TIEABLE
/datum/sprite_accessory/hair/buzz
name = "Buzzcut"
+ id = "hair_buzzcut"
icon_state = "hair_buzzcut"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/crono
name = "Chrono"
+ id = "hair_chrono"
icon_state = "hair_toriyama"
/datum/sprite_accessory/hair/cia
name = "CIA"
+ id = "hair_cia"
icon_state = "hair_cia"
/datum/sprite_accessory/hair/coffeehouse
name = "Coffee House Cut"
+ id = "hair_coffeehouse"
icon_state = "hair_coffeehouse"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/combover
name = "Combover"
+ id = "hair_combover"
icon_state = "hair_combover"
/datum/sprite_accessory/hair/country
name = "Country"
+ id = "hair_country"
icon_state = "hair_country"
/datum/sprite_accessory/hair/crew
name = "Crewcut"
+ id = "hair_crewcut"
icon_state = "hair_crewcut"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/curls
name = "Curls"
+ id = "hair_curls"
icon_state = "hair_curls"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/cut
name = "Cut Hair"
+ id = "hair_cut"
icon_state = "hair_c"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/dave
name = "Dave"
+ id = "hair_dave"
icon_state = "hair_dave"
/datum/sprite_accessory/hair/devillock
name = "Devil Lock"
+ id = "hair_devillock"
icon_state = "hair_devilock"
/datum/sprite_accessory/hair/dreadlocks
name = "Dreadlocks"
+ id = "hair_dreadlocks"
icon_state = "hair_dreads"
/datum/sprite_accessory/hair/mahdrills
name = "Drillruru"
+ id = "hair_drillruru"
icon_state = "hair_drillruru"
/datum/sprite_accessory/hair/emo
name = "Emo"
+ id = "hair_emo"
icon_state = "hair_emo"
/datum/sprite_accessory/hair/emo2
name = "Emo Alt"
+ id = "hair_emo_alt"
icon_state = "hair_emo2"
/datum/sprite_accessory/hair/fringeemo
name = "Emo Fringe"
+ id = "hair_emo_fringe"
icon_state = "hair_emofringe"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/halfshaved
name = "Emo Half-Shaved"
+ id = "hair_emo_halfshave"
icon_state = "hair_halfshaved"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/longemo
name = "Emo Long"
+ id = "hair_emo_long"
icon_state = "hair_emolong"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/highfade
name = "Fade High"
+ id = "hair_fade_high"
icon_state = "hair_highfade"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/medfade
name = "Fade Medium"
+ id = "hair_fade_medium"
icon_state = "hair_medfade"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/lowfade
name = "Fade Low"
+ id = "hair_fade_low"
icon_state = "hair_lowfade"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/partfade
name = "Fade Parted"
+ id = "hair_fade_parted"
icon_state = "hair_shavedpart"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/familyman
name = "Family Man"
+ id = "hair_familyman"
icon_state = "hair_thefamilyman"
/datum/sprite_accessory/hair/father
name = "Father"
+ id = "hair_father"
icon_state = "hair_father"
/datum/sprite_accessory/hair/feather
name = "Feather"
+ id = "hair_feather"
icon_state = "hair_feather"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/flair
name = "Flaired Hair"
+ id = "hair_flair"
icon_state = "hair_flair"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/sargeant
name = "Flat Top"
+ id = "hair_sargeant"
icon_state = "hair_sargeant"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/flowhair
name = "Flow Hair"
+ id = "hair_flow"
icon_state = "hair_f"
/datum/sprite_accessory/hair/longfringe
name = "Fringe Long"
+ id = "hair_fringe_long"
icon_state = "hair_longfringe"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/longestalt
name = "Fringe Longer"
+ id = "hair_fringe_verylong"
icon_state = "hair_vlongfringe"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/fringetail
name = "Fringetail"
+ id = "hair_fringe_tail"
icon_state = "hair_fringetail"
- flags = HAIR_TIEABLE|HAIR_VERY_SHORT
+ hair_flags = HAIR_TIEABLE|HAIR_VERY_SHORT
/datum/sprite_accessory/hair/gelled
name = "Gelled Back"
+ id = "hair_gelled"
icon_state = "hair_gelled"
/datum/sprite_accessory/hair/gentle
name = "Gentle"
+ id = "hair_gentle"
icon_state = "hair_gentle"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/glossy
name = "Glossy"
+ id = "hair_glossy"
icon_state = "hair_glossy"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/halfbang
name = "Half-banged Hair"
+ id = "hair_halfbang"
icon_state = "hair_halfbang"
/datum/sprite_accessory/hair/halfbangalt
name = "Half-banged Hair Alt"
+ id = "hair_halfbang_alt"
icon_state = "hair_halfbang_alt"
/datum/sprite_accessory/hair/hedgehog
name = "Hedgehog Hair"
+ id = "hair_hedgehog"
icon_state = "hair_hedgehog"
icon_add = null
/datum/sprite_accessory/hair/hightight
name = "High and Tight"
+ id = "hair_hightight"
icon_state = "hair_hightight"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/himecut
name = "Hime Cut"
+ id = "hair_hime"
icon_state = "hair_himecut"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/shorthime
name = "Hime Cut Short"
+ id = "hair_hime_short"
icon_state = "hair_shorthime"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/hitop
name = "Hitop"
+ id = "hair_hitop"
icon_state = "hair_hitop"
/datum/sprite_accessory/hair/jade
name = "Jade"
+ id = "hair_jade"
icon_state = "hair_jade"
/datum/sprite_accessory/hair/jensen
name = "Jensen"
+ id = "hair_jensen"
icon_state = "hair_jensen"
/datum/sprite_accessory/hair/joestar
name = "Joestar"
+ id = "hair_joestar"
icon_state = "hair_joestar"
/datum/sprite_accessory/hair/kagami
name = "Kagami"
+ id = "hair_kagami"
icon_state = "hair_kagami"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/kusangi
name = "Kusanagi Hair"
+ id = "hair_kusanagi"
icon_state = "hair_kusanagi"
/datum/sprite_accessory/hair/long
name = "Long Hair Shoulder-length"
+ id = "hair_long_shoulder"
icon_state = "hair_b"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/*
longish
name = "Longer Hair"
icon_state = "hair_b2"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
*/
/datum/sprite_accessory/hair/longer
name = "Long Hair"
+ id = "hair_long"
icon_state = "hair_vlong"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/longeralt2
name = "Long Hair Alt 2"
+ id = "hair_long_alt"
icon_state = "hair_longeralt2"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/longest
name = "Very Long Hair"
+ id = "hair_verylong"
icon_state = "hair_longest"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/manbun
name = "Manbun"
+ id = "hair_manbun"
icon_state = "hair_manbun"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/modern
name = "Modern"
+ id = "hair_modern"
icon_state = "hair_modern"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/mohawk
name = "Mohawk"
+ id = "hair_mohawk"
icon_state = "hair_d"
/datum/sprite_accessory/hair/regulationmohawk
name = "Mohawk Regulation"
+ id = "hair_mohawk_regulation"
icon_state = "hair_shavedmohawk"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/reversemohawk
name = "Mohawk Reverse"
+ id = "hair_mohawk_reverse"
icon_state = "hair_reversemohawk"
/datum/sprite_accessory/hair/messy
name = "Messy"
+ id = "hair_messy"
icon_state = "hair_messy_tg"
icon_add = null
/datum/sprite_accessory/hair/mohawkunshaven
name = "Mohawk Unshaven"
+ id = "hair_mohawk_unshaven"
icon_state = "hair_unshaven_mohawk"
/datum/sprite_accessory/hair/mulder
name = "Mulder"
+ id = "hair_mulder"
icon_state = "hair_mulder"
/datum/sprite_accessory/hair/newyou
name = "New You"
+ id = "hair_newyou"
icon_state = "hair_newyou"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/nia
name = "Nia"
+ id = "hair_nia"
icon_state = "hair_nia"
/datum/sprite_accessory/hair/nitori
name = "Nitori"
+ id = "hair_nitori"
icon_state = "hair_nitori"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/odango
name = "Odango"
+ id = "hair_odango"
icon_state = "hair_odango"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/ombre
name = "Ombre"
+ id = "hair_ombre"
icon_state = "hair_ombre"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/oxton
name = "Oxton"
+ id = "hair_oxton"
icon_state = "hair_oxton"
/datum/sprite_accessory/hair/longovereye
name = "Overeye Long"
+ id = "hair_overeye_long"
icon_state = "hair_longovereye"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/shortovereye
name = "Overeye Short"
+ id = "hair_overeye_short"
icon_state = "hair_shortovereye"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/veryshortovereyealternate
name = "Overeye Very Short, Alternate"
+ id = "hair_overeye_veryshort_alt"
icon_state = "hair_veryshortovereyealternate"
/datum/sprite_accessory/hair/veryshortovereye
name = "Overeye Very Short"
+ id = "hair_overeye_veryshort"
icon_state = "hair_veryshortovereye"
/datum/sprite_accessory/hair/parted
name = "Parted"
+ id = "hair_parted"
icon_state = "hair_parted"
/datum/sprite_accessory/hair/partedalt
name = "Parted Alt"
+ id = "hair_parted_alt"
icon_state = "hair_partedalt"
/datum/sprite_accessory/hair/pompadour
name = "Pompadour"
+ id = "hair_pompadour"
icon_state = "hair_pompadour"
/datum/sprite_accessory/hair/dandypomp
name = "Pompadour Dandy"
+ id = "hair_pompadour_dandy"
icon_state = "hair_dandypompadour"
/datum/sprite_accessory/hair/ponytail1
name = "Ponytail 1"
+ id = "hair_ponytail"
icon_state = "hair_ponytail"
- flags = HAIR_TIEABLE|HAIR_VERY_SHORT
+ hair_flags = HAIR_TIEABLE|HAIR_VERY_SHORT
/datum/sprite_accessory/hair/ponytail2
name = "Ponytail 2"
+ id = "hair_ponytail2"
icon_state = "hair_pa"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/ponytail3
name = "Ponytail 3"
+ id = "hair_ponytail3"
icon_state = "hair_ponytail3"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/ponytail4
name = "Ponytail 4"
+ id = "hair_ponytail4"
icon_state = "hair_ponytail4"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/ponytail5
name = "Ponytail 5"
+ id = "hair_ponytail5"
icon_state = "hair_ponytail5"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/ponytail6
name = "Ponytail 6"
+ id = "hair_ponytail6"
icon_state = "hair_ponytail6"
- flags = HAIR_TIEABLE|HAIR_VERY_SHORT
+ hair_flags = HAIR_TIEABLE|HAIR_VERY_SHORT
/datum/sprite_accessory/hair/ponytail6_fixed //Eggnerd's done with waiting for upstream fixes lmao.
name = "Ponytail 6 but fixed"
+ id = "hair_ponytail6_alt"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "hair_ponytail6"
/datum/sprite_accessory/hair/sharpponytail
name = "Ponytail Sharp"
+ id = "hair_ponytail_sharp"
icon_state = "hair_sharpponytail"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/spikyponytail
name = "Ponytail Spiky"
+ id = "hair_ponytail_spiky"
icon_state = "hair_spikyponytail"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/highponytail
name = "High Ponytail"
+ id = "hair_ponytail_high"
icon_state = "hair_highponytail"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/poofy
name = "Poofy"
+ id = "hair_poofy"
icon_state = "hair_poofy"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/poofy2
name = "Poofy 2"
+ id = "hair_poofy2"
icon_state = "hair_poofy2"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/quiff
name = "Quiff"
+ id = "hair_quiff"
icon_state = "hair_quiff"
/datum/sprite_accessory/hair/nofade
name = "Regulation Cut"
+ id = "hair_regulation"
icon_state = "hair_nofade"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/ronin
name = "Ronin"
+ id = "hair_ronin"
icon_state = "hair_ronin"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/rosa
name = "Rosa"
+ id = "hair_rosa"
icon_state = "hair_rosa"
/datum/sprite_accessory/hair/rows
name = "Rows"
+ id = "hair_row"
icon_state = "hair_rows1"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/rows2
name = "Rows 2"
+ id = "hair_row2"
icon_state = "hair_rows2"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/rowbun
name = "Row Bun"
+ id = "hair_row_bun"
icon_state = "hair_rowbun"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/rowdualbraid
name = "Row Dual Braid"
+ id = "hair_row_braid_dual"
icon_state = "hair_rowdualtail"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/rowbraid
name = "Row Braid"
+ id = "hair_row_braid"
icon_state = "hair_rowbraid"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/scully
name = "Scully"
+ id = "hair_scully"
icon_state = "hair_scully"
/datum/sprite_accessory/hair/shavehair
name = "Shaved Hair"
+ id = "hair_shaved"
icon_state = "hair_shaved"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/shortbangs
name = "Short Bangs"
+ id = "hair_bangs_short"
icon_state = "hair_shortbangs"
/datum/sprite_accessory/hair/short
name = "Short Hair" // try to capatilize the names please~
+ id = "hair_short"
icon_state = "hair_a" // you do not need to define _s or _l sub-states, game automatically does this for you
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/short2
name = "Short Hair 2"
+ id = "hair_short2"
icon_state = "hair_shorthair3"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/shortalt2
name = "Short Hair 2 Alt"
+ id = "hair_short2_alt"
icon_state = "shorthair3a"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
/datum/sprite_accessory/hair/short3
name = "Short Hair 3"
+ id = "hair_short3"
icon_state = "hair_shorthair4"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/shy
name = "Shy"
+ id = "hair_fluttershy" // let's be brutally honest about what htis is
icon_state = "hair_shy"
/datum/sprite_accessory/hair/sideponytail
name = "Side Ponytail"
+ id = "hair_ponytail_side"
icon_state = "hair_stail"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/sideponytail4 //Not happy about this... but it's for the save files.
name = "Side Ponytail 2"
+ id = "hair_ponytail_side2"
icon_state = "hair_ponytailf"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/sideponytail2
name = "Shoulder One"
+ id = "hair_shoulder_one"
icon_state = "hair_oneshoulder"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/sideponytail3
name = "Shoulder Tress"
+ id = "hair_shoulder_tress"
icon_state = "hair_tressshoulder"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/skinhead
name = "Skinhead"
+ id = "hair_skinhead"
icon_state = "hair_skinhead"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/sleeze
name = "Sleeze"
+ id = "hair_sleaze"
icon_state = "hair_sleeze"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/spiky
name = "Spiky"
+ id = "hair_spiky"
icon_state = "hair_spikey"
/datum/sprite_accessory/hair/thinning
name = "Thinning"
+ id = "hair_thinning"
icon_state = "hair_thinning"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/thinningfront
name = "Thinning Front"
+ id = "hair_thinning_front"
icon_state = "hair_thinningfront"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/thinningback
name = "Thinning Back"
+ id = "hair_thinning_back"
icon_state = "hair_thinningrear"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/topknot
name = "Topknot"
+ id = "hair_topknot"
icon_state = "hair_topknot"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/trimflat
name = "Trimmed Flat Top"
+ id = "hair_trimmed_flat"
icon_state = "hair_trimflat"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/jade
name = "Jade"
+ id = "hair_jade"
icon_state = "hair_jade"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/trimmed
name = "Trimmed"
+ id = "hair_trimmed"
icon_state = "hair_trimmed"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/twintai1
name = "Twintail"
+ id = "hair_twintails"
icon_state = "hair_twintail"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/twintail2
name = "Twintail Short"
+ id = "hair_twintails_short"
icon_state = "hair_twintailshort"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/undercut1
name = "Undercut"
+ id = "hair_undercut"
icon_state = "hair_undercut1"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/undercut2
name = "Undercut Swept Right"
+ id = "hair_undercut_right"
icon_state = "hair_undercut2"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/undercut3
name = "Undercut Swept Left"
+ id = "hair_undercut_left"
icon_state = "hair_undercut3"
gender = MALE
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/undercutlong
name = "Undercut Long"
+ id = "hair_undercut_long"
icon_state = "hair_undercutlong"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/unkept
name = "Unkept"
+ id = "hair_upkept"
icon_state = "hair_unkept"
/datum/sprite_accessory/hair/updo
name = "Updo"
+ id = "hair_updo"
icon_state = "hair_updo"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/vegeta
name = "Vegeta"
+ id = "hair_vegeta"
icon_state = "hair_toriyama2"
/datum/sprite_accessory/hair/volaju
name = "Volaju"
+ id = "hair_volaju"
icon_state = "hair_volaju"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/wisp
name = "Wisp"
+ id = "hair_wisp"
icon_state = "hair_wisp"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/zieglertail
name = "Zieglertail"
+ id = "hair_ziegler"
icon_state = "hair_ziegler"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/glossy
name = "Glossy"
+ id = "hair_glossy"
icon_state = "hair_glossy"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/sharpponytail
name = "Ponytail Sharp"
+ id = "hair_ponytail_sharp"
icon_state = "hair_sharpponytail"
- flags = HAIR_TIEABLE
-
-/datum/sprite_accessory/hair/newyou
- name = "New You"
- icon_state = "hair_newyou"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/partedalt
name = "Parted Alt"
+ id = "hair_parted2"
icon_state = "hair_partedalt"
/datum/sprite_accessory/hair/amazon
name = "Amazon"
+ id = "hair_amazon"
icon_state = "hair_amazon"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/straightlong
name = "Straight Long"
+ id = "hair_long_straight"
icon_state = "hair_straightlong"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/marysue
name = "Mary Sue"
+ id = "hair_marysue"
icon_state = "hair_marysue"
/datum/sprite_accessory/hair/sideundercut
name = "Side Undercut"
+ id = "hair_undercut_side"
icon_state = "hair_sideundercut"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/donutbun
name = "Donut Bun"
+ id = "hair_bun_donut"
icon_state = "hair_donutbun"
/datum/sprite_accessory/hair/gentle2
name = "Gentle 2, Long"
+ id = "hair_gentle2"
icon_state = "hair_gentle2long"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/sweepshave
name = "Sweep Shave"
+ id = "hair_sweepshave"
icon_state = "hair_sweepshave"
/datum/sprite_accessory/hair/beachwave
name = "Beach Waves"
+ id = "hair_beachwave"
icon_state = "hair_beachwave"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/celebcurls
name = "Celeb Curls"
+ id = "hair_curls_celeb"
icon_state = "hair_celebcurls"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/bigcurls
name = "Big Curls"
+ id = "hair_curls_big"
icon_state = "hair_bigcurls"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/jessica
name = "Jessica"
+ id = "hair_jessica"
icon_state = "hair_jessica"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/proper
name = "Proper"
+ id = "hair_proper"
icon_state = "hair_proper"
/datum/sprite_accessory/hair/himeup
name = "Hime Updo"
+ id = "hair_hime_updo"
icon_state = "hair_himeup"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/front_braid
name = "Braided front"
+ id = "hair_braid_front"
icon_state = "hair_braidfront"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/antenna
name = "Antenna"
+ id = "hair_antenna"
icon_state = "hair_antenna"
/datum/sprite_accessory/hair/protagonist
name = "Slightly Long"
+ id = "hair_protagonist"
icon_state = "hair_protagonist"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/braidtail
name = "Braided Tail"
+ id = "hair_braid_tail"
icon_state = "hair_braidtail"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/business
name = "Business Hair"
+ id = "hair_business"
icon_state = "hair_business"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/business3
name = "Business Hair 3"
+ id = "hair_business3"
icon_state = "hair_business3"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/business4
name = "Business Hair 4"
+ id = "hair_business4"
icon_state = "hair_business4"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/sidepartlongalt
name = "Long Side Part"
+ id = "hair_sidepart_long"
icon_state = "hair_longsidepart"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/miles
name = "Miles Hair"
+ id = "hair_miles"
icon_state = "hair_miles"
/datum/sprite_accessory/hair/vivi
name = "Vivi"
+ id = "hair_vivi"
icon_state = "hair_vivi"
/datum/sprite_accessory/hair/taro
name = "Taro"
+ id = "hair_taro"
icon_state = "hair_taro"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/astolfo
name = "Astolfo"
+ id = "hair_astolfo"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "hair_astolfo"
/datum/sprite_accessory/hair/awoohair
name = "Shoulder-length Messy"
+ id = "hair_messy_shoulder"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "momijihair"
-/datum/sprite_accessory/hair/citheronia
- name = "Citheronia Hair (Kira72)"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_state = "citheronia_hair"
- ckeys_allowed = list("Kira72")
- do_colouration = 0
-
-/datum/sprite_accessory/hair/taramaw
- name = "Hairmaw (Liquidfirefly)"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_state = "maw_hair"
- ckeys_allowed = list("liquidfirefly")
- do_colouration = 0
-
/datum/sprite_accessory/hair/citheronia_colorable
name = "Citheronia Hair"
+ id = "hair_citheronia"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "citheronia_hair_c"
@@ -954,46 +1126,53 @@
/datum/sprite_accessory/hair/twindrills
name = "Twin Drills"
+ id = "hair_twindrills"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "hair_twincurl"
/datum/sprite_accessory/hair/myopia
name = "Myopia"
+ id = "hair_myopia"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "myopia"
- flags = HAIR_VERY_SHORT
+ hair_flags = HAIR_VERY_SHORT
/datum/sprite_accessory/hair/shortish
name = "Shortish"
+ id = "hair_shortish"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "bshort-1"
/datum/sprite_accessory/hair/shortmess
name = "Short Mess"
+ id = "hair_short_mess"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "bshort-2"
/datum/sprite_accessory/hair/peaked
name = "Peaked"
+ id = "hair_peaked"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "bshort-3"
/datum/sprite_accessory/hair/blindbangs
name = "Blind Bangs"
+ id = "hair_bangs_blind"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "blindbangs"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
/datum/sprite_accessory/hair/reallyblindbangs
name = "Grudge"
+ id = "hair_grudge"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "grudge"
- flags = HAIR_TIEABLE
+ hair_flags = HAIR_TIEABLE
diff --git a/code/modules/sprite_accessories/hair/sergal_hair.dm b/code/modules/sprite_accessories/hair/sergal.dm
similarity index 90%
rename from code/modules/sprite_accessories/hair/sergal_hair.dm
rename to code/modules/sprite_accessories/hair/sergal.dm
index 75aba7cb483..c1efc05b4c4 100644
--- a/code/modules/sprite_accessories/hair/sergal_hair.dm
+++ b/code/modules/sprite_accessories/hair/sergal.dm
@@ -2,6 +2,7 @@
/datum/sprite_accessory/hair/ergal_plain
name = "Sergal Plain"
+ id = "hair_sergal_plain"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "serg_plain"
@@ -10,6 +11,7 @@
/datum/sprite_accessory/hair/sergal_medicore
name = "Sergal Medicore"
+ id = "hair_sergal_medicore"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "serg_medicore"
@@ -18,6 +20,7 @@
/datum/sprite_accessory/hair/sergal_tapered
name = "Sergal Tapered"
+ id = "hair_sergal_tapered"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "serg_tapered"
@@ -26,6 +29,7 @@
/datum/sprite_accessory/hair/sergal_fairytail
name = "Sergal Fairytail"
+ id = "hair_sergal_fairytail"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "serg_fairytail"
diff --git a/code/modules/sprite_accessories/hair/shadekin.dm b/code/modules/sprite_accessories/hair/shadekin.dm
index 2d21ba5bd17..7b64c9be2cc 100644
--- a/code/modules/sprite_accessories/hair/shadekin.dm
+++ b/code/modules/sprite_accessories/hair/shadekin.dm
@@ -1,38 +1,31 @@
// Shadekin stuffs
/datum/sprite_accessory/hair/shadekin_hair_short
- name = "Shadekin Short Hair"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "shadekin_short"
- species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
- apply_restrictions = TRUE
- gender = NEUTER
+ name = "Shadekin Short Hair"
+ id = "hair_shadekin_short"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "shadekin_short"
+ species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
+ apply_restrictions = TRUE
+ gender = NEUTER
/datum/sprite_accessory/hair/shadekin_hair_poofy
- name = "Shadekin Poofy Hair"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "shadekin_poofy"
- species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
- apply_restrictions = TRUE
- gender = NEUTER
+ name = "Shadekin Poofy Hair"
+ id = "hair_shadekin_poofy"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "shadekin_poofy"
+ species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
+ apply_restrictions = TRUE
+ gender = NEUTER
/datum/sprite_accessory/hair/shadekin_hair_long
- name = "Shadekin Long Hair"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "shadekin_long"
- species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/shadekin_hair_rivyr
- name = "Rivyr Hair"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "shadekin_rivyr"
- ckeys_allowed = list("verysoft")
- species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
- apply_restrictions = TRUE
- gender = NEUTER
+ name = "Shadekin Long Hair"
+ id = "hair_shadekin_long"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "shadekin_long"
+ species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
+ apply_restrictions = TRUE
+ gender = NEUTER
diff --git a/code/modules/sprite_accessories/hair/skrell_hair.dm b/code/modules/sprite_accessories/hair/skrell.dm
similarity index 81%
rename from code/modules/sprite_accessories/hair/skrell_hair.dm
rename to code/modules/sprite_accessories/hair/skrell.dm
index ecd2b46f364..42578625bb7 100644
--- a/code/modules/sprite_accessories/hair/skrell_hair.dm
+++ b/code/modules/sprite_accessories/hair/skrell.dm
@@ -1,19 +1,23 @@
//Skrell stuff
/datum/sprite_accessory/hair/skr_tentacle_veryshort
name = "Skrell Very Short Tentacles"
+ id = "hair_skrell_tentacles_veryshort"
icon_state = "skrell_hair_veryshort"
gender = MALE
/datum/sprite_accessory/hair/skr_tentacle_short
name = "Skrell Short Tentacles"
+ id = "hair_skrell_tentacles_short"
icon_state = "skrell_hair_short"
species_allowed = list(SPECIES_SKRELL, SPECIES_XENOCHIMERA, SPECIES_PROTEAN, SPECIES_CUSTOM, SPECIES_PROMETHEAN)
/datum/sprite_accessory/hair/skr_tentacle_average
name = "Skrell Average Tentacles"
+ id = "hair_skrell_tentacles_average"
icon_state = "skrell_hair_average"
/datum/sprite_accessory/hair/skr_tentacle_verylong
name = "Skrell Long Tentacles"
+ id = "hair_skrell_tentacles_long"
icon_state = "skrell_hair_verylong"
gender = FEMALE
diff --git a/code/modules/sprite_accessories/hair/tajaran_hair.dm b/code/modules/sprite_accessories/hair/tajaran.dm
similarity index 91%
rename from code/modules/sprite_accessories/hair/tajaran_hair.dm
rename to code/modules/sprite_accessories/hair/tajaran.dm
index 8108939a439..655670b22c6 100644
--- a/code/modules/sprite_accessories/hair/tajaran_hair.dm
+++ b/code/modules/sprite_accessories/hair/tajaran.dm
@@ -1,102 +1,119 @@
//Tajaran hairstyles
/datum/sprite_accessory/hair/taj_ears
name = "Tajaran Ears"
+ id = "hair_tajaran_ears"
icon_state = "ears_plain"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_clean
name = "Tajara Clean"
+ id = "hair_tajaran_clean"
icon_state = "hair_clean"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_bangs
name = "Tajara Bangs"
+ id = "hair_tajaran_bangs"
icon_state = "hair_bangs"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_braid
name = "Tajara Braid"
+ id = "hair_tajaran_braid"
icon_state = "hair_tbraid"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_shaggy
name = "Tajara Shaggy"
+ id = "hair_tajaran_shaggy"
icon_state = "hair_shaggy"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_mohawk
name = "Tajaran Mohawk"
+ id = "hair_tajaran_mohawk"
icon_state = "hair_mohawk"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_plait
name = "Tajara Plait"
+ id = "hair_tajaran_plait"
icon_state = "hair_plait"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_straight
name = "Tajara Straight"
+ id = "hair_tajaran_straight"
icon_state = "hair_straight"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_long
name = "Tajara Long"
+ id = "hair_tajaran_long"
icon_state = "hair_long"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_rattail
name = "Tajara Rat Tail"
+ id = "hair_tajaran_tail_rat"
icon_state = "hair_rattail"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_spiky
name = "Tajara Spiky"
+ id = "hair_tajaran_spiky"
icon_state = "hair_tajspiky"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_messy
name = "Tajara Messy"
+ id = "hair_tajaran_messy"
icon_state = "hair_messy"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_curls
name = "Tajaran Curly"
+ id = "hair_tajaran_curly"
icon_state = "hair_curly"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_wife
name = "Tajaran Housewife"
+ id = "hair_tajaran_wife"
icon_state = "hair_wife"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_victory
name = "Tajaran Victory Curls"
+ id = "hair_tajaran_victory"
icon_state = "hair_victory"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/taj_ears_bob
name = "Tajaran Bob"
+ id = "hair_tajaran_bob"
icon_state = "hair_tbob"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
-
+
/datum/sprite_accessory/hair/taj_ears_fingercurl
name = "Tajaran Finger Curls"
+ id = "hair_tajaran_fingerwave"
icon_state = "hair_fingerwave"
species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN, SPECIES_CUSTOM)
apply_restrictions = TRUE
diff --git a/code/modules/sprite_accessories/hair/teshari_hair.dm b/code/modules/sprite_accessories/hair/teshari.dm
similarity index 88%
rename from code/modules/sprite_accessories/hair/teshari_hair.dm
rename to code/modules/sprite_accessories/hair/teshari.dm
index 84ef031e3b3..cd2aab525d9 100644
--- a/code/modules/sprite_accessories/hair/teshari_hair.dm
+++ b/code/modules/sprite_accessories/hair/teshari.dm
@@ -1,6 +1,7 @@
//Teshari things
/datum/sprite_accessory/hair/teshari
name = "Teshari Default"
+ id = "hair_teshari_default"
icon_state = "teshari_default"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -8,6 +9,7 @@
/datum/sprite_accessory/hair/teshari_altdefault
name = "Teshari Alt. Default"
+ id = "hair_teshari_default_alt"
icon_state = "teshari_ears"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -15,6 +17,7 @@
/datum/sprite_accessory/hair/teshari_tight
name = "Teshari Tight"
+ id = "hair_teshari_tight"
icon_state = "teshari_tight"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -22,6 +25,7 @@
/datum/sprite_accessory/hair/teshari_excited
name = "Teshari Spiky"
+ id = "hair_teshari_spiky"
icon_state = "teshari_spiky"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -29,6 +33,7 @@
/datum/sprite_accessory/hair/teshari_spike
name = "Teshari Spike"
+ id = "hair_teshari_spike"
icon_state = "teshari_spike"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -36,6 +41,7 @@
/datum/sprite_accessory/hair/teshari_long
name = "Teshari Overgrown"
+ id = "hair_teshari_long"
icon_state = "teshari_long"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -43,6 +49,7 @@
/datum/sprite_accessory/hair/teshari_burst
name = "Teshari Starburst"
+ id = "hair_teshari_burst"
icon_state = "teshari_burst"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -50,6 +57,7 @@
/datum/sprite_accessory/hair/teshari_shortburst
name = "Teshari Short Starburst"
+ id = "hair_teshari_burst_short"
icon_state = "teshari_burst_short"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -57,6 +65,7 @@
/datum/sprite_accessory/hair/teshari_mohawk
name = "Teshari Mohawk"
+ id = "hair_teshari_mohawk"
icon_state = "teshari_mohawk"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -64,6 +73,7 @@
/datum/sprite_accessory/hair/teshari_pointy
name = "Teshari Pointy"
+ id = "hair_teshari_pointy"
icon_state = "teshari_pointy"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -71,6 +81,7 @@
/datum/sprite_accessory/hair/teshari_upright
name = "Teshari Upright"
+ id = "hair_teshari_upright"
icon_state = "teshari_upright"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -78,6 +89,7 @@
/datum/sprite_accessory/hair/teshari_mane
name = "Teshari Mane"
+ id = "hair_teshari_mane"
icon_state = "teshari_mane"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -85,6 +97,7 @@
/datum/sprite_accessory/hair/teshari_droopy
name = "Teshari Droopy"
+ id = "hair_teshari_droopy"
icon_state = "teshari_droopy"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -92,6 +105,7 @@
/datum/sprite_accessory/hair/teshari_mushroom
name = "Teshari Mushroom"
+ id = "hair_teshari_mushroom"
icon_state = "teshari_mushroom"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -99,6 +113,7 @@
/datum/sprite_accessory/hair/teshari_twies
name = "Teshari Twies"
+ id = "hair_teshari_twies"
icon_state = "teshari_twies"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -106,6 +121,7 @@
/datum/sprite_accessory/hair/teshari_backstrafe
name = "Teshari Backstrafe"
+ id = "hair_teshari_backstrafe"
icon_state = "teshari_backstrafe"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -113,6 +129,7 @@
/datum/sprite_accessory/hair/teshari_longway
name = "Teshari Long way"
+ id = "hair_teshari_longway"
icon_state = "teshari_longway"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -120,6 +137,7 @@
/datum/sprite_accessory/hair/teshari_tree
name = "Teshari Tree"
+ id = "hair_teshari_tree"
icon_state = "teshari_tree"
icon_add = 'icons/mob/human_face_vr_add.dmi'
species_allowed = list(SPECIES_TESHARI)
@@ -127,6 +145,7 @@
/datum/sprite_accessory/hair/teshari_fluffymohawk
name = "Teshari Fluffy Mohawk"
+ id = "hair_teshari_mohawk_fluffy"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "teshari_fluffymohawk"
@@ -135,6 +154,7 @@
/datum/sprite_accessory/hair/teshari_sleek
name = "Teshari Sleek"
+ id = "hair_teshari_sleek"
icon_state = "teshari_sleek"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -142,6 +162,7 @@
/datum/sprite_accessory/hair/teshari_thepeel
name = "Teshari 'The Peel'"
+ id = "hair_teshari_peel"
icon_state = "teshari_peel"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -149,6 +170,7 @@
/datum/sprite_accessory/hair/teshari_sweptup
name = "Teshari Swept Up"
+ id = "hair_teshari_swept_up"
icon_state = "teshari_sweep"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -156,6 +178,7 @@
/datum/sprite_accessory/hair/teshari_aerodynamic
name = "Teshari Aerodynamic"
+ id = "hair_teshari_aerodynamic"
icon_state = "teshari_aerodynamic"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -163,6 +186,7 @@
/datum/sprite_accessory/hair/teshari_tallmohawk
name = "Teshari Tall Mohawk"
+ id = "hair_teshari_mohawk_tall"
icon_state = "teshari_tallmohawk"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -170,6 +194,7 @@
/datum/sprite_accessory/hair/teshari_cowlick
name = "Teshari Cow-lick"
+ id = "hair_teshari_cowlick"
icon_state = "teshari_cowlick"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -177,6 +202,7 @@
/datum/sprite_accessory/hair/teshari_spikyalt
name = "Teshari Spiky alt"
+ id = "hair_teshari_spiky_alt"
icon_state = "teshari_spiky2"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -184,6 +210,7 @@
/datum/sprite_accessory/hair/teshari_soap
name = "Teshari Soap"
+ id = "hair_teshari_soap"
icon_state = "teshari_soap"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -191,6 +218,7 @@
/datum/sprite_accessory/hair/teshari_crowned
name = "Teshari Crowned"
+ id = "hair_teshari_crowned"
icon_state = "teshari_crowned"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -198,6 +226,7 @@
/datum/sprite_accessory/hair/teshari_crest
name = "Teshari Crest"
+ id = "hair_teshari_crest"
icon_state = "teshari_crest"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -205,6 +234,7 @@
/datum/sprite_accessory/hair/teshari_ponytail
name = "Teshari Feather Ponytail"
+ id = "hair_teshari_ponytail"
icon_state = "teshari_ponytail"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
@@ -212,6 +242,7 @@
/datum/sprite_accessory/hair/teshari_bun
name = "Teshari Feather Bun"
+ id = "hair_teshari_bun"
icon_state = "teshari_bun"
color_blend_mode = ICON_ADD
species_allowed = list(SPECIES_TESHARI)
diff --git a/code/modules/sprite_accessories/hair/unathi_hair.dm b/code/modules/sprite_accessories/hair/unathi.dm
similarity index 87%
rename from code/modules/sprite_accessories/hair/unathi_hair.dm
rename to code/modules/sprite_accessories/hair/unathi.dm
index 70fb591b396..d54c17ac800 100644
--- a/code/modules/sprite_accessories/hair/unathi_hair.dm
+++ b/code/modules/sprite_accessories/hair/unathi.dm
@@ -2,18 +2,21 @@
/datum/sprite_accessory/hair/una_hood
name = "Cobra Hood"
+ id = "hair_unathi_hood"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "soghun_hood"
/datum/sprite_accessory/hair/una_spines_long
name = "Long Unathi Spines"
+ id = "hair_unathi_spines_long"
icon_state = "soghun_longspines"
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN) //Xenochimera get most hairstyles since they're abominations.
apply_restrictions = TRUE
/datum/sprite_accessory/hair/una_spines_short
name = "Short Unathi Spines"
+ id = "hair_unathi_spines_short"
icon_state = "soghun_shortspines"
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
apply_restrictions = TRUE
@@ -21,48 +24,56 @@
/datum/sprite_accessory/hair/una_frills_long
name = "Long Unathi Frills"
+ id = "hair_unathi_frills_long"
icon_state = "soghun_longfrills"
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/una_frills_short
name = "Short Unathi Frills"
+ id = "hair_unathi_frills_short"
icon_state = "soghun_shortfrills"
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/una_horns
name = "Unathi Horns"
+ id = "hair_unathi_horns"
icon_state = "soghun_horns"
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/una_bighorns
name = "Unathi Big Horns"
+ id = "hair_unathi_horns_big"
icon_state = "unathi_bighorn"
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/una_smallhorns
name = "Unathi Small Horns"
+ id = "hair_unathi_horns_small"
icon_state = "unathi_smallhorn"
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/una_ramhorns
name = "Unathi Ram Horns"
+ id = "hair_unathi_horns_ram"
icon_state = "unathi_ramhorn"
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/una_sidefrills
name = "Unathi Side Frills"
+ id = "hair_unathi_frills_side"
icon_state = "unathi_sidefrills"
species_allowed = list(SPECIES_UNATHI, SPECIES_XENOCHIMERA, SPECIES_PROTEAN)
apply_restrictions = TRUE
/datum/sprite_accessory/hair/una_doublehorns
name = "Double Unathi Horns"
+ id = "hair_unathi_horns_double"
icon = 'icons/mob/human_face_vr.dmi'
icon_add = 'icons/mob/human_face_vr_add.dmi'
icon_state = "soghun_dubhorns"
diff --git a/code/modules/sprite_accessories/hair/unathidigi_hair.dm b/code/modules/sprite_accessories/hair/unathi_digitigrade.dm
similarity index 89%
rename from code/modules/sprite_accessories/hair/unathidigi_hair.dm
rename to code/modules/sprite_accessories/hair/unathi_digitigrade.dm
index 9b090e3129e..515ea5be362 100644
--- a/code/modules/sprite_accessories/hair/unathidigi_hair.dm
+++ b/code/modules/sprite_accessories/hair/unathi_digitigrade.dm
@@ -2,6 +2,7 @@
/datum/sprite_accessory/hair/una_digi_spines_short
name = "Short Digitigrade Unathi Spines"
+ id = "hair_flatunathi_spines_short"
icon_state = "soghun_shortspines_digi"
icon = 'icons/mob/species/unathidigi/hair.dmi'
icon_add = null
@@ -10,6 +11,7 @@
/datum/sprite_accessory/hair/una_digi_spines_long
name = "Long Digitigrade Unathi Spines"
+ id = "hair_flatunathi_spines_long"
icon_state = "soghun_longspines_digi"
icon = 'icons/mob/species/unathidigi/hair.dmi'
icon_add = null
@@ -18,6 +20,7 @@
/datum/sprite_accessory/hair/una_digi_finhawk
name = "Digitigrade Unathi Finhawk"
+ id = "hair_flatunathi_finhawk"
icon_state = "fin_hawk_digi"
icon = 'icons/mob/species/unathidigi/hair.dmi'
icon_add = null
@@ -26,6 +29,7 @@
/datum/sprite_accessory/hair/una_digi_demonhorns
name = "Digitigrade Unathi Demon Horns"
+ id = "hair_flatunathi_horns_demon"
icon_state = "demon_horn_digi"
icon = 'icons/mob/species/unathidigi/hair.dmi'
icon_add = null
@@ -34,6 +38,7 @@
/datum/sprite_accessory/hair/una_digi_swepthorns
name = "Digitigrade Unathi Swept Horns"
+ id = "hair_flatunathi_horns_swept"
icon_state = "swept_horn_digi"
icon = 'icons/mob/species/unathidigi/hair.dmi'
icon_add = null
@@ -42,6 +47,7 @@
/datum/sprite_accessory/hair/una_digi_ramhorns
name = "Digitigrade Unathi Ram Horns"
+ id = "hair_flatunathi_horns_ram"
icon_state = "ram_horn_digi"
icon = 'icons/mob/species/unathidigi/hair.dmi'
icon_add = null
@@ -50,6 +56,7 @@
/datum/sprite_accessory/hair/una_digi_frills_long
name = "Long Digitigrade Unathi Frills"
+ id = "hair_flatunathi_frills_long"
icon_state = "soghun_longfrills_digi"
icon = 'icons/mob/species/unathidigi/hair.dmi'
icon_add = null
@@ -58,6 +65,7 @@
/datum/sprite_accessory/hair/una_digi_frills_short
name = "Short Digitigrade Unathi Frills"
+ id = "hair_flatunathi_frills_short"
icon_state = "soghun_shortfrills_digi"
icon = 'icons/mob/species/unathidigi/hair.dmi'
icon_add = null
@@ -66,6 +74,7 @@
/datum/sprite_accessory/hair/una_digi_horns
name = "Digitigrade Unathi Horns"
+ id = "hair_flatunathi_horns"
icon_state = "soghun_horns_digi"
icon = 'icons/mob/species/unathidigi/hair.dmi'
icon_add = null
@@ -74,6 +83,7 @@
/datum/sprite_accessory/hair/una_digi_frills_big
name = "Big Digitigrade Unathi Frills"
+ id = "hair_flatunathi_frills_big"
icon_state = "big_frills_digi"
icon = 'icons/mob/species/unathidigi/hair.dmi'
icon_add = null
diff --git a/code/modules/sprite_accessories/hair/vox.dm b/code/modules/sprite_accessories/hair/vox.dm
new file mode 100644
index 00000000000..cdfb3e9b402
--- /dev/null
+++ b/code/modules/sprite_accessories/hair/vox.dm
@@ -0,0 +1,118 @@
+/datum/sprite_accessory/hair/vox_braid_long
+ name = "Long Vox braid"
+ id = "hair_vox_braid_long"
+ icon_state = "vox_longbraid"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_braid_short
+ name = "Short Vox Braid"
+ id = "hair_vox_braid_short"
+ icon_state = "vox_shortbraid"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_short
+ name = "Short Vox Quills"
+ id = "hair_vox_quills_short"
+ icon_state = "vox_shortquills"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_kingly
+ name = "Kingly Vox Quills"
+ id = "hair_vox_quills_kingly"
+ icon_state = "vox_kingly"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_mohawk
+ name = "Quill Mohawk"
+ id = "hair_vox_quill_mohawk"
+ icon_state = "vox_mohawk"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_afro
+ name = "Vox Afro"
+ id = "hair_vox_afro"
+ icon_state = "vox_afro"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_mohawk
+ name = "Vox Mohawk"
+ id = "hair_vox_mohawk"
+ icon_state = "vox_mohawk"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_yasu
+ name = "Vox Yasuhiro"
+ id = "hair_vox_yasuhiro"
+ icon_state = "vox_yasu"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_horns
+ name = "Vox Quorns"
+ id = "hair_vox_horns"
+ icon_state = "vox_horns"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_nights
+ name = "Vox Nights"
+ id = "hair_vox_nights"
+ icon_state = "vox_nights"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_surf
+ name = "Vox Surf"
+ id = "hair_vox_surf"
+ icon_state = "vox_surf"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_cropped
+ name = "Vox Cropped"
+ id = "hair_vox_cropped"
+ icon_state = "vox_cropped"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_bald
+ name = "Vox Bald"
+ id = "hair_vox_bald"
+ icon_state = "vox_bald"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_ruffhawk
+ name = "Vox Ruffhawk"
+ id = "hair_vox_ruff_hawk"
+ icon_state = "vox_ruff_hawk"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_rows
+ name = "Vox Rows"
+ id = "hair_vox_rows"
+ icon_state = "vox_rows"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_mange
+ name = "Vox Mange"
+ id = "hair_vox_mange"
+ icon_state = "vox_mange"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
+
+/datum/sprite_accessory/hair/vox_quills_pony
+ name = "Vox Pony"
+ id = "hair_vox_pony"
+ icon_state = "vox_pony"
+ species_allowed = list(SPECIES_VOX)
+ apply_restrictions = TRUE
diff --git a/code/modules/sprite_accessories/hair/vox_hair.dm b/code/modules/sprite_accessories/hair/vox_hair.dm
deleted file mode 100644
index d843802fea7..00000000000
--- a/code/modules/sprite_accessories/hair/vox_hair.dm
+++ /dev/null
@@ -1,101 +0,0 @@
-/datum/sprite_accessory/hair/vox_braid_long
- name = "Long Vox braid"
- icon_state = "vox_longbraid"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_braid_short
- name = "Short Vox Braid"
- icon_state = "vox_shortbraid"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_short
- name = "Short Vox Quills"
- icon_state = "vox_shortquills"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_kingly
- name = "Kingly Vox Quills"
- icon_state = "vox_kingly"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_mohawk
- name = "Quill Mohawk"
- icon_state = "vox_mohawk"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_afro
- name = "Vox Afro"
- icon_state = "vox_afro"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_mohawk
- name = "Vox Mohawk"
- icon_state = "vox_mohawk"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_yasu
- name = "Vox Yasuhiro"
- icon_state = "vox_yasu"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_horns
- name = "Vox Quorns"
- icon_state = "vox_horns"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_nights
- name = "Vox Nights"
- icon_state = "vox_nights"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_surf
- name = "Vox Surf"
- icon_state = "vox_surf"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_cropped
- name = "Vox Cropped"
- icon_state = "vox_cropped"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_bald
- name = "Vox Bald"
- icon_state = "vox_bald"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_ruffhawk
- name = "Vox Ruffhawk"
- icon_state = "vox_ruff_hawk"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_rows
- name = "Vox Rows"
- icon_state = "vox_rows"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_mange
- name = "Vox Mange"
- icon_state = "vox_mange"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/hair/vox_quills_pony
- name = "Vox Pony"
- icon_state = "vox_pony"
- species_allowed = list(SPECIES_VOX)
- apply_restrictions = TRUE
diff --git a/code/modules/sprite_accessories/hair/vulpakin_hair.dm b/code/modules/sprite_accessories/hair/vulpakin_hair.dm
deleted file mode 100644
index 1826c06bae6..00000000000
--- a/code/modules/sprite_accessories/hair/vulpakin_hair.dm
+++ /dev/null
@@ -1,134 +0,0 @@
-// Vulpa stuffs
-
-/datum/sprite_accessory/hair/vulp_hair_none
- name = "None"
- icon_state = "bald"
- species_allowed = list(SPECIES_VULPKANIN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_kajam
- name = "Kajam"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "kajam"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_keid
- name = "Keid"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "keid"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_adhara
- name = "Adhara"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "adhara"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_kleeia
- name = "Kleeia"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "kleeia"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_mizar
- name = "Mizar"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "mizar"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_apollo
- name = "Apollo"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "apollo"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_belle
- name = "Belle"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "belle"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_bun
- name = "Bun"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "bun"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_jagged
- name = "Jagged"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "jagged"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_curl
- name = "Curl"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "curl"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_hawk
- name = "Hawk"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "hawk"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_anita
- name = "Anita"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "anita"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_short
- name = "Short"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "short"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
-
-/datum/sprite_accessory/hair/vulp_hair_spike
- name = "Spike"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "spike"
- species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
- apply_restrictions = TRUE
- gender = NEUTER
diff --git a/code/modules/sprite_accessories/hair/vulpkanin.dm b/code/modules/sprite_accessories/hair/vulpkanin.dm
new file mode 100644
index 00000000000..c08ae2e2648
--- /dev/null
+++ b/code/modules/sprite_accessories/hair/vulpkanin.dm
@@ -0,0 +1,149 @@
+// Vulpa stuffs
+
+/datum/sprite_accessory/hair/vulp_hair_none
+ name = "None"
+ id = "hair_vulp_none"
+ icon_state = "bald"
+ species_allowed = list(SPECIES_VULPKANIN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_kajam
+ name = "Kajam"
+ id = "hair_vulp_kajam"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "kajam"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_keid
+ name = "Keid"
+ id = "hair_vulp_keid"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "keid"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_adhara
+ name = "Adhara"
+ id = "hair_vulp_adhara"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "adhara"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_kleeia
+ name = "Kleeia"
+ id = "hair_vulp_kleeia"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "kleeia"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_mizar
+ name = "Mizar"
+ id = "hair_vulp_mizar"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "mizar"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_apollo
+ name = "Apollo"
+ id = "hair_vulp_apollo"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "apollo"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_belle
+ name = "Belle"
+ id = "hair_vulp_belle"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "belle"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_bun
+ name = "Bun"
+ id = "hair_vulp_bun"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "bun"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_jagged
+ name = "Jagged"
+ id = "hair_vulp_jagged"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "jagged"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_curl
+ name = "Curl"
+ id = "hair_vulp_curl"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "curl"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_hawk
+ name = "Hawk"
+ id = "hair_vulp_hawk"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "hawk"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_anita
+ name = "Anita"
+ id = "hair_vulp_anita"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "anita"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_short
+ name = "Short"
+ id = "hair_vulp_short"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "short"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/vulp_hair_spike
+ name = "Spike"
+ id = "hair_vulp_spike"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "spike"
+ species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_ZORREN_FLAT, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN)
+ apply_restrictions = TRUE
+ gender = NEUTER
diff --git a/code/modules/sprite_accessories/hair/xenomorph.dm b/code/modules/sprite_accessories/hair/xenomorph.dm
new file mode 100644
index 00000000000..24eefad71cf
--- /dev/null
+++ b/code/modules/sprite_accessories/hair/xenomorph.dm
@@ -0,0 +1,57 @@
+//xeno stuffs
+
+/datum/sprite_accessory/hair/xeno_head_drone_color
+ name = "Drone dome"
+ id = "hair_xeno_drone"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "cxeno_drone"
+ species_allowed = list(SPECIES_XENOHYBRID)
+ gender = NEUTER
+
+// figure this one out for better coloring
+
+/datum/sprite_accessory/hair/xeno_head_sentinel_color
+ name = "Sentinal dome"
+ id = "hair_xeno_sentinel"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "cxeno_sentinel"
+ species_allowed = list(SPECIES_XENOHYBRID)
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/xeno_head_queen_color
+ name = "Queen dome"
+ id = "hair_xeno_queen"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "cxeno_queen"
+ species_allowed = list(SPECIES_XENOHYBRID)
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/xeno_head_hunter_color
+ name = "Hunter dome"
+ id = "hair_xeno_hunter"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "cxeno_hunter"
+ species_allowed = list(SPECIES_XENOHYBRID)
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/xeno_head_praetorian_color
+ name = "Praetorian dome"
+ id = "hair_xeno_praetorian"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "cxeno_praetorian"
+ species_allowed = list(SPECIES_XENOHYBRID)
+ gender = NEUTER
+
+/datum/sprite_accessory/hair/xeno_head_hybrid_color1
+ name = "Xenohybrid dome 1"
+ id = "hair_xeno_hybrid"
+ icon = 'icons/mob/human_face_vr.dmi'
+ icon_add = 'icons/mob/human_face_vr_add.dmi'
+ icon_state = "cxeno_hybrid1"
+ species_allowed = list(SPECIES_XENOHYBRID)
+ gender = NEUTER
diff --git a/code/modules/sprite_accessories/hair/xenomorph_hybrid_domes.dm b/code/modules/sprite_accessories/hair/xenomorph_hybrid_domes.dm
deleted file mode 100644
index 2fb4ed570ff..00000000000
--- a/code/modules/sprite_accessories/hair/xenomorph_hybrid_domes.dm
+++ /dev/null
@@ -1,51 +0,0 @@
-//xeno stuffs
-
-/datum/sprite_accessory/hair/xeno_head_drone_color
- name = "Drone dome"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "cxeno_drone"
- species_allowed = list(SPECIES_XENOHYBRID)
- gender = NEUTER
-
- // figure this one out for better coloring
-
-/datum/sprite_accessory/hair/xeno_head_sentinel_color
- name = "Sentinal dome"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "cxeno_sentinel"
- species_allowed = list(SPECIES_XENOHYBRID)
- gender = NEUTER
-
-/datum/sprite_accessory/hair/xeno_head_queen_color
- name = "Queen dome"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "cxeno_queen"
- species_allowed = list(SPECIES_XENOHYBRID)
- gender = NEUTER
-
-/datum/sprite_accessory/hair/xeno_head_hunter_color
- name = "Hunter dome"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "cxeno_hunter"
- species_allowed = list(SPECIES_XENOHYBRID)
- gender = NEUTER
-
-/datum/sprite_accessory/hair/xeno_head_praetorian_color
- name = "Praetorian dome"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "cxeno_praetorian"
- species_allowed = list(SPECIES_XENOHYBRID)
- gender = NEUTER
-
-/datum/sprite_accessory/hair/xeno_head_hybrid_color1
- name = "Xenohybrid dome 1"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_add = 'icons/mob/human_face_vr_add.dmi'
- icon_state = "cxeno_hybrid1"
- species_allowed = list(SPECIES_XENOHYBRID)
- gender = NEUTER
diff --git a/code/modules/sprite_accessories/body_markings.dm b/code/modules/sprite_accessories/markings/_markings.dm
similarity index 86%
rename from code/modules/sprite_accessories/body_markings.dm
rename to code/modules/sprite_accessories/markings/_markings.dm
index 636d15cf1ad..e76d50bb984 100644
--- a/code/modules/sprite_accessories/body_markings.dm
+++ b/code/modules/sprite_accessories/markings/_markings.dm
@@ -1,13 +1,5 @@
-/*
-////////////////////////////
-/ =--------------------= /
-/ == Body Markings == /
-/ =--------------------= /
-////////////////////////////
-*/
-//Moved here from sprite_accessories.dm in the same folder
-
/datum/sprite_accessory/marking
+ abstract_type = /datum/sprite_accessory/marking
icon = "icons/mob/sprite_accessories/markings.dmi"
do_colouration = 1 //Almost all of them have it, COLOR_ADD
color_blend_mode = ICON_ADD
@@ -19,43 +11,49 @@
var/body_parts = list() //A list of bodyparts this covers, in organ_tag defines
//Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD
-
/datum/sprite_accessory/marking/bands
name = "Color Bands"
+ id = "marking_bands"
icon_state = "bands"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/bandsface
name = "Color Bands (Face)"
+ id = "marking_bands_face"
icon_state = "bandsface"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/tigerhead
name = "Tiger Stripes (Head, Minor)"
+ id = "marking_tiger_head"
icon_state = "tigerhead"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/backstripe
name = "Back Stripe"
+ id = "marking_back"
icon_state = "backstripe"
body_parts = list(BP_TORSO)
-/// Misc
+/// Misc
/datum/sprite_accessory/marking/abomination
name = "Abomination"
+ id = "marking_abomination"
icon_state = "abomination"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/abomination_alt
name = "Abomination Alternate"
+ id = "marking_abomination2"
icon_state = "abomination2"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/nevrean_female
name = "Female Nevrean beak"
+ id = "marking_nevrean_f"
icon_state = "nevrean_f"
body_parts = list(BP_HEAD)
color_blend_mode = ICON_MULTIPLY
@@ -63,6 +61,7 @@
/datum/sprite_accessory/marking/nevrean_male
name = "Male Nevrean beak"
+ id = "marking_nevrean_m"
icon_state = "nevrean_m"
body_parts = list(BP_HEAD)
color_blend_mode = ICON_MULTIPLY
@@ -70,261 +69,306 @@
/datum/sprite_accessory/marking/spots
name = "Spots"
+ id = "marking_spots"
icon_state = "spots"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
/datum/sprite_accessory/marking/shaggy_mane
name = "Shaggy mane/feathers"
+ id = "marking_shaggy"
icon_state = "shaggy"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO)
/datum/sprite_accessory/marking/jagged_teeth
name = "Jagged teeth"
+ id = "marking_teeth_jagged"
icon_state = "jagged"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/blank_face
name = "Blank round face (use with monster mouth)"
+ id = "marking_face_blank"
icon_state = "blankface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/monster_mouth
name = "Monster mouth"
+ id = "marking_mouth_monster"
icon_state = "monster"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/saber_teeth
name = "Saber teeth"
+ id = "marking_teeth_saber"
icon_state = "saber"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/fangs
name = "Fangs"
+ id = "marking_teeth_fangs"
icon_state = "fangs"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/tusks
name = "Tusks"
+ id = "marking_teeth_tusks"
icon_state = "tusks"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/otie_face
name = "Otie face"
+ id = "marking_face_otie"
icon_state = "otieface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/otie_nose
name = "Otie nose"
+ id = "marking_nose_otie"
icon_state = "otie_nose"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/otienose_lite
name = "Short otie nose"
+ id = "marking_nose_otie_short"
icon_state = "otienose_lite"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/backstripes
name = "Back stripes"
+ id = "marking_stripes_otie"
icon_state = "otiestripes"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_HEAD)
/datum/sprite_accessory/marking/belly_butt
name = "Belly and butt"
+ id = "marking_bellybutt"
icon_state = "bellyandbutt"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_GROIN,BP_TORSO)
/datum/sprite_accessory/marking/fingers_toes
name = "Fingers and toes"
+ id = "marking_fingerstoes"
icon_state = "fingerstoes"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND)
/datum/sprite_accessory/marking/otie_socks
name = "Fingerless socks"
+ id = "marking_socks_otie"
icon_state = "otiesocks"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
/datum/sprite_accessory/marking/corvid_beak
name = "Corvid beak"
+ id = "marking_beak_corvid"
icon_state = "corvidbeak"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/corvid_belly
name = "Corvid belly"
+ id = "marking_belly_corvid"
icon_state = "corvidbelly"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD)
/datum/sprite_accessory/marking/cow_body
name = "Cow markings"
+ id = "marking_body_cow"
icon_state = "cowbody"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
/datum/sprite_accessory/marking/cow_nose
name = "Cow nose"
+ id = "marking_nose_cow"
icon_state = "cownose"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/zbody
name = "Thick jagged stripes"
+ id = "marking_jaggedstripes"
icon_state = "zbody"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO)
/datum/sprite_accessory/marking/znose
name = "Jagged snout"
+ id = "marking_nose_jagged"
icon_state = "znose"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/otter_nose
name = "Otter nose"
+ id = "marking_nose_otter"
icon_state = "otternose"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/otter_face
name = "Otter face"
+ id = "marking_face_otter"
icon_state = "otterface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/deer_face
name = "Deer face"
+ id = "marking_face_deer"
icon_state = "deerface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/sharkface
name = "Akula snout"
+ id = "marking_face_akula"
icon_state = "sharkface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/sheppy_face
name = "Shepherd snout"
+ id = "marking_face_shepherd"
icon_state = "shepface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/sheppy_back
name = "Shepherd back"
+ id = "marking_back_shepherd"
icon_state = "shepback"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/harpy_feathers
name = "Rapala leg Feather"
+ id = "marking_leg_rapala"
icon_state = "harpy-feathers"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG,BP_R_LEG)
/datum/sprite_accessory/marking/harpy_legs
name = "Rapala leg coloring"
+ id = "marking_leg_harpy"
icon_state = "harpy-leg"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG)
/datum/sprite_accessory/marking/chooves
name = "Cloven hooves"
+ id = "marking_hooves_cloven"
icon_state = "chooves"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT)
/datum/sprite_accessory/marking/alurane
name = "Alraune Body"
+ id = "marking_body_alraune"
icon_state = "alurane"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
/datum/sprite_accessory/marking/body_tone
name = "Body toning (for emergency contrast loss)"
+ id = "marking_body_tone"
icon_state = "btone"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
/datum/sprite_accessory/marking/gloss
name = "Full body gloss"
+ id = "marking_body_gloss"
icon_state = "gloss"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
/datum/sprite_accessory/marking/osocks_rarm
name = "Modular Longsock (right arm)"
+ id = "marking_sock_rarm"
icon_state = "osocks"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_R_ARM,BP_R_HAND)
/datum/sprite_accessory/marking/osocks_larm
name = "Modular Longsock (left arm)"
+ id = "marking_sock_larm"
icon_state = "osocks"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_ARM,BP_L_HAND)
/datum/sprite_accessory/marking/osocks_rleg
name = "Modular Longsock (right leg)"
+ id = "marking_sock_rleg"
icon_state = "osocks"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_R_FOOT,BP_R_LEG)
/datum/sprite_accessory/marking/osocks_lleg
name = "Modular Longsock (left leg)"
+ id = "marking_sock_lleg"
icon_state = "osocks"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_L_LEG)
/datum/sprite_accessory/marking/catwomantorso
name = "Catwoman chest stripes"
+ id = "marking_chest_catwoman"
icon_state = "catwomanchest"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO)
/datum/sprite_accessory/marking/catwomangroin
name = "Catwoman groin stripes"
+ id = "marking_groin_catwoman"
icon_state = "catwomangroin"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_GROIN)
/datum/sprite_accessory/marking/catwoman_rleg
name = "Catwoman right leg stripes"
+ id = "marking_catwoman_rleg"
icon_state = "catwomanright"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_R_LEG)
/datum/sprite_accessory/marking/catwoman_lleg
name = "Catwoman left leg stripes"
+ id = "marking_catwoman_lleg"
icon_state = "catwomanleft"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG)
/datum/sprite_accessory/marking/tentacle_head
name = "Squid Head"
+ id = "marking_head_squid"
icon_state = "tentaclehead"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/tentacle_mouth
name = "Tentacle Mouth"
+ id = "marking_mouth_tentacles"
icon_state = "tentaclemouth"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/rosette
name = "Rosettes"
+ id = "marking_rosettes"
icon_state = "rosette"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
/datum/sprite_accessory/marking/shadekin_snoot
name = "Shadekin Snoot"
+ id = "marking_face_shadekin"
icon_state = "shadekin-snoot"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
@@ -333,53 +377,62 @@
/datum/sprite_accessory/marking/talons
name = "Talons"
+ id = "marking_talons"
icon_state = "talons"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG)
/datum/sprite_accessory/marking/claws
name = "Claws"
+ id = "marking_claws"
icon_state = "claws"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_HAND,BP_R_HAND)
/datum/sprite_accessory/marking/equine_snout //Why the long face? Works best with sergal bodytype.
name = "Equine Snout"
+ id = "marking_face_donkey"
icon_state = "donkey"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/equine_nose
name = "Equine Nose"
+ id = "marking_nose_equine"
icon_state = "dnose"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/short_snoot
name = "Short Snout"
+ id = "marking_snout_short"
icon_state = "shortsnoot"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/short_snoot_nose
name = "Short Snout Nose"
+ id = "marking_snout_short_nose"
icon_state = "snootnose"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/fullhead
name = "Full Head Color"
+ id = "marking_head_full"
icon_state = "fullhead"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/jackal_backpattern
name = "Jackal Backpattern"
+ id = "marking_back_jackal"
icon_state = "jackal_backpattern"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_ARM,BP_R_ARM,BP_TORSO)
/datum/sprite_accessory/marking/jackal_bareback
name = "Jackal Bareback"
+ id = "marking_back_jackal2"
icon_state = "jackal_bareback"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_ARM,BP_R_ARM,BP_GROIN,BP_TORSO)
diff --git a/code/modules/sprite_accessories/markings/diona_stuff.dm b/code/modules/sprite_accessories/markings/diona_stuff.dm
index d178d787b1c..4c498988943 100644
--- a/code/modules/sprite_accessories/markings/diona_stuff.dm
+++ b/code/modules/sprite_accessories/markings/diona_stuff.dm
@@ -1,42 +1,36 @@
/datum/sprite_accessory/marking/diona
+ abstract_type = /datum/sprite_accessory/marking/diona
icon = "icons/mob/sprite_accessories/markings/diona.dmi"
+ species_allowed = list(SPECIES_DIONA, SPECIES_ALRAUNE)
/datum/sprite_accessory/marking/diona/diona_leaves
name = "Diona Leaves"
+ id = "marking_diona_leaves"
icon_state = "diona_leaves"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_GROIN,BP_TORSO,BP_HEAD)
- species_allowed = list(SPECIES_DIONA, SPECIES_ALRAUNE)
apply_restrictions = TRUE
/datum/sprite_accessory/marking/diona/diona_thorns
name = "Diona Thorns"
+ id = "marking_diona_thorns"
icon_state = "diona_thorns"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_HEAD)
- species_allowed = list(SPECIES_DIONA, SPECIES_ALRAUNE)
apply_restrictions = TRUE
/datum/sprite_accessory/marking/diona/diona_flowers
name = "Diona Flowers"
+ id = "marking_diona_flowers"
icon_state = "diona_flowers"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_HEAD)
- species_allowed = list(SPECIES_DIONA, SPECIES_ALRAUNE)
apply_restrictions = TRUE
/datum/sprite_accessory/marking/diona/diona_moss
name = "Diona moss"
+ id = "marking_diona_moss"
icon_state = "diona_moss"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO)
- species_allowed = list(SPECIES_DIONA, SPECIES_ALRAUNE)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/marking/diona/diona_flowers
- name = "Diona Flowers"
- icon_state = "diona_flowers"
- color_blend_mode = ICON_MULTIPLY
- body_parts = list(BP_TORSO,BP_HEAD)
- species_allowed = list(SPECIES_DIONA, SPECIES_ALRAUNE)
apply_restrictions = TRUE
diff --git a/code/modules/sprite_accessories/markings/eye_stuff.dm b/code/modules/sprite_accessories/markings/eye_stuff.dm
index b9979c3d8ba..8de3bf3f4cf 100644
--- a/code/modules/sprite_accessories/markings/eye_stuff.dm
+++ b/code/modules/sprite_accessories/markings/eye_stuff.dm
@@ -1,60 +1,71 @@
/datum/sprite_accessory/marking/eye_stuff
+ abstract_type = /datum/sprite_accessory/marking/eye_stuff
icon = 'icons/mob/sprite_accessories/markings/eye_stuff.dmi'
/datum/sprite_accessory/marking/eye_stuff/monoeye
name = "Monoeye"
+ id = "marking_eye_mono"
icon_state = "monoeye"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/eye_stuff/spidereyes
name = "Spider Eyes"
+ id = "marking_eye_spider"
icon_state = "spidereyes"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/eye_stuff/brows
name = "Eyebrows"
+ id = "marking_eye_brow"
icon_state = "brows"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/eye_stuff/zmask
name = "Eye mask"
+ id = "marking_eye_mask"
icon_state = "zmask"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/eye_stuff/motheyes
name = "Moth Eyes"
+ id = "marking_eye_moth"
icon_state = "motheyes"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/eye_stuff/animeeyesinner
name = "Anime Eyes Inner"
+ id = "marking_eye_anime_inner"
icon_state = "animeeyesinner"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/eye_stuff/animeeyesouter
name = "Anime Eyes Outer"
+ id = "marking_eye_anime_outer"
icon_state = "animeeyesouter"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/eye_stuff/heterochromia
name = "Heterochromia"
+ id = "marking_eye_color_left"
icon_state = "heterochromia"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/eye_stuff/heterochromia_r
name = "Heterochromia (right eye)"
+ id = "marking_eye_color_right"
icon_state = "heterochromia_r"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/eye_stuff/thirdeye
name = "Third Eye"
+ id = "marking_eye_third"
icon_state = "thirdeye"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/eye_stuff/closedeye
name = "Closed Eyes"
+ id = "marking_eye_closed"
icon_state = "closedeyes"
body_parts = list(BP_HEAD)
-
diff --git a/code/modules/sprite_accessories/markings/panda.dm b/code/modules/sprite_accessories/markings/panda.dm
index 4f1bbc98838..0e7331eb29d 100644
--- a/code/modules/sprite_accessories/markings/panda.dm
+++ b/code/modules/sprite_accessories/markings/panda.dm
@@ -1,14 +1,17 @@
/datum/sprite_accessory/marking/panda
- icon = "icons/mob/sprite_accessories/markings/panda.dmi"
+ abstract_type = /datum/sprite_accessory/marking/panda
+ icon = "icons/mob/sprite_accessories/markings/panda.dmi"
/datum/sprite_accessory/marking/panda/panda_eye_marks
name = "Panda Eye Markings"
+ id = "marking_panda_eyes"
icon_state = "eyes_panda"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_HUMAN)
/datum/sprite_accessory/marking/panda/panda_full
name = "Panda Limbs"
+ id = "marking_panda_full"
icon_state = "panda"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
color_blend_mode = ICON_ADD
diff --git a/code/modules/sprite_accessories/markings/sergal.dm b/code/modules/sprite_accessories/markings/sergal.dm
index c3fbbc016e1..4ed063cee27 100644
--- a/code/modules/sprite_accessories/markings/sergal.dm
+++ b/code/modules/sprite_accessories/markings/sergal.dm
@@ -1,8 +1,10 @@
/datum/sprite_accessory/marking/sergal
+ abstract_type = /datum/sprite_accessory/marking/sergal
icon = "icons/mob/sprite_accessories/markings/sergal.dmi"
/datum/sprite_accessory/marking/sergal/sergal_full
name = "Sergal Markings"
+ id = "marking_sergal_full_m"
icon_state = "sergal_full"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
@@ -11,6 +13,7 @@
/datum/sprite_accessory/marking/sergal/sergal_full_female
name = "Sergal Markings (Female)"
+ id = "marking_sergal_full_f"
icon_state = "sergal_full_female"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
@@ -19,5 +22,6 @@
/datum/sprite_accessory/marking/sergal/sergaleyes
name = "Sergal Eyes"
+ id = "marking_sergal_eyes"
icon_state = "eyes_sergal"
body_parts = list(BP_HEAD)
diff --git a/code/modules/sprite_accessories/markings/synth_stuff.dm b/code/modules/sprite_accessories/markings/synth_stuff.dm
index b62a8ae27d1..79fdc73d0af 100644
--- a/code/modules/sprite_accessories/markings/synth_stuff.dm
+++ b/code/modules/sprite_accessories/markings/synth_stuff.dm
@@ -1,80 +1,94 @@
/datum/sprite_accessory/marking/synth
+ abstract_type = /datum/sprite_accessory/marking/synth
icon = "icons/mob/sprite_accessories/markings/synth_stuff.dmi"
/datum/sprite_accessory/marking/synth/spirit_lights
name = "Ward - Spirit FBP Lights"
+ id = "marking_synth_spirit"
icon_state = "lights"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD)
/datum/sprite_accessory/marking/synth/spirit_lights_body
name = "Ward - Spirit FBP Lights (body)"
+ id = "marking_synth_spirit_body"
icon_state = "lights"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO)
/datum/sprite_accessory/marking/synth/spirit_lights_head
name = "Ward - Spirit FBP Lights (head)"
+ id = "marking_synth_spirit_head"
icon_state = "lights"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/synth/spirit_panels
name = "Ward - Spirit FBP Panels"
+ id = "marking_synth_spirit_panel"
icon_state = "panels"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
/datum/sprite_accessory/marking/synth/spirit_panels_body
name = "Ward - Spirit FBP Panels (body)"
+ id = "marking_synth_spirit_panel_body"
icon_state = "panels"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
/datum/sprite_accessory/marking/synth/spirit_panels_head
name = "Ward - Spirit FBP Panels (head)"
+ id = "marking_synth_spirit_panel_head"
icon_state = "panels"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/synth/c_beast_body
name = "Cyber Body"
+ id = "marking_synth_cyber_body"
icon_state = "c_beast_body"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/synth/c_beast_plating
name = "Cyber Plating (Use with Cyber Body)"
+ id = "marking_synth_cyber_plating"
icon_state = "c_beast_plating"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM)
/datum/sprite_accessory/marking/synth/c_beast_band
name = "Cyber Band (Use with Cybertech head)"
+ id = "marking_synth_cyber_band"
icon_state = "c_beast_band"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/synth/c_beast_cheek_a
name = "Cyber Beast Cheeks A (Use A, B and C)"
+ id = "marking_synth_cyber_cheek1"
icon_state = "c_beast_a"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/synth/c_beast_cheek_b
name = "Cyber Beast Cheeks B (Use A, B and C)"
+ id = "marking_synth_cyber_cheek2"
icon_state = "c_beast_b"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/synth/c_beast_cheek_c
name = "Cyber Beast Cheeks c (Use A, B and C)"
+ id = "marking_synth_cyber_cheek3"
icon_state = "c_beast_c"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/synth/eboop_panels
name = "Eggnerd FBP panels"
+ id = "marking_synth_eggnerd_panel"
icon_state = "eboop"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
diff --git a/code/modules/sprite_accessories/markings/taj.dm b/code/modules/sprite_accessories/markings/taj.dm
index 7c66bba1088..177f3f91106 100644
--- a/code/modules/sprite_accessories/markings/taj.dm
+++ b/code/modules/sprite_accessories/markings/taj.dm
@@ -1,11 +1,10 @@
-/////////////////
-/// Taj stuff ///
-/////////////////
/datum/sprite_accessory/marking/taj
+ abstract_type = /datum/sprite_accessory/marking/taj
icon = "icons/mob/sprite_accessories/markings/taj.dmi"
/datum/sprite_accessory/marking/taj/taj_paw_socks
name = "Socks Coloration (Taj)"
+ id = "marking_tajaran_pawsocks"
icon_state = "taj_pawsocks"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
species_allowed = list(SPECIES_TAJ)
@@ -13,30 +12,35 @@
/datum/sprite_accessory/marking/taj/paw_socks
name = "Socks Coloration (Generic)"
+ id = "marking_pawsocks"
icon_state = "pawsocks"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
species_allowed = list(SPECIES_TAJ, SPECIES_UNATHI)
/datum/sprite_accessory/marking/taj/paw_socks_belly
name = "Socks,Belly Coloration (Generic)"
+ id = "marking_pawsocks_belly"
icon_state = "pawsocksbelly"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
species_allowed = list(SPECIES_TAJ, SPECIES_UNATHI)
/datum/sprite_accessory/marking/taj/belly_hands_feet
name = "Hands,Feet,Belly Color (Minor)"
+ id = "marking_tajaran_bhf_min"
icon_state = "bellyhandsfeetsmall"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
species_allowed = list(SPECIES_TAJ, SPECIES_UNATHI)
/datum/sprite_accessory/marking/taj/hands_feet_belly_full
name = "Hands,Feet,Belly Color (Major)"
+ id = "marking_tajaran_bhf_maj"
icon_state = "bellyhandsfeet"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
species_allowed = list(SPECIES_TAJ, SPECIES_UNATHI)
/datum/sprite_accessory/marking/taj/hands_feet_belly_full_female
name = "Hands,Feet,Belly Color (Major, Female)"
+ id = "marking_tajaran_bhf_majf"
icon_state = "bellyhandsfeet_female"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
species_allowed = list(SPECIES_TAJ)
@@ -44,6 +48,7 @@
/datum/sprite_accessory/marking/taj/patches
name = "Color Patches"
+ id = "marking_tajaran_patches"
icon_state = "patches"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN)
species_allowed = list(SPECIES_TAJ)
@@ -51,6 +56,7 @@
/datum/sprite_accessory/marking/taj/patchesface
name = "Color Patches (Face)"
+ id = "marking_tajaran_patches_face"
icon_state = "patchesface"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_TAJ)
@@ -58,6 +64,7 @@
/datum/sprite_accessory/marking/taj/tiger_stripes
name = "Tiger Stripes"
+ id = "marking_tajaran_tiger"
icon_state = "tiger"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN)
species_allowed = list(SPECIES_TAJ) //There's a tattoo for non-cats
@@ -65,6 +72,7 @@
//Taj specific stuff
/datum/sprite_accessory/marking/taj/taj_belly
name = "Belly Fur (Taj)"
+ id = "marking_tajaran_belly"
icon_state = "taj_belly"
body_parts = list(BP_TORSO)
species_allowed = list(SPECIES_TAJ)
@@ -72,6 +80,7 @@
/datum/sprite_accessory/marking/taj/taj_bellyfull
name = "Belly Fur Wide (Taj)"
+ id = "marking_tajaran_belly_wide"
icon_state = "taj_bellyfull"
body_parts = list(BP_TORSO)
species_allowed = list(SPECIES_TAJ)
@@ -79,6 +88,7 @@
/datum/sprite_accessory/marking/taj/taj_earsout
name = "Outer Ear (Taj)"
+ id = "marking_tajaran_ears_out"
icon_state = "taj_earsout"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_TAJ)
@@ -86,6 +96,7 @@
/datum/sprite_accessory/marking/taj/taj_earsin
name = "Inner Ear (Taj)"
+ id = "marking_tajaran_ears_in"
icon_state = "taj_earsin"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_TAJ)
@@ -93,6 +104,7 @@
/datum/sprite_accessory/marking/taj/taj_nose
name = "Nose Color (Taj)"
+ id = "marking_tajaran_nose"
icon_state = "taj_nose"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_TAJ)
@@ -100,6 +112,7 @@
/datum/sprite_accessory/marking/taj/taj_crest
name = "Chest Fur Crest (Taj)"
+ id = "marking_tajaran_crest"
icon_state = "taj_crest"
body_parts = list(BP_TORSO)
species_allowed = list(SPECIES_TAJ)
@@ -107,6 +120,7 @@
/datum/sprite_accessory/marking/taj/taj_muzzle
name = "Muzzle Color (Taj)"
+ id = "marking_tajaran_muzzle"
icon_state = "taj_muzzle"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_TAJ)
@@ -114,6 +128,7 @@
/datum/sprite_accessory/marking/taj/taj_face
name = "Cheeks Color (Taj)"
+ id = "marking_tajaran_cheeks"
icon_state = "taj_face"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_TAJ)
@@ -121,6 +136,7 @@
/datum/sprite_accessory/marking/taj/taj_all
name = "All Taj Head (Taj)"
+ id = "marking_tajaran_head_all"
icon_state = "taj_all"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_TAJ)
@@ -128,12 +144,14 @@
/datum/sprite_accessory/marking/taj/taj_nose_alt
name = "Nose Color, alt. (Taj)"
+ id = "marking_tajaran_nose_alt"
icon_state = "taj_nosealt"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/taj/tigerface
name = "Tiger Stripes (Head, Major)"
+ id = "marking_tajaran_head_tiger"
icon_state = "tigerface"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_TAJ) //There's a tattoo for non-cats
diff --git a/code/modules/sprite_accessories/markings/tanlines.dm b/code/modules/sprite_accessories/markings/tanlines.dm
index 6aeb0ab33da..fc0ccd37319 100644
--- a/code/modules/sprite_accessories/markings/tanlines.dm
+++ b/code/modules/sprite_accessories/markings/tanlines.dm
@@ -1,26 +1,27 @@
-
-////////////////
-/// Tanlines ///
-////////////////
/datum/sprite_accessory/marking/tanline
+ abstract_type = /datum/sprite_accessory/marking/tanline
icon = "icons/mob/sprite_accessories/markings/tanlines.dmi"
/datum/sprite_accessory/marking/tanline/tanlines
name = "Tan Lines (One Piece, F)"
+ id = "marking_tanline_onepiece_f"
icon_state = "tan_op"
body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/tanline/tanlines_m
name = "Tan Lines (One Piece, M)"
+ id = "marking_tanline_onepiece_m"
icon_state = "tan_mop"
body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/tanline/tanlines_bikini
name = "Tan Lines (Bikini)"
+ id = "marking_tanline_bikini"
icon_state = "tan_bikini"
body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/tanline/tanlines_b_strap
name = "Tan Lines (Bikini, Strapless)"
+ id = "marking_tanline_bikini_nostrap"
icon_state = "tan_bikini_strap"
body_parts = list(BP_TORSO,BP_GROIN)
diff --git a/code/modules/sprite_accessories/markings/tattoo.dm b/code/modules/sprite_accessories/markings/tattoo.dm
index 78bbed328b1..13043a0614d 100644
--- a/code/modules/sprite_accessories/markings/tattoo.dm
+++ b/code/modules/sprite_accessories/markings/tattoo.dm
@@ -1,72 +1,84 @@
-//////////////
-/// Tatoos ///
-//////////////
/datum/sprite_accessory/marking/tatoo
+ abstract_type = /datum/sprite_accessory/marking/tatoo
icon = "icons/mob/sprite_accessories/markings/tatoos.dmi"
/datum/sprite_accessory/marking/tatoo/tat_rheart
name = "Tattoo (Heart, R. Arm)"
+ id = "marking_tattoo_r_arm_heart"
icon_state = "tat_rheart"
body_parts = list(BP_R_ARM)
/datum/sprite_accessory/marking/tatoo/tat_lheart
name = "Tattoo (Heart, L. Arm)"
+ id = "marking_tattoo_l_arm_heart"
icon_state = "tat_lheart"
body_parts = list(BP_L_ARM)
/datum/sprite_accessory/marking/tatoo/tat_hive
name = "Tattoo (Hive, Back)"
+ id = "marking_tattoo_back_hive"
icon_state = "tat_hive"
body_parts = list(BP_TORSO)
/datum/sprite_accessory/marking/tatoo/tat_nightling
name = "Tattoo (Nightling, Back)"
+ id = "marking_tattoo_back_nightling"
icon_state = "tat_nightling"
body_parts = list(BP_TORSO)
/datum/sprite_accessory/marking/tatoo/tat_campbell
name = "Tattoo (Campbell, R.Arm)"
+ id = "marking_tattoo_r_arm_campbell"
icon_state = "tat_campbell"
body_parts = list(BP_R_ARM)
/datum/sprite_accessory/marking/tatoo/tat_campbell/left
name = "Tattoo (Campbell, L.Arm)"
+ id = "marking_tattoo_l_arm_campbell"
body_parts = list(BP_L_ARM)
/datum/sprite_accessory/marking/tatoo/tat_campbell/rightleg
- name = "Tattoo (Campbell, R.Leg)"
- body_parts = list(BP_R_LEG)
+ name = "Tattoo (Campbell, R.Leg)"
+ id = "marking_tattoo_r_leg_campbell"
+ body_parts = list(BP_R_LEG)
/datum/sprite_accessory/marking/tatoo/tat_campbell/leftleg
- name = "Tattoo (Campbell, L.Leg)"
- body_parts = list (BP_L_LEG)
+ name = "Tattoo (Campbell, L.Leg)"
+ id = "marking_tattoo_l_leg_campbell"
+ body_parts = list (BP_L_LEG)
/datum/sprite_accessory/marking/tatoo/tat_silverburgh
name = "Tattoo (Silverburgh, R.Leg)"
+ id = "marking_tattoo_r_leg_silverburgh"
icon_state = "tat_silverburgh"
body_parts = list (BP_R_LEG)
/datum/sprite_accessory/marking/tatoo/tat_silverburgh/left
- name = "Tattoo (Silverburgh, L.Leg)"
- icon_state = "tat_silverburgh"
- body_parts = list (BP_L_LEG)
+ name = "Tattoo (Silverburgh, L.Leg)"
+ id = "marking_tattoo_l_leg_silverburgh"
+ icon_state = "tat_silverburgh"
+ body_parts = list (BP_L_LEG)
/datum/sprite_accessory/marking/tatoo/tat_tiger
name = "Tattoo (Tiger Stripes, Body)"
+ id = "marking_tattoo_body_tiger"
icon_state = "tat_tiger"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/tatoo/tat_inmon1
name = "Tattoo (Inmon, Variant 1)"
+ id = "marking_tattoo_groin_inmon"
icon_state = "tat_inmon1"
body_parts = list(BP_GROIN)
/datum/sprite_accessory/marking/tatoo/tat_inmon2
name = "Tattoo (Inmon, Variant 2)"
+ id = "marking_tattoo_groin_inmon2"
icon_state = "tat_inmon2"
body_parts = list(BP_GROIN)
/datum/sprite_accessory/marking/tatoo/tat_inmon3
name = "Tattoo (Inmon, Variant 3)"
+ id = "marking_tattoo_groin_inmon3"
icon_state = "tat_inmon3"
body_parts = list(BP_GROIN)
diff --git a/code/modules/sprite_accessories/markings/tesh.dm b/code/modules/sprite_accessories/markings/tesh.dm
index bc7cf76cd76..7251e584023 100644
--- a/code/modules/sprite_accessories/markings/tesh.dm
+++ b/code/modules/sprite_accessories/markings/tesh.dm
@@ -1,46 +1,53 @@
-/// Teshari Markings.
/datum/sprite_accessory/marking/tesh
+ abstract_type = /datum/sprite_accessory/marking/tesh
icon = 'icons/mob/sprite_accessories/markings/tesh_stuff.dmi'
species_allowed = list(SPECIES_TESHARI)
apply_restrictions = TRUE
/datum/sprite_accessory/marking/tesh/teshi_heterochromia
name = "Teshari Heterochromia"
+ id = "marking_teshari_heterochromia"
icon_state = "teshi_heterochromia"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/tesh/tesh_feathers
name = "Teshari Feathers"
+ id = "marking_teshari_feathers"
icon_state = "teshi_feathers"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT, BP_R_FOOT, BP_L_HAND, BP_R_HAND)
/datum/sprite_accessory/marking/tesh/teshi_fluff
name = "Teshari underfluff"
+ id = "marking_teshari_fluff"
icon_state = "teshi_fluff"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO, BP_HEAD)
/datum/sprite_accessory/marking/tesh/teshi_small_feathers
name = "Teshari small wingfeathers"
+ id = "marking_teshari_wingfeathers_small"
icon_state = "teshi_sf"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT, BP_R_FOOT, BP_L_HAND, BP_R_HAND, BP_TORSO)
/datum/sprite_accessory/marking/tesh/teshari_coat
name = "Teshari coat"
+ id = "marking_teshari_coat"
icon_state = "teshi_coat"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM, BP_TORSO, BP_HEAD)
/datum/sprite_accessory/marking/tesh/teshari_pattern_male
name = "Teshari male pattern"
+ id = "marking_teshari_pattern_m"
icon_state = "teshi_pattern_male"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_TORSO, BP_GROIN, BP_HEAD)
/datum/sprite_accessory/marking/tesh/teshari_pattern_female
name = "Teshari female pattern"
+ id = "marking_teshari_pattern_f"
icon_state = "teshi_pattern_fem"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG, BP_R_LEG, BP_L_HAND, BP_R_HAND, BP_TORSO, BP_GROIN, BP_HEAD)
diff --git a/code/modules/sprite_accessories/markings/unathi.dm b/code/modules/sprite_accessories/markings/unathi.dm
index 8083137e480..e8d4f9ceb80 100644
--- a/code/modules/sprite_accessories/markings/unathi.dm
+++ b/code/modules/sprite_accessories/markings/unathi.dm
@@ -1,75 +1,87 @@
-//Una specific stuff
/datum/sprite_accessory/marking/unathi
+ abstract_type = /datum/sprite_accessory/marking/unathi
icon = "icons/mob/sprite_accessories/markings/unathi_stuff.dmi"
/datum/sprite_accessory/marking/unathi/una_paw_socks
name = "Socks Coloration (Una)"
+ id = "marking_unathi_socks"
icon_state = "una_pawsocks"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
species_allowed = list(SPECIES_UNATHI)
/datum/sprite_accessory/marking/unathi/una_face
name = "Face Color (Una)"
+ id = "marking_unathi_face"
icon_state = "una_face"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_UNATHI)
/datum/sprite_accessory/marking/unathi/una_facelow
name = "Face Color Low (Una)"
+ id = "marking_unathi_face_low"
icon_state = "una_facelow"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_UNATHI)
/datum/sprite_accessory/marking/unathi/una_scutes
name = "Scutes (Una)"
+ id = "marking_unathi_scutes"
icon_state = "una_scutes"
body_parts = list(BP_TORSO)
species_allowed = list(SPECIES_UNATHI)
/datum/sprite_accessory/marking/unathi/unathihood
name = "Cobra Hood"
+ id = "marking_unathi_hood"
icon_state = "unathihood"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/unathi/unathidoublehorns
name = "Double Unathi Horns"
+ id = "marking_unathi_horns_double"
icon_state = "unathidoublehorns"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/unathi/unathihorns
name = "Unathi Horns"
+ id = "marking_unathi_horns"
icon_state = "unathihorns"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/unathi/unathiramhorns
name = "Unathi Ram Horns"
+ id = "marking_unathi_horns_ram"
icon_state = "unathiramhorns"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/unathi/unathishortspines
name = "Unathi Short Spines"
+ id = "marking_unathi_spines_short"
icon_state = "unathishortspines"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/unathi/unathilongspines
name = "Unathi Long Spines"
+ id = "marking_unathi_spines_lnog"
icon_state = "unathilongspines"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/unathi/unathishortfrills
name = "Unathi Short Frills"
+ id = "marking_unathi_frills_short"
icon_state = "unathishortfrills"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/unathi/unathilongfrills
name = "Unathi Long Frills"
+ id = "marking_unathi_frills_long"
icon_state = "unathilongfrills"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
diff --git a/code/modules/sprite_accessories/markings/vox.dm b/code/modules/sprite_accessories/markings/vox.dm
index aebd64a9023..0d432e4b7cd 100644
--- a/code/modules/sprite_accessories/markings/vox.dm
+++ b/code/modules/sprite_accessories/markings/vox.dm
@@ -1,19 +1,21 @@
/////////////
//Vox stuff//
/////////////
-
/datum/sprite_accessory/marking/vox
+ abstract_type = /datum/sprite_accessory/marking/vox
icon = "icons/mob/sprite_accessories/markings/vox_stuff.dmi"
/datum/sprite_accessory/marking/vox/vox_coloration
name = "Vox Two Tone"
- icon_state = "vox_two_tone"
+ id = "marking_vox_2tone"
+ icon_state = "vox_dual"
body_parts = list(BP_HEAD,BP_L_HAND,BP_R_HAND,BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM)
species_allowed = list(SPECIES_VOX)
apply_restrictions = TRUE
/datum/sprite_accessory/marking/vox/vox_alt
name = "Vox Alternate"
+ id = "marking_vox_alt"
icon_state = "bay_vox"
body_parts = list (BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD)
species_allowed = list(SPECIES_VOX)
@@ -21,6 +23,7 @@
/datum/sprite_accessory/marking/vox/vox_alt_eyes
name = "Alternate Vox Eyes"
+ id = "marking_vox_alt_eyes"
icon_state = "bay_vox_eyes"
body_parts = list(BP_HEAD)
species_allowed = list(SPECIES_VOX)
@@ -28,6 +31,7 @@
/datum/sprite_accessory/marking/vox/voxscales
name = "Vox Scales"
+ id = "marking_vox_scales"
icon_state = "Voxscales"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_HEAD)
@@ -35,11 +39,13 @@
/datum/sprite_accessory/marking/vox/voxclaws
name = "Vox Claws"
icon_state = "Voxclaws"
+ id = "marking_vox_claws"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND)
/datum/sprite_accessory/marking/vox/voxbeak
name = "Vox Beak"
+ id = "marking_vox_beak"
icon_state = "Voxscales"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
diff --git a/code/modules/sprite_accessories/markings/vulp.dm b/code/modules/sprite_accessories/markings/vulpkanin.dm
similarity index 84%
rename from code/modules/sprite_accessories/markings/vulp.dm
rename to code/modules/sprite_accessories/markings/vulpkanin.dm
index 7cee6b860fc..822f59f4e9a 100644
--- a/code/modules/sprite_accessories/markings/vulp.dm
+++ b/code/modules/sprite_accessories/markings/vulpkanin.dm
@@ -1,61 +1,72 @@
/datum/sprite_accessory/marking/vulp
+ abstract_type = /datum/sprite_accessory/marking/vulp
icon = "icons/mob/sprite_accessories/markings/vulp.dmi"
/datum/sprite_accessory/marking/vulp/vulp_belly
name = "belly fur (Vulp)"
+ id = "marking_vulp_belly"
icon_state = "vulp_belly"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/vulp/vulp_fullbelly
name = "full belly fur (Vulp)"
+ id = "marking_vulp_fullbelly"
icon_state = "vulp_fullbelly"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/vulp/vulp_crest
name = "belly crest (Vulp)"
+ id = "marking_vulp_crest"
icon_state = "vulp_crest"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/vulp/vulp_nose
name = "nose (Vulp)"
+ id = "marking_vulp_nose"
icon_state = "vulp_nose"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/vulp/vulp_short_nose
name = "nose, short (Vulp)"
+ id = "marking_vulp_nose_short"
icon_state = "vulp_short_nose"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/vulp/snoutstripe
name = "snout stripe (Vulp)"
+ id = "marking_vulp_snoutstripe"
icon_state = "snoutstripe"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/vulp/vulp_face
name = "face (Vulp)"
+ id = "marking_vulp_face"
icon_state = "vulp_face"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/vulp/vulp_facealt
name = "face, alt. (Vulp)"
+ id = "marking_vulp_facealt"
icon_state = "vulp_facealt"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/vulp/vulp_earsface
name = "ears and face (Vulp)"
+ id = "marking_vulp_earsface"
icon_state = "vulp_earsface"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/vulp/vulp_all
+ id = "marking_vulp_all"
name = "all head highlights (Vulp)"
icon_state = "vulp_all"
color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/markings/werebeast.dm b/code/modules/sprite_accessories/markings/werebeast.dm
index 47e3acdb78d..ff3ddbe893b 100644
--- a/code/modules/sprite_accessories/markings/werebeast.dm
+++ b/code/modules/sprite_accessories/markings/werebeast.dm
@@ -1,4 +1,5 @@
-/datum/sprite_accessory/markering/werebeast
+/datum/sprite_accessory/marking/werebeast
+ abstract_type = /datum/sprite_accessory/marking/werebeast
icon = 'icons/mob/clothing/species/werebeast/werebeast_markings.dmi'
color_blend_mode = ICON_MULTIPLY
species_allowed = list(SPECIES_WEREBEAST)
@@ -6,20 +7,24 @@
/datum/sprite_accessory/marking/werebeast/werewolf_nose
name = "Werewolf nose"
+ id = "marking_werebeast_nose"
icon_state = "werewolf_nose"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/werebeast/werewolf_face
name = "Werewolf face"
+ id = "marking_werebeast_face"
icon_state = "werewolf"
body_parts = list(BP_HEAD)
/datum/sprite_accessory/marking/werebeast/werewolf_belly
name = "Werewolf belly"
+ id = "marking_werebeast_belly"
icon_state = "werewolf"
body_parts = list(BP_GROIN,BP_TORSO)
/datum/sprite_accessory/marking/werebeast/werewolf_socks
name = "Werewolf socks"
+ id = "marking_werebeast_socks"
icon_state = "werewolf"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
diff --git a/code/modules/sprite_accessories/markings/zorren.dm b/code/modules/sprite_accessories/markings/zorren.dm
index aaba9d3c26b..bd11fdaafe7 100644
--- a/code/modules/sprite_accessories/markings/zorren.dm
+++ b/code/modules/sprite_accessories/markings/zorren.dm
@@ -1,26 +1,31 @@
/datum/sprite_accessory/marking/zorren
- icon = "icons/mob/sprite_accessories/markings/zorren.dmi"
+ abstract_type = /datum/sprite_accessory/marking/zorren
+ icon = "icons/mob/sprite_accessories/markings/zorren.dmi"
/datum/sprite_accessory/marking/zorren/zorren_belly_male
name = "Zorren Male Torso"
+ id = "marking_zorren_belly_m"
icon_state = "zorren_belly"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/zorren/zorren_belly_female
name = "Zorren Female Torso"
+ id = "marking_zorren_belly_f"
icon_state = "zorren_belly_female"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO,BP_GROIN)
/datum/sprite_accessory/marking/zorren/zorren_back_patch
name = "Zorren Back Patch"
+ id = "marking_zorren_backpatch"
icon_state = "zorren_backpatch"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_TORSO)
/datum/sprite_accessory/marking/zorren/zorren_face_male
name = "Zorren Male Face"
+ id = "marking_zorren_face_m"
icon_state = "zorren_face"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
@@ -28,6 +33,7 @@
/datum/sprite_accessory/marking/zorren/zorren_face_female
name = "Zorren Female Face"
+ id = "marking_zorren_face_f"
icon_state = "zorren_face_female"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
@@ -35,6 +41,7 @@
/datum/sprite_accessory/marking/zorren/zorren_muzzle_male
name = "Zorren Male Muzzle"
+ id = "marking_zorren_muzzle_m"
icon_state = "zorren_muzzle"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
@@ -42,6 +49,7 @@
/datum/sprite_accessory/marking/zorren/zorren_muzzle_female
name = "Zorren Female Muzzle"
+ id = "marking_zorren_muzzle_f"
icon_state = "zorren_muzzle_female"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
@@ -49,12 +57,14 @@
/datum/sprite_accessory/marking/zorren/zorren_socks
name = "Zorren Socks"
+ id = "marking_zorren_socks"
icon_state = "zorren_socks"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
/datum/sprite_accessory/marking/zorren/zorren_longsocks
name = "Zorren Longsocks"
+ id = "marking_zorren_socks_long"
icon_state = "zorren_longsocks"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND)
diff --git a/code/modules/sprite_accessories/sprite_accessories.dm b/code/modules/sprite_accessories/sprite_accessories.dm
index 0e959550dc3..0f8d364025d 100644
--- a/code/modules/sprite_accessories/sprite_accessories.dm
+++ b/code/modules/sprite_accessories/sprite_accessories.dm
@@ -46,38 +46,14 @@
/// use front/behind, citadel snowflake for now; only usable on wings/tails
var/front_behind_system = FALSE
-//skin styles - WIP
-//going to have to re-integrate this with surgery
-//let the icon_state hold an icon preview for now
-/datum/sprite_accessory/skin
- icon = 'icons/mob/species/human/body.dmi'
-
-/datum/sprite_accessory/skin/human
- name = "Default human skin"
- icon_state = "default"
- species_allowed = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN)
-
-/datum/sprite_accessory/skin/human_tatt01
- name = "Tatt01 human skin"
- icon_state = "tatt1"
- icon = 'icons/mob/species/human/tatt1.dmi'
- species_allowed = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN)
-
-/datum/sprite_accessory/skin/tajaran
- name = "Default tajaran skin"
- icon_state = "default"
- icon = 'icons/mob/species/tajaran/body.dmi'
- species_allowed = list(SPECIES_TAJ)
- apply_restrictions = TRUE
-
-/datum/sprite_accessory/skin/unathi
- name = "Default Unathi skin"
- icon_state = "default"
- icon = 'icons/mob/species/unathi/body.dmi'
- species_allowed = list(SPECIES_UNATHI)
-
-/datum/sprite_accessory/skin/skrell
- name = "Default skrell skin"
- icon_state = "default"
- icon = 'icons/mob/species/skrell/body.dmi'
- species_allowed = list(SPECIES_SKRELL)
+ // Ckey of person allowed to use this, if defined.
+ var/list/ckeys_allowed = null
+ var/apply_restrictions = FALSE //whether to apply restrictions for specific tails/ears/wings
+ var/center = FALSE
+ var/dimension_x = 32
+ var/dimension_y = 32
+ /// id
+ var/id
+ // these two are moved up for now
+ var/extra_overlay // Icon state of an additional overlay to blend in.
+ var/extra_overlay2
diff --git a/code/modules/sprite_accessories/tail/_tail.dm b/code/modules/sprite_accessories/tail/_tail.dm
new file mode 100644
index 00000000000..e78a779f79f
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/_tail.dm
@@ -0,0 +1,52 @@
+/datum/sprite_accessory/tail
+ abstract_type = /datum/sprite_accessory/tail
+ name = "You should not see this..."
+ icon = 'icons/mob/sprite_accessories/tails.dmi'
+ do_colouration = 0 //Set to 1 to enable coloration using the tail color.
+
+ color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
+ 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/extra_overlay_w // Wagging state for extra overlay
+ var/extra_overlay2_w // Tertiary wagging.
+ var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff.
+ var/icon/clip_mask_icon = null //Icon file used for clip mask.
+ var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits.
+ var/icon/clip_mask = null //Instantiated clip mask of given icon and state
+
+/datum/sprite_accessory/tail/New()
+ . = ..()
+ if(clip_mask_icon && clip_mask_state)
+ clip_mask = icon(icon = clip_mask_icon, icon_state = clip_mask_state)
+
+//For all species tails. Includes haircolored tails.
+/datum/sprite_accessory/tail/special
+ abstract_type = /datum/sprite_accessory/tail/special
+ icon = 'icons/effects/species_tails_vr.dmi'
+
+// todo: sort ears by something that makes sense
+// todo: tgui choice menu should be modular
+// todo: and include way to do categories
+//! right now the categories are way too sparse, we'll combine them later.
+
+//? AND YES, I AM SHITPOSTING WITH THE CATEGORY .DM NAMES
+//? Deal with it, I'll deal with this in the emissives PR
+//? Seriously I'm not categorizing our 500 kinds of wings.
+
+//? If anyone wants to sort it, obviously, PLEASE, be my guest, but I just don't have the energy to do the stuff I did
+//? in /ears. It just isn't working out for me, sorry.
+
+//? Potential nomenclatures:
+//? - by animal (real or fakefurrysona) type
+//? - "Animal", "Species", "Robotic", "Misc"
+//? etc
+
+//? PLEASE HELP WITH THIS.
+
+/datum/sprite_accessory/tail/invisible
+ name = "Invisible (hide species-sprite tail)"
+ id = "tail_abstract"
+ icon = null
+ icon_state = null
diff --git a/code/modules/sprite_accessories/tail/bearlike.dm b/code/modules/sprite_accessories/tail/bearlike.dm
new file mode 100644
index 00000000000..b5e6c112339
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/bearlike.dm
@@ -0,0 +1,11 @@
+/datum/sprite_accessory/tail/bear
+ name = "bear, colorable"
+ id = "tail_bear"
+ icon_state = "bear"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/bear_brown
+ name = "bear, brown"
+ id = "tail_bear_brown"
+ icon_state = "bear-brown"
diff --git a/code/modules/sprite_accessories/tail/bird.dm b/code/modules/sprite_accessories/tail/bird.dm
new file mode 100644
index 00000000000..2e3140a8a97
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/bird.dm
@@ -0,0 +1,6 @@
+/datum/sprite_accessory/tail/fantail
+ name = "avian fantail, colorable"
+ id = "tail_avian_fantail"
+ icon_state = "fantail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/tail/bovine.dm b/code/modules/sprite_accessories/tail/bovine.dm
new file mode 100644
index 00000000000..e0100391433
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/bovine.dm
@@ -0,0 +1,16 @@
+/datum/sprite_accessory/tail/cow
+ name = "cow tail, colorable"
+ id = "tail_cow"
+ icon_state = "cow"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/satyr
+ name = "goat legs, colorable"
+ id = "tail_satyr_legs"
+ icon_state = "satyr"
+ color_blend_mode = ICON_MULTIPLY
+ do_colouration = 1
+ hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case.
+ clip_mask_icon = 'icons/mob/sprite_accessories/taurs.dmi'
+ clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms.
diff --git a/code/modules/sprite_accessories/tail/bunny.dm b/code/modules/sprite_accessories/tail/bunny.dm
new file mode 100644
index 00000000000..a1500b2c3eb
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/bunny.dm
@@ -0,0 +1,5 @@
+/datum/sprite_accessory/tail/bunny
+ id = "tail_bunny"
+ name = "bunny, colorable"
+ icon_state = "bunny"
+ do_colouration = 1
diff --git a/code/modules/sprite_accessories/tail/canid.dm b/code/modules/sprite_accessories/tail/canid.dm
new file mode 100644
index 00000000000..9dbd92f5fb5
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/canid.dm
@@ -0,0 +1,117 @@
+/datum/sprite_accessory/tail/wolf_grey
+ name = "wolf, grey"
+ id = "tail_wolf_grey"
+ icon_state = "wolf-grey"
+
+/datum/sprite_accessory/tail/wolf_green
+ name = "wolf, green"
+ id = "tail_wolf_green"
+ icon_state = "wolf-green"
+
+/datum/sprite_accessory/tail/wisewolf
+ name = "wolf, wise"
+ id = "tail_wolf_wise"
+ icon_state = "wolf-wise"
+
+/datum/sprite_accessory/tail/wolf
+ name = "wolf, colorable"
+ id = "tail_wolf"
+ icon_state = "wolf"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "wolfinner"
+
+/datum/sprite_accessory/tail/blackwolf
+ name = "wolf, black"
+ id = "tail_wolf_black"
+ icon_state = "wolf"
+
+/datum/sprite_accessory/tail/crossfox
+ name = "cross fox"
+ id = "tail_fox_cross"
+ icon_state = "crossfox"
+
+/datum/sprite_accessory/tail/doublekitsune
+ name = "double kitsune tail, colorable"
+ id = "tail_kitsune_dual"
+ icon_state = "doublekitsune"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/fennec_tail
+ name = "Fennec tail"
+ id = "tail_fox_fennec"
+ icon_state = "fennec_tail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/fox_tail
+ name = "Fox tail"
+ id = "tail_fox"
+ icon_state = "fox_tail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/fox_tail_plain
+ name = "Fox tail 2"
+ id = "tail_fox2"
+ icon_state = "fox_tail_plain_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/foxtail
+ name = "Fox"
+ id = "tail_fox3"
+ desc = "" //leaving this just in case i break something if i just don't include a blank description because this codebase is akin to a house of cards
+ icon_state = "foxtail_but_good"
+ extra_overlay = "foxtail_but_good-tips"
+ do_colouration = TRUE
+ color_blend_mode = ICON_MULTIPLY
+ ani_state = "foxtail_but_good_w"
+ extra_overlay_w = "foxtail_but_good-tips_w"
+
+/datum/sprite_accessory/tail/jackal_bicolor
+ name = "jackal, dual-colorable"
+ id = "tail_jackal"
+ icon_state = "jackal_bicolor"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "jackal_bicolor_extra"
+
+/datum/sprite_accessory/tail/otietail
+ name = "otie tail (vwag)"
+ id = "tail_otie"
+ icon_state = "otie"
+ ani_state = "otie_w"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/takahiro_kitsune
+ name = "Takahiro Kitsune Tails" //takahiro had five tails i just wanted to follow the 'T' naming convention vs. tamamo and triple
+ id = "tail_kitsune_penta"
+ icon_state = "takahiro-kitsunetails"
+ extra_overlay = "takahiro-kitsunetails-tips"
+ do_colouration = TRUE
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/tamamo_kitsune
+ name = "Tamamo Kitsune Tails" //Tamamo-no-Tiro, let it be known!
+ id = "tail_kitsune_nine"
+ icon_state = "tamamo-kitsunetails"
+ extra_overlay = "tamamo-kitsunetails-tips"
+ do_colouration = TRUE
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/triple_kitsune
+ name = "Triple Kitsune Tails"
+ id = "tail_kitsune_triple"
+ icon_state = "triple-kitsunetails"
+ extra_overlay = "triple-kitsunetails-tips"
+ do_colouration = TRUE
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/ketrai_wag
+ name = "fennix tail (vwag)"
+ id = "tail_fennix"
+ icon_state = "ketraitail"
+ ani_state = "ketraitail_w"
diff --git a/code/modules/sprite_accessories/tail/equine.dm b/code/modules/sprite_accessories/tail/equine.dm
new file mode 100644
index 00000000000..870c47d7b90
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/equine.dm
@@ -0,0 +1,6 @@
+/datum/sprite_accessory/tail/horse
+ name = "horse tail, colorable"
+ id = "tail_horse"
+ icon_state = "horse"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/tail/feline.dm b/code/modules/sprite_accessories/tail/feline.dm
new file mode 100644
index 00000000000..6a16befc9e8
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/feline.dm
@@ -0,0 +1,70 @@
+/datum/sprite_accessory/tail/tiger_new
+ name = "tiger tail (vwag)"
+ id = "tail_tiger2"
+ icon_state = "tigertail"
+ ani_state = "tigertail_w"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "tigertail_mark"
+ extra_overlay_w = "tigertail_mark_w"
+
+/datum/sprite_accessory/tail/tiger_white
+ name = "tiger, colorable"
+ id = "tail_tiger"
+ icon_state = "tiger"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "tigerinnerwhite"
+
+/datum/sprite_accessory/tail/cat_big
+ name = "kitty (big), colorable"
+ id = "tail_cat_big"
+ icon_state = "catbig"
+ ani_state = "catbig_wag"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ front_behind_system = TRUE
+
+/datum/sprite_accessory/tail/kitty
+ name = "kitty, colorable, downwards"
+ id = "tail_cat_down"
+ icon_state = "kittydown"
+ ani_state = "kittydown_wag"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/kitty_tg
+ name = "kitty, colorable, main"
+ id = "tail_cat_tg"
+ icon_state = "kittytg"
+ ani_state = "kittytg_wag"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/kittyup
+ name = "kitty, colorable, upwards"
+ id = "tail_cat_up"
+ icon_state = "kittyup"
+ ani_state = "kittyup_wag"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/liontail
+ name = "Lion Tail (vwag)"
+ id = "tail_lion"
+ icon_state = "liontail"
+ ani_state = "liontail_w"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "liontail_markings"
+ extra_overlay_w = "liontail_markings_w"
+
+/datum/sprite_accessory/tail/sneptail
+ name = "Snep/Furry Tail (vwag)"
+ id = "tail_snowleopard"
+ icon_state = "sneptail"
+ ani_state = "sneptail_w"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "sneptail_mark"
+ extra_overlay_w = "sneptail_mark_w"
diff --git a/code/modules/sprite_accessories/tail/insects.dm b/code/modules/sprite_accessories/tail/insects.dm
new file mode 100644
index 00000000000..1d395816c1c
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/insects.dm
@@ -0,0 +1,256 @@
+/datum/sprite_accessory/tail/beethorax
+ name = "bee thorax"
+ id = "tail_bee_thorax"
+ icon_state = "beethorax"
+
+/datum/sprite_accessory/tail/buggo
+ name = "Bug abdomen, colorable"
+ id = "tail_bug_abdomen"
+ icon_state = "buggo_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/buggowag
+ name = "Bug abdomen, colorable, vwag change"
+ id = "tail_bug_abdomen2"
+ icon_state = "buggo_s"
+ ani_state = "buggofat_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/buggo_bee
+ name = "Bug abdomen, bee top, dual-colorable"
+ id = "tail_bug_abdomen_bee"
+ icon_state = "buggo_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggobee_markings"
+
+/datum/sprite_accessory/tail/buggo_beefull
+ name = "Bug abdomen, bee full, dual-colorable"
+ id = "tail_bug_abdomen_bee2"
+ icon_state = "buggo_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggobeefull_markings"
+
+/datum/sprite_accessory/tail/buggo_beefullwag
+ name = "Bug abdomen, bee full, dual color, vwag"
+ id = "tail_bug_abdomen_bee3"
+ icon_state = "buggo_s"
+ ani_state = "buggofat_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggobeefull_markings"
+ extra_overlay_w = "buggofatbeefull_markings"
+
+/datum/sprite_accessory/tail/buggo_beewag
+ name = "Bug abdomen, bee top, dual color, vwag"
+ id = "tail_bug_abdomen_bee4"
+ icon_state = "buggo_s"
+ ani_state = "buggofat_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggobee_markings"
+ extra_overlay_w = "buggofatbee_markings"
+
+/datum/sprite_accessory/tail/buggo_firefly
+ name = "Bug abdomen, firefly, dual-colorable"
+ id = "tail_bug_abdomen_firefly"
+ icon_state = "buggo_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofirefly_markings"
+
+/datum/sprite_accessory/tail/buggo_fireflywag
+ name = "Bug abdomen, firefly, dual color, vwag"
+ id = "tail_bug_abdomen_firefly2"
+ icon_state = "buggo_s"
+ ani_state = "buggofat_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofirefly_markings"
+ extra_overlay_w = "buggofatfirefly_markings"
+
+/datum/sprite_accessory/tail/buggo_under
+ name = "Bug abdomen, underside, dual-colorable"
+ id = "tail_bug_abdomen_under"
+ icon_state = "buggo_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggounder_markings"
+
+/datum/sprite_accessory/tail/buggo_underwag
+ name = "Bug abdomen, underside, dual color, vwag"
+ id = "tail_bug_abdomen_under2"
+ icon_state = "buggo_s"
+ ani_state = "buggofat_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggounder_markings"
+ extra_overlay_w = "buggofatunder_markings"
+
+/datum/sprite_accessory/tail/buggofat
+ name = "Fat bug abdomen, colorable"
+ id = "tail_bug_abdomen_fat"
+ icon_state = "buggofat_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/buggofat_bee
+ name = "Fat bug abdomen, bee top, dual-colorable"
+ id = "tail_bug_abdomen_fat_bee"
+ icon_state = "buggofat_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofatbee_markings"
+
+/datum/sprite_accessory/tail/buggofat_beefull
+ name = "Fat bug abdomen, bee full, dual-colorable"
+ id = "tail_bug_abdomen_fat_bee2"
+ icon_state = "buggofat_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofatbeefull_markings"
+
+/datum/sprite_accessory/tail/buggofat_firefly
+ name = "Fat bug abdomen, firefly, dual-colorable"
+ id = "tail_bug_abdomen_fat_firefly"
+ icon_state = "buggofat_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofatfirefly_markings"
+
+/datum/sprite_accessory/tail/buggofat_under
+ name = "Fat bug abdomen, underside, dual-colorable"
+ id = "tail_bug_abdomen_fat_under"
+ icon_state = "buggofat_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofatunder_markings"
+
+/datum/sprite_accessory/tail/buggovass
+ name = "Bug abdomen, vass, colorable"
+ id = "tail_bug_vass"
+ icon_state = "buggo_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/buggovass_wag
+ name = "Bug abdomen, vass, colorable, vwag change"
+ id = "tail_bug_vass2"
+ icon_state = "buggo_vass_s"
+ ani_state = "buggofat_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/buggovass_bee
+ name = "Bug abdomen, bee top, dc, vass"
+ id = "tail_bug_vass_bee"
+ icon_state = "buggo_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggobee_vass_markings"
+
+/datum/sprite_accessory/tail/buggovass_beewag
+ name = "Bug abdomen, bee top, dc, vass, vwag"
+ id = "tail_bug_vass_bee2"
+ icon_state = "buggo_vass_s"
+ ani_state = "buggofat_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggobee_vass_markings"
+ extra_overlay_w = "buggofatbee_vass_markings"
+
+/datum/sprite_accessory/tail/buggovass_beefull
+ name = "Bug abdomen, bee full, dc, vass"
+ id = "tail_bug_vass_bee3"
+ icon_state = "buggo_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggobeefull_vass_markings"
+
+/datum/sprite_accessory/tail/buggovass_beefullwag
+ name = "Bug abdomen, bee full, dc, vass, vwag"
+ id = "tail_bug_vass_bee4"
+ icon_state = "buggo_vass_s"
+ ani_state = "buggofat_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggobeefull_vass_markings"
+ extra_overlay_w = "buggofatbeefull_vass_markings"
+
+/datum/sprite_accessory/tail/buggovass_firefly
+ name = "Bug abdomen, firefly, dc, vass"
+ id = "tail_bug_vass_firefly"
+ icon_state = "buggo_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofirefly_vass_markings"
+
+/datum/sprite_accessory/tail/buggovass_fireflywag
+ name = "Bug abdomen, firefly, dc, vass, vwag"
+ id = "tail_bug_vass_firefly2"
+ icon_state = "buggo_vass_s"
+ ani_state = "buggofat_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofirefly_vass_markings"
+ extra_overlay_w = "buggofatfirefly_vass_markings"
+
+/datum/sprite_accessory/tail/buggovass_under
+ name = "Bug abdomen, underside, dc, vass"
+ id = "tail_bug_vass_under"
+ icon_state = "buggo_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggounder_vass_markings"
+
+/datum/sprite_accessory/tail/buggovass_underwag
+ name = "Bug abdomen, underside, dc, vass, vwag"
+ id = "tail_bug_vass_under2"
+ icon_state = "buggo_vass_s"
+ ani_state = "buggofat_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggounder_vass_markings"
+ extra_overlay_w = "buggofatunder_vass_markings"
+
+/datum/sprite_accessory/tail/buggovassfat
+ name = "Fat bug abdomen, vass, colorable"
+ id = "tail_bug_vass_fat"
+ icon_state = "buggofat_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/buggovassfat_bee
+ name = "Fat bug abdomen, bee top, dc, vass"
+ id = "tail_bug_vass_fat_bee"
+ icon_state = "buggofat_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofatbee_vass_markings"
+
+/datum/sprite_accessory/tail/buggovassfat_beefull
+ name = "Fat bug abdomen, bee full, dc, vass"
+ id = "tail_bug_vass_fat_bee2"
+ icon_state = "buggofat_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofatbeefull_vass_markings"
+
+/datum/sprite_accessory/tail/buggovassfat_firefly
+ name = "Fat bug abdomen, firefly, dc, vass"
+ id = "tail_bug_vass_fat_firefly"
+ icon_state = "buggofat_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofatfirefly_vass_markings"
+
+/datum/sprite_accessory/tail/buggovassfat_under
+ name = "Fat bug abdomen, underside, dc, vass"
+ id = "tail_bug_vass_fat_under"
+ icon_state = "buggofat_vass_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "buggofatunder_vass_markings"
diff --git a/code/modules/sprite_accessories/tail/misc.dm b/code/modules/sprite_accessories/tail/misc.dm
new file mode 100644
index 00000000000..ac11543247e
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/misc.dm
@@ -0,0 +1,49 @@
+/datum/sprite_accessory/tail/ztail
+ name = "jagged flufftail"
+ id = "tail_jagged_flufftail"
+ icon_state = "ztail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/curltail
+ name = "curltail (vwag)"
+ id = "tail_curltail"
+ icon_state = "curltail"
+ ani_state = "curltail_w"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "curltail_mark"
+ extra_overlay_w = "curltail_mark_w"
+
+/datum/sprite_accessory/tail/wagtail
+ name = "avian wagtail, colorable"
+ id = "tail_avian_wagtail"
+ icon_state = "wagtail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/deertail
+ name = "deer tail, dual-color"
+ id = "tail_deer"
+ icon_state = "deertail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "deertail_mark"
+
+/datum/sprite_accessory/tail/Segmentedtail
+ name = "Segmented tail, animated"
+ id = "tail_segmented"
+ icon_state = "Segmentedtail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "Segmentedtailmarking"
+ ani_state = "Segmentedtail_w"
+ extra_overlay_w = "Segmentedtailmarking_w"
+
+/datum/sprite_accessory/tail/shorttail
+ name = "shorttail (vwag)"
+ id = "tail_shorttail"
+ icon_state = "straighttail"
+ ani_state = "straighttail_w"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/tail/pokemon.dm b/code/modules/sprite_accessories/tail/pokemon.dm
new file mode 100644
index 00000000000..df8b975c6e9
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/pokemon.dm
@@ -0,0 +1,4 @@
+/datum/sprite_accessory/tail/leafeon
+ name = "Leaf Tail"
+ id = "tail_leafeon"
+ icon_state = "leaf_tail"
diff --git a/code/modules/sprite_accessories/tail/rodents_and_adjacent.dm b/code/modules/sprite_accessories/tail/rodents_and_adjacent.dm
new file mode 100644
index 00000000000..8744e081902
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/rodents_and_adjacent.dm
@@ -0,0 +1,56 @@
+/datum/sprite_accessory/tail/beaver
+ name = "beaver tail, colorable"
+ id = "tail_beaver"
+ icon_state = "beaver"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/redpanda
+ name = "red panda"
+ id = "tail_redpanda"
+ icon_state = "redpanda"
+
+/datum/sprite_accessory/tail/ringtail
+ name = "ringtail, colorable"
+ id = "tail_ringtail"
+ icon_state = "ringtail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "ringtail_mark"
+
+/datum/sprite_accessory/tail/mouse
+ name = "mouse, colorable"
+ id = "tail_mouse"
+ icon_state = "mouse"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/mouse_pink
+ name = "mouse, pink"
+ id = "tail_mouse_pink"
+ icon_state = "mouse-pink"
+
+/datum/sprite_accessory/tail/skunktail
+ name = "skunk, dual-color"
+ id = "tail_skunk"
+ icon_state = "skunktail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "skunktail_mark"
+
+/datum/sprite_accessory/tail/squirrel
+ name = "squirrel, colorable"
+ id = "tail_squirrel"
+ icon_state = "squirrel"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/squirrel_orange
+ name = "squirel, orange"
+ id = "tail_squirrel_orange"
+ icon_state = "squirrel-orange"
+
+/datum/sprite_accessory/tail/squirrel_red
+ name = "squirrel, red"
+ id = "tail_squirrel_red"
+ icon_state = "squirrel-red"
diff --git a/code/modules/sprite_accessories/tail/scalies.dm b/code/modules/sprite_accessories/tail/scalies.dm
new file mode 100644
index 00000000000..c8960660814
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/scalies.dm
@@ -0,0 +1,58 @@
+/datum/sprite_accessory/tail/chameleon
+ name = "Chameleon, colorable"
+ id = "tail_chameleon"
+ icon_state = "chameleon"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/dragon
+ name = "dragon, colorable"
+ id = "tail_dragon"
+ icon_state = "dragon"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/Easterntail
+ name = "Eastern Dragon (Animated)"
+ id = "tail_dragon_eastern"
+ icon_state = "Easterntail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "EasterntailColorTip"
+ ani_state = "Easterntail_w"
+ extra_overlay_w = "EasterntailColorTip_w"
+
+/datum/sprite_accessory/tail/lizard_tail_dark_tiger
+ name = "Lizard Tail (Dark Tiger)"
+ id = "tail_lizard_darktiger"
+ icon_state = "lizard_tail_dark_tiger"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/lizard_tail_light_tiger
+ name = "Lizard Tail (Light Tiger)"
+ id = "tail_lizard_lighttiger"
+ icon_state = "lizard_tail_light_tiger"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/lizard_tail_smooth
+ name = "Lizard Tail (Smooth)"
+ id = "tail_lizard_smooth"
+ icon_state = "lizard_tail_smooth"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/lizard_tail_spiked
+ name = "Lizard Tail (Spiked)"
+ id = "tail_lizard_spiked"
+ icon_state = "lizard_tail_spiked"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/tail_smooth
+ name = "Smooth Lizard Tail, Colorable"
+ id = "tail_lizard_smooth2"
+ icon_state = "tail_smooth"
+ ani_state = "tail_smooth_w"
+ do_colouration = 1
diff --git a/code/modules/sprite_accessories/tail/snake.dm b/code/modules/sprite_accessories/tail/snake.dm
new file mode 100644
index 00000000000..60d5b586656
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/snake.dm
@@ -0,0 +1,6 @@
+/datum/sprite_accessory/tail/snaketail
+ name = "snake tail, colorable"
+ id = "tail_snake"
+ icon_state = "snaketail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/tail/species/akula.dm b/code/modules/sprite_accessories/tail/species/akula.dm
new file mode 100644
index 00000000000..62ca47d4ddc
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/akula.dm
@@ -0,0 +1,13 @@
+/datum/sprite_accessory/tail/special/akula
+ name = "akula tail"
+ id = "tail_akula"
+ icon_state = "sharktail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/akulahc
+ name = "akula tail, colorable"
+ id = "tail_akula_color"
+ icon_state = "sharktail_hc_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/tail/species/monkey.dm b/code/modules/sprite_accessories/tail/species/monkey.dm
new file mode 100644
index 00000000000..590d6536947
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/monkey.dm
@@ -0,0 +1,10 @@
+/datum/sprite_accessory/tail/special/monkeyhc
+ name = "monkey tail, colorable"
+ id = "tail_monkey"
+ icon_state = "chimptail_hc_s"
+ do_colouration = 1
+
+/datum/sprite_accessory/tail/special/monkey
+ name = "monkey tail"
+ id = "tail_monkey_nocolor"
+ icon_state = "chimptail_s"
diff --git a/code/modules/sprite_accessories/tail/species/naramadi.dm b/code/modules/sprite_accessories/tail/species/naramadi.dm
new file mode 100644
index 00000000000..f1fa75be65a
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/naramadi.dm
@@ -0,0 +1,21 @@
+/datum/sprite_accessory/tail/special/sergal
+ name = "sergal tail"
+ id = "tail_naramadi"
+ icon_state = "sergtail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/sergalhc
+ name = "sergal tail, colorable"
+ id = "tail_naramadi_color"
+ icon_state = "sergtail_hc_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/sergaltaildc
+ name = "sergal, dual-color"
+ id = "tail_sergal"
+ icon_state = "sergal"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "sergal_mark"
diff --git a/code/modules/sprite_accessories/tail/species/nevrean.dm b/code/modules/sprite_accessories/tail/species/nevrean.dm
new file mode 100644
index 00000000000..60e68f17e3a
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/nevrean.dm
@@ -0,0 +1,37 @@
+/datum/sprite_accessory/tail/special/nevreanhc
+ name = "nevrean tail, colorable"
+ id = "tail_nevrean_color"
+ icon_state = "nevreantail_hc_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/nevrean
+ name = "nevrean tail"
+ id = "tail_nevrean"
+ icon_state = "nevreantail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/nevreandc
+ name = "nevrean tail, dual-color"
+ id = "tail_nevrean2"
+ icon_state = "nevreantail_dc"
+ extra_overlay = "nevreantail_dc_tail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/nevreanwagdc
+ name = "nevrean wagtail, dual-color"
+ id = "tail_nevrean_wag"
+ icon_state = "wagtail"
+ extra_overlay = "wagtail_dc_tail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/nevreanwagdc_alt
+ name = "nevrean wagtail, marked, dual-color"
+ id = "tail_nevrean_wag_mark"
+ icon_state = "wagtail2_dc"
+ extra_overlay = "wagtail2_dc_mark"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/tail/species/shadekin.dm b/code/modules/sprite_accessories/tail/species/shadekin.dm
new file mode 100644
index 00000000000..9707bd2f109
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/shadekin.dm
@@ -0,0 +1,8 @@
+/datum/sprite_accessory/tail/shadekin_short
+ name = "Shadekin Short Tail, colorable"
+ id = "tail_shadekin_short"
+ icon_state = "shadekin-short"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ apply_restrictions = TRUE
+ species_allowed = list(SPECIES_SHADEKIN)
diff --git a/code/modules/sprite_accessories/tail/species/tajaran.dm b/code/modules/sprite_accessories/tail/species/tajaran.dm
new file mode 100644
index 00000000000..5d2aa0f3ba8
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/tajaran.dm
@@ -0,0 +1,40 @@
+/datum/sprite_accessory/tail/special/tajaran
+ name = "tajaran tail"
+ id = "tail_tajaran"
+ icon_state = "tajtail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/tajaranhc
+ name = "tajaran tail, colorable"
+ id = "tail_tajaran_color"
+ icon_state = "tajtail_hc_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/tajaran_damaged
+ name = "tajaran tail, damaged/short"
+ id = "tail_tajaran_short"
+ icon_state = "tajtail_damaged_s"
+ species_allowed = list(SPECIES_TAJ)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tajaran_stubby
+ name = "tajaran tail, stubby"
+ id = "tail_tajarna_stubby"
+ icon_state = "tajtail_stubby_s"
+ species_allowed = list(SPECIES_TAJ)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/stripey
+ name = "stripey taj, colorable"
+ id = "tail_tajaran_stripey"
+ icon_state = "stripeytail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "stripeytail_mark"
+
+/datum/sprite_accessory/tail/stripeytail_brown
+ name = "stripey taj, brown"
+ id = "tail_tajaran_stripey_brown"
+ icon_state = "stripeytail-brown"
diff --git a/code/modules/sprite_accessories/tail/species/teshari.dm b/code/modules/sprite_accessories/tail/species/teshari.dm
new file mode 100644
index 00000000000..b407ed106cd
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/teshari.dm
@@ -0,0 +1,242 @@
+/datum/sprite_accessory/tail/tesh_pattern_fem
+ name = "Teshari female tail pattern"
+ id = "tail_teshari_pattern_f"
+ icon_state = "teshtail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "teshpattern_fem_tail"
+
+/datum/sprite_accessory/tail/tesh_pattern_fem_alt
+ name = "Teshari female tail alt. pattern"
+ id = "tail_teshari_pattern_f2"
+ icon_state = "teshtail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "teshpattern_fem_alt"
+
+/datum/sprite_accessory/tail/tesh_pattern_male
+ name = "Teshari male tail pattern"
+ id = "tail_teshari_pattern_m"
+ icon_state = "teshtail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "teshpattern_male_tail"
+
+/datum/sprite_accessory/tail/tesh_pattern_male_alt
+ name = "Teshari male tail alt. pattern"
+ id = "tail_teshari_pattern_m2"
+ icon_state = "teshtail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "teshpattern_male_alt"
+
+/datum/sprite_accessory/tail/teshari_fluffytail
+ name = "Teshari tail"
+ id = "tail_teshari_fluffy"
+ icon_state = "teshari_fluffytail"
+ extra_overlay = "teshari_fluffytail_mark"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/teshtailfeathered
+ name = "Teshari tail alt"
+ id = "tail_teshari2"
+ icon_state = "teshtail_s"
+ extra_overlay = "teshtail_feathers_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/tesharitail_noplume
+ name = "teshari tail, no plumage"
+ id = "tail_teshari3"
+ icon_state = "teshtail_noplume_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_noplume_feathered
+ name = "teshari tail, no plumage w/feathers"
+ id = "tail_teshari4"
+ icon_state = "teshtail_noplume_s"
+ extra_overlay = "teshtail_noplume_feathers_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_damaged
+ name = "teshari tail, damaged"
+ id = "tail_teshari5"
+ icon_state = "teshtail_damaged_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_damaged_feathered
+ name = "teshari tail, damaged w/feathers"
+ id = "tail_teshari6"
+ icon_state = "teshtail_damaged_s"
+ extra_overlay = "teshtail_damaged_feathers_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_damaged_unbranded
+ name = "teshari tail, damaged w/ unbranded prosthetic"
+ id = "tail_teshari7"
+ icon_state = "teshtail_damaged_s"
+ extra_overlay = "teshtail_damaged_prosthetic_unbranded_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_damaged_unbranded_feathered
+ name = "teshari tail, damaged w/feathers + unbranded prosthetic"
+ id = "tail_teshari8"
+ icon_state = "teshtail_damaged_s"
+ extra_overlay = "teshtail_damaged_feathers_s"
+ extra_overlay2 = "teshtail_damaged_prosthetic_unbranded_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_damaged_cenilimi
+ name = "teshari tail, damaged w/ Cenilimi Cybernetics prosthetic"
+ id = "tail_teshari9"
+ icon_state = "teshtail_damaged_s"
+ extra_overlay = "teshtail_damaged_prosthetic_cenilimi_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_damaged_cenilimi_feathered
+ name = "teshari tail, damaged w/feathers + Cenilimi Cybernetics prosthetic"
+ id = "tail_teshari10"
+ icon_state = "teshtail_damaged_s"
+ extra_overlay = "teshtail_damaged_feathers_s"
+ extra_overlay2 = "teshtail_damaged_prosthetic_cenilimi_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_damaged_wood
+ id = "tail_teshari11"
+ name = "teshari tail, damaged w/ wooden prosthetic"
+ icon_state = "teshtail_damaged_s"
+ extra_overlay = "teshtail_damaged_prosthetic_wood_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_damaged_wood_feathered
+ name = "teshari tail, damaged w/feathers + wooden prosthetic"
+ id = "tail_teshari12"
+ icon_state = "teshtail_damaged_s"
+ extra_overlay = "teshtail_damaged_feathers_s"
+ extra_overlay2 = "teshtail_damaged_prosthetic_wood_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_damaged_sifwood
+ name = "teshari tail, damaged w/ Sivian wooden prosthetic"
+ id = "tail_teshari13"
+ icon_state = "teshtail_damaged_s"
+ extra_overlay = "teshtail_damaged_prosthetic_wood_sif_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_damaged_sifwood_feathered
+ name = "teshari tail, damaged w/feathers + Sivian wooden prosthetic"
+ id = "tail_teshari14"
+ icon_state = "teshtail_damaged_s"
+ extra_overlay = "teshtail_damaged_feathers_s"
+ extra_overlay2 = "teshtail_damaged_prosthetic_wood_sif_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_stubby
+ name = "teshari tail, stubby"
+ id = "tail_teshari15"
+ icon_state = "teshtail_stubby_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_stubby_feathered
+ name = "teshari tail, stubby w/feathers"
+ id = "tail_teshari16"
+ icon_state = "teshtail_stubby_s"
+ extra_overlay = "teshtail_stubby_feathers_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_stubby_unbranded
+ name = "teshari tail, stubby w/ unbranded prosthetic"
+ id = "tail_teshari17"
+ icon_state = "teshtail_stubby_s"
+ extra_overlay = "teshtail_stubby_prosthetic_unbranded_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_stubby_unbranded_feathered
+ name = "teshari tail, stubby w/ feathers + unbranded prosthetic"
+ id = "tail_teshari18"
+ icon_state = "teshtail_stubby_s"
+ extra_overlay = "teshtail_stubby_feathers_s"
+ extra_overlay2 = "teshtail_stubby_prosthetic_unbranded_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_stubby_cenilimi
+ name = "teshari tail, stubby w/ Cenilimi Cybernetics prosthetic"
+ id = "tail_teshari19"
+ icon_state = "teshtail_stubby_s"
+ extra_overlay = "teshtail_stubby_prosthetic_cenilimi_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_stubby_cenilimi_feathered
+ name = "teshari tail, stubby w/ feathers + Cenilimi Cybernetics prosthetic"
+ id = "tail_teshari20"
+ icon_state = "teshtail_stubby_s"
+ extra_overlay = "teshtail_stubby_feathers_s"
+ extra_overlay2 = "teshtail_stubby_prosthetic_cenilimi_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_stubby_wood
+ name = "teshari tail, stubby w/ wooden prosthetic"
+ id = "tail_teshari21"
+ icon_state = "teshtail_stubby_s"
+ extra_overlay = "teshtail_stubby_prosthetic_wood_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_stubby_wood_feathered
+ name = "teshari tail, stubby w/feathers + wooden prosthetic"
+ id = "tail_teshari22"
+ icon_state = "teshtail_stubby_s"
+ extra_overlay = "teshtail_stubby_feathers_s"
+ extra_overlay2 = "teshtail_stubby_prosthetic_wood_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_stubby_sifwood
+ name = "teshari tail, stubby w/ Sivian wooden prosthetic"
+ id = "tail_teshari23"
+ icon_state = "teshtail_stubby_s"
+ extra_overlay = "teshtail_stubby_prosthetic_wood_sif_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_stubby_sifwood_feathered
+ name = "teshari tail, stubby w/feathers + Sivian wooden prosthetic"
+ id = "tail_teshari24"
+ icon_state = "teshtail_stubby_s"
+ extra_overlay = "teshtail_stubby_feathers_s"
+ extra_overlay2 = "teshtail_stubby_prosthetic_wood_sif_s"
+ species_allowed = list(SPECIES_TESHARI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tesharitail_prosthetic_unbranded
+ name = "teshari tail, unbranded prosthetic"
+ id = "tail_teshari25"
+ icon_state = "teshtail_prosthetic_unbranded_s"
+ species_allowed = list(SPECIES_TESHARI)
+ do_colouration = FALSE
+
+/datum/sprite_accessory/tail/special/tesharitail_prosthetic_cenilimi
+ name = "teshari tail, Cenilimi Cybernetics prosthetic"
+ id = "tail_teshari26"
+ icon_state = "teshtail_prosthetic_cenilimi_s"
+ species_allowed = list(SPECIES_TESHARI)
+ do_colouration = FALSE
diff --git a/code/modules/sprite_accessories/tail/species/unathi.dm b/code/modules/sprite_accessories/tail/species/unathi.dm
new file mode 100644
index 00000000000..5c14d72f82a
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/unathi.dm
@@ -0,0 +1,27 @@
+/datum/sprite_accessory/tail/special/unathi
+ name = "unathi tail"
+ id = "tail_unathi"
+ icon_state = "sogtail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/unathihc
+ name = "unathi tail, colorable"
+ id = "tail_unathi_color"
+ icon_state = "sogtail_hc_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/unathi_damaged
+ name = "unathi tail, damaged"
+ id = "tail_unathi_damaged"
+ icon_state = "unathitail_damaged_s"
+ species_allowed = list(SPECIES_UNATHI)
+ color_blend_mode = ICON_ADD
+
+/datum/sprite_accessory/tail/special/unathi_stubby
+ name = "unathi tail, stubby"
+ id = "tail_unathi_stubby"
+ icon_state = "unathitail_stubby_s"
+ species_allowed = list(SPECIES_UNATHI)
+ color_blend_mode = ICON_ADD
diff --git a/code/modules/sprite_accessories/tail/species/vox.dm b/code/modules/sprite_accessories/tail/species/vox.dm
new file mode 100644
index 00000000000..9228bdfc8d1
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/vox.dm
@@ -0,0 +1,10 @@
+/datum/sprite_accessory/tail/special/armalis
+ name = "armalis tail"
+ id = "tail_vox_armalis"
+ icon_state = "armalis_tail_humanoid_s"
+
+/datum/sprite_accessory/tail/special/armalishc
+ name = "armalis tail, colorable"
+ id = "tail_vox_armalis_color"
+ icon_state = "armalis_tail_humanoid_hc_s"
+ do_colouration = 1
diff --git a/code/modules/sprite_accessories/tail/species/vulpkanin.dm b/code/modules/sprite_accessories/tail/species/vulpkanin.dm
new file mode 100644
index 00000000000..2c498e46aad
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/vulpkanin.dm
@@ -0,0 +1,23 @@
+/datum/sprite_accessory/tail/special/vulpan
+ name = "vulpkanin, colorable"
+ id = "tail_vulp"
+ icon_state = "vulptail_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/vulp_new
+ name = "new vulp tail (vwag)"
+ id = "tail_vulp2"
+ icon_state = "vulptail"
+ ani_state = "vulptail_w"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "vulptail_mark"
+ extra_overlay_w = "vulptail_mark_w"
+
+/datum/sprite_accessory/tail/vulpan_alt
+ name = "vulpkanin alt style, colorable"
+ id = "tail_vulp3"
+ icon_state = "vulptail_alt"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/tail/species/xenomorph.dm b/code/modules/sprite_accessories/tail/species/xenomorph.dm
new file mode 100644
index 00000000000..84f3eb1cd61
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/xenomorph.dm
@@ -0,0 +1,67 @@
+/datum/sprite_accessory/tail/snag
+ name = "xenomorph tail 1"
+ id = "tail_xenomorph"
+ icon_state = "snag"
+
+/datum/sprite_accessory/tail/xenotail
+ name = "xenomorph tail 2"
+ id = "tail_xenomorph2"
+ icon_state = "xenotail"
+
+/datum/sprite_accessory/tail/xenotail_fullcolour
+ name = "xenomorph tail (fully colourable)"
+ id = "tail_xenomorph3"
+ icon_state = "xenotail_fullcolour"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/xenotailalt_fullcolour
+ name = "xenomorph tail alt. (fully colourable)"
+ id = "tail_xenomorph4"
+ icon_state = "xenotailalt_fullcolour"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/xenodrone
+ name = "xenomorph drone tail"
+ id = "tail_xeno_drone"
+ icon_state = "xenos_drone_tail_s"
+
+/datum/sprite_accessory/tail/special/xenodronehc
+ name = "xenomorph drone tail, colorable"
+ id = "tail_xeno_drone_color"
+ icon_state = "xenos_drone_tail_hc_s"
+ do_colouration = 1
+
+/datum/sprite_accessory/tail/special/xenohunter
+ name = "xenomorph hunter tail"
+ id = "tail_xeno_hunter"
+ icon_state = "xenos_hunter_tail_s"
+
+/datum/sprite_accessory/tail/special/xenohunterhc
+ name = "xenomorph hunter tail, colorable"
+ id = "tail_xeno_hunter_color"
+ icon_state = "xenos_hunter_tail_hc_s"
+ do_colouration = 1
+
+/datum/sprite_accessory/tail/special/xenoqueen
+ name = "xenomorph queen tail"
+ id = "tail_xeno_queen"
+ icon_state = "xenos_queen_tail_s"
+
+/datum/sprite_accessory/tail/special/xenoqueenhc
+ name = "xenomorph queen tail, colorable"
+ id = "tail_xeno_queen_color"
+ icon_state = "xenos_queen_tail_hc_s"
+ do_colouration = 1
+
+/datum/sprite_accessory/tail/special/xenosentinel
+ name = "xenomorph sentinel tail"
+ id = "tail_xeno_sentinel"
+ icon_state = "xenos_sentinel_tail_s"
+
+/datum/sprite_accessory/tail/special/xenosentinelhc
+ name = "xenomorph sentinel tail, colorable"
+ id = "tail_xeno_sentinel_color"
+ icon_state = "xenos_sentinel_tail_hc_s"
+ do_colouration = 1
diff --git a/code/modules/sprite_accessories/tail/species/zorren.dm b/code/modules/sprite_accessories/tail/species/zorren.dm
new file mode 100644
index 00000000000..61dca3ba082
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/species/zorren.dm
@@ -0,0 +1,13 @@
+/datum/sprite_accessory/tail/special/fennechc
+ name = "flatland zorren tail, colorable"
+ id = "tail_zorren_flat"
+ icon_state = "fentail_hc_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/special/foxhc
+ name = "highlander zorren tail, colorable"
+ id = "tail_zorren_high"
+ icon_state = "foxtail_hc_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/tail/synthetic.dm b/code/modules/sprite_accessories/tail/synthetic.dm
new file mode 100644
index 00000000000..2c8962a8b6f
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/synthetic.dm
@@ -0,0 +1,69 @@
+/datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts
+ name = "Ward-Takahashi Tail"
+ id = "tail_synth_wardtakashi"
+ icon_state = "wardtakahashi_vulp"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/wartacosushi_tail_dc
+ name = "Ward-Takahashi Tail, dual-color"
+ id = "tail_synth_wardtakashi2"
+ icon_state = "wardtakahashi_vulp_dc"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "wardtakahashi_vulp_dc_mark"
+
+/datum/sprite_accessory/tail/zenghu_taj
+ name = "Zeng-Hu Tajaran Synth tail"
+ id = "tail_synth_zenghu_tajaran"
+ icon_state = "zenghu_taj"
+
+/datum/sprite_accessory/tail/eboop
+ name = "EGN mech tail (dual color)"
+ id = "tail_synth_egn"
+ icon_state = "eboop"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "eboop_mark"
+
+/datum/sprite_accessory/tail/Plugtail
+ name = "Synthetic plug tail"
+ id = "tail_synth_plug"
+ icon_state = "Plugtail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "PlugtailMarking"
+ extra_overlay2 = "PlugtailMarking2"
+
+/datum/sprite_accessory/tail/robo_tail
+ name = "Robo Dragon Tail"
+ id = "tail_synth_dragon"
+ icon_state = "robo_dragon"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "robodragon_b"
+
+/datum/sprite_accessory/tail/Segmentedlights
+ name = "Segmented tail, animated synth"
+ id = "tail_synth_segmented"
+ icon_state = "Segmentedtail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "Segmentedlights"
+ ani_state = "Segmentedtail_w"
+ extra_overlay_w = "Segmentedlights_w"
+
+/datum/sprite_accessory/tail/synthtail_static
+ name = "Synthetic lizard tail"
+ id = "tail_synth_lizard"
+ icon_state = "synthtail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/synthtail_vwag
+ name = "Synthetic lizard tail (vwag)"
+ id = "tail_synth_lizard2"
+ icon_state = "synthtail"
+ ani_state = "synthtail_w"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/sprite_accessories/tail/taurs.dm
similarity index 87%
rename from code/modules/vore/appearance/sprite_accessories_taur_vr.dm
rename to code/modules/sprite_accessories/tail/taurs.dm
index 3c556831e2f..d9f168d827a 100644
--- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm
+++ b/code/modules/sprite_accessories/tail/taurs.dm
@@ -1,14 +1,5 @@
-/*
-////////////////////////////
-/ =--------------------= /
-/ == Taur Definitions == /
-/ =--------------------= /
-////////////////////////////
-*/
-
-// Taur sprites are now a subtype of tail since they are mutually exclusive anyway.
-
/datum/sprite_accessory/tail/taur
+ abstract_type = /datum/sprite_accessory/tail/taur
name = "You should not see this..."
icon = 'icons/mob/sprite_accessories/taurs.dmi'
do_colouration = 1 // Yes color, using tail color
@@ -48,15 +39,11 @@
clip_mask_icon = 'icons/mob/sprite_accessories/taurs.dmi'
clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms
-/datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite.
- name = "Long Lizard Tail (Roiz Lizden)"
- icon_state = "roiz_tail_s"
- do_colouration = 0
- ckeys_allowed = list("spoopylizz")
// Species-unique long tails/taurhalves
/datum/sprite_accessory/tail/taur/shadekin_tail
name = "Shadekin Tail"
+ id = "tail_taur_shadekin"
icon_state = "shadekin_s"
can_ride = 0
hide_body_parts = null
@@ -67,51 +54,61 @@
/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_2c
name = "Shadekin Tail dual-color"
+ id = "tail_taur_shadekin_colorable"
extra_overlay = "shadekin_markings"
/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_long
name = "Shadekin Long Tail"
+ id = "tail_taur_shadekin_long"
icon_state = "shadekin_long_s"
/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_long_2
name = "Shadekin Striped Long Tail"
+ id = "tail_taur_shadekin_long_stripes"
icon_state = "shadekin_long_2"
extra_overlay = "shadekin_long_marking_2"
/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_small
name = "Shadekin Small Tail"
+ id = "tail_taur_shadekin_small"
icon_state = "shadekin_s2"
// Tails/taurhalves for everyone
/datum/sprite_accessory/tail/taur/wolf
name = "Wolf (Taur)"
+ id = "tail_taur_wolf"
icon_state = "wolf_s"
suit_sprites = 'icons/mob/clothing/taursuits_wolf.dmi'
//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/fatwolf
name = "Fat Wolf (Taur)"
+ id = "tail_taur_wolf_fat"
icon_state = "fatwolf_s"
/datum/sprite_accessory/tail/taur/wolf/wolf_2c
name = "Wolf dual-color (Taur)"
+ id = "tail_taur_wolf_colorable"
icon_state = "wolf_s"
extra_overlay = "wolf_markings"
//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c
name = "Fat Wolf dual-color (Taur)"
+ id = "tail_taur_wolf_fat_colorable"
icon_state = "fatwolf_s"
extra_overlay = "fatwolf_markings"
/datum/sprite_accessory/tail/taur/wolf/synthwolf
name = "SynthWolf dual-color (Taur)"
+ id = "tail_taur_wolf_synth_colorable"
icon_state = "synthwolf_s"
extra_overlay = "synthwolf_markings"
/datum/sprite_accessory/tail/taur/naga
name = "Naga (Taur)"
+ id = "tail_taur_naga"
icon_state = "naga_s"
suit_sprites = 'icons/mob/clothing/taursuits_naga.dmi'
@@ -144,11 +141,13 @@
/datum/sprite_accessory/tail/taur/naga/naga_2c
name = "Naga dual-color (Taur)"
+ id = "tail_taur_naga_colorable"
icon_state = "naga_s"
extra_overlay = "naga_markings"
/datum/sprite_accessory/tail/taur/horse
name = "Horse (Taur)"
+ id = "tail_taur_horse"
icon_state = "horse_s"
suit_sprites = 'icons/mob/clothing/taursuits_horse.dmi'
@@ -169,11 +168,13 @@
/datum/sprite_accessory/tail/taur/horse/synthhorse
name = "SynthHorse dual-color (Taur)"
+ id = "tail_taur_horse_synth_colorable"
icon_state = "synthhorse_s"
extra_overlay = "synthhorse_markings"
/datum/sprite_accessory/tail/taur/cow
name = "Cow (Taur)"
+ id = "tail_taur_cow"
icon_state = "cow_s"
suit_sprites = 'icons/mob/clothing/taursuits_cow.dmi'
@@ -194,6 +195,7 @@
/datum/sprite_accessory/tail/taur/deer
name = "Deer dual-color (Taur)"
+ id = "tail_taur_deer_colorable"
icon_state = "deer_s"
extra_overlay = "deer_markings"
suit_sprites = 'icons/mob/clothing/taursuits_deer.dmi'
@@ -215,21 +217,25 @@
/datum/sprite_accessory/tail/taur/lizard
name = "Lizard (Taur)"
+ id = "tail_taur_lizard"
icon_state = "lizard_s"
suit_sprites = 'icons/mob/clothing/taursuits_lizard.dmi'
/datum/sprite_accessory/tail/taur/lizard/lizard_2c
name = "Lizard dual-color (Taur)"
+ id = "tail_taur_lizard_colorable"
icon_state = "lizard_s"
extra_overlay = "lizard_markings"
/datum/sprite_accessory/tail/taur/lizard/synthlizard
name = "SynthLizard dual-color (Taur)"
+ id = "tail_taur_lizard_synth"
icon_state = "synthlizard_s"
extra_overlay = "synthlizard_markings"
/datum/sprite_accessory/tail/taur/spider
name = "Spider (Taur)"
+ id = "tail_taur_spider"
icon_state = "spider_s"
suit_sprites = 'icons/mob/clothing/taursuits_spider.dmi'
@@ -250,6 +256,7 @@
/datum/sprite_accessory/tail/taur/tents
name = "Tentacles (Taur)"
+ id = "tail_taur_tentacles"
icon_state = "tent_s"
can_ride = 0
@@ -276,37 +283,42 @@
/datum/sprite_accessory/tail/taur/feline
name = "Feline (Taur)"
+ id = "tail_taur_feline"
icon_state = "feline_s"
suit_sprites = 'icons/mob/clothing/taursuits_feline.dmi'
-//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/fatfeline
name = "Fat Feline (Taur)"
+ id = "tail_taur_feline_fat"
icon_state = "fatfeline_s"
/datum/sprite_accessory/tail/taur/fatfeline_wag
name = "Fat Feline (Taur) (vwag)"
+ id = "tail_taur_feline_fat_waggable"
icon_state = "fatfeline_s"
ani_state = "fatfeline_w"
/datum/sprite_accessory/tail/taur/feline/feline_2c
name = "Feline dual-color (Taur)"
+ id = "tail_taur_feline_colorable"
icon_state = "feline_s"
extra_overlay = "feline_markings"
-//TFF 22/11/19 - CHOMPStation port of fat taur sprites
/datum/sprite_accessory/tail/taur/feline/fatfeline_2c
name = "Fat Feline dual-color (Taur)"
+ id = "tail_taur_feline_fat_colorable"
icon_state = "fatfeline_s"
extra_overlay = "fatfeline_markings"
/datum/sprite_accessory/tail/taur/feline/synthfeline
name = "SynthFeline dual-color (Taur)"
+ id = "tail_taur_feline_synth_colorable"
icon_state = "synthfeline_s"
extra_overlay = "synthfeline_markings"
/datum/sprite_accessory/tail/taur/slug
name = "Slug (Taur)"
+ id = "tail_taur_slug"
icon_state = "slug_s"
suit_sprites = 'icons/mob/clothing/taursuits_slug.dmi'
@@ -339,32 +351,26 @@
/datum/sprite_accessory/tail/taur/frog
name = "Frog (Taur)"
+ id = "tail_taur_frog"
icon_state = "frog_s"
/datum/sprite_accessory/tail/taur/drake //Enabling on request, no suit compatibility but then again see 2 above.
name = "Drake (Taur)"
+ id = "tail_taur_drake"
icon_state = "drake_s"
extra_overlay = "drake_markings"
suit_sprites = 'icons/mob/clothing/taursuits_drake.dmi'
/datum/sprite_accessory/tail/taur/otie
name = "Otie (Taur)"
+ id = "tail_taur_otie"
icon_state = "otie_s"
extra_overlay = "otie_markings"
suit_sprites = 'icons/mob/clothing/taursuits_otie.dmi'
-/datum/sprite_accessory/tail/taur/alraune/alraune_2c
- name = "Alraune (dual color)"
- icon_state = "alraunecolor_s"
- ani_state = "alraunecolor_closed_s"
- ckeys_allowed = null
- do_colouration = 1
- extra_overlay = "alraunecolor_markings"
- extra_overlay_w = "alraunecolor_closed_markings"
- clip_mask_state = "taur_clip_mask_alraune"
-
/datum/sprite_accessory/tail/taur/wasp
name = "Wasp (dual color)"
+ id = "tail_taur_wasp"
icon_state = "wasp_s"
extra_overlay = "wasp_markings"
clip_mask_state = "taur_clip_mask_wasp"
@@ -386,6 +392,7 @@
/datum/sprite_accessory/tail/taur/mantis
name = "Mantis (Taur)"
+ id = "tail_taur_mantis"
icon_state = "mantis_s"
clip_mask_state = "taur_clip_mask_mantis"
@@ -406,52 +413,9 @@
// Special snowflake tails/taurhalves
-//spoopylizz: Roiz Lizden
-/datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite.
- name = "Long Lizard Tail (Roiz Lizden)"
- icon_state = "roiz_tail_s"
- do_colouration = 0
- ckeys_allowed = list("spoopylizz")
- hide_body_parts = null
- clip_mask_icon = null
- clip_mask_state = null
-
-//wickedtemp: Chakat Tempest
-/datum/sprite_accessory/tail/taur/feline/tempest
- name = "Feline (wickedtemp) (Taur)"
- icon_state = "tempest_s"
- ckeys_allowed = list("wickedtemp")
-
-//silencedmp5a5: Serdykov Antoz
-/datum/sprite_accessory/tail/taur/wolf/serdy
- name = "CyberSerdy (silencedmp5a5) (Taur)"
- icon_state = "serdy_s"
- ckeys_allowed = list("silencedmp5a5")
-
-//liquidfirefly: Ariana Scol
-/datum/sprite_accessory/tail/taur/centipede
- name = "Centipede (liquidfirefly) (Taur)"
- icon_state = "ariana_s"
- ckeys_allowed = list("liquidfirefly")
- do_colouration = 0
-
- msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!"
- msg_prey_disarm_run = "%owner pushes you down to the ground with their leg!"
-
- msg_owner_disarm_walk = "You firmly push your leg down on %prey, painfully but harmlessly pinning them to the ground!"
- msg_prey_disarm_walk = "%owner firmly pushes their leg down on you, quite painfully but harmlessly pinning you to the ground!"
-
- msg_owner_harm_walk = "You methodically place your leg down upon %prey's body, slowly applying pressure, crushing them against the floor below!"
- msg_prey_harm_walk = "%owner methodically places their leg upon your body, slowly applying pressure, crushing you against the floor below!"
-
- msg_owner_grab_success = "You pin %prey down on the ground with your front leg before using your other leg to pick them up, trapping them between two of your front legs!"
- msg_prey_grab_success = "%owner pins you down on the ground with their front leg before using their other leg to pick you up, trapping you between two of their front legs!"
-
- msg_owner_grab_fail = "You step down onto %prey, squishing them and forcing them down to the ground!"
- msg_prey_grab_fail = "%owner steps down and squishes you with their leg, forcing you down to the ground!"
-
-//natje:
+// todo: remove
/datum/sprite_accessory/tail/taur/alraune
+ abstract_type = /datum/sprite_accessory/tail/taur/alraune
name = "Alraune (natje) (Taur)"
icon_state = "alraune_s"
ani_state = "alraune_closed_s"
@@ -484,15 +448,18 @@
/datum/sprite_accessory/tail/taur/alraune/alraune_2c
name = "Alraune (dual color)"
+ id = "tail_taur_alraune_colorable"
icon_state = "alraunecolor_s"
ani_state = "alraunecolor_closed_s"
ckeys_allowed = null
do_colouration = 1
extra_overlay = "alraunecolor_markings"
extra_overlay_w = "alraunecolor_closed_markings"
+ clip_mask_state = "taur_clip_mask_alraune"
/datum/sprite_accessory/tail/taur/long_lizard
name = "Large Dragon Tail"
+ id = "tail_taur_dragon_large"
icon_state = "big_liz"
can_ride = 0
hide_body_parts = null
@@ -501,4 +468,5 @@
/datum/sprite_accessory/tail/taur/long_lizard/scaled
name = "Large Dragon Tail/W scales"
+ id = "tail_taur_dragon_large_scales"
extra_overlay = "big_liz_mark"
diff --git a/code/modules/sprite_accessories/tail/weird_shadow_creature_ocs.dm b/code/modules/sprite_accessories/tail/weird_shadow_creature_ocs.dm
new file mode 100644
index 00000000000..ab6c6682763
--- /dev/null
+++ b/code/modules/sprite_accessories/tail/weird_shadow_creature_ocs.dm
@@ -0,0 +1,28 @@
+/datum/sprite_accessory/tail/newtailmaw
+ name = "new tailmaw (vwag)"
+ id = "tail_maw"
+ icon_state = "newtailmaw"
+ ani_state = "newtailmaw_w"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/tailmaw
+ name = "tailmaw, colorable"
+ id = "tail_tailmaw2"
+ icon_state = "tailmaw"
+ color_blend_mode = ICON_MULTIPLY
+ do_colouration = 1
+
+/datum/sprite_accessory/tail/tentacles
+ name = "Tentacles"
+ id = "tail_tentacles"
+ icon_state = "tentacles"
+ do_colouration = TRUE
+ color_blend_mode = ICON_MULTIPLY
+ ani_state = "tentacles_wag"
+
+/datum/sprite_accessory/tail/spade_color
+ name = "spade-tail (colorable)"
+ id = "tail_spade"
+ icon_state = "spadetail-black"
+ do_colouration = 1
diff --git a/code/modules/sprite_accessories/wings/_wings.dm b/code/modules/sprite_accessories/wings/_wings.dm
new file mode 100644
index 00000000000..3ae01264afc
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/_wings.dm
@@ -0,0 +1,35 @@
+/datum/sprite_accessory/wing
+ abstract_type = /datum/sprite_accessory/wing
+ name = "You should not see this..."
+ icon = 'icons/mob/sprite_accessories/wings.dmi'
+ dimension_x = 64
+ do_colouration = 0 //Set to 1 to enable coloration using the tail color.
+
+ color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
+ 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 // TODO - Seems not needed ~Leshana
+ var/desc = "You should not see this..."
+ var/ani_state // State when flapping/animated
+ var/spr_state // State when spreading wings w/o anim
+ var/extra_overlay_w // Flapping state for extra overlay
+ var/extra_overlay2_w
+
+
+// todo: sort ears by something that makes sense
+// todo: tgui choice menu should be modular
+// todo: and include way to do categories
+//! right now the categories are way too sparse, we'll combine them later.
+
+//? AND YES, I AM SHITPOSTING WITH THE CATEGORY .DM NAMES
+//? Deal with it, I'll deal with this in the emissives PR
+//? Seriously I'm not categorizing our 500 kinds of wings.
+
+//? If anyone wants to sort it, obviously, PLEASE, be my guest, but I just don't have the energy to do the stuff I did
+//? in /ears. It just isn't working out for me, sorry.
+
+//? Potential nomenclatures:
+//? - by animal (real or fakefurrysona) type
+//? - "Animal", "Species", "Robotic", "Misc"
+//? etc
+
+//? PLEASE HELP WITH THIS.
diff --git a/code/modules/sprite_accessories/wings/bat.dm b/code/modules/sprite_accessories/wings/bat.dm
new file mode 100644
index 00000000000..207a821a071
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/bat.dm
@@ -0,0 +1,30 @@
+/datum/sprite_accessory/wing/bat_black
+ id = "wing_bat_black"
+ name = "bat wings, black"
+ icon_state = "bat-black"
+
+/datum/sprite_accessory/wing/bat_color
+ name = "bat wings, colorable"
+ id = "wing_bat_color"
+ icon_state = "bat-color"
+ do_colouration = 1
+
+/datum/sprite_accessory/wing/bat_red
+ name = "bat wings, red"
+ id = "wing_bat_red"
+ icon_state = "bat-red"
+
+/datum/sprite_accessory/wing/succubus
+ name = "succubus wings, black"
+ id = "wing_succubus_black"
+ icon_state = "succubus-black"
+
+/datum/sprite_accessory/wing/succubus_purple
+ name = "succubus wings, purple"
+ id = "wing_succubus_purple"
+ icon_state = "succubus-purple"
+
+/datum/sprite_accessory/wing/succubus_red
+ name = "succubus wings, red"
+ id = "wing_succubus_red"
+ icon_state = "succubus-red"
diff --git a/code/modules/sprite_accessories/wings/draconic_furries.dm b/code/modules/sprite_accessories/wings/draconic_furries.dm
new file mode 100644
index 00000000000..e038643e450
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/draconic_furries.dm
@@ -0,0 +1,20 @@
+/datum/sprite_accessory/wing/cyberdragon
+ name = "Cyber dragon wing (colorable)"
+ id = "wing_cyberdragon"
+ icon_state = "cyberdragon_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/cyberdragon_red
+ name = "Cyber dragon wing (red)"
+ id = "wing_cyberdragon_red"
+ icon_state = "cyberdragon_red_s"
+ do_colouration = 0
+
+/datum/sprite_accessory/wing/drago_wing
+ name = "Cybernetic Dragon wings"
+ id = "wing_cyberdragon2"
+ icon_state = "drago_wing"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "drago_wing_2"
diff --git a/code/modules/sprite_accessories/wings/feathered.dm b/code/modules/sprite_accessories/wings/feathered.dm
new file mode 100644
index 00000000000..10cce8f5bcd
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/feathered.dm
@@ -0,0 +1,75 @@
+/datum/sprite_accessory/wing/feathered
+ name = "feathered wings (colorable)"
+ id = "wing_feather"
+ icon_state = "feathered"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/feathered_medium
+ name = "medium feathered wings (colorable)" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys.
+ id = "wing_feather_medium"
+ icon_state = "feathered2"
+ spr_state = "feathered2_spr"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/feathered_large //Made by Natje!
+ name = "large feathered wings (colorable)"
+ id = "wing_feather_large"
+ icon_state = "feathered3"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/harpywings
+ name = "harpy wings (colorable)"
+ id = "wing_harpy"
+ icon_state = "harpywings"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+// the below two weren't my doing
+// check blame, it wasn't me ~silicons
+// yikes.
+
+/datum/sprite_accessory/wing/Harpywings_alt
+ name = "harpy wings alt, archeopteryx 2"
+ id = "wing_harpy_archeopterx"
+ icon_state = "Harpywings_alt"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "Neckfur"
+ extra_overlay2 = "Harpywings_altmarkings"
+
+/datum/sprite_accessory/wing/harpywings_alt
+ name = "harpy wings alt, archeopteryx"
+ id = "wing_harpy_archeopteryx2"
+ icon_state = "harpywings_alt"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "harpywings_altmarkings"
+
+/datum/sprite_accessory/wing/harpywings_alt_neckfur
+ name = "harpy wings alt, archeopteryx & neckfur"
+ id = "wing_harpy_archeopteryx3"
+ icon_state = "harpywings_alt"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "harpywings_altmarkings"
+ extra_overlay2 = "neckfur"
+
+/datum/sprite_accessory/wing/harpywings_bat
+ name = "harpy wings, bat"
+ id = "wing_harpy_bat2"
+ icon_state = "harpywings_bat"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "harpywings_batmarkings"
+
+/datum/sprite_accessory/wing/harpywings_bat_neckfur
+ name = "harpy wings, bat & neckfur"
+ id = "wing_harpy_bat_neckfur"
+ icon_state = "harpywings_bat"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "harpywings_batmarkings"
+ extra_overlay2 = "neckfur"
diff --git a/code/modules/sprite_accessories/wings/insect_not_really_wings.dm b/code/modules/sprite_accessories/wings/insect_not_really_wings.dm
new file mode 100644
index 00000000000..eb0e28cf59e
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/insect_not_really_wings.dm
@@ -0,0 +1,20 @@
+/datum/sprite_accessory/wing/mantis_arms //Same rationale as spider legs.
+ name = "mantis arms"
+ id = "wing_mantis_arms"
+ icon_state = "mantis-arms"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/mantis_arms_saturated
+ name = "mantis arms (saturated)"
+ id = "wing_mantis_arms2"
+ icon_state = "mantis-arms_saturated"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here.
+ name = "spider legs"
+ id = "wing_spider_legs"
+ icon_state = "spider-legs"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/wings/misc.dm b/code/modules/sprite_accessories/wings/misc.dm
new file mode 100644
index 00000000000..de8ffdfcd7c
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/misc.dm
@@ -0,0 +1,19 @@
+/datum/sprite_accessory/wing/neckfur
+ name = "neck fur"
+ id = "wing_neckfur"
+ icon_state = "neckfur"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/nevrean
+ name = "nevrean wings/fantail"
+ id = "wing_nevrean_wtail"
+ icon_state = "nevrean_s"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/sepulchre_c_yw
+ name = "demon wings (colorable)"
+ id = "wing_demon"
+ icon_state = "sepulchre_wingsc"
+ do_colouration = 1
diff --git a/code/modules/sprite_accessories/wings/moth.dm b/code/modules/sprite_accessories/wings/moth.dm
new file mode 100644
index 00000000000..fb47aae413f
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/moth.dm
@@ -0,0 +1,118 @@
+/datum/sprite_accessory/wing/moth
+ name = "moth wings"
+ id = "wing_moth"
+ icon_state = "moth"
+ clothing_can_hide = FALSE
+
+/datum/sprite_accessory/wing/mothc
+ name = "moth wings (colorable)"
+ id = "wing_moth_color"
+ icon_state = "moth"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/wing/moth_atlas
+ name = "atlas moth wings"
+ id = "wing_moth_atlas"
+ icon_state = "moth_atlas"
+
+/datum/sprite_accessory/wing/moth_burnt
+ name = "burnt moth wings"
+ id = "wing_moth_burnt"
+ icon_state = "moth_burnt"
+
+/datum/sprite_accessory/wing/moth_deathhead
+ name = "death's-head hawkmoth wings"
+ id = "wing_moth_deathshead"
+ icon_state = "moth_deathhead"
+
+/datum/sprite_accessory/wing/moth_firewatch
+ name = "firewatch moth wings"
+ id = "wing_moth_firewatch"
+ icon_state = "moth_firewatch"
+ front_behind_system = TRUE
+
+/datum/sprite_accessory/wing/moth_full
+ name = "moth antenna and wings"
+ id = "wing_moth_full"
+ icon_state = "moth_full"
+
+/datum/sprite_accessory/wing/moth_gothic
+ name = "gothic moth wings"
+ id = "wing_moth_gothic"
+ icon_state = "moth_gothic"
+
+/datum/sprite_accessory/wing/moth_jungle
+ name = "jungle moth wings"
+ id = "wing_moth_jungle"
+ icon_state = "moth_jungle"
+
+/datum/sprite_accessory/wing/moth_lover
+ name = "lover moth wings"
+ id = "wing_moth_lover"
+ icon_state = "moth_lover"
+
+/datum/sprite_accessory/wing/moth_luna
+ name = "luna moth wings"
+ id = "wing_moth_luna"
+ icon_state = "moth_luna"
+
+/datum/sprite_accessory/wing/moth_monarch
+ name = "monarch moth wings"
+ id = "wing_moth_monarch"
+ icon_state = "moth_monarch"
+
+/datum/sprite_accessory/wing/moth_moonfly
+ name = "moonfly moth wings"
+ id = "wing_moth_moonfly"
+ icon_state = "moth_moonfly"
+
+/datum/sprite_accessory/wing/moth_oakworm
+ name = "oakworm moth wings"
+ id = "wing_moth_oakworm"
+ icon_state = "moth_oakworm"
+
+/datum/sprite_accessory/wing/moth_plain
+ name = "plain moth wings"
+ id = "wing_moth_plain"
+ icon_state = "moth_plain"
+
+/datum/sprite_accessory/wing/moth_poison
+ name = "poison moth wings"
+ id = "wing_moth_poison"
+ icon_state = "moth_poison"
+
+/datum/sprite_accessory/wing/moth_ragged
+ name = "ragged moth wings"
+ id = "wing_moth_ragged"
+ icon_state = "moth_ragged"
+
+/datum/sprite_accessory/wing/moth_red
+ name = "red moth wings"
+ id = "wing_moth_read"
+ icon_state = "moth_red"
+
+/datum/sprite_accessory/wing/moth_royal
+ name = "royal moth wings"
+ id = "wing_moth_royal"
+ icon_state = "moth_royal"
+
+/datum/sprite_accessory/wing/moth_snowy
+ name = "snowy moth wings"
+ id = "wing_moth_snowy"
+ icon_state = "moth_snowy"
+
+/datum/sprite_accessory/wing/moth_white
+ name = "white moth wings"
+ id = "wing_moth_white"
+ icon_state = "moth_white"
+
+/datum/sprite_accessory/wing/moth_whitefly
+ name = "whitefly moth wings"
+ id = "wing_moth_whitefly"
+ icon_state = "moth_whitefly"
+
+/datum/sprite_accessory/wing/moth_witchwing
+ name = "witchwing moth wings"
+ id = "wing_moth_witchwing"
+ icon_state = "moth_witchwing"
diff --git a/code/modules/sprite_accessories/wings/non_moth_insects.dm b/code/modules/sprite_accessories/wings/non_moth_insects.dm
new file mode 100644
index 00000000000..f6ed116c6fc
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/non_moth_insects.dm
@@ -0,0 +1,10 @@
+/datum/sprite_accessory/wing/beewings
+ name = "bee wings"
+ id = "wing_bee"
+ icon_state = "beewings"
+
+/datum/sprite_accessory/wing/dragonfly
+ name = "dragonfly"
+ id = "wing_dragonfly"
+ icon_state = "dragonfly"
+ color_blend_mode = ICON_MULTIPLY
diff --git a/code/modules/sprite_accessories/wings/pokemon.dm b/code/modules/sprite_accessories/wings/pokemon.dm
new file mode 100644
index 00000000000..7c2d6bbcaf9
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/pokemon.dm
@@ -0,0 +1,4 @@
+/datum/sprite_accessory/wing/leafeon
+ name = "Leaf Offshoots"
+ id = "wing_leafeon"
+ icon_state = "leaf_markings"
diff --git a/code/modules/sprite_accessories/wings/synthetic.dm b/code/modules/sprite_accessories/wings/synthetic.dm
new file mode 100644
index 00000000000..4157f9adbe5
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/synthetic.dm
@@ -0,0 +1,14 @@
+/datum/sprite_accessory/wing/robo
+ name = "Robotic Wings"
+ id = "wing_robot1"
+ icon_state = "Drago_wing"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+
+//? synth furries count
+
+/datum/sprite_accessory/wing/cyberdoe
+ name = "Cyber doe wing"
+ id = "wing_cyberdoe"
+ icon_state = "cyberdoe_s"
+ do_colouration = 0
diff --git a/code/modules/sprite_accessories/wings/weird_shadow_creature_ocs.dm b/code/modules/sprite_accessories/wings/weird_shadow_creature_ocs.dm
new file mode 100644
index 00000000000..ca2307e7bc5
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/weird_shadow_creature_ocs.dm
@@ -0,0 +1,5 @@
+/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings?
+ name = "gazer eyestalks"
+ id = "wing_gazer"
+ icon_state = "liquidfirefly-eyestalks"
+ //ckeys_allowed = list("liquidfirefly","seiga") //At request.
diff --git a/code/modules/sprite_accessories/wings/xenomorph.dm b/code/modules/sprite_accessories/wings/xenomorph.dm
new file mode 100644
index 00000000000..27f805c36f8
--- /dev/null
+++ b/code/modules/sprite_accessories/wings/xenomorph.dm
@@ -0,0 +1,4 @@
+/datum/sprite_accessory/wing/snag
+ name = "xenomorph backplate"
+ id = "wing_xeno_backplate"
+ icon_state = "snag-backplate"
diff --git a/code/modules/unit_tests/mob/_mob.dm b/code/modules/unit_tests/mob/_mob.dm
index b964361dc30..4221cf340e1 100644
--- a/code/modules/unit_tests/mob/_mob.dm
+++ b/code/modules/unit_tests/mob/_mob.dm
@@ -1 +1,2 @@
#include "inventory.dm"
+#include "sprite_accessories.dm"
diff --git a/code/modules/unit_tests/mob/sprite_accessories.dm b/code/modules/unit_tests/mob/sprite_accessories.dm
new file mode 100644
index 00000000000..ba2b7edd4da
--- /dev/null
+++ b/code/modules/unit_tests/mob/sprite_accessories.dm
@@ -0,0 +1,52 @@
+/datum/unit_test/sprite_accessory_uniqueness/Run()
+ var/list/ids = list()
+ var/list/names_hair = list()
+ var/list/names_beard = list()
+ var/list/names_tail = list()
+ var/list/names_wing = list()
+ var/list/names_ear = list()
+ var/list/names_marking = list()
+ for(var/path in subtypesof(/datum/sprite_accessory))
+ var/datum/sprite_accessory/S = path
+ if(initial(S.abstract_type) == path)
+ continue
+ S = new path
+ if(isnull(S.id))
+ Fail("null ID on [path]")
+ continue
+ else if(ids[S.id])
+ Fail("duplicate id [S.id] on [path] against [ids[S.id]:type]")
+ else
+ ids[S.id] = S
+ // yanderedev gaming
+ if(istype(S, /datum/sprite_accessory/hair))
+ if(names_hair[S.name])
+ Fail("duplciate name [S.name] on [path] against [names_hair[S.name]:type]")
+ else
+ names_hair[S.name] = S
+ else if(istype(S, /datum/sprite_accessory/facial_hair))
+ if(names_beard[S.name])
+ Fail("duplciate name [S.name] on [path] against [names_beard[S.name]:type]")
+ else
+ names_beard[S.name] = S
+ else if(istype(S, /datum/sprite_accessory/wing))
+ if(names_wing[S.name])
+ Fail("duplciate name [S.name] on [path] against [names_wing[S.name]:type]")
+ else
+ names_wing[S.name] = S
+ else if(istype(S, /datum/sprite_accessory/ears))
+ if(names_ear[S.name])
+ Fail("duplciate name [S.name] on [path] against [names_ear[S.name]:type]")
+ else
+ names_ear[S.name] = S
+ else if(istype(S, /datum/sprite_accessory/tail))
+ if(names_tail[S.name])
+ Fail("duplciate name [S.name] on [path] against [names_tail[S.name]:type]")
+ else
+ names_tail[S.name] = S
+ else if(istype(S, /datum/sprite_accessory/marking))
+ if(names_marking[S.name])
+ Fail("duplciate name [S.name] on [path] against [names_marking[S.name]:type]")
+ else
+ names_marking[S.name] = S
+
diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm
deleted file mode 100644
index eacd80cfb4b..00000000000
--- a/code/modules/vore/appearance/sprite_accessories_vr.dm
+++ /dev/null
@@ -1,2595 +0,0 @@
-/*
- Hello and welcome to VOREStation sprite_accessories: For a more general overview
- please read sprite_accessories.dm. This file is for ears and tails.
- 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
- var/apply_restrictions = FALSE //whether to apply restrictions for specific tails/ears/wings
- var/center = FALSE
- var/dimension_x = 32
- var/dimension_y = 32
-
-/*
-////////////////////////////
-/ =--------------------= /
-/ == Ear Definitions == /
-/ =--------------------= /
-////////////////////////////
-*/
-/datum/sprite_accessory/ears
- name = "You should not see this..."
- icon = 'icons/mob/sprite_accessories/ears.dmi'
- do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color
-
- color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
- var/extra_overlay // Icon state of an additional overlay to blend in.
- var/extra_overlay2
- var/desc = "You should not see this..."
-
-// Ears avaliable to anyone
-
-/datum/sprite_accessory/ears/antennae
- name = "antennae, colorable"
- desc = ""
- icon_state = "antennae"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/antlercrown
- name = "antler crown"
- desc = ""
- icon_state = "antlercrown"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/antlers
- name = "antlers"
- desc = ""
- icon_state = "antlers"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/antlers_e
- name = "antlers with ears"
- desc = ""
- icon_state = "cow-nohorns"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "antlers_mark"
-
-/datum/sprite_accessory/ears/antlers_large
- name = "Antlers (large)"
- desc = ""
- icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
- icon_state = "antlers_large"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/bear_brown
- name = "bear, brown"
- desc = ""
- icon_state = "bear-brown"
-
-/datum/sprite_accessory/ears/bear_panda
- name = "bear, panda"
- desc = ""
- icon_state = "panda"
-
-/datum/sprite_accessory/ears/bearhc
- name = "bear, colorable"
- desc = ""
- icon_state = "bear"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/bee
- name = "bee antennae"
- desc = ""
- icon_state = "bee"
-
-/datum/sprite_accessory/ears/bnnuy //bnnuy
- name = "Bnnuy Ears"
- desc = ""
- icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
- icon_state = "bnnuy"
- extra_overlay = "bnnuy-inner"
- extra_overlay2 = "bnnuy-tips"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/bnnuy2
- name = "Bnnuy Ears 2"
- desc = ""
- icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
- icon_state = "bnnuy2"
- extra_overlay = "bnnuy-inner"
- extra_overlay2 = "bnnuy-tips2"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/bunnyalt
- name = "bunny 2, dual-color"
- desc = ""
- icon_state = "bunny-alt"
- extra_overlay = "bunny-alt-inner"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/bunnyhc
- name = "bunny, colorable"
- desc = ""
- icon_state = "bunny"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/bunny_floppy
- name = "floppy bunny ears (colorable)"
- desc = ""
- icon_state = "floppy_bun"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/bunny_tall
- name = "Bunny Tall Ears"
- desc = ""
- icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
- icon_state = "bunny-tall"
- extra_overlay = "bunny-tall-inner"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/bunny_white
- name = "bunny, white"
- desc = ""
- icon_state = "bunny"
-
-/datum/sprite_accessory/ears/caprahorns
- name = "caprine horns"
- desc = ""
- icon_state = "caprahorns"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/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
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/cow_nohorns
- name = "cow, no horns"
- desc = ""
- icon_state = "cow-nohorns"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/curly_bug
- name = "curly antennae, colorable"
- desc = ""
- icon_state = "curly_bug"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/deer
- name = "deer ears"
- desc = ""
- icon_state = "deer"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/demon_horns1
- name = "demon horns"
- desc = ""
- icon_state = "demon-horns1"
-
-/datum/sprite_accessory/ears/demon_horns1_c
- name = "demon horns, colorable"
- desc = ""
- icon_state = "demon-horns1_c"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/demon_horns2
- name = "demon horns, colorable(outward)"
- desc = ""
- icon_state = "demon-horns2"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/demon_horns3
- name = "demon horns, colorable(upward)"
- desc = ""
- icon_state = "demon-horns3"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/demon_horns4
- name = "demon horns, colorable ring(upward)"
- desc = ""
- icon_state = "demon-horns4"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "demon-horns4-ring"
-
-/datum/sprite_accessory/ears/demon_horns5
- name = "demon horns, colorable (stubby)"
- desc = ""
- icon_state = "demon-horns5"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/donkey
- name = "donkey, colorable"
- desc = ""
- icon_state = "donkey"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "otie-inner"
-
-/datum/sprite_accessory/ears/dragon_horns
- name = "dragon horns, colorable"
- desc = ""
- icon_state = "dragon-horns"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/drake
- name = "drake frills"
- desc = ""
- icon_state = "drake"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/dual_robot
- name = "synth antennae, colorable"
- desc = ""
- icon_state = "dual_robot_antennae"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/elfs
- name = "elven ears"
- desc = ""
- icon_state = "elfs"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/elfshort
- name = "elven ears (short)"
- desc = ""
- icon_state = "elfshort"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/fenears
- name = "flatland zorren ears"
- desc = ""
- icon_state = "fenears"
-
-/datum/sprite_accessory/ears/fenearshc
- name = "flatland zorren ears, colorable"
- desc = ""
- icon_state = "fenearshc"
- extra_overlay = "fenears-inner"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/floppyelf
- name = "floppy elven ears"
- desc = ""
- icon_state = "floppy-elf"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/foxears
- name = "highlander zorren ears"
- desc = ""
- icon_state = "foxears"
-
-/datum/sprite_accessory/ears/foxearshc
- name = "highlander zorren ears, colorable"
- desc = ""
- icon_state = "foxearshc"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/inkling
- name = "colorable mature inkling tentacles"
- icon = 'icons/mob/human_face_vr.dmi'
- icon_state = "inkling-colorable"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/jackalope
- name = "Jackalope Ears and Antlers"
- desc = ""
- icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
- icon_state = "jackalope"
- extra_overlay = "jackalope-antlers"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/kittyhc
- name = "kitty, colorable"
- desc = ""
- icon_state = "kitty"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "kittyinner"
-
-/datum/sprite_accessory/ears/kittyr
- name = "kitty right only, colorable"
- icon = 'icons/mob/sprite_accessories/ears_uneven.dmi'
- desc = ""
- icon_state = "kittyrinner"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "kittyr"
-
-/datum/sprite_accessory/ears/large_dragon
- name = "vary large dragon horns"
- desc = ""
- icon_state = "big_liz"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/leafeon
- name = "Leaf Ears"
- desc = ""
- icon_state = "leaf_ears"
-
-/datum/sprite_accessory/ears/left_robot
- name = "left synth, colorable"
- desc = ""
- icon_state = "left_robot_antennae"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/mousehc
- name = "mouse, colorable"
- desc = ""
- icon_state = "mouse"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "mouseinner"
-
-/datum/sprite_accessory/ears/mousehcno
- name = "mouse, colorable, no inner"
- desc = ""
- icon_state = "mouse"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/mouse_grey
- name = "mouse, grey"
- desc = ""
- icon_state = "mouse-grey"
-
-/datum/sprite_accessory/ears/oni_h1
- name = "oni horns"
- desc = ""
- icon_state = "oni-h1"
-
-/datum/sprite_accessory/ears/oni_h1_c
- name = "oni horns, colorable"
- desc = ""
- icon_state = "oni-h1_c"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/otie
- name = "otie, colorable"
- desc = ""
- icon_state = "otie"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "otie-inner"
-
-/datum/sprite_accessory/ears/peekinghuman
- name = "peeking ears"
- desc = ""
- icon_state = "earpeek"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/rabbit_swept
- name = "Rabbit Ears (swept back)"
- desc = ""
- icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
- icon_state = "rabbit-swept"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/ram
- name = "ram horns"
- desc = ""
- icon_state = "ram"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/right_robot
- name = "right synth, colorable"
- desc = ""
- icon_state = "right_robot_antennae"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/sandfox
- name = "Sandfox Ears"
- desc = ""
- icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
- icon_state = "sandfox"
- extra_overlay = "sandfox-inner"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/sergal //Redundant
- name = "Sergal ears"
- icon_state = "serg_plain_s"
-
-/datum/sprite_accessory/ears/sergalhc
- name = "Sergal ears, colorable"
- icon_state = "serg_plain_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/sleek
- name = "sleek ears"
- desc = ""
- icon_state = "sleek"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/smallantlers
- name = "small antlers"
- desc = ""
- icon_state = "smallantlers"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/smallantlers_e
- name = "small antlers with ears"
- desc = ""
- icon_state = "smallantlers"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "deer"
-
-/datum/sprite_accessory/ears/smallbear
- name = "small bear"
- desc = ""
- icon_state = "smallbear"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/squirrelhc
- name = "squirrel, colorable"
- desc = ""
- icon_state = "squirrel"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/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/swooped_bunny
- name = "Swooped bunny ears (colorable)"
- desc = ""
- icon_state = "swooped_bunny"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/synthhorns_curly
- name = "Synth horns, curly"
- desc = ""
- icon_state = "synthhorns_curled"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/synthhorns_plain
- name = "Synth horns, plain"
- desc = ""
- icon_state = "synthhorns_plain"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "synthhorns_plain_light"
-
-/datum/sprite_accessory/ears/synthhorns_thick
- name = "Synth horns, thick"
- desc = ""
- icon_state = "synthhorns_thick"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "synthhorns_thick_light"
-
-/datum/sprite_accessory/ears/teppiears
- name = "Teppi Ears"
- desc = ""
- icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
- icon_state = "teppi_ears"
- extra_overlay = "teppi_ears_inner"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/teppihorns
- name = "Teppi Horns"
- desc = ""
- icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
- icon_state = "teppi_horns"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/teppiearshorns
- name = "Teppi Ears and Horns"
- desc = ""
- icon = 'icons/mob/sprite_accessories/ears_32x64.dmi'
- icon_state = "teppi_ears"
- extra_overlay = "teppi_ears_inner"
- extra_overlay2 = "teppi_horns"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/teshari
- name = "Teshari ears (colorable)"
- desc = ""
- icon_state = "teshari"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "teshariinner"
-
-/datum/sprite_accessory/ears/tesharihigh
- name = "Teshari upper ears (colorable)"
- desc = ""
- icon_state = "tesharihigh"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "tesharihighinner"
-
-/datum/sprite_accessory/ears/tesharilow
- name = "Teshari lower ears (colorable)"
- desc = ""
- icon_state = "tesharilow"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "tesharilowinner"
-
-/datum/sprite_accessory/ears/tesh_pattern_ear_male
- name = "Teshari male ear pattern (colorable)"
- desc = ""
- icon_state = "teshari"
- color_blend_mode = ICON_MULTIPLY
- do_colouration = 1
- extra_overlay = "teshari_male_pattern"
-
-/datum/sprite_accessory/ears/tesh_pattern_ear_female
- name = "Teshari female ear pattern (colorable)"
- desc = ""
- icon_state = "teshari"
- color_blend_mode = ICON_MULTIPLY
- do_colouration = 1
- extra_overlay = "teshari_female_pattern"
-
-/datum/sprite_accessory/ears/vulp
- name = "vulpkanin, dual-color"
- desc = ""
- icon_state = "vulp"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "vulp-inner"
-
-/datum/sprite_accessory/ears/vulp_jackal
- name = "vulpkanin thin, dual-color"
- desc = ""
- icon_state = "vulp_jackal"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "vulp_jackal-inner"
-
-/datum/sprite_accessory/ears/vulp_short
- name = "vulpkanin short"
- desc = ""
- icon_state = "vulp_terrier"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/ears/vulp_short_dc
- name = "vulpkanin short, dual-color"
- desc = ""
- icon_state = "vulp_terrier"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "vulp_terrier-inner"
-
-/datum/sprite_accessory/ears/wisewolf
- name = "wolf, wise"
- desc = ""
- icon_state = "wolf-wise"
-
-/datum/sprite_accessory/ears/wolfhc
- name = "wolf, colorable"
- desc = ""
- icon_state = "wolf"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "wolfinner"
-
-/datum/sprite_accessory/ears/wolf_green
- name = "wolf, green"
- desc = ""
- icon_state = "wolf-green"
-
-/datum/sprite_accessory/ears/wolf_grey
- name = "wolf, grey"
- desc = ""
- icon_state = "wolf-grey"
-
-/datum/sprite_accessory/ears/zears
- name = "jagged ears"
- desc = ""
- icon_state = "zears"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-//Moths
-/datum/sprite_accessory/ears/moth_antenna_fluff_burnt
- name = "burnt moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_burnt"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_deathhead
- name = "death's-head hawkmoth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_deathhead"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_firewatch
- name = "firewatch moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_firewatch"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_gothic
- name = "gothic moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_goth"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_jungle
- name = "jungle moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_jungle"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_lovers
- name = "lovers moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_lovers"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_moonfly
- name = "moonfly moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_moonfly"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_oakworm
- name = "oakworm moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_oakworm"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_plain
- name = "plain moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_plain"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_poison
- name = "poison moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_poison"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_ragged
- name = "ragged moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_ragged"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_red
- name = "red moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_red"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_royal
- name = "royal moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_royal"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_snowy
- name = "snowy moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_snowy"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_whitefly
- name = "whitefly moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_whitefly"
-
-/datum/sprite_accessory/ears/moth_antenna_fluff_witchwing
- name = "witchwing moth antennae and fluff"
- desc = ""
- icon_state = "moth_antenna_fluff_witchwing"
-
-//Mushroom Heads - Ha.
-/datum/sprite_accessory/ears/fungal_muscaria
- name = "fungal muscaria cap"
- desc = ""
- icon_state = "fungal_muscaria"
-
-/datum/sprite_accessory/ears/fungal_polypore
- name = "fungal polyporous cap"
- desc = ""
- icon_state = "fungal_polypore"
-
-// Species-unique ears
-/datum/sprite_accessory/ears/shadekin
- name = "Shadekin Ears, colorable"
- desc = ""
- icon_state = "shadekin"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- apply_restrictions = TRUE
- species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW)
-
-// Special snowflake (Read: Whitelisted) ears go below here.
-//None of these seem to be for Citadel users, but I'm retaining them for now.
-/datum/sprite_accessory/ears/alurane
- name = "alurane ears/hair (Pumila)"
- desc = ""
- icon_state = "alurane-ears"
- ckeys_allowed = list("natje")
-
-/datum/sprite_accessory/ears/aronai
- name = "aronai ears/head (Aronai)"
- desc = ""
- icon_state = "aronai"
- ckeys_allowed = list("arokha")
-
-/datum/sprite_accessory/ears/frost
- name = "Frost antenna"
- desc = ""
- icon_state = "frosted_tips"
- ckeys_allowed = list("tucker0666")
-
-/datum/sprite_accessory/ears/holly
- name = "tigress ears (Holly Sharp)"
- desc = ""
- icon_state = "tigressears"
- ckeys_allowed = list("hoodoo")
-
-/datum/sprite_accessory/ears/kerena
- name = "wingwolf ears (Kerena)"
- desc = ""
- icon_state = "kerena"
- ckeys_allowed = list("somekindofpony")
-
-/datum/sprite_accessory/ears/lilimoth_antennae
- name = "citheronia antennae (Kira72)"
- desc = ""
- icon_state = "lilimoth_antennae"
- ckeys_allowed = list("kira72")
-
-/datum/sprite_accessory/ears/miria_fluffdragon
- name = "fluffdragon ears (Miria Masters)"
- desc = ""
- icon_state = "miria-fluffdragonears"
- ckeys_allowed = list("miriamasters")
-
-/datum/sprite_accessory/ears/molenar_deathclaw
- name = "deathclaw ears"
- desc = ""
- icon_state = "molenar-deathclaw"
-
-/datum/sprite_accessory/ears/miria_kitsune
- name = "kitsune ears (Miria Masters)"
- desc = ""
- icon_state = "miria-kitsuneears"
- ckeys_allowed = list("miriamasters")
-
-/datum/sprite_accessory/ears/molenar_inkling
- name = "teal mature inkling hair (Kari Akiren)"
- desc = ""
- icon_state = "molenar-tentacle"
- ckeys_allowed = list("molenar")
-
-/datum/sprite_accessory/ears/molenar_kitsune
- name = "quintail kitsune ears (Molenar)"
- desc = ""
- icon_state = "molenar-kitsune"
- ckeys_allowed = list("molenar")
-
-/datum/sprite_accessory/ears/rosey
- name = "tritail kitsune ears (Rosey)"
- desc = ""
- icon_state = "rosey"
- ckeys_allowed = list("joey4298")
-
-/datum/sprite_accessory/ears/runac
- name = "fennecsune ears (Runac)"
- desc = ""
- icon_state = "runac"
- ckeys_allowed = list("rebcom1807")
-
-/datum/sprite_accessory/ears/shock
- name = "pharoah hound ears (Shock Diamond)"
- desc = ""
- icon_state = "shock"
- ckeys_allowed = list("icowom","cameron653")
-
-/*
-////////////////////////////
-/ =--------------------= /
-/ == Wing Definitions == /
-/ =--------------------= /
-////////////////////////////
-*/
-/datum/sprite_accessory/wing
- name = "You should not see this..."
- icon = 'icons/mob/sprite_accessories/wings.dmi'
- dimension_x = 64
- do_colouration = 0 //Set to 1 to enable coloration using the tail color.
-
- color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
- var/extra_overlay // Icon state of an additional overlay to blend in.
- var/extra_overlay2
- 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 // TODO - Seems not needed ~Leshana
- var/desc = "You should not see this..."
- var/ani_state // State when flapping/animated
- var/spr_state // State when spreading wings w/o anim
- var/extra_overlay_w // Flapping state for extra overlay
- var/extra_overlay2_w
-
-/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/beewings
- name = "bee wings"
- desc = ""
- icon_state = "beewings"
-
-/datum/sprite_accessory/wing/cyberdoe
- name = "Cyber doe wing"
- desc = ""
- icon_state = "cyberdoe_s"
- do_colouration = 0
-
-/datum/sprite_accessory/wing/cyberdragon
- name = "Cyber dragon wing (colorable)"
- desc = ""
- icon_state = "cyberdragon_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/wing/cyberdragon_red
- name = "Cyber dragon wing (red)"
- desc = ""
- icon_state = "cyberdragon_red_s"
- do_colouration = 0
-
-/datum/sprite_accessory/wing/drago_wing
- name = "Cybernetic Dragon wings"
- desc = ""
- icon_state = "drago_wing"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "drago_wing_2"
-
-/datum/sprite_accessory/wing/dragonfly
- name = "dragonfly"
- desc = ""
- icon_state = "dragonfly"
- 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/feathered_medium
- name = "medium feathered wings (colorable)" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys.
- desc = ""
- icon_state = "feathered2"
- spr_state = "feathered2_spr"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/wing/feathered_large //Made by Natje!
- name = "large feathered wings (colorable)"
- desc = ""
- icon_state = "feathered3"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/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/Harpywings_alt
- name = "harpy wings alt, archeopteryx"
- desc = ""
- icon_state = "Harpywings_alt"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "Neckfur"
- extra_overlay2 = "Harpywings_altmarkings"
-
-/datum/sprite_accessory/wing/harpywings_alt
- name = "harpy wings alt, archeopteryx"
- desc = ""
- icon_state = "harpywings_alt"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "harpywings_altmarkings"
-
-/datum/sprite_accessory/wing/harpywings_alt_neckfur
- name = "harpy wings alt, archeopteryx & neckfur"
- desc = ""
- icon_state = "harpywings_alt"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "harpywings_altmarkings"
- extra_overlay2 = "neckfur"
-
-/datum/sprite_accessory/wing/Harpywings_Bat
- name = "harpy wings, bat"
- desc = ""
- icon_state = "Harpywings_Bat"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "Neckfur"
- extra_overlay2 = "Harpywings_BatMarkings"
-
-/datum/sprite_accessory/wing/harpywings_bat
- name = "harpy wings, bat"
- desc = ""
- icon_state = "harpywings_bat"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "harpywings_batmarkings"
-
-/datum/sprite_accessory/wing/harpywings_bat_neckfur
- name = "harpy wings, bat & neckfur"
- desc = ""
- icon_state = "harpywings_bat"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "harpywings_batmarkings"
- extra_overlay2 = "neckfur"
-
-/datum/sprite_accessory/wing/leafeon
- name = "Leaf Offshoots"
- desc = ""
- icon_state = "leaf_markings"
-
-/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings?
- name = "gazer eyestalks"
- desc = ""
- icon_state = "liquidfirefly-eyestalks"
- //ckeys_allowed = list("liquidfirefly","seiga") //At request.
-
-/datum/sprite_accessory/wing/mantis_arms //Same rationale as spider legs.
- name = "mantis arms"
- desc = ""
- icon_state = "mantis-arms"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/wing/mantis_arms_saturated
- name = "mantis arms (saturated)"
- desc = ""
- icon_state = "mantis-arms_saturated"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/wing/neckfur
- name = "neck fur"
- desc = ""
- icon_state = "neckfur"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/wing/nevrean
- name = "nevrean wings/fantail"
- desc = ""
- icon_state = "nevrean_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/wing/robo
- name = "Robotic Wings"
- desc = ""
- icon_state = "Drago_wing"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/wing/sepulchre_c_yw
- name = "demon wings (colorable)"
- desc = ""
- icon_state = "sepulchre_wingsc"
- do_colouration = 1
-
-/datum/sprite_accessory/wing/snag
- name = "xenomorph backplate"
- desc = ""
- icon_state = "snag-backplate"
-
-/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here.
- name = "spider legs"
- desc = ""
- icon_state = "spider-legs"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/wing/succubus
- name = "succubus wings, black"
- desc = ""
- icon_state = "succubus-black"
-
-/datum/sprite_accessory/wing/succubus_purple
- name = "succubus wings, purple"
- desc = ""
- icon_state = "succubus-purple"
-
-/datum/sprite_accessory/wing/succubus_red
- name = "succubus wings, red"
- desc = ""
- icon_state = "succubus-red"
-
-//Moth Wings (We have a lot!)
-/datum/sprite_accessory/wing/moth
- name = "moth wings"
- desc = ""
- icon_state = "moth"
- clothing_can_hide = FALSE
-
-/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/moth_atlas
- name = "atlas moth wings"
- desc = ""
- icon_state = "moth_atlas"
-
-/datum/sprite_accessory/wing/moth_burnt
- name = "burnt moth wings"
- desc = ""
- icon_state = "moth_burnt"
-
-/datum/sprite_accessory/wing/moth_deathhead
- name = "death's-head hawkmoth wings"
- desc = ""
- icon_state = "moth_deathhead"
-
-/datum/sprite_accessory/wing/moth_firewatch
- name = "firewatch moth wings"
- desc = ""
- icon_state = "moth_firewatch"
- front_behind_system = TRUE
-
-/datum/sprite_accessory/wing/moth_full
- name = "moth antenna and wings"
- desc = ""
- icon_state = "moth_full"
-
-/datum/sprite_accessory/wing/moth_gothic
- name = "gothic moth wings"
- desc = ""
- icon_state = "moth_gothic"
-
-/datum/sprite_accessory/wing/moth_jungle
- name = "jungle moth wings"
- desc = ""
- icon_state = "moth_jungle"
-
-/datum/sprite_accessory/wing/moth_lover
- name = "lover moth wings"
- desc = ""
- icon_state = "moth_lover"
-
-/datum/sprite_accessory/wing/moth_luna
- name = "luna moth wings"
- desc = ""
- icon_state = "moth_luna"
-
-/datum/sprite_accessory/wing/moth_monarch
- name = "monarch moth wings"
- desc = ""
- icon_state = "moth_monarch"
-
-/datum/sprite_accessory/wing/moth_moonfly
- name = "moonfly moth wings"
- desc = ""
- icon_state = "moth_moonfly"
-
-/datum/sprite_accessory/wing/moth_oakworm
- name = "oakworm moth wings"
- desc = ""
- icon_state = "moth_oakworm"
-
-/datum/sprite_accessory/wing/moth_plain
- name = "plain moth wings"
- desc = ""
- icon_state = "moth_plain"
-
-/datum/sprite_accessory/wing/moth_poison
- name = "poison moth wings"
- desc = ""
- icon_state = "moth_poison"
-
-/datum/sprite_accessory/wing/moth_ragged
- name = "ragged moth wings"
- desc = ""
- icon_state = "moth_ragged"
-
-/datum/sprite_accessory/wing/moth_red
- name = "red moth wings"
- desc = ""
- icon_state = "moth_red"
-
-/datum/sprite_accessory/wing/moth_royal
- name = "royal moth wings"
- desc = ""
- icon_state = "moth_royal"
-
-/datum/sprite_accessory/wing/moth_snowy
- name = "snowy moth wings"
- desc = ""
- icon_state = "moth_snowy"
-
-/datum/sprite_accessory/wing/moth_white
- name = "white moth wings"
- desc = ""
- icon_state = "moth_white"
-
-/datum/sprite_accessory/wing/moth_whitefly
- name = "whitefly moth wings"
- desc = ""
- icon_state = "moth_whitefly"
-
-/datum/sprite_accessory/wing/moth_witchwing
- name = "witchwing moth wings"
- desc = ""
- icon_state = "moth_witchwing"
-
-/*
-////////////////////////////
-/ =--------------------= /
-/ == Tail Definitions == /
-/ =--------------------= /
-////////////////////////////
-*/
-/datum/sprite_accessory/tail
- name = "You should not see this..."
- icon = 'icons/mob/sprite_accessories/tails.dmi'
- do_colouration = 0 //Set to 1 to enable coloration using the tail color.
-
- color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
- var/extra_overlay // Icon state of an additional overlay to blend in.
- var/extra_overlay2 //Tertiary.
- 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/extra_overlay_w // Wagging state for extra overlay
- var/extra_overlay2_w // Tertiary wagging.
- var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff.
- var/icon/clip_mask_icon = null //Icon file used for clip mask.
- var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits.
- var/icon/clip_mask = null //Instantiated clip mask of given icon and state
-
-/datum/sprite_accessory/tail/New()
- . = ..()
- if(clip_mask_icon && clip_mask_state)
- clip_mask = icon(icon = clip_mask_icon, icon_state = clip_mask_state)
-
-// Everyone tails
-/datum/sprite_accessory/tail/bear
- name = "bear, colorable"
- desc = ""
- icon_state = "bear"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/bear_brown
- name = "bear, brown"
- desc = ""
- icon_state = "bear-brown"
-
-/datum/sprite_accessory/tail/beaver
- name = "beaver tail, colorable"
- desc = ""
- icon_state = "beaver"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/beethorax
- name = "bee thorax"
- desc = ""
- icon_state = "beethorax"
-
-/datum/sprite_accessory/tail/blackwolf
- name = "wolf, black"
- desc = ""
- icon_state = "wolf"
-
-//Buggo Abdomens!
-/datum/sprite_accessory/tail/buggo
- name = "Bug abdomen, colorable"
- desc = ""
- icon_state = "buggo_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/buggowag
- name = "Bug abdomen, colorable, vwag change"
- desc = ""
- icon_state = "buggo_s"
- ani_state = "buggofat_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/buggo_bee
- name = "Bug abdomen, bee top, dual-colorable"
- desc = ""
- icon_state = "buggo_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggobee_markings"
-
-/datum/sprite_accessory/tail/buggo_beefull
- name = "Bug abdomen, bee full, dual-colorable"
- desc = ""
- icon_state = "buggo_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggobeefull_markings"
-
-/datum/sprite_accessory/tail/buggo_beefullwag
- name = "Bug abdomen, bee full, dual color, vwag"
- desc = ""
- icon_state = "buggo_s"
- ani_state = "buggofat_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggobeefull_markings"
- extra_overlay_w = "buggofatbeefull_markings"
-
-/datum/sprite_accessory/tail/buggo_beewag
- name = "Bug abdomen, bee top, dual color, vwag"
- desc = ""
- icon_state = "buggo_s"
- ani_state = "buggofat_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggobee_markings"
- extra_overlay_w = "buggofatbee_markings"
-
-/datum/sprite_accessory/tail/buggo_firefly
- name = "Bug abdomen, firefly, dual-colorable"
- desc = ""
- icon_state = "buggo_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofirefly_markings"
-
-/datum/sprite_accessory/tail/buggo_fireflywag
- name = "Bug abdomen, firefly, dual color, vwag"
- desc = ""
- icon_state = "buggo_s"
- ani_state = "buggofat_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofirefly_markings"
- extra_overlay_w = "buggofatfirefly_markings"
-
-/datum/sprite_accessory/tail/buggo_under
- name = "Bug abdomen, underside, dual-colorable"
- desc = ""
- icon_state = "buggo_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggounder_markings"
-
-/datum/sprite_accessory/tail/buggo_underwag
- name = "Bug abdomen, underside, dual color, vwag"
- desc = ""
- icon_state = "buggo_s"
- ani_state = "buggofat_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggounder_markings"
- extra_overlay_w = "buggofatunder_markings"
-
-/datum/sprite_accessory/tail/buggofat
- name = "Fat bug abdomen, colorable"
- desc = ""
- icon_state = "buggofat_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/buggofat_bee
- name = "Fat bug abdomen, bee top, dual-colorable"
- desc = ""
- icon_state = "buggofat_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofatbee_markings"
-
-/datum/sprite_accessory/tail/buggofat_beefull
- name = "Fat bug abdomen, bee full, dual-colorable"
- desc = ""
- icon_state = "buggofat_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofatbeefull_markings"
-
-/datum/sprite_accessory/tail/buggofat_firefly
- name = "Fat bug abdomen, firefly, dual-colorable"
- desc = ""
- icon_state = "buggofat_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofatfirefly_markings"
-
-/datum/sprite_accessory/tail/buggofat_under
- name = "Fat bug abdomen, underside, dual-colorable"
- desc = ""
- icon_state = "buggofat_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofatunder_markings"
-
-//Vass buggo variants!
-/datum/sprite_accessory/tail/buggovass
- name = "Bug abdomen, vass, colorable"
- desc = ""
- icon_state = "buggo_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/buggovass_wag
- name = "Bug abdomen, vass, colorable, vwag change"
- desc = ""
- icon_state = "buggo_vass_s"
- ani_state = "buggofat_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/buggovass_bee
- name = "Bug abdomen, bee top, dc, vass"
- desc = ""
- icon_state = "buggo_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggobee_vass_markings"
-
-/datum/sprite_accessory/tail/buggovass_beewag
- name = "Bug abdomen, bee top, dc, vass, vwag"
- desc = ""
- icon_state = "buggo_vass_s"
- ani_state = "buggofat_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggobee_vass_markings"
- extra_overlay_w = "buggofatbee_vass_markings"
-
-/datum/sprite_accessory/tail/buggovass_beefull
- name = "Bug abdomen, bee full, dc, vass"
- desc = ""
- icon_state = "buggo_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggobeefull_vass_markings"
-
-/datum/sprite_accessory/tail/buggovass_beefullwag
- name = "Bug abdomen, bee full, dc, vass, vwag"
- desc = ""
- icon_state = "buggo_vass_s"
- ani_state = "buggofat_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggobeefull_vass_markings"
- extra_overlay_w = "buggofatbeefull_vass_markings"
-
-/datum/sprite_accessory/tail/buggovass_firefly
- name = "Bug abdomen, firefly, dc, vass"
- desc = ""
- icon_state = "buggo_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofirefly_vass_markings"
-
-/datum/sprite_accessory/tail/buggovass_fireflywag
- name = "Bug abdomen, firefly, dc, vass, vwag"
- desc = ""
- icon_state = "buggo_vass_s"
- ani_state = "buggofat_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofirefly_vass_markings"
- extra_overlay_w = "buggofatfirefly_vass_markings"
-
-/datum/sprite_accessory/tail/buggovass_under
- name = "Bug abdomen, underside, dc, vass"
- desc = ""
- icon_state = "buggo_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggounder_vass_markings"
-
-/datum/sprite_accessory/tail/buggovass_underwag
- name = "Bug abdomen, underside, dc, vass, vwag"
- desc = ""
- icon_state = "buggo_vass_s"
- ani_state = "buggofat_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggounder_vass_markings"
- extra_overlay_w = "buggofatunder_vass_markings"
-
-/datum/sprite_accessory/tail/buggovassfat
- name = "Fat bug abdomen, vass, colorable"
- desc = ""
- icon_state = "buggofat_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/buggovassfat_bee
- name = "Fat bug abdomen, bee top, dc, vass"
- desc = ""
- icon_state = "buggofat_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofatbee_vass_markings"
-
-/datum/sprite_accessory/tail/buggovassfat_beefull
- name = "Fat bug abdomen, bee full, dc, vass"
- desc = ""
- icon_state = "buggofat_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofatbeefull_vass_markings"
-
-/datum/sprite_accessory/tail/buggovassfat_firefly
- name = "Fat bug abdomen, firefly, dc, vass"
- desc = ""
- icon_state = "buggofat_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofatfirefly_vass_markings"
-
-/datum/sprite_accessory/tail/buggovassfat_under
- name = "Fat bug abdomen, underside, dc, vass"
- desc = ""
- icon_state = "buggofat_vass_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "buggofatunder_vass_markings"
-
-/datum/sprite_accessory/tail/bunny
- name = "bunny, colorable"
- desc = ""
- icon_state = "bunny"
- do_colouration = 1
-
-/datum/sprite_accessory/tail/cat_big
- name = "kitty (big), colorable"
- desc = ""
- icon_state = "catbig"
- ani_state = "catbig_wag"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- front_behind_system = TRUE
-
-/datum/sprite_accessory/tail/chameleon
- name = "Chameleon, colorable"
- desc = ""
- icon_state = "chameleon"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/cow
- name = "cow tail, colorable"
- desc = ""
- icon_state = "cow"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/crossfox
- name = "cross fox"
- desc = ""
- icon_state = "crossfox"
-
-/datum/sprite_accessory/tail/curltail
- name = "curltail (vwag)"
- desc = ""
- icon_state = "curltail"
- ani_state = "curltail_w"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "curltail_mark"
- extra_overlay_w = "curltail_mark_w"
-
-/datum/sprite_accessory/tail/deertail
- name = "deer tail, dual-color"
- desc = ""
- icon_state = "deertail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "deertail_mark"
-
-/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/dragon
- name = "dragon, colorable"
- desc = ""
- icon_state = "dragon"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/Easterntail
- name = "Eastern Dragon (Animated)"
- desc = ""
- icon_state = "Easterntail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "EasterntailColorTip"
- ani_state = "Easterntail_w"
- extra_overlay_w = "EasterntailColorTip_w"
-
-/datum/sprite_accessory/tail/eboop
- name = "EGN mech tail (dual color)"
- desc = ""
- icon_state = "eboop"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "eboop_mark"
-
-/datum/sprite_accessory/tail/fantail
- name = "avian fantail, colorable"
- desc = ""
- icon_state = "fantail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/fennec_tail
- name = "Fennec tail"
- desc = ""
- icon_state = "fennec_tail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/fox_tail
- name = "Fox tail"
- desc = ""
- icon_state = "fox_tail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/fox_tail_plain
- name = "Fox tail"
- desc = ""
- icon_state = "fox_tail_plain_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/foxtail
- name = "Fox"
- desc = "" //leaving this just in case i break something if i just don't include a blank description because this codebase is akin to a house of cards
- icon_state = "foxtail_but_good"
- extra_overlay = "foxtail_but_good-tips"
- do_colouration = TRUE
- color_blend_mode = ICON_MULTIPLY
- ani_state = "foxtail_but_good_w"
- extra_overlay_w = "foxtail_but_good-tips_w"
-
-/datum/sprite_accessory/tail/horse
- name = "horse tail, colorable"
- desc = ""
- icon_state = "horse"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/invisible
- name = "hide species-sprite tail"
- icon = null
- icon_state = null
-
-/datum/sprite_accessory/tail/jackal_bicolor
- name = "jackal, dual-colorable"
- desc = ""
- icon_state = "jackal_bicolor"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "jackal_bicolor_extra"
-
-/datum/sprite_accessory/tail/ketrai_wag
- name = "fennix tail (vwag)"
- desc = ""
- icon_state = "ketraitail"
- ani_state = "ketraitail_w"
- //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone.
-
-/datum/sprite_accessory/tail/kitty
- name = "kitty, colorable, downwards"
- desc = ""
- icon_state = "kittydown"
- ani_state = "kittydown_wag"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/kitty_tg
- name = "kitty, colorable, main"
- desc = ""
- icon_state = "kittytg"
- ani_state = "kittytg_wag"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/kittyup
- name = "kitty, colorable, upwards"
- desc = ""
- icon_state = "kittyup"
- ani_state = "kittyup_wag"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/leafeon
- name = "Leaf Tail"
- desc = ""
- icon_state = "leaf_tail"
-
-/datum/sprite_accessory/tail/liontail
- name = "Lion Tail (vwag)"
- desc = ""
- icon_state = "liontail"
- ani_state = "liontail_w"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "liontail_markings"
- extra_overlay_w = "liontail_markings_w"
-
-/datum/sprite_accessory/tail/lizard_tail_dark_tiger
- name = "Lizard Tail (Dark Tiger)"
- desc = ""
- icon_state = "lizard_tail_dark_tiger"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/lizard_tail_light_tiger
- name = "Lizard Tail (Light Tiger)"
- desc = ""
- icon_state = "lizard_tail_light_tiger"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/lizard_tail_smooth
- name = "Lizard Tail (Smooth)"
- desc = ""
- icon_state = "lizard_tail_smooth"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/lizard_tail_spiked
- name = "Lizard Tail (Spiked)"
- desc = ""
- icon_state = "lizard_tail_spiked"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/mouse
- name = "mouse, colorable"
- desc = ""
- icon_state = "mouse"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/mouse_pink
- name = "mouse, pink"
- desc = ""
- icon_state = "mouse-pink"
-
-/datum/sprite_accessory/tail/nevreandc
- name = "nevrean tail, dual-color"
- desc = ""
- icon_state = "nevreantail_dc"
- extra_overlay = "nevreantail_dc_tail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/nevreanwagdc
- name = "nevrean wagtail, dual-color"
- desc = ""
- icon_state = "wagtail"
- extra_overlay = "wagtail_dc_tail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/nevreanwagdc_alt
- name = "nevrean wagtail, marked, dual-color"
- desc = ""
- icon_state = "wagtail2_dc"
- extra_overlay = "wagtail2_dc_mark"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/newtailmaw
- name = "new tailmaw (vwag)"
- desc = ""
- icon_state = "newtailmaw"
- ani_state = "newtailmaw_w"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/otietail
- name = "otie tail (vwag)"
- desc = ""
- icon_state = "otie"
- ani_state = "otie_w"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/Plugtail
- name = "Synthetic plug tail"
- desc = ""
- icon_state = "Plugtail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "PlugtailMarking"
- extra_overlay2 = "PlugtailMarking2"
-
-/datum/sprite_accessory/tail/redpanda
- name = "red panda"
- desc = ""
- icon_state = "redpanda"
-
-/datum/sprite_accessory/tail/ringtail
- name = "ringtail, colorable"
- desc = ""
- icon_state = "ringtail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "ringtail_mark"
-
-/datum/sprite_accessory/tail/robo_tail
- name = "Robo Dragon Tail"
- desc = ""
- icon_state = "robo_dragon"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "robodragon_b"
-
-/datum/sprite_accessory/tail/satyr
- name = "goat legs, colorable"
- desc = ""
- icon_state = "satyr"
- color_blend_mode = ICON_MULTIPLY
- do_colouration = 1
- hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case.
- clip_mask_icon = 'icons/mob/sprite_accessories/taurs.dmi'
- clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms.
-
-/datum/sprite_accessory/tail/Segmentedlights
- name = "Segmented tail, animated synth"
- desc = ""
- icon_state = "Segmentedtail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "Segmentedlights"
- ani_state = "Segmentedtail_w"
- extra_overlay_w = "Segmentedlights_w"
-
-/datum/sprite_accessory/tail/Segmentedtail
- name = "Segmented tail, animated"
- desc = ""
- icon_state = "Segmentedtail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "Segmentedtailmarking"
- ani_state = "Segmentedtail_w"
- extra_overlay_w = "Segmentedtailmarking_w"
-
-/datum/sprite_accessory/tail/sergaltaildc
- name = "sergal, dual-color"
- desc = ""
- icon_state = "sergal"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "sergal_mark"
-
-/datum/sprite_accessory/tail/shorttail
- name = "shorttail (vwag)"
- desc = ""
- icon_state = "straighttail"
- ani_state = "straighttail_w"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/skunktail
- name = "skunk, dual-color"
- desc = ""
- icon_state = "skunktail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "skunktail_mark"
-
-/datum/sprite_accessory/tail/snag
- name = "xenomorph tail 1"
- desc = ""
- icon_state = "snag"
-
-/datum/sprite_accessory/tail/snaketail
- name = "snake tail, colorable"
- desc = ""
- icon_state = "snaketail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/sneptail
- name = "Snep/Furry Tail (vwag)"
- desc = ""
- icon_state = "sneptail"
- ani_state = "sneptail_w"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "sneptail_mark"
- extra_overlay_w = "sneptail_mark_w"
-
-/datum/sprite_accessory/tail/spade_color
- name = "spade-tail (colorable)"
- desc = ""
- icon_state = "spadetail-black"
- do_colouration = 1
-
-/datum/sprite_accessory/tail/squirrel
- name = "squirrel, colorable"
- desc = ""
- icon_state = "squirrel"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/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/stripey
- name = "stripey taj, colorable"
- desc = ""
- icon_state = "stripeytail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "stripeytail_mark"
-
-/datum/sprite_accessory/tail/stripeytail_brown
- name = "stripey taj, brown"
- desc = ""
- icon_state = "stripeytail-brown"
-
-/datum/sprite_accessory/tail/synthtail_static
- name = "Synthetic lizard tail"
- desc = ""
- icon_state = "synthtail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/synthtail_vwag
- name = "Synthetic lizard tail (vwag)"
- desc = ""
- icon_state = "synthtail"
- ani_state = "synthtail_w"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/tail_smooth
- name = "Smooth Lizard Tail, Colorable"
- desc = ""
- icon_state = "tail_smooth"
- ani_state = "tail_smooth_w"
- do_colouration = 1
-
-/datum/sprite_accessory/tail/tailmaw
- name = "tailmaw, colorable"
- desc = ""
- icon_state = "tailmaw"
- color_blend_mode = ICON_MULTIPLY
- do_colouration = 1
-
-/datum/sprite_accessory/tail/takahiro_kitsune
- name = "Takahiro Kitsune Tails" //takahiro had five tails i just wanted to follow the 'T' naming convention vs. tamamo and triple
- desc = ""
- icon_state = "takahiro-kitsunetails"
- extra_overlay = "takahiro-kitsunetails-tips"
- do_colouration = TRUE
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/tamamo_kitsune
- name = "Tamamo Kitsune Tails" //Tamamo-no-Tiro, let it be known!
- desc = ""
- icon_state = "tamamo-kitsunetails"
- extra_overlay = "tamamo-kitsunetails-tips"
- do_colouration = TRUE
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/tentacles
- name = "Tentacles"
- desc = ""
- icon_state = "tentacles"
- do_colouration = TRUE
- color_blend_mode = ICON_MULTIPLY
- ani_state = "tentacles_wag"
-
-/datum/sprite_accessory/tail/tesh_pattern_fem
- name = "Teshari female tail pattern"
- desc = ""
- icon_state = "teshtail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "teshpattern_fem_tail"
-
-/datum/sprite_accessory/tail/tesh_pattern_fem_alt
- name = "Teshari male tail alt. pattern"
- desc = ""
- icon_state = "teshtail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "teshpattern_fem_alt"
-
-/datum/sprite_accessory/tail/tesh_pattern_male
- name = "Teshari male tail pattern"
- desc = ""
- icon_state = "teshtail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "teshpattern_male_tail"
-
-/datum/sprite_accessory/tail/tesh_pattern_male_alt
- name = "Teshari male tail alt. pattern"
- desc = ""
- icon_state = "teshtail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "teshpattern_male_alt"
-
-/datum/sprite_accessory/tail/teshari_fluffytail
- name = "Teshari tail"
- desc = ""
- icon_state = "teshari_fluffytail"
- extra_overlay = "teshari_fluffytail_mark"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/tiger_new
- name = "tiger tail (vwag)"
- desc = ""
- icon_state = "tigertail"
- ani_state = "tigertail_w"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "tigertail_mark"
- extra_overlay_w = "tigertail_mark_w"
-
-/datum/sprite_accessory/tail/tiger_white
- name = "tiger, colorable"
- desc = ""
- icon_state = "tiger"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "tigerinnerwhite"
-
-/datum/sprite_accessory/tail/triple_kitsune
- name = "Triple Kitsune Tails"
- desc = ""
- icon_state = "triple-kitsunetails"
- extra_overlay = "triple-kitsunetails-tips"
- do_colouration = TRUE
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/vulp_new
- name = "new vulp tail (vwag)"
- desc = ""
- icon_state = "vulptail"
- ani_state = "vulptail_w"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "vulptail_mark"
- extra_overlay_w = "vulptail_mark_w"
-
-/datum/sprite_accessory/tail/vulpan_alt
- name = "vulpkanin alt style, colorable"
- desc = ""
- icon_state = "vulptail_alt"
- 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/wartacosushi_tail //brightened +20RGB from matching roboparts
- name = "Ward-Takahashi Tail"
- desc = ""
- icon_state = "wardtakahashi_vulp"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/wartacosushi_tail_dc
- name = "Ward-Takahashi Tail, dual-color"
- desc = ""
- icon_state = "wardtakahashi_vulp_dc"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "wardtakahashi_vulp_dc_mark"
-
-/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/wolf
- name = "wolf, colorable"
- desc = ""
- icon_state = "wolf"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- extra_overlay = "wolfinner"
-
-/datum/sprite_accessory/tail/xenotail
- name = "xenomorph tail 2"
- desc = ""
- icon_state = "xenotail"
-
-/datum/sprite_accessory/tail/xenotail_fullcolour
- name = "xenomorph tail (fully colourable)"
- desc = ""
- icon_state = "xenotail_fullcolour"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/xenotailalt_fullcolour
- name = "xenomorph tail alt. (fully colourable)"
- desc = ""
- icon_state = "xenotailalt_fullcolour"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/zenghu_taj
- name = "Zeng-Hu Tajaran Synth tail"
- desc = ""
- icon_state = "zenghu_taj"
-
-/datum/sprite_accessory/tail/ztail
- name = "jagged flufftail"
- desc = ""
- icon_state = "ztail"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-//For all species tails. Includes haircolored tails.
-/datum/sprite_accessory/tail/special
- name = "Blank tail. Do not select."
- icon = 'icons/effects/species_tails_vr.dmi'
-
-
-
-/datum/sprite_accessory/tail/special/akula
- name = "akula tail"
- desc = ""
- icon_state = "sharktail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/armalis
- name = "armalis tail"
- desc = ""
- icon_state = "armalis_tail_humanoid_s"
-
-/datum/sprite_accessory/tail/special/armalishc
- name = "armalis tail, colorable"
- desc = ""
- icon_state = "armalis_tail_humanoid_hc_s"
- do_colouration = 1
-
-/datum/sprite_accessory/tail/special/monkeyhc
- name = "monkey tail, colorable"
- desc = ""
- icon_state = "chimptail_hc_s"
- do_colouration = 1
-
-/datum/sprite_accessory/tail/special/nevrean
- name = "nevrean tail"
- desc = ""
- icon_state = "nevreantail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/akulahc
- name = "akula tail, colorable"
- desc = ""
- icon_state = "sharktail_hc_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/fennechc
- name = "flatland zorren tail, colorable"
- desc = ""
- icon_state = "fentail_hc_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/foxhc
- name = "highlander zorren tail, colorable"
- desc = ""
- icon_state = "foxtail_hc_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/monkey
- name = "monkey tail"
- desc = ""
- icon_state = "chimptail_s"
-
-/datum/sprite_accessory/tail/special/nevreanhc
- name = "nevrean tail, colorable"
- desc = ""
- icon_state = "nevreantail_hc_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/sergal
- name = "sergal tail"
- desc = ""
- icon_state = "sergtail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/sergalhc
- name = "sergal tail, colorable"
- desc = ""
- icon_state = "sergtail_hc_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/tajaran
- name = "tajaran tail"
- desc = ""
- icon_state = "tajtail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/tajaranhc
- name = "tajaran tail, colorable"
- desc = ""
- icon_state = "tajtail_hc_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/tajaran_damaged
- name = "tajaran tail, damaged/short"
- icon_state = "tajtail_damaged_s"
- species_allowed = list(SPECIES_TAJ)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tajaran_stubby
- name = "tajaran tail, stubby"
- icon_state = "tajtail_stubby_s"
- species_allowed = list(SPECIES_TAJ)
- color_blend_mode = ICON_ADD
-
-
-/datum/sprite_accessory/tail/special/teshtailfeathered
- name = "Teshari tail alt"
- desc = ""
- icon_state = "teshtail_s"
- extra_overlay = "teshtail_feathers_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/tesharitail_noplume
- name = "teshari tail, no plumage"
- icon_state = "teshtail_noplume_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_noplume_feathered
- name = "teshari tail, no plumage w/feathers"
- icon_state = "teshtail_noplume_s"
- extra_overlay = "teshtail_noplume_feathers_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_damaged
- name = "teshari tail, damaged"
- icon_state = "teshtail_damaged_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_damaged_feathered
- name = "teshari tail, damaged w/feathers"
- icon_state = "teshtail_damaged_s"
- extra_overlay = "teshtail_damaged_feathers_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_damaged_unbranded
- name = "teshari tail, damaged w/ unbranded prosthetic"
- icon_state = "teshtail_damaged_s"
- extra_overlay = "teshtail_damaged_prosthetic_unbranded_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_damaged_unbranded_feathered
- name = "teshari tail, damaged w/feathers + unbranded prosthetic"
- icon_state = "teshtail_damaged_s"
- extra_overlay = "teshtail_damaged_feathers_s"
- extra_overlay2 = "teshtail_damaged_prosthetic_unbranded_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_damaged_cenilimi
- name = "teshari tail, damaged w/ Cenilimi Cybernetics prosthetic"
- icon_state = "teshtail_damaged_s"
- extra_overlay = "teshtail_damaged_prosthetic_cenilimi_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_damaged_cenilimi_feathered
- name = "teshari tail, damaged w/feathers + Cenilimi Cybernetics prosthetic"
- icon_state = "teshtail_damaged_s"
- extra_overlay = "teshtail_damaged_feathers_s"
- extra_overlay2 = "teshtail_damaged_prosthetic_cenilimi_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_damaged_wood
- name = "teshari tail, damaged w/ wooden prosthetic"
- icon_state = "teshtail_damaged_s"
- extra_overlay = "teshtail_damaged_prosthetic_wood_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_damaged_wood_feathered
- name = "teshari tail, damaged w/feathers + wooden prosthetic"
- icon_state = "teshtail_damaged_s"
- extra_overlay = "teshtail_damaged_feathers_s"
- extra_overlay2 = "teshtail_damaged_prosthetic_wood_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_damaged_sifwood
- name = "teshari tail, damaged w/ Sivian wooden prosthetic"
- icon_state = "teshtail_damaged_s"
- extra_overlay = "teshtail_damaged_prosthetic_wood_sif_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_damaged_sifwood_feathered
- name = "teshari tail, damaged w/feathers + Sivian wooden prosthetic"
- icon_state = "teshtail_damaged_s"
- extra_overlay = "teshtail_damaged_feathers_s"
- extra_overlay2 = "teshtail_damaged_prosthetic_wood_sif_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_stubby
- name = "teshari tail, stubby"
- icon_state = "teshtail_stubby_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_stubby_feathered
- name = "teshari tail, stubby w/feathers"
- icon_state = "teshtail_stubby_s"
- extra_overlay = "teshtail_stubby_feathers_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_stubby_unbranded
- name = "teshari tail, stubby w/ unbranded prosthetic"
- icon_state = "teshtail_stubby_s"
- extra_overlay = "teshtail_stubby_prosthetic_unbranded_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_stubby_unbranded_feathered
- name = "teshari tail, stubby w/ feathers + unbranded prosthetic"
- icon_state = "teshtail_stubby_s"
- extra_overlay = "teshtail_stubby_feathers_s"
- extra_overlay2 = "teshtail_stubby_prosthetic_unbranded_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_stubby_cenilimi
- name = "teshari tail, stubby w/ Cenilimi Cybernetics prosthetic"
- icon_state = "teshtail_stubby_s"
- extra_overlay = "teshtail_stubby_prosthetic_cenilimi_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_stubby_cenilimi_feathered
- name = "teshari tail, stubby w/ feathers + Cenilimi Cybernetics prosthetic"
- icon_state = "teshtail_stubby_s"
- extra_overlay = "teshtail_stubby_feathers_s"
- extra_overlay2 = "teshtail_stubby_prosthetic_cenilimi_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_stubby_wood
- name = "teshari tail, stubby w/ wooden prosthetic"
- icon_state = "teshtail_stubby_s"
- extra_overlay = "teshtail_stubby_prosthetic_wood_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_stubby_wood_feathered
- name = "teshari tail, stubby w/feathers + wooden prosthetic"
- icon_state = "teshtail_stubby_s"
- extra_overlay = "teshtail_stubby_feathers_s"
- extra_overlay2 = "teshtail_stubby_prosthetic_wood_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_stubby_sifwood
- name = "teshari tail, stubby w/ Sivian wooden prosthetic"
- icon_state = "teshtail_stubby_s"
- extra_overlay = "teshtail_stubby_prosthetic_wood_sif_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_stubby_sifwood_feathered
- name = "teshari tail, stubby w/feathers + Sivian wooden prosthetic"
- icon_state = "teshtail_stubby_s"
- extra_overlay = "teshtail_stubby_feathers_s"
- extra_overlay2 = "teshtail_stubby_prosthetic_wood_sif_s"
- species_allowed = list(SPECIES_TESHARI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/tesharitail_prosthetic_unbranded
- name = "teshari tail, unbranded prosthetic"
- icon_state = "teshtail_prosthetic_unbranded_s"
- species_allowed = list(SPECIES_TESHARI)
- do_colouration = FALSE
-
-/datum/sprite_accessory/tail/special/tesharitail_prosthetic_cenilimi
- name = "teshari tail, Cenilimi Cybernetics prosthetic"
- icon_state = "teshtail_prosthetic_cenilimi_s"
- species_allowed = list(SPECIES_TESHARI)
- do_colouration = FALSE
-
-/datum/sprite_accessory/tail/special/unathi
- name = "unathi tail"
- desc = ""
- icon_state = "sogtail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/unathihc
- name = "unathi tail, colorable"
- desc = ""
- icon_state = "sogtail_hc_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/unathi_damaged
- name = "unathi tail, damaged"
- icon_state = "unathitail_damaged_s"
- species_allowed = list(SPECIES_UNATHI)
- color_blend_mode = ICON_ADD
-
-/datum/sprite_accessory/tail/special/unathi_stubby
- name = "unathi tail, stubby"
- icon_state = "unathitail_stubby_s"
- species_allowed = list(SPECIES_UNATHI)
- color_blend_mode = ICON_ADD
-
-
-
-/datum/sprite_accessory/tail/special/vulpan
- name = "vulpkanin, colorable"
- desc = ""
- icon_state = "vulptail_s"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
-
-/datum/sprite_accessory/tail/special/xenodrone
- name = "xenomorph drone tail"
- desc = ""
- icon_state = "xenos_drone_tail_s"
-
-/datum/sprite_accessory/tail/special/xenodronehc
- name = "xenomorph drone tail, colorable"
- desc = ""
- icon_state = "xenos_drone_tail_hc_s"
- do_colouration = 1
-
-/datum/sprite_accessory/tail/special/xenohunter
- name = "xenomorph hunter tail"
- desc = ""
- icon_state = "xenos_hunter_tail_s"
-
-/datum/sprite_accessory/tail/special/xenohunterhc
- name = "xenomorph hunter tail, colorable"
- desc = ""
- icon_state = "xenos_hunter_tail_hc_s"
- do_colouration = 1
-
-/datum/sprite_accessory/tail/special/xenoqueen
- name = "xenomorph queen tail"
- desc = ""
- icon_state = "xenos_queen_tail_s"
-
-/datum/sprite_accessory/tail/special/xenoqueenhc
- name = "xenomorph queen tail, colorable"
- desc = ""
- icon_state = "xenos_queen_tail_hc_s"
- do_colouration = 1
-
-/datum/sprite_accessory/tail/special/xenosentinel
- name = "xenomorph sentinel tail"
- desc = ""
- icon_state = "xenos_sentinel_tail_s"
-
-/datum/sprite_accessory/tail/special/xenosentinelhc
- name = "xenomorph sentinel tail, colorable"
- desc = ""
- icon_state = "xenos_sentinel_tail_hc_s"
- do_colouration = 1
-
-
-
-// Species-unique tails
-/datum/sprite_accessory/tail/shadekin_short
- name = "Shadekin Short Tail, colorable"
- desc = ""
- icon_state = "shadekin-short"
- do_colouration = 1
- color_blend_mode = ICON_MULTIPLY
- apply_restrictions = TRUE
- species_allowed = list(SPECIES_SHADEKIN)
-
-//Snowflake/donator Tails.
-/datum/sprite_accessory/tail/aronai
- name = "aronai tail (Aronai)"
- desc = ""
- icon_state = "aronai"
- ckeys_allowed = list("arokha")
-
-/datum/sprite_accessory/tail/cabletail
- name = "cabletail"
- desc = "cabletail"
- icon_state = "cabletail"
- ckeys_allowed = list("tucker0666")
-
-/datum/sprite_accessory/tail/featherfluff_tail
- name = "featherfluff_tail"
- desc = ""
- icon_state = "featherfluff_tail"
- ckeys_allowed = list("tucker0666")
-
-/datum/sprite_accessory/tail/holly
- name = "tigress tail (Holly)"
- desc = ""
- icon_state = "tigresstail"
- ckeys_allowed = list("hoodoo")
-
-/datum/sprite_accessory/tail/miria_fluffdragon
- name = "fluffdragon tail (Miria Masters)"
- desc = ""
- icon_state = "miria-fluffdragontail"
- ckeys_allowed = list("miriamasters")
-
-/datum/sprite_accessory/tail/miria_kitsune
- name = "Black kitsune tails (Miria Masters)"
- desc = ""
- icon_state = "miria-kitsunetail"
- ckeys_allowed = list("miriamasters")
-
-/datum/sprite_accessory/tail/molenar_deathclaw
- name = "deathclaw bits (Molenar)"
- desc = ""
- icon_state = "molenar-deathclaw"
- ckeys_allowed = list("molenar","silvertalismen","jertheace")
-
-/datum/sprite_accessory/tail/molenar_kitsune
- name = "quintail kitsune tails (Molenar)"
- desc = ""
- icon_state = "molenar-kitsune"
- ckeys_allowed = list("molenar")
-
-/datum/sprite_accessory/tail/reika //Leaving this since it was too hard to split the wings from the tail.
- name = "fox tail (+ beewings) (Reika)"
- desc = ""
- icon_state = "reika"
- ckeys_allowed = list("rikaru19xjenkins")
-
-/datum/sprite_accessory/tail/rosey
- name = "tritail kitsune tails (Rosey)"
- desc = ""
- icon_state = "rosey_three"
- ckeys_allowed = list("joey4298")
-
-/datum/sprite_accessory/tail/rosey2
- name = "pentatail kitsune tails (Rosey)" //I predict seven tails next. ~CK
- desc = ""
- icon_state = "rosey_five"
- ckeys_allowed = list("joey4298")
-
-/datum/sprite_accessory/tail/runac
- name = "fennecsune tails (Runac)"
- desc = ""
- icon_state = "runac"
- ckeys_allowed = list("rebcom1807")
-
-/datum/sprite_accessory/tail/scree
- name = "green taj tail (Scree)"
- desc = ""
- icon_state = "scree"
- ckeys_allowed = list("scree")
diff --git a/code/modules/vore/fluffstuff/custom_items.dm b/code/modules/vore/fluffstuff/custom_items.dm
index 17d2f1236d5..69d44853af1 100644
--- a/code/modules/vore/fluffstuff/custom_items.dm
+++ b/code/modules/vore/fluffstuff/custom_items.dm
@@ -587,481 +587,11 @@
to_chat(user, "This isn't even an ID card you idiot.")
return
-//WickedTempest: Chakat Tempest
-/obj/item/reagent_containers/hypospray/vial/tempest
- name = "Tempest's Hypospray"
- desc = "A custom-made MKII hypospray belonging to Chakat Tempest. There's small print engraved on the handle: A medicine-cat has no time for doubt. Act now, act swiftly."
- icon = 'icons/vore/custom_items_vr.dmi'
- item_state = "temphypo"
- icon_state = "temphypo"
-
-//WickedTempest: Chakat Tempest
-/obj/item/storage/backpack/saddlebag/tempest
- name = "Tempest's Saddlebags"
- desc = "A custom-made set of saddlebags, tailored to Chakat Tempest's exact dimensions, and taste in color! One one side, there's small print stitched in: ...to carry the weight of any responsibility, burden or task."
- icon = 'icons/vore/custom_items_vr.dmi'
- icon_override = 'icons/vore/custom_items_vr.dmi'
- item_state = "tempestsaddlebag"
- icon_state = "tempestbag"
- max_storage_space = INVENTORY_DUFFLEBAG_SPACE //Since they play a macro character, no reason to put custom slowdown code on here.
- slowdown = 0
- taurtype = /datum/sprite_accessory/tail/taur/feline/tempest
- no_message = "These saddlebags seem to be fitted for someone else, and keep slipping off!"
- action_button_name = "Toggle Mlembulance Mode"
- var/ambulance = FALSE
- var/datum/looping_sound/ambulance/soundloop
- var/ambulance_state = FALSE
- var/ambulance_last_switch = 0
-
-/obj/item/storage/backpack/saddlebag/tempest/Initialize(mapload)
- soundloop = new(list(src), FALSE)
- return ..()
-
-/obj/item/storage/backpack/saddlebag/tempest/Destroy()
- QDEL_NULL(soundloop)
- return ..()
-
-/obj/item/storage/backpack/saddlebag/tempest/ui_action_click()
- ambulance = !(ambulance)
- if(ambulance)
- START_PROCESSING(SSobj, src)
- item_state = "tempestsaddlebag-amb"
- icon_state = "tempestbag-amb"
- if (ismob(loc))
- var/mob/M = loc
- M.update_inv_back()
- ambulance_state = FALSE
- set_light(2, 1, "#FF0000")
- soundloop.start()
- else
- item_state = "tempestsaddlebag"
- icon_state = "tempestbag"
- if (ismob(loc))
- var/mob/M = loc
- M.update_inv_back()
- set_light(0)
- soundloop.stop()
-
-/obj/item/storage/backpack/saddlebag/tempest/process(delta_time)
- if(!ambulance)
- STOP_PROCESSING(SSobj, src)
- return
- if(world.time - ambulance_last_switch > 15)
- ambulance_state = !(ambulance_state)
- var/newlight = "#FF0000"
- if(ambulance_state)
- newlight = "#0000FF"
- if (ismob(loc))
- var/mob/M = loc
- M.update_inv_back()
- set_light(2, 1, newlight)
- ambulance_last_switch = world.time
-
/datum/looping_sound/ambulance
mid_sounds = list('sound/items/amulanceweeoo.ogg'=1)
mid_length = 20
volume = 25
-//WickedTempest: Chakat Tempest
-/obj/item/implant/reagent_generator/tempest
- generated_reagents = list("milk" = 2)
- reagent_name = "milk"
- usable_volume = 1000
-
- empty_message = list("Your breasts are almost completely drained!")
- full_message = list("Your teats feel heavy and swollen!")
- emote_descriptor = list("squeezes milk", "tugs on Tempest's breasts, milking them")
- self_emote_descriptor = list("squeeze")
- random_emote = list("moos quietly")
- verb_name = "Milk"
- verb_desc = "Grab Tempest's nipples and milk them into a container! May cause blushing and groaning."
-
-/obj/item/implanter/reagent_generator/tempest
- implant_type = /obj/item/implant/reagent_generator/tempest
-
-
-//Hottokeeki: Belle Day
-/obj/item/implant/reagent_generator/belle
- generated_reagents = list("milk" = 2)
- reagent_name = "milk"
- usable_volume = 5000
-
- empty_message = list("Your breasts and or udder feel almost completely drained!", "You're feeling a liittle on the empty side...")
- full_message = list("You're due for a milking; your breasts and or udder feel heavy and swollen!", "Looks like you've got some full tanks!")
- emote_descriptor = list("squeezes milk", "tugs on Belle's breasts/udders, milking them", "extracts milk")
- self_emote_descriptor = list("squeeze", "extract")
- random_emote = list("moos", "mrours", "groans softly")
- verb_name = "Milk"
- verb_desc = "Obtain Belle's milk and put it into a container! May cause blushing and groaning, or arousal."
-
-/obj/item/implanter/reagent_generator/belle
- implant_type = /obj/item/implant/reagent_generator/belle
-
-//Gowst: Eldi Moljir
-//Eldi iz coolest elf-dorf.
-/obj/item/implant/reagent_generator/eldi
- name = "lactation implant"
- desc = "This is an implant that allows the user to lactate."
- generated_reagents = list("milk" = 2)
- reagent_name = "milk"
- usable_volume = 1000
-
- empty_message = list("Your breasts feel unusually empty.", "Your chest feels lighter - your milk supply is empty!", "Your milk reserves have run dry.", "Your grateful nipples ache as the last of your milk leaves them.")
- full_message = list("Your breasts ache badly - they are swollen and feel fit to burst!", "You need to be milked! Your breasts feel bloated, eager for release.", "Your milky breasts are starting to leak...")
- emote_descriptor = list("squeezes Eldi's nipples, milking them", "milks Eldi's breasts", "extracts milk")
- self_emote_descriptor = list("squeeze out", "extract")
- random_emote = list("surpresses a moan", "gasps sharply", "bites her lower lip")
- verb_name = "Milk"
- verb_desc = "Grab Eldi's breasts and milk her, storing her fresh, warm milk in a container. This will undoubtedly turn her on."
-
-/obj/item/implanter/reagent_generator/eldi
- implant_type = /obj/item/implant/reagent_generator/eldi
-
-//Vorrarkul: Theodora Lindt
-/obj/item/implant/reagent_generator/vorrarkul
- generated_reagents = list("chocolate_milk" = 2)
- reagent_name = "chocalate milk"
- usable_volume = 1000
-
- empty_message = list("Your nipples are sore from being milked!")
- full_message = list("Your breasts are full, their sweet scent emanating from your chest!")
- emote_descriptor = list("squeezes chocolate milk from Theodora", "tugs on Theodora's nipples, milking them", "kneads Theodora's breasts, milking them")
- self_emote_descriptor = list("squeeze", "knead")
- random_emote = list("moans softly", "gives an involuntary squeal")
- verb_name = "Milk"
- verb_desc = "Grab Theodora's breasts and extract delicious chocolate milk from them!"
-
-/obj/item/implanter/reagent_generator/vorrarkul
- implant_type = /obj/item/implant/reagent_generator/vorrarkul
-
-//Lycanthorph: Savannah Dixon
-/obj/item/implant/reagent_generator/savannah
- generated_reagents = list("milk" = 2)
- reagent_name = "milk"
- usable_volume = 1000
-
- empty_message = list("Your nipples are sore from being milked!", "Your breasts feel drained, milk is no longer leaking from your nipples!")
- full_message = list("Your breasts are full, their sweet scent emanating from your chest!", "Your breasts feel full, milk is starting to leak from your nipples, filling the air with it's sweet scent!")
- emote_descriptor = list("squeezes sweet milk from Savannah", "tugs on Savannah's nipples, milking them", "kneads Savannah's breasts, milking them")
- self_emote_descriptor = list("squeeze", "knead")
- random_emote = list("lets out a soft moan", "gives an involuntary squeal")
- verb_name = "Milk"
- verb_desc = "Grab Savannah's breasts and extract sweet milk from them!"
-
-/obj/item/implanter/reagent_generator/savannah
- implant_type = /obj/item/implant/reagent_generator/savannah
-
-//SpoopyLizz: Roiz Lizden
-//I made this! Woo!
-//implant
-//--------------------
-/obj/item/implant/reagent_generator/roiz
- name = "egg laying implant"
- desc = "This is an implant that allows the user to lay eggs."
- generated_reagents = list("egg" = 2)
- usable_volume = 500
- transfer_amount = 50
-
- empty_message = list("Your lower belly feels smooth and empty. Sorry, we're out of eggs!", "The reduced pressure in your lower belly tells you there are no more eggs.")
- full_message = list("Your lower belly looks swollen with irregular bumps, and it feels heavy.", "Your lower abdomen feels really heavy, making it a bit hard to walk.")
- emote_descriptor = list("an egg right out of Roiz's lower belly!", "into Roiz' belly firmly, forcing him to lay an egg!", "Roiz really tight, who promptly lays an egg!")
- var/verb_descriptor = list("squeezes", "pushes", "hugs")
- var/self_verb_descriptor = list("squeeze", "push", "hug")
- var/short_emote_descriptor = list("lays", "forces out", "pushes out")
- self_emote_descriptor = list("lay", "force out", "push out")
- random_emote = list("hisses softly with a blush on his face", "yelps in embarrassment", "grunts a little")
- assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_roiz
-
-/obj/item/implant/reagent_generator/roiz/post_implant(mob/living/carbon/source)
- START_PROCESSING(SSobj, src)
- to_chat(source, "You implant [source] with \the [src].")
- source.verbs |= assigned_proc
- return 1
-
-/obj/item/implanter/reagent_generator/roiz
- implant_type = /obj/item/implant/reagent_generator/roiz
-
-/mob/living/carbon/human/proc/use_reagent_implant_roiz()
- set name = "Lay Egg"
- set desc = "Force Roiz to lay an egg by squeezing into his lower body! This makes the lizard extremely embarrassed, and it looks funny."
- set category = "Object"
- set src in view(1)
-
- //do_reagent_implant(usr)
- if(!isliving(usr) || !usr.canClick())
- return
-
- if(usr.incapacitated() || usr.stat > CONSCIOUS)
- return
-
- var/obj/item/implant/reagent_generator/roiz/rimplant
- for(var/obj/item/organ/external/E in organs)
- for(var/obj/item/implant/I in E.implants)
- if(istype(I, /obj/item/implant/reagent_generator))
- rimplant = I
- break
- if (rimplant)
- if(rimplant.reagents.total_volume <= rimplant.transfer_amount)
- to_chat(src, "[pick(rimplant.empty_message)]")
- return
-
- new /obj/item/reagent_containers/food/snacks/egg/roiz(get_turf(src))
-
- var/index = rand(0,3)
-
- if (usr != src)
- var/emote = rimplant.emote_descriptor[index]
- var/verb_desc = rimplant.verb_descriptor[index]
- var/self_verb_desc = rimplant.self_verb_descriptor[index]
- usr.visible_message("[usr] [verb_desc] [emote]",
- "You [self_verb_desc] [emote]")
- else
- visible_message("[src] [pick(rimplant.short_emote_descriptor)] an egg.",
- "You [pick(rimplant.self_emote_descriptor)] an egg.")
- if(prob(15))
- visible_message("[src] [pick(rimplant.random_emote)].") // M-mlem.
-
- rimplant.reagents.remove_any(rimplant.transfer_amount)
-
-//Cameron653: Jasmine Lizden
-/obj/item/implant/reagent_generator/jasmine
- name = "egg laying implant"
- desc = "This is an implant that allows the user to lay eggs."
- generated_reagents = list("egg" = 2)
- usable_volume = 500
- transfer_amount = 50
-
- empty_message = list("Your lower belly feels flat, empty, and somewhat rough!", "Your lower belly feels completely empty, no more bulges visible... At least, for the moment!")
- full_message = list("Your lower belly is stretched out, smooth,and heavy, small bulges visible from within!", "It takes considerably more effort to move yourself, the large bulges within your gut most likely the cause!")
- emote_descriptor = list("an egg from Jasmine's tauric belly!", "into Jasmine's gut, forcing her to lay a considerably large egg!", "Jasmine with a considerable amount of force, causing an egg to slip right out of her!")
- var/verb_descriptor = list("squeezes", "pushes", "hugs")
- var/self_verb_descriptor = list("squeeze", "push", "hug")
- var/short_emote_descriptor = list("lays", "forces out", "pushes out")
- self_emote_descriptor = list("lay", "force out", "push out")
- random_emote = list("hisses softly with a blush on her face", "bites down on her lower lip", "lets out a light huff")
- assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_jasmine
-
-/obj/item/implant/reagent_generator/jasmine/post_implant(mob/living/carbon/source)
- START_PROCESSING(SSobj, src)
- to_chat(source, "You implant [source] with \the [src].")
- source.verbs |= assigned_proc
- return 1
-
-/obj/item/implanter/reagent_generator/jasmine
- implant_type = /obj/item/implant/reagent_generator/jasmine
-
-/mob/living/carbon/human/proc/use_reagent_implant_jasmine()
- set name = "Lay Egg"
- set desc = "Cause Jasmine to lay an egg by squeezing her tauric belly!"
- set category = "Object"
- set src in view(1)
-
- //do_reagent_implant(usr)
- if(!isliving(usr) || !usr.canClick())
- return
-
- if(usr.incapacitated() || usr.stat > CONSCIOUS)
- return
-
- var/obj/item/implant/reagent_generator/jasmine/rimplant
- for(var/obj/item/organ/external/E in organs)
- for(var/obj/item/implant/I in E.implants)
- if(istype(I, /obj/item/implant/reagent_generator))
- rimplant = I
- break
- if (rimplant)
- if(rimplant.reagents.total_volume <= rimplant.transfer_amount)
- to_chat(src, "[pick(rimplant.empty_message)]")
- return
-
- new /obj/item/reagent_containers/food/snacks/egg/roiz(get_turf(src))
-
- var/index = rand(0,3)
-
- if (usr != src)
- var/emote = rimplant.emote_descriptor[index]
- var/verb_desc = rimplant.verb_descriptor[index]
- var/self_verb_desc = rimplant.self_verb_descriptor[index]
- usr.visible_message("[usr] [verb_desc] [emote]",
- "You [self_verb_desc] [emote]")
- else
- visible_message("[src] [pick(rimplant.short_emote_descriptor)] an egg.",
- "You [pick(rimplant.self_emote_descriptor)] an egg.")
- if(prob(15))
- visible_message("[src] [pick(rimplant.random_emote)].")
-
- rimplant.reagents.remove_any(rimplant.transfer_amount)
-
-//Draycu: Schae Yonra
-/obj/item/implant/reagent_generator/yonra
- name = "egg laying implant"
- desc = "This is an implant that allows the user to lay eggs."
- generated_reagents = list("egg" = 2)
- usable_volume = 500
- transfer_amount = 50
-
- empty_message = list("Your feathery lower belly feels smooth and empty. For now...", "The lack of clacking eggs in your abdomen lets you know you're free to continue your day as normal.", "The reduced pressure in your lower belly tells you there are no more eggs.", "With a soft sigh, you can feel your lower body is empty. You know it will only be a matter of time before another batch fills you up again, however.")
- full_message = list("Your feathery lower belly looks swollen with irregular bumps, and feels very heavy.", "Your feathery covered lower abdomen feels really heavy, making it a bit hard to walk.", "The added weight from your collection of eggs constantly reminds you that you'll have to lay soon!", "The sounds of eggs clacking as you walk reminds you that you will have to lay soon!")
- emote_descriptor = list("an egg right out of Yonra's feathery crotch!", "into Yonra's belly firmly, forcing her to lay an egg!", ", making Yonra gasp and softly moan while an egg slides out.")
- var/verb_descriptor = list("squeezes", "pushes", "hugs")
- var/self_verb_descriptor = list("squeeze", "push", "hug")
- var/short_emote_descriptor = list("lays", "forces out", "pushes out")
- self_emote_descriptor = list("lay", "force out", "push out")
- random_emote = list("hisses softly with a blush on her face", "yelps in embarrassment", "grunts a little")
- assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_yonra
-
-/obj/item/implant/reagent_generator/yonra/post_implant(mob/living/carbon/source)
- START_PROCESSING(SSobj, src)
- to_chat(source, "You implant [source] with \the [src].")
- source.verbs |= assigned_proc
- return 1
-
-/obj/item/implanter/reagent_generator/yonra
- implant_type = /obj/item/implant/reagent_generator/yonra
-
-/mob/living/carbon/human/proc/use_reagent_implant_yonra()
- set name = "Lay Egg"
- set desc = "Force Yonra to lay an egg by squeezing into her lower body! This makes the Teshari stop whatever she is doing at the time, greatly embarassing her."
- set category = "Object"
- set src in view(1)
-
- //do_reagent_implant(usr)
- if(!isliving(usr) || !usr.canClick())
- return
-
- if(usr.incapacitated() || usr.stat > CONSCIOUS)
- return
-
- var/obj/item/implant/reagent_generator/yonra/rimplant
- for(var/obj/item/organ/external/E in organs)
- for(var/obj/item/implant/I in E.implants)
- if(istype(I, /obj/item/implant/reagent_generator))
- rimplant = I
- break
- if (rimplant)
- if(rimplant.reagents.total_volume <= rimplant.transfer_amount)
- to_chat(src, "[pick(rimplant.empty_message)]")
- return
-
- new /obj/item/reagent_containers/food/snacks/egg/teshari(get_turf(src))
-
- var/index = rand(0,3)
-
- if (usr != src)
- var/emote = rimplant.emote_descriptor[index]
- var/verb_desc = rimplant.verb_descriptor[index]
- var/self_verb_desc = rimplant.self_verb_descriptor[index]
- usr.visible_message("[usr] [verb_desc] [emote]",
- "You [self_verb_desc] [emote]")
- else
- visible_message("[src] [pick(rimplant.short_emote_descriptor)] an egg.",
- "You [pick(rimplant.self_emote_descriptor)] an egg.")
- if(prob(15))
- visible_message("[src] [pick(rimplant.random_emote)].")
-
- rimplant.reagents.remove_any(rimplant.transfer_amount)
-
-/obj/item/reagent_containers/food/snacks/egg/teshari
- name = "teshari egg"
- desc = "It's a large teshari egg."
- icon = 'icons/vore/custom_items_vr.dmi'
- icon_state = "tesh_egg"
- filling_color = "#FDFFD1"
- volume = 12
-
-/obj/item/reagent_containers/food/snacks/egg/teshari/Initialize(mapload)
- . = ..()
- reagents.add_reagent("egg", 10)
- bitesize = 2
-
-/obj/item/reagent_containers/food/snacks/egg/teshari/tesh2
- icon_state = "tesh_egg_2"
-
-//Konabird: Rischi
-/obj/item/implant/reagent_generator/rischi
- name = "egg laying implant"
- desc = "This is an implant that allows the user to lay eggs."
- generated_reagents = list("egg" = 2)
- usable_volume = 3000 //They requested 1 egg every ~30 minutes.
- transfer_amount = 3000
-
- empty_message = list("Your abdomen feels normal and taught, like usual.", "The lack of eggs in your abdomen leaves your belly flat and smooth.", "The reduced pressure in your belly tells you there are no more eggs.", "With a soft sigh, you can feel your body is empty of eggs. You know it will only be a matter of time before an egg forms once again, however.")
- full_message = list("Your lower abdomen feels a bit swollen", "You feel a pressure within your abdomen, and a broody mood slowly creeps over you.", "You can feel the egg inside of you shift as you move, the needy feeling to lay slowly growing stronger!", "You can feel the egg inside of you, swelling out your normally taught abdomen considerably. You'll definitely need to lay soon!")
- emote_descriptor = list("Rischi, causing the small female to squeak and wriggle, an egg falling from between her legs!", "Rischi's midsection, forcing her to lay an egg!", "Rischi, the Teshari huffing and grunting as an egg is squeezed from her body!")
- var/verb_descriptor = list("squeezes", "squashes", "hugs")
- var/self_verb_descriptor = list("squeeze", "push", "hug")
- var/short_emote_descriptor = list("lays", "forces out", "pushes out")
- self_emote_descriptor = list("lay", "force out", "push out")
- random_emote = list("trembles and huffs, panting from the exertion.", "sees what has happened and covers her face with both hands!", "whimpers softly, her legs shivering, knees pointed inward from the feeling.")
- assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_rischi
-
-/obj/item/implant/reagent_generator/rischi/post_implant(mob/living/carbon/source)
- START_PROCESSING(SSobj, src)
- to_chat(source, "You implant [source] with \the [src].")
- source.verbs |= assigned_proc
- return 1
-
-/obj/item/implanter/reagent_generator/rischi
- implant_type = /obj/item/implant/reagent_generator/rischi
-
-/mob/living/carbon/human/proc/use_reagent_implant_rischi()
- set name = "Lay Egg"
- set desc = "Force Rischi to lay an egg by squeezing her! What a terribly rude thing to do!"
- set category = "Object"
- set src in view(1)
-
- //do_reagent_implant(usr)
- if(!isliving(usr) || !usr.canClick())
- return
-
- if(usr.incapacitated() || usr.stat > CONSCIOUS)
- return
-
- var/obj/item/implant/reagent_generator/rischi/rimplant
- for(var/obj/item/organ/external/E in organs)
- for(var/obj/item/implant/I in E.implants)
- if(istype(I, /obj/item/implant/reagent_generator))
- rimplant = I
- break
- if (rimplant)
- if(rimplant.reagents.total_volume <= rimplant.transfer_amount)
- to_chat(src, "[pick(rimplant.empty_message)]")
- return
-
- new /obj/item/reagent_containers/food/snacks/egg/teshari/tesh2(get_turf(src))
-
- var/index = rand(0,3)
-
- if (usr != src)
- var/emote = rimplant.emote_descriptor[index]
- var/verb_desc = rimplant.verb_descriptor[index]
- var/self_verb_desc = rimplant.self_verb_descriptor[index]
- usr.visible_message("[usr] [verb_desc] [emote]",
- "You [self_verb_desc] [emote]")
- else
- visible_message("[src] falls to her knees as the urge to lay overwhelms her, letting out a whimper as she [pick(rimplant.short_emote_descriptor)] an egg from between her legs.",
- "You fall to your knees as the urge to lay overwhelms you, letting out a whimper as you [pick(rimplant.self_emote_descriptor)] an egg from between your legs.")
- if(prob(15))
- visible_message("[src] [pick(rimplant.random_emote)].")
-
- rimplant.reagents.remove_any(rimplant.transfer_amount)
-
-/*
-/obj/item/implant/reagent_generator/pumila_nectar //Bugged. Two implants at once messes things up.
- generated_reagents = list("honey" = 2)
- reagent_name = "honey"
- usable_volume = 5000
-
- empty_message = list("You appear to be all out of nectar", "You feel as though you are lacking a majority of your nectar.")
- full_message = list("You appear to be full of nectar.", "You feel as though you are full of nectar!")
- emote_descriptor = list("squeezes nectar", "extracts nectar")
- self_emote_descriptor = list("squeeze", "extract")
- verb_name = "Extract Honey"
- verb_desc = "Obtain pumila's nectar and put it into a container!"
-
-/obj/item/implanter/reagent_generator/pumila_nectar
- implant_type = /obj/item/implant/reagent_generator/pumila_nectar
-*/
//Egg item
//-------------
/obj/item/reagent_containers/food/snacks/egg/roiz
diff --git a/code/modules/vore/persist/persist_vr.dm b/code/modules/vore/persist/persist_vr.dm
index 53722eec3f7..64fc61f76b2 100644
--- a/code/modules/vore/persist/persist_vr.dm
+++ b/code/modules/vore/persist/persist_vr.dm
@@ -107,39 +107,6 @@
prefs.save_character()
-// Saves mob's current coloration state to prefs
-// This basically needs to be the reverse of /datum/category_item/player_setup_item/general/body/copy_to_mob() ~Leshana
-/proc/apply_coloration_to_prefs(var/mob/living/carbon/human/character, var/datum/preferences/prefs)
- if(!istype(character)) return
- prefs.r_eyes = character.r_eyes
- prefs.g_eyes = character.g_eyes
- prefs.b_eyes = character.b_eyes
- prefs.h_style = character.h_style
- prefs.r_hair = character.r_hair
- prefs.g_hair = character.g_hair
- prefs.b_hair = character.b_hair
- prefs.f_style = character.f_style
- prefs.r_facial = character.r_facial
- prefs.g_facial = character.g_facial
- prefs.b_facial = character.b_facial
- prefs.r_skin = character.r_skin
- prefs.g_skin = character.g_skin
- prefs.b_skin = character.b_skin
- prefs.s_tone = character.s_tone
- prefs.h_style = character.h_style
- prefs.f_style = character.f_style
- prefs.b_type = character.b_type
-
-// Saves mob's current custom species, ears, and tail state to prefs
-// This basically needs to be the reverse of /datum/category_item/player_setup_item/vore/ears/copy_to_mob() ~Leshana
-/proc/apply_ears_to_prefs(var/mob/living/carbon/human/character, var/datum/preferences/prefs)
- if(character.ear_style) prefs.ear_style = character.ear_style.type
- if(character.tail_style) prefs.tail_style = character.tail_style.type
- prefs.r_tail = character.r_tail
- prefs.b_tail = character.b_tail
- prefs.g_tail = character.g_tail
- prefs.custom_species = character.custom_species
-
// Saves mob's current organ state to prefs.
// This basically needs to be the reverse of /datum/category_item/player_setup_item/general/body/copy_to_mob() ~Leshana
/proc/apply_organs_to_prefs(var/mob/living/carbon/human/character, var/datum/preferences/prefs)
@@ -188,13 +155,13 @@
if(!istype(mark_datum) || !mark_color)
log_debug(SPAN_DEBUG("[character]'s organ [O] ([O.type]) has marking [list2params(ML)] with invalid/missing color/datum!"))
continue;
- if(!(mark_datum.name in body_marking_styles_list))
+ if(!(mark_datum.name in GLOB.legacy_marking_lookup))
log_debug(SPAN_DEBUG("[character]'s organ [O] ([O.type]) has marking [mark_datum] which is not in body_marking_styles_list!"))
continue;
// Note: Since datums can cover multiple organs, we may encounter it multiple times, but this is okay
// because you're only allowed to have each marking type once! If this assumption changes, obviously update this. ~Leshana
- new_body_markings[mark_datum.name] = mark_color
- prefs.body_markings = new_body_markings // Overwrite with new list!
+ new_body_markings[mark_datum.id] = mark_color
+ prefs.body_marking_ids = new_body_markings // Overwrite with new list!
/**
* Resolve any surplus/deficit in nutrition's effet on weight all at once.