diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md
index 4e4af5cc4e8..84db59f22ab 100644
--- a/ATTRIBUTIONS.md
+++ b/ATTRIBUTIONS.md
@@ -131,3 +131,28 @@
**File:** `/sound/talksounds/looc_sound.ogg`
**Creator:** VerySoft
**License:** [CC BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/)
+
+**Files**:icons\inventory\suit\taursuits_wolf,
+icons\inventory\suit\taursuits_fox,
+icons\inventory\suit\taursuits_zorgoia,
+icons\inventory\suit\taursuits_redpanda,
+icons\inventory\suit\taursuits_lizard,
+icons\inventory\suit\taursuits_drake,
+icons\inventory\suit\taursuits_otie,
+icons\inventory\suit\taursuits_noodle,
+icons\inventory\suit\taursuits_horse,
+icons\inventory\suit\taursuits_cow,
+icons\inventory\suit\taursuits_skunk,
+icons\inventory\suit\taursuits_sergal,
+icons\inventory\suit\taursuits_rat,
+icons\inventory\suit\taursuits_deer,
+icons\inventory\suit\taursuits_feline
+**Folder**:tools\TaurClothingCutter
+**Notes:** All sprites other than the waist-up humanoid torso portions are fully created by Poojawa and as such must be credited if ported.
+**File**: icons/obj/guncabinet.dmi
+**Notes:** All sprites not appended with 'old' Are fully created by Poojawa.
+**File**: icons/obj/machines/foodsynthesizer.dmi
+**Notes:** Original Sprite taken from Deep Space 13. Portable Synth, Screen Animations, East/West, Panel layering, and canisters, Are fully created by Poojawa.
+**Creator:** Poojawa
+**License:** [CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)
+
\ No newline at end of file
diff --git a/code/__defines/sprite_sheets.dm b/code/__defines/sprite_sheets.dm
index cfb37433256..f32cdbaf0cf 100644
--- a/code/__defines/sprite_sheets.dm
+++ b/code/__defines/sprite_sheets.dm
@@ -1,190 +1,190 @@
// Default species get default sprites, VR species get VR sprites
#define ALL_SPRITE_SHEETS_SUIT_MOB list(\
SPECIES_HUMAN = 'icons/inventory/suit/mob.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/suit/mob_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/suit/mob_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/suit/mob_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/suit/mob.dmi',\
+SPECIES_SKRELL = 'icons/inventory/suit/mob.dmi',\
+SPECIES_UNATHI = 'icons/inventory/suit/mob.dmi',\
SPECIES_TESHARI = 'icons/inventory/suit/mob_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/suit/mob_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/suit/mob_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/suit/mob_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/suit/mob_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/suit/mob_vulpkanin.dmi',\
+SPECIES_XENOHYBRID = 'icons/inventory/suit/mob.dmi',\
+SPECIES_AKULA = 'icons/inventory/suit/mob.dmi',\
+SPECIES_SERGAL = 'icons/inventory/suit/mob.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/suit/mob.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/suit/mob.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/suit/mob.dmi',\
+SPECIES_FENNEC = 'icons/inventory/suit/mob.dmi',\
SPECIES_ALTEVIAN = 'icons/inventory/suit/mob_altevian.dmi')
#define VR_SPECIES_SPRITE_SHEETS_HEAD_MOB list(\
SPECIES_HUMAN = 'icons/inventory/head/mob.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/head/mob_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/head/mob_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/head/mob_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/head/mob.dmi',\
+SPECIES_SKRELL = 'icons/inventory/head/mob.dmi',\
+SPECIES_UNATHI = 'icons/inventory/head/mob.dmi',\
SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/head/mob_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/head/mob_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/head/mob_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/head/mob_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/head/mob_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/head/mob_vulpkanin.dmi',\
+SPECIES_XENOHYBRID = 'icons/inventory/head/mob.dmi',\
+SPECIES_AKULA = 'icons/inventory/head/mob.dmi',\
+SPECIES_SERGAL = 'icons/inventory/head/mob.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/head/mob.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/head/mob.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob.dmi',\
+SPECIES_FENNEC = 'icons/inventory/head/mob.dmi',\
SPECIES_ALTEVIAN = 'icons/inventory/head/mob_altevian.dmi')
#define VR_SPECIES_SPRITE_SHEETS_HANDS_MOB list(\
SPECIES_HUMAN = 'icons/inventory/hands/mob.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/hands/mob_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/hands/mob_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/hands/mob_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/hands/mob.dmi',\
+SPECIES_SKRELL = 'icons/inventory/hands/mob.dmi',\
+SPECIES_UNATHI = 'icons/inventory/hands/mob.dmi',\
SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/hands/mob_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/hands/mob_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/hands/mob_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/hands/mob_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/hands/mob_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/hands/mob_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/hands/mob_vulpkanin.dmi')
+SPECIES_XENOHYBRID = 'icons/inventory/hands/mob.dmi',\
+SPECIES_AKULA = 'icons/inventory/hands/mob.dmi',\
+SPECIES_SERGAL = 'icons/inventory/hands/mob.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/hands/mob.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/hands/mob.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/hands/mob.dmi',\
+SPECIES_FENNEC = 'icons/inventory/hands/mob.dmi')
#define VR_SPECIES_SPRITE_SHEETS_FEET_MOB list(\
SPECIES_HUMAN = 'icons/inventory/feet/mob.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/feet/mob_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/feet/mob_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/feet/mob_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/feet/mob.dmi',\
+SPECIES_SKRELL = 'icons/inventory/feet/mob.dmi',\
+SPECIES_UNATHI = 'icons/inventory/feet/mob.dmi',\
SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/feet/mob_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/feet/mob_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/feet/mob_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/feet/mob_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/feet/mob_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/feet/mob_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/feet/mob_vulpkanin.dmi')
+SPECIES_XENOHYBRID = 'icons/inventory/feet/mob.dmi',\
+SPECIES_AKULA = 'icons/inventory/feet/mob.dmi',\
+SPECIES_SERGAL = 'icons/inventory/feet/mob.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/feet/mob.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/feet/mob.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/feet/mob.dmi',\
+SPECIES_FENNEC = 'icons/inventory/feet/mob.dmi')
#define SPECIES_SPRITE_SHEETS_SUIT_ITEM list(\
SPECIES_HUMAN = 'icons/inventory/suit/item.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/suit/item_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/suit/item_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/suit/item_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/suit/item.dmi',\
+SPECIES_SKRELL = 'icons/inventory/suit/item.dmi',\
+SPECIES_UNATHI = 'icons/inventory/suit/item.dmi',\
SPECIES_TESHARI = 'icons/inventory/suit/item_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/suit/item_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/suit/item_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/suit/item_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/suit/item_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/suit/item_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/suit/item_vulpkanin.dmi',\
+SPECIES_XENOHYBRID = 'icons/inventory/suit/item.dmi',\
+SPECIES_AKULA = 'icons/inventory/suit/item.dmi',\
+SPECIES_SERGAL = 'icons/inventory/suit/item.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/suit/item.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/suit/item.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/suit/item.dmi',\
+SPECIES_FENNEC = 'icons/inventory/suit/item.dmi',\
SPECIES_ALTEVIAN = 'icons/inventory/suit/item_altevian.dmi')
#define VR_SPECIES_SPRITE_SHEETS_HEAD_ITEM list(\
SPECIES_HUMAN = 'icons/inventory/head/item.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/head/item_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/head/item_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/head/item_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/head/item.dmi',\
+SPECIES_SKRELL = 'icons/inventory/head/item.dmi',\
+SPECIES_UNATHI = 'icons/inventory/head/item.dmi',\
SPECIES_TESHARI = 'icons/inventory/head/item_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/head/item_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/head/item_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/head/item_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/head/item_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/head/item_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/head/item_vulpkanin.dmi',\
+SPECIES_XENOHYBRID = 'icons/inventory/head/item.dmi',\
+SPECIES_AKULA = 'icons/inventory/head/item.dmi',\
+SPECIES_SERGAL = 'icons/inventory/head/item.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/head/item.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/head/item.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/head/item.dmi',\
+SPECIES_FENNEC = 'icons/inventory/head/item.dmi',\
SPECIES_ALTEVIAN = 'icons/inventory/head/item_altevian.dmi')
#define VR_SPECIES_SPRITE_SHEETS_HANDS_ITEM list(\
SPECIES_HUMAN = 'icons/inventory/hands/item.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/hands/item_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/hands/item_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/hands/item_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/hands/item.dmi',\
+SPECIES_SKRELL = 'icons/inventory/hands/item.dmi',\
+SPECIES_UNATHI = 'icons/inventory/hands/item.dmi',\
SPECIES_TESHARI = 'icons/inventory/hands/item_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/hands/item_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/hands/item_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/hands/item_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/hands/item_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/hands/item_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/hands/item_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/hands/item_vulpkanin.dmi')
+SPECIES_XENOHYBRID = 'icons/inventory/hands/item.dmi',\
+SPECIES_AKULA = 'icons/inventory/hands/item.dmi',\
+SPECIES_SERGAL = 'icons/inventory/hands/item.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/hands/item.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/hands/item.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/hands/item.dmi',\
+SPECIES_FENNEC = 'icons/inventory/hands/item.dmi')
#define VR_SPECIES_SPRITE_SHEETS_FEET_ITEM list(\
SPECIES_HUMAN = 'icons/inventory/feet/item.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/feet/item_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/feet/item_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/feet/item_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/feet/item.dmi',\
+SPECIES_SKRELL = 'icons/inventory/feet/item.dmi',\
+SPECIES_UNATHI = 'icons/inventory/feet/item.dmi',\
SPECIES_TESHARI = 'icons/inventory/feet/item_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/feet/item_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/feet/item_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/feet/item_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/feet/item_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/feet/item_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/feet/item_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/feet/item_vulpkanin.dmi')
+SPECIES_XENOHYBRID = 'icons/inventory/feet/item.dmi',\
+SPECIES_AKULA = 'icons/inventory/feet/item.dmi',\
+SPECIES_SERGAL = 'icons/inventory/feet/item.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/feet/item.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/feet/item.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/feet/item.dmi',\
+SPECIES_FENNEC = 'icons/inventory/feet/item.dmi')
#define ALL_VR_SPRITE_SHEETS_HEAD_MOB list(\
SPECIES_HUMAN = 'icons/inventory/head/mob.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/head/mob_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/head/mob_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/head/mob_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/head/mob.dmi',\
+SPECIES_SKRELL = 'icons/inventory/head/mob.dmi',\
+SPECIES_UNATHI = 'icons/inventory/head/mob.dmi',\
SPECIES_TESHARI = 'icons/inventory/head/mob_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/head/mob_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/head/mob_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/head/mob_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/head/mob_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/head/mob_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/head/mob_vulpkanin.dmi',\
+SPECIES_XENOHYBRID = 'icons/inventory/head/mob.dmi',\
+SPECIES_AKULA = 'icons/inventory/head/mob.dmi',\
+SPECIES_SERGAL = 'icons/inventory/head/mob.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/head/mob.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/head/mob.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/head/mob.dmi',\
+SPECIES_FENNEC = 'icons/inventory/head/mob.dmi',\
SPECIES_ALTEVIAN = 'icons/inventory/head/mob_altevian.dmi')
#define ALL_VR_SPRITE_SHEETS_HANDS_MOB list(\
SPECIES_HUMAN = 'icons/inventory/hands/mob.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/hands/mob_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/hands/mob_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/hands/mob_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/hands/mob.dmi',\
+SPECIES_SKRELL = 'icons/inventory/hands/mob.dmi',\
+SPECIES_UNATHI = 'icons/inventory/hands/mob.dmi',\
SPECIES_TESHARI = 'icons/inventory/hands/mob_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/hands/mob_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/hands/mob_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/hands/mob_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/hands/mob_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/hands/mob_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/hands/mob_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/hands/mob_vulpkanin.dmi')
+SPECIES_XENOHYBRID = 'icons/inventory/hands/mob.dmi',\
+SPECIES_AKULA = 'icons/inventory/hands/mob.dmi',\
+SPECIES_SERGAL = 'icons/inventory/hands/mob.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/hands/mob.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/hands/mob.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/hands/mob.dmi',\
+SPECIES_FENNEC = 'icons/inventory/hands/mob.dmi')
#define ALL_VR_SPRITE_SHEETS_FEET_MOB list(\
SPECIES_HUMAN = 'icons/inventory/feet/mob.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/feet/mob_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/feet/mob_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/feet/mob_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/feet/mob.dmi',\
+SPECIES_SKRELL = 'icons/inventory/feet/mob.dmi',\
+SPECIES_UNATHI = 'icons/inventory/feet/mob.dmi',\
SPECIES_TESHARI = 'icons/inventory/feet/mob_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/feet/mob_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/feet/mob_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/feet/mob_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/feet/mob_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/feet/mob_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/feet/mob_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/feet/mob_vulpkanin.dmi')
+SPECIES_XENOHYBRID = 'icons/inventory/feet/mob.dmi',\
+SPECIES_AKULA = 'icons/inventory/feet/mob.dmi',\
+SPECIES_SERGAL = 'icons/inventory/feet/mob.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/feet/mob.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/feet/mob.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/feet/mob.dmi',\
+SPECIES_FENNEC = 'icons/inventory/feet/mob.dmi')
#define ALL_VR_SPRITE_SHEETS_HEAD_ITEM list(\
SPECIES_HUMAN = 'icons/inventory/head/item.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/head/item_unathi.dmi',\
-SPECIES_SKRELL = 'icons/inventory/head/item_unathi.dmi',\
-SPECIES_UNATHI = 'icons/inventory/head/item_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/head/item.dmi',\
+SPECIES_SKRELL = 'icons/inventory/head/item.dmi',\
+SPECIES_UNATHI = 'icons/inventory/head/item.dmi',\
SPECIES_TESHARI = 'icons/inventory/head/item_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/head/item_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/head/item_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/head/item_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/head/item_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/head/item_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/head/item_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/head/item_vulpkanin.dmi',\
+SPECIES_XENOHYBRID = 'icons/inventory/head/item.dmi',\
+SPECIES_AKULA = 'icons/inventory/head/item.dmi',\
+SPECIES_SERGAL = 'icons/inventory/head/item.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/head/item.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/head/item.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/head/item.dmi',\
+SPECIES_FENNEC = 'icons/inventory/head/item.dmi',\
SPECIES_ALTEVIAN = 'icons/inventory/head/item_altevian.dmi')
#define ALL_VR_SPRITE_SHEETS_HANDS_ITEM list(\
SPECIES_HUMAN = 'icons/inventory/hands/item.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/hands/item_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/hands/item_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/hands/item_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/hands/item.dmi',\
+SPECIES_SKRELL = 'icons/inventory/hands/item.dmi',\
+SPECIES_UNATHI = 'icons/inventory/hands/item.dmi',\
SPECIES_TESHARI = 'icons/inventory/hands/item_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/hands/item_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/hands/item_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/hands/item_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/hands/item_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/hands/item_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/hands/item_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/hands/item_vulpkanin.dmi')
+SPECIES_XENOHYBRID = 'icons/inventory/hands/item.dmi',\
+SPECIES_AKULA = 'icons/inventory/hands/item.dmi',\
+SPECIES_SERGAL = 'icons/inventory/hands/item.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/hands/item.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/hands/item.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/hands/item.dmi',\
+SPECIES_FENNEC = 'icons/inventory/hands/item.dmi')
#define ALL_VR_SPRITE_SHEETS_FEET_ITEM list(\
SPECIES_HUMAN = 'icons/inventory/feet/item.dmi',\
-SPECIES_TAJARAN = 'icons/inventory/feet/item_tajaran.dmi',\
-SPECIES_SKRELL = 'icons/inventory/feet/item_skrell.dmi',\
-SPECIES_UNATHI = 'icons/inventory/feet/item_unathi.dmi',\
+SPECIES_TAJARAN = 'icons/inventory/feet/item.dmi',\
+SPECIES_SKRELL = 'icons/inventory/feet/item.dmi',\
+SPECIES_UNATHI = 'icons/inventory/feet/item.dmi',\
SPECIES_TESHARI = 'icons/inventory/feet/item_teshari.dmi',\
-SPECIES_XENOHYBRID = 'icons/inventory/feet/item_unathi.dmi',\
-SPECIES_AKULA = 'icons/inventory/feet/item_akula.dmi',\
-SPECIES_SERGAL = 'icons/inventory/feet/item_sergal.dmi',\
-SPECIES_NEVREAN = 'icons/inventory/feet/item_sergal.dmi',\
-SPECIES_VULPKANIN = 'icons/inventory/feet/item_vulpkanin.dmi',\
-SPECIES_ZORREN_HIGH = 'icons/inventory/feet/item_vulpkanin.dmi',\
-SPECIES_FENNEC = 'icons/inventory/feet/item_vulpkanin.dmi')
+SPECIES_XENOHYBRID = 'icons/inventory/feet/item.dmi',\
+SPECIES_AKULA = 'icons/inventory/feet/item.dmi',\
+SPECIES_SERGAL = 'icons/inventory/feet/item.dmi',\
+SPECIES_NEVREAN = 'icons/inventory/feet/item.dmi',\
+SPECIES_VULPKANIN = 'icons/inventory/feet/item.dmi',\
+SPECIES_ZORREN_HIGH = 'icons/inventory/feet/item.dmi',\
+SPECIES_FENNEC = 'icons/inventory/feet/item.dmi')
diff --git a/code/__defines/update_icons.dm b/code/__defines/update_icons.dm
index ab5b375c841..a5e8a770bc3 100644
--- a/code/__defines/update_icons.dm
+++ b/code/__defines/update_icons.dm
@@ -44,6 +44,10 @@
#define TARGETED_LAYER 41 //'Aimed at' overlay layer
#define TOTAL_LAYERS 41 // <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list.
+/// Tail layering shortcuts
+#define TAUR_LAYERING BODY_LAYER+TAIL_UPPER_LAYER+1
+#define LOWER_TAIL_DIRS list(SOUTH, EAST, WEST)
+#define TAIL_LAYER_CLEARING list(TAIL_UPPER_LAYER, TAIL_UPPER_LAYER_HIGH, TAIL_UPPER_LAYER_LOW, TAIL_LOWER_LAYER)
//These two are only used for gargoyles currently
#define HUMAN_BODY_LAYERS list(MUTATIONS_LAYER, TAIL_LOWER_LAYER, WING_LOWER_LAYER, BODYPARTS_LAYER, SKIN_LAYER, BLOOD_LAYER, MOB_DAM_LAYER, TAIL_UPPER_LAYER, HAIR_LAYER, HAIR_ACCESSORY_LAYER, EYES_LAYER, WING_LAYER, VORE_BELLY_LAYER, VORE_TAIL_LAYER, TAIL_UPPER_LAYER_HIGH, TAIL_UPPER_LAYER_LOW)
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index dbfe8343af9..5d975b26021 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -111,7 +111,7 @@
slowdown = 0.5
armor = list(melee = 60, bullet = 50, laser = 30, energy = 80, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0
- flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
/obj/item/clothing/suit/space/cult/cultify()
return
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index cf47577f85d..7731c58b025 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -42,15 +42,14 @@
src.attach_accessory(null, tie)
set_clothing_index()
- //VOREStation edit start
if(polychromic)
verbs |= /obj/item/clothing/proc/change_color
- //VOREStation edit start
/obj/item/clothing/update_icon()
cut_overlays() //This removes all the overlays on the sprite and then goes down a checklist adding them as required.
if(forensic_data?.has_blooddna())
add_blood()
+ //TODO: strip out redundant icons like labcoats with an overlay badge, security uniforms with the trim, winter coats, etc etc.
. = ..()
/obj/item/clothing/equipped(mob/user,slot)
@@ -987,14 +986,26 @@
. = ..()
if(has_hood_sprite) //If we have a special hood_sprite, great, let's use it! Only used by /obj/item/clothing/suit/storage/hooded atm.
icon_state = "[toggleicon][hood_up ? "_t" : ""]"
+ update_clothing_icon()
/obj/item/clothing/suit/equipped(mob/user, slot)
+ //Let's make sure we're extra aggressive with taur settings.
+ icon_override = initial(icon_override)
+ taurized = FALSE
if(slot != slot_wear_suit)
RemoveHood()
+ if(ishuman(user))
+ var/mob/living/carbon/human/Hoomie = user
+ var/taurtail = istaurtail(Hoomie.tail_style)
+ if(taurtail)
+ taurize(Hoomie, taurtail)
+
+ update_clothing_icon()
..()
/obj/item/clothing/suit/dropped(mob/user, equipping, slot)
RemoveHood()
+ update_clothing_icon()
..()
/obj/item/clothing/suit/ui_action_click(mob/user, actiontype)
@@ -1017,9 +1028,9 @@
if(hood)
hood.canremove = TRUE // This shouldn't matter anyways but just incase.
if(ishuman(hood.loc))
- var/mob/living/carbon/H = hood.loc
- H.unEquip(hood, 1)
- H.update_inv_wear_suit()
+ var/mob/living/carbon/Carbmob = hood.loc
+ Carbmob.unEquip(hood, 1)
+ Carbmob.update_inv_wear_suit()
hood.forceMove(src)
/obj/item/clothing/suit/proc/ToggleHood()
@@ -1029,69 +1040,64 @@
RemoveHood()
return
if(ishuman(loc))
- var/mob/living/carbon/human/H = src.loc
- if(H.wear_suit != src)
- to_chat(H, span_warning("You must be wearing [src] to put up the hood!"))
+ var/mob/living/carbon/human/Hoomie = src.loc
+ if(Hoomie.wear_suit != src)
+ to_chat(Hoomie, span_warning("You must be wearing [src] to put up the hood!"))
return
- if(H.head)
- to_chat(H, span_warning("You're already wearing something on your head!"))
+ if(Hoomie.head)
+ to_chat(Hoomie, span_warning("You're already wearing something on your head!"))
return
else
if(color != hood.color)
hood.color = color
- H.equip_to_slot_if_possible(hood,slot_head,0,0,1)
+ Hoomie.equip_to_slot_if_possible(hood,slot_head,0,0,1)
hood_up = TRUE
hood.canremove = FALSE
update_icon()
- H.update_inv_wear_suit()
+ Hoomie.update_inv_wear_suit()
///Hood stuff end.
/obj/item/clothing/suit/update_clothing_icon()
- if (ismob(src.loc))
- var/mob/M = src.loc
- M.update_inv_wear_suit()
-
-/obj/item/clothing/suit/equipped(mob/user, slot)
- if(ishuman(user))
- var/mob/living/carbon/human/H = user
- var/taurtail = istaurtail(H.tail_style)
- if((taurized && !taurtail) || (!taurized && taurtail))
- taurize(user, taurtail)
-
- return ..()
+ if (ismob(loc))
+ var/mob/Mobbie = loc
+ Mobbie.update_inv_wear_suit()
+///Establishes Icon overrides for taur bodies
/obj/item/clothing/suit/proc/taurize(mob/living/carbon/human/taur, has_taur_tail = FALSE)
- if(has_taur_tail)
- var/datum/sprite_accessory/tail/taur/taurtail = taur.tail_style
- if(taurtail.suit_sprites && (icon_exists(taurtail.suit_sprites, get_worn_icon_state(slot_wear_suit_str))))
- icon_override = taurtail.suit_sprites
- taurized = TRUE
- // means that if a taur puts on an already taurized suit without a taur sprite
- // for their taur type, but the previous taur type had a sprite, it stays
- // taurized and they end up with that taur style which is funny
- else
- taurized = FALSE
+ /// We've already confirmed that we have a taur tail during equipped, this is just makes sure we get the correct icon override.
+ if(!has_taur_tail)
+ return
- if(!taurized)
- icon_override = initial(icon_override)
- taurized = FALSE
+ taurized = TRUE
-// Taur suits need to be shifted so its centered on their taur half.
-/obj/item/clothing/suit/make_worn_icon(body_type,slot_name,inhands,default_icon,default_layer = 0,icon/clip_mask)
+ if(showtaurbutts) //We don't want the override icons if we're being asked to show that booty
+ return
+
+ // if we're not showing butts, then let's apply the proper overrides
+ var/datum/sprite_accessory/tail/taur/taurtail = taur.tail_style
+ if(taurtail?.suit_sprites && icon_exists(taurtail.suit_sprites, get_worn_icon_state(slot_wear_suit_str)))
+ icon_override = taurtail.suit_sprites
+
+// Taur suits need to be shifted so it's centered on their taur half.
+/obj/item/clothing/suit/make_worn_icon(body_type, slot_name, inhands, default_icon, default_layer = 0, icon/clip_mask)
var/image/standing = ..()
- if(taurized) //Special snowflake var on suits
+ if(!standing)
+ return null
+
+ // Only apply the -16 offset when taurized AND showtaurbutts is FALSE
+ if(taurized && !showtaurbutts && icon_override)
standing.pixel_x = -16
- standing.layer = BODY_LAYER + TAIL_UPPER_LAYER + 1
+ standing.layer = TAUR_LAYERING
+ // but if we don't have an icon_override, we already have our offsets, set.
return standing
/obj/item/clothing/suit/apply_accessories(image/standing)
- if(LAZYLEN(accessories) && taurized)
- for(var/obj/item/clothing/accessory/A in accessories)
- var/image/I = new(A.get_mob_overlay())
- I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body.
- standing.add_overlay(I)
- else
- return ..()
+ . = ..()
+
+ if(LAZYLEN(accessories) && taurized && !showtaurbutts && standing)
+ // account for the offset of our standing image
+ for(var/image/I in standing.overlays)
+ I.pixel_x += 16
///////////////////////////////////////////////////////////////////////
@@ -1162,6 +1168,8 @@
var/icon/rolled_down_sleeves_icon = 'icons/inventory/uniform/mob_sleeves_rolled.dmi'
update_icon_define_digi = "icons/inventory/uniform/mob_digi.dmi"
+ /// hehe, soon.
+ var/taurized = FALSE
/obj/item/clothing/under/attack_hand(mob/user)
if(LAZYLEN(accessories))
diff --git a/code/modules/clothing/clothing_icons.dm b/code/modules/clothing/clothing_icons.dm
index 59483df42ed..11a4c486719 100644
--- a/code/modules/clothing/clothing_icons.dm
+++ b/code/modules/clothing/clothing_icons.dm
@@ -24,6 +24,11 @@
if(forensic_data?.has_blooddna() && blood_sprite_state && ishuman(loc))
var/mob/living/carbon/human/H = loc
blood_sprite_state = "[blood_overlay_type]blood"
- var/image/bloodsies = image(icon = H.species.get_blood_mask(H), icon_state = blood_sprite_state)
- bloodsies.color = blood_color
+ var/datum/sprite_accessory/tail/taur/taurtail = H.tail_style
+ var/image/bloodsies
+ if(taurized && taurtail.suit_sprites)
+ bloodsies = image(icon = taurtail.suit_sprites, icon_state = blood_sprite_state)
+ else
+ bloodsies = image(icon = H.species.get_blood_mask(H), icon_state = blood_sprite_state)
+ bloodsies.color = blood_color
standing.add_overlay(bloodsies)
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 2b8f8e1ed8d..c33c2b91693 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -21,7 +21,7 @@
allowed = list(POCKET_GENERIC, POCKET_EMERGENCY, POCKET_SECURITY)
slowdown = 1.5
armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50)
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
min_pressure_protection = 0
max_pressure_protection = 2 * ONE_ATMOSPHERE
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
@@ -87,7 +87,7 @@
slowdown = 0
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0.9
- flags_inv = HIDETAIL|HIDEHOLSTER
+ flags_inv = HIDEHOLSTER
body_parts_covered = UPPER_TORSO|ARMS
//Orange emergency space suit
diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm
index 4b4fbdc2bd1..4384780f47e 100644
--- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm
@@ -47,7 +47,7 @@
body_parts_covered = CHEST|LEGS|ARMS
heat_protection = CHEST|LEGS|ARMS
cold_protection = CHEST|LEGS|ARMS
- flags_inv = HIDEJUMPSUIT|HIDETAIL
+ flags_inv = HIDEJUMPSUIT
item_flags = THICKMATERIAL | AIRTIGHT
slowdown = 0
//will reach 10 breach damage after 25 laser carbine blasts, 3 revolver hits, or ~1 PTR hit. Completely immune to smg or sts hits.
diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm
index 038727c030d..8f7576bf717 100644
--- a/code/modules/clothing/spacesuits/spacesuits.dm
+++ b/code/modules/clothing/spacesuits/spacesuits.dm
@@ -80,7 +80,7 @@
allowed = list(POCKET_GENERIC, POCKET_EMERGENCY, POCKET_SUIT_REGULATORS)
slowdown = 1.5
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
cold_protection = CHEST|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|LEGS|FEET|ARMS|HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE
diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm
index f0482200ef8..839ab8df242 100644
--- a/code/modules/clothing/spacesuits/void/void.dm
+++ b/code/modules/clothing/spacesuits/void/void.dm
@@ -77,7 +77,8 @@
/obj/item/clothing/suit/space/void/equipped(mob/M)
..()
-
+ /// for sealable void suits using the rig sprites like Engineering
+ icon_state = "[initial(icon_state)]"
var/mob/living/carbon/human/H = M
if(!istype(H)) return
@@ -94,6 +95,8 @@
to_chat(M, "You are unable to deploy your suit's helmet as \the [H.head] is in the way.")
else if (H.equip_to_slot_if_possible(hood, slot_head))
to_chat(M, "Your suit's helmet deploys with a hiss.")
+ if(sealable)
+ icon_state = "[initial(icon_state)]_sealed"
hood.canremove = FALSE
if(cooler)
@@ -181,6 +184,8 @@
H.drop_from_inventory(hood)
hood.forceMove(src)
playsound(src.loc, 'sound/machines/click2.ogg', 75, 1)
+ if(sealable)
+ icon_state = "[initial(icon_state)]"
else
if(H.head)
to_chat(H, span_danger("You cannot deploy your helmet while wearing \the [H.head]."))
@@ -189,6 +194,8 @@
hood.canremove = FALSE
to_chat(H, span_info("You deploy your suit helmet, sealing you off from the world."))
playsound(src.loc, 'sound/machines/click2.ogg', 75, 1)
+ if(sealable)
+ icon_state = "[initial(icon_state)]_sealed"
/obj/item/clothing/suit/space/void/click_alt(mob/living/user)
eject_tank()
diff --git a/code/modules/clothing/suits/aliens/tajara.dm b/code/modules/clothing/suits/aliens/tajara.dm
index 280fe5dd0ba..1c1e793d50c 100644
--- a/code/modules/clothing/suits/aliens/tajara.dm
+++ b/code/modules/clothing/suits/aliens/tajara.dm
@@ -3,7 +3,7 @@
desc = "A traditional Zhan-Khazan garment."
icon_state = "zhan_furs"
body_parts_covered = CHEST|LEGS|FEET|ARMS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
drop_sound = 'sound/items/drop/leather.ogg'
pickup_sound = 'sound/items/pickup/leather.ogg'
diff --git a/code/modules/clothing/suits/armor_vr.dm b/code/modules/clothing/suits/armor_vr.dm
index e55d0cca377..792b816e486 100644
--- a/code/modules/clothing/suits/armor_vr.dm
+++ b/code/modules/clothing/suits/armor_vr.dm
@@ -15,7 +15,7 @@
name = "wolf-taur armor vest"
desc = "An armored vest that protects against some damage. It appears to be created for a wolf-taur."
species_restricted = null //Species restricted since all it cares about is a taur half
- icon = 'icons/mob/taursuits_wolf.dmi'
+ icon = 'icons/inventory/suit/taursuits_snowflake.dmi'
icon_state = "wolf_item"
item_state = "heavy_wolf_armor"
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 5ef36ce2278..335ff8ceb49 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -26,7 +26,7 @@
slowdown = 1.0
allowed = list(POCKET_GENERIC, POCKET_EMERGENCY)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
siemens_coefficient = 0.9
flags = PHORONGUARD
item_flags = THICKMATERIAL
@@ -41,7 +41,7 @@
/obj/item/clothing/suit/bio_suit/general
icon_state = "bio_general"
item_state_slots = list(slot_r_hand_str = "bio", slot_l_hand_str = "bio")
- flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
//Virology biosuit, green stripe
/obj/item/clothing/head/bio_hood/virology
@@ -49,7 +49,7 @@
/obj/item/clothing/suit/bio_suit/virology
icon_state = "bio_virology"
- flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
//Security biosuit, grey with red stripe across the chest
/obj/item/clothing/head/bio_hood/security
@@ -57,7 +57,7 @@
/obj/item/clothing/suit/bio_suit/security
icon_state = "bio_security"
- flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
//Janitor's biosuit, grey with purple arms
/obj/item/clothing/head/bio_hood/janitor
@@ -65,7 +65,7 @@
/obj/item/clothing/suit/bio_suit/janitor
icon_state = "bio_janitor"
- flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
//Scientist's biosuit, white with a pink-ish hue
/obj/item/clothing/head/bio_hood/scientist
@@ -73,12 +73,12 @@
/obj/item/clothing/suit/bio_suit/scientist
icon_state = "bio_scientist"
- flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
//CMO's biosuit, blue stripe
/obj/item/clothing/suit/bio_suit/cmo
icon_state = "bio_cmo"
- flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
/obj/item/clothing/head/bio_hood/cmo
icon_state = "bio_cmo"
@@ -89,4 +89,4 @@
desc = "It protected doctors from the Black Death, back then. You bet your arse it's gonna help you against viruses."
icon_state = "plaguedoctor"
item_state_slots = list(slot_r_hand_str = "bio", slot_l_hand_str = "bio")
- flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 6d258c2bfcf..7f00c7cb84c 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -128,7 +128,7 @@
desc = "A plastic replica of a mercenary combat space suit, you'll look just like a real bloodthirsty mercenary in this! This is a toy, it is not made for use in space!"
w_class = ITEMSIZE_NORMAL
allowed = list(POCKET_GENERIC, POCKET_EMERGENCY)
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
body_parts_covered = CHEST|ARMS|HANDS|LEGS|FEET
/obj/item/clothing/suit/hastur
@@ -258,7 +258,7 @@
desc = "A suit that completely restrains the wearer."
icon_state = "straight_jacket"
body_parts_covered = CHEST|LEGS|FEET|ARMS|HANDS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
var/resist_time = 4800 // Eight minutes.
diff --git a/code/modules/clothing/suits/miscellaneous_vr.dm b/code/modules/clothing/suits/miscellaneous_vr.dm
index b7af7fd6d39..d74e5ea3acc 100644
--- a/code/modules/clothing/suits/miscellaneous_vr.dm
+++ b/code/modules/clothing/suits/miscellaneous_vr.dm
@@ -24,7 +24,7 @@
/obj/item/clothing/suit/drake_cloak
name = "drake cloak"
desc = "A simple cloak for drake-taurs."
- icon = 'icons/mob/taursuits_drake.dmi'
+ icon = 'icons/inventory/suit/taursuits_snowflake.dmi'
icon_state = "cloak"
item_state_slots = list(slot_r_hand_str = "capjacket", slot_l_hand_str = "capjacket")
body_parts_covered = UPPER_TORSO|ARMS
@@ -41,7 +41,7 @@
/obj/item/clothing/suit/barding
name = DEVELOPER_WARNING_NAME
description_info = "You need to be a horsy to wear that."
- icon = 'icons/mob/taursuits_horse.dmi'
+ icon = 'icons/inventory/suit/taursuits_snowflake.dmi'
item_state_slots = list(slot_r_hand_str = "capjacket", slot_l_hand_str = "capjacket")
body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS
pixel_x = -16
@@ -73,7 +73,7 @@
/obj/item/clothing/suit/taur
name = DEVELOPER_WARNING_NAME
- icon = 'icons/mob/taursuits_horse.dmi'
+ icon = 'icons/inventory/suit/taursuits_snowflake.dmi'
body_parts_covered = CHEST
pixel_x = -16
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index 8c0a1ec48bd..dff237afba6 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -20,7 +20,7 @@
body_parts_covered = CHEST|LEGS|FEET|ARMS|HANDS
allowed = list(POCKET_GENERIC, POCKET_EMERGENCY, /obj/item/extinguisher)
slowdown = 1.0
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
item_flags = 0
heat_protection = CHEST|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
@@ -63,7 +63,7 @@
permeability_coefficient = 0.01
slowdown = 2
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0)
- flags_inv = HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
heat_protection = CHEST|LEGS|FEET|ARMS|HANDS
cold_protection = CHEST|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE
@@ -107,7 +107,7 @@
allowed = list(POCKET_GENERIC, POCKET_EMERGENCY, /obj/item/clothing/head/radiation)
slowdown = 1.5
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100)
- flags_inv = HIDEJUMPSUIT|HIDETAIL|HIDETIE|HIDEHOLSTER
+ flags_inv = HIDEJUMPSUIT|HIDETIE|HIDEHOLSTER
item_flags = THICKMATERIAL
/obj/item/clothing/suit/radiation/Initialize(mapload)
diff --git a/code/modules/clothing/tail_sock.dm b/code/modules/clothing/tail_sock.dm
new file mode 100644
index 00000000000..2d115ace512
--- /dev/null
+++ b/code/modules/clothing/tail_sock.dm
@@ -0,0 +1,284 @@
+//This file contains the vars used to give taur and tail socks a baseline color, using their base sprite, upon the various suits and space suits that require them
+// I've tried to reasonably color match to the vibes of the overall sprite just to be sure. - Pooj
+// Rig Suits deploy a clothing path'd suit, so we just need to keep that in mind for sealed/unsealed related applications.
+// These are all stored seperately because I don't really want to edit all the clothing paths myself and change a bunch of files. plays nicer with downstreams too.alist
+
+/obj/item/clothing/suit
+ ///does the suit require a full-envelop suit sock? Spacesuits, bio suits, rad suits, etc.
+ var/requires_tailsock = FALSE
+ /// what color is the tailsock going to be? Defaults to a nice, dark grey that usually matches everything.
+ var/tailsock_color = "#1F1F1F"
+ /// toggle tailsock options
+ var/tailsock_toggle = TRUE
+ /// toggle taur extending for the sprites, for people who want their butts to be shown off, default false
+ var/showtaurbutts = FALSE
+
+/obj/item/clothing/suit/space
+ /// unrelated to tailsocks directly, buuuuuut, taur suits have dedicated sealed/unsealed variants and that should be applied, too.
+ var/sealable = FALSE
+ requires_tailsock = TRUE
+
+///This is purely for player preference.
+/obj/item/clothing/suit/verb/toggletailsock()
+ set name = "Toggle Tail Sock"
+ set category = "Object"
+ set desc = "Toggle the tail sock on your suit."
+ toggle_tailsock(usr)
+
+/obj/item/clothing/suit/proc/toggle_tailsock(mob/user)
+ if(!user || !ishuman(user))
+ return
+ var/mob/living/carbon/human/H = user
+ if(H.wear_suit != src)
+ to_chat(user, span_warning("You must be wearing \the [src] to adjust the tail sock."))
+ return
+
+ if(!requires_tailsock)
+ to_chat(user, span_notice("\The [src] does not have a tail sock extruder."))
+ return
+
+ if(showtaurbutts)
+ to_chat(user, span_notice("You must enable full body taur sheathing on \the [src] first."))
+ return
+
+ tailsock_toggle = !tailsock_toggle
+ to_chat(user, span_notice("You toggle \the [src]'s dynamic tail sheath [tailsock_toggle ? "ON" : "OFF"]."))
+
+ H.update_inv_wear_suit()
+ H.update_tail_showing()
+
+/obj/item/clothing/suit/verb/toggletaursuit()
+ set name = "Toggle Taur Extension"
+ set category = "Object"
+ set desc = "Toggle the full body taur sprite on your suit."
+ toggle_taurextender(usr)
+
+/obj/item/clothing/suit/proc/toggle_taurextender(mob/user)
+ if(!user || !ishuman(user))
+ return
+
+ var/mob/living/carbon/human/H = user
+ if(H.wear_suit != src)
+ to_chat(user, span_warning("You must be wearing \the [src] to adjust the taur extension."))
+ return
+
+ var/taurtail = istaurtail(H.tail_style)
+ if(!taurtail)
+ to_chat(user, span_warning("\The [src]'s taur extension requires a taur body."))
+ return
+
+ showtaurbutts = !showtaurbutts
+
+ if(showtaurbutts)
+ // Classic Mode: turn off suit tailsock sleeve
+ tailsock_toggle = FALSE
+ to_chat(user, span_notice("You disable full body sheathing on \the [src] (Classic mode)."))
+ else
+ // Modern Taur Mode: Enable suit override & tail sheath
+ tailsock_toggle = TRUE
+ to_chat(user, span_notice("You enable full body taur sheathing on \the [src]."))
+
+ taurize(H, taurtail)
+ H.update_inv_wear_suit()
+ H.update_tail_showing()
+
+/obj/item/clothing/suit/examine(mob/user)
+ . = ..()
+ ///It's a little thing, but feedback can help someone wondering why a suit isn't hinding their tails/butt.
+ . += span_notice("The dynamic sheathing toggle is [tailsock_toggle ? "enabled" : "disabled"].")
+
+//The following for specific sock colors more than anything.
+
+//Fire suits
+/obj/item/clothing/suit/fire
+ requires_tailsock = TRUE
+ tailsock_color = "#343442"
+
+/obj/item/clothing/suit/fire/firefighter
+ tailsock_color = "#3F3F3F"
+
+/obj/item/clothing/suit/fire/heavy
+ tailsock_color = "#3F3F3F"
+
+//Bomb suits
+/obj/item/clothing/suit/bomb_suit
+ requires_tailsock = TRUE
+ tailsock_color = "#9C8956"
+
+/obj/item/clothing/suit/bomb_suit/security
+ tailsock_color = "#4A4A2F"
+
+// Bio suits
+/obj/item/clothing/suit/bio_suit
+ requires_tailsock = TRUE
+ tailsock_color = "#BBBBBB"
+
+/obj/item/clothing/suit/bio_suit/security
+ tailsock_color = "#5F615E"
+
+/obj/item/clothing/suit/bio_suit/janitor
+ tailsock_color = "#5F615E"
+
+/obj/item/clothing/suit/bio_suit/scientist
+ tailsock_color = "#CCB8A8"
+
+// Radiation
+/obj/item/clothing/suit/radiation
+ requires_tailsock = TRUE
+
+// Misc suits
+/obj/item/clothing/suit/straight_jacket
+ requires_tailsock = TRUE
+ tailsock_color = "#AAAAAA"
+
+//Station Void Space Suits
+/obj/item/clothing/suit/space/void/makeshift
+ tailsock_color = "#573226"
+
+/obj/item/clothing/suit/space/void/refurb
+ tailsock_color = "#293f61"
+
+/obj/item/clothing/suit/space/void/captain
+ tailsock_color = "#7F7F7F"
+
+/obj/item/clothing/suit/space/void/security/prototype
+ tailsock_color = "#7F7F7F"
+
+/obj/item/clothing/suit/space/void/pilot
+ tailsock_color = "#6B5E52"
+
+/obj/item/clothing/suit/space/void/exploration/alt
+ tailsock_color = "#6B5E52"
+
+/obj/item/clothing/suit/space/void/engineering
+ sealable = TRUE
+ tailsock_color = "#4E4139"
+
+/obj/item/clothing/suit/space/void/engineering/salvage
+ tailsock_color = "#3E3823"
+
+/obj/item/clothing/suit/space/void/atmos
+ sealable = TRUE
+ tailsock_color = "#6B5E52"
+
+/obj/item/clothing/suit/space/void/mining
+ sealable = TRUE
+ tailsock_color = "#6B5E52"
+
+/obj/item/clothing/suit/space/void/mining/alt
+ sealable = TRUE
+ tailsock_color = "#5F615E"
+
+/obj/item/clothing/suit/space/void/medical
+ sealable = TRUE
+ tailsock_color = "#645C56"
+
+/obj/item/clothing/suit/space/void/security
+ sealable = TRUE
+ tailsock_color = "#39342D"
+
+/obj/item/clothing/suit/space/void/security/riot
+ sealable = TRUE
+ tailsock_color = "#660000"
+
+/obj/item/clothing/suit/space/void/security/alt
+ sealable = TRUE
+ tailsock_color = "#1D1D1D"
+
+/obj/item/clothing/suit/armor/captain
+ requires_tailsock = TRUE
+ tailsock_color = "#1E3E50"
+
+/obj/item/clothing/suit/space/emergency
+ tailsock_color = "#282828"
+
+//Bay ported Station Suits
+/obj/item/clothing/suit/space/void/engineering/alt2
+ sealable = FALSE
+ tailsock_color = "#1C222B"
+
+/obj/item/clothing/suit/space/void/atmos/alt2
+ sealable = FALSE
+ tailsock_color = "#1C222B"
+
+/obj/item/clothing/suit/space/void/captain/alt
+ sealable = FALSE
+ tailsock_color = "#1C222B"
+
+/obj/item/clothing/suit/space/void/medical/alt2
+ sealable = FALSE
+ tailsock_color = "#1C222B"
+
+/obj/item/clothing/suit/space/void/exploration/alt2
+ sealable = FALSE
+ tailsock_color = "#1C222B"
+
+/obj/item/clothing/suit/space/void/mining/alt2
+ sealable = FALSE
+ tailsock_color = "#2B3440"
+
+/obj/item/clothing/suit/space/anomaly/alt
+ sealable = FALSE
+ tailsock_color = "#1C222B"
+
+/obj/item/clothing/suit/space/void/security/riot/alt
+ sealable = FALSE
+ tailsock_color = "#1C222B"
+
+//Event Space Suits
+/obj/item/clothing/suit/space/void/hev
+ tailsock_color = "#2D313C"
+
+/obj/item/clothing/suit/space/void/aether
+ tailsock_color = "#423F4F"
+
+/obj/item/clothing/suit/space/void/custodian
+ tailsock_color = "#453542"
+
+/obj/item/clothing/suit/space/void/excelsior
+ tailsock_color = "#6D6D6B"
+
+//Antag Space suits
+/obj/item/clothing/suit/space/syndicate
+ tailsock_color = "#282828"
+
+/obj/item/clothing/suit/space/void/merc
+ sealable = TRUE
+ tailsock_color = "#851e0e"
+
+/obj/item/clothing/suit/space/void/merc/fire
+ sealable = TRUE
+ tailsock_color = "#483031"
+
+/obj/item/clothing/suit/space/void/wizard
+ sealable = TRUE
+ tailsock_color = "#493955"
+
+//snowflake species suits
+/obj/item/clothing/suit/space/vox
+ requires_tailsock = FALSE
+
+/obj/item/clothing/suit/space/void/altevian_heartbreaker
+ requires_tailsock = FALSE
+
+/obj/item/clothing/suit/space/void/zaddat
+ requires_tailsock = FALSE
+
+//RIG's space suits
+/obj/item/clothing/suit/space/rig/zero
+ tailsock_color = "#232226"
+
+/obj/item/clothing/suit/space/rig/baymed
+ tailsock_color = "#1C222B"
+
+/obj/item/clothing/suit/space/rig/pathfinder
+ tailsock_color = "#1C222B"
+
+/obj/item/clothing/suit/space/rig/advsuit
+ tailsock_color = "#6B5E52"
+
+/obj/item/clothing/suit/space/rig/focalpoint
+ tailsock_color = "#303B40"
+
+/obj/item/clothing/suit/space/rig/hephaestus
+ tailsock_color = "#2D253E"
diff --git a/code/modules/emotes/definitions/human.dm b/code/modules/emotes/definitions/human.dm
index 1d540964d96..3b063728124 100644
--- a/code/modules/emotes/definitions/human.dm
+++ b/code/modules/emotes/definitions/human.dm
@@ -26,7 +26,7 @@
key = "swish"
/datum/decl/emote/human/swish/do_emote(mob/living/carbon/human/user)
- user.animate_tail_once()
+ user.animate_tail_start()
/datum/decl/emote/human/wag
key = "wag"
@@ -44,13 +44,13 @@
key = "qwag"
/datum/decl/emote/human/qwag/do_emote(mob/living/carbon/human/user)
- user.animate_tail_fast()
+ user.animate_tail_start()
/datum/decl/emote/human/fastsway
key = "fastsway"
/datum/decl/emote/human/fastsway/do_emote(mob/living/carbon/human/user)
- user.animate_tail_fast()
+ user.animate_tail_start()
/datum/decl/emote/human/swag
key = "swag"
diff --git a/code/modules/maint_recycler/code/vendor_goodies/remote_scene_tools/voodoo.dm b/code/modules/maint_recycler/code/vendor_goodies/remote_scene_tools/voodoo.dm
index b485b6efefe..727261c56a4 100644
--- a/code/modules/maint_recycler/code/vendor_goodies/remote_scene_tools/voodoo.dm
+++ b/code/modules/maint_recycler/code/vendor_goodies/remote_scene_tools/voodoo.dm
@@ -2,6 +2,7 @@
#define DATA_X_OFFSET "x"
#define DATA_Y_OFFSET "y"
#define DATA_ROTATION "rotation"
+#define DEFAULT_RGB_OUTLINE rgb(50,50,50)
/obj/item/remote_scene_tool/voodoo_doll
name = "voodoo doll"
@@ -84,17 +85,23 @@
output.Scale(data[DATA_SCALE], data[DATA_SCALE])
return output
-/obj/item/remote_scene_tool/voodoo_doll/proc/generate_layer_image(image/input, matrix/newtransform, outline_width = 0, outline_color = rgb(50,50,50))
+/obj/item/remote_scene_tool/voodoo_doll/proc/generate_layer_image(image/input, matrix/newtransform, outline_width = 0, outline_color = DEFAULT_RGB_OUTLINE)
if(input == null)
return null
- input.dir = SOUTH
- input.transform = newtransform
- input.layer = FLOAT_LAYER
- if(outline_width > 0)
- input.filters += filter(type="outline", size = outline_width, color = outline_color)
+ // Please for the love of fuck stop kidnapping taur bodies.
+ var/image/doll_img = image(input)
- return input
+ doll_img.dir = SOUTH
+ doll_img.transform = newtransform
+ doll_img.layer = FLOAT_LAYER
+ doll_img.plane = FLOAT_PLANE // Strip PLANE_CH_STOMACH or mob-specific planes!
+ doll_img.appearance_flags = NONE // Strip RESET_PLANE / KEEP_TOGETHER flags!
+
+ if(outline_width > 0)
+ doll_img.filters += filter(type="outline", size = outline_width, color = outline_color)
+
+ return doll_img
/obj/item/remote_scene_tool/voodoo_doll/update_icon()
. = ..()
@@ -124,26 +131,34 @@
if(no_fun_mode) return //no fun allowed
- if(ishuman(owner)) //TODO, refactor the fuck out of this once I port the tgui filter manager stuff over.
+ var/image/tail_image = null
+ if(ishuman(owner)) //Am I a real boy now, papa?
var/mob/living/carbon/human/buddy = owner
- var/is_tail_taur = istaurtail(buddy.tail_style)
- var/icon/displacement_map = icon(src.icon,is_tail_taur ? "taurdisplacement" : "displacement",SOUTH)
- var/image/displacement_rendered = get_humanoid_displacement_map_image(buddy,discarded_layer_indicies,displacement_map,2,null)
+ var/datum/sprite_accessory/tail/tail_style = buddy.tail_style
+ var/is_tail_taur = istaurtail(tail_style)
+
+ var/icon/displacement_map = icon(src.icon, is_tail_taur ? "taurdisplacement" : "displacement", SOUTH)
+ var/image/displacement_rendered = get_humanoid_displacement_map_image(buddy, discarded_layer_indicies, displacement_map, 2, null)
//tails need special attention because taurs
- var/tailoutlinecolor = rgb(50,50,50) //default to a grey, otherwise we use a darker version of one of the tail colors
- if(buddy.tail_style?.do_colouration)
- tailoutlinecolor = get_outline_color(buddy.r_tail,buddy.g_tail,buddy.b_tail,buddy.a_tail)
+ var/tailoutlinecolor = DEFAULT_RGB_OUTLINE //default to a grey, otherwise we use a darker version of one of the tail colors
+ if(tail_style?.do_colouration)
+ tailoutlinecolor = get_outline_color(buddy.r_tail, buddy.g_tail, buddy.b_tail, buddy.a_tail)
- var/image/tail_image = buddy.get_tail_image()
- if(is_tail_taur)
- tail_image = generate_layer_image(buddy.get_tail_image(),generate_layer_matrix(taur_data),outline_size,tailoutlinecolor)
- tail_image.filters += filter(type="alpha", flags = MASK_INVERSE)
- else
- tail_image = generate_layer_image(buddy.get_tail_image(),generate_layer_matrix(tail_data),outline_size,tailoutlinecolor)
+ // Let's get the tail image, checks species and custom tail!
+ var/image/raw_tail = buddy.get_tail_image()
+ if(raw_tail)
+ var/image/full_tail = buddy.apply_tailsock_layer(raw_tail, apply_to_mob = FALSE)
+ var/matrix/target_matrix = generate_layer_matrix(is_tail_taur ? taur_data : tail_data)
+ var/image/cooked_tail = generate_layer_image(full_tail, target_matrix, outline_size, tailoutlinecolor)
+
+ if(is_tail_taur && cooked_tail)
+ cooked_tail.filters += filter(type="alpha", flags = MASK_INVERSE)
+
+ tail_image = cooked_tail
//same kind of scenario for wings
- var/wingoutlinecolor = rgb(50,50,50)
+ var/wingoutlinecolor = DEFAULT_RGB_OUTLINE
if(buddy.wing_style?.do_colouration)
wingoutlinecolor = get_outline_color(buddy.r_wing,buddy.g_wing,buddy.b_wing,buddy.a_wing)
var/image/wing_image = generate_layer_image(buddy.get_wing_image(FALSE),generate_layer_matrix(wing_data),outline_size,wingoutlinecolor)
@@ -177,6 +192,7 @@
rotateMatrix.Turn(2) //very slight blur. this is unironically the best way to do it, any of the blur filters are just way too strong at a minimum value.
transform = rotateMatrix
+#undef DEFAULT_RGB_OUTLINE
#undef DATA_X_OFFSET
#undef DATA_Y_OFFSET
#undef DATA_SCALE
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index f75125eee87..5447a13b54e 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -305,7 +305,10 @@
return
/mob/living/carbon/human/set_dir(new_dir)
+ var/old_dir = dir
. = ..()
- if(. && (species.tail || tail_style))
+ //we already check our tail through these procs now, tailsock/taur tail overlay needs higher priority to be updated correctly.
+ //this has specifically been updated to mutable_appearance and is not as costly as it used to be.
+ if(. && old_dir != new_dir && (old_dir == NORTH || new_dir == NORTH))
update_tail_showing()
update_inv_wear_suit()
diff --git a/code/modules/mob/living/carbon/human/human_powers_vr.dm b/code/modules/mob/living/carbon/human/human_powers_vr.dm
index fcb0bda92a0..e8ed4d3d864 100644
--- a/code/modules/mob/living/carbon/human/human_powers_vr.dm
+++ b/code/modules/mob/living/carbon/human/human_powers_vr.dm
@@ -291,3 +291,8 @@
holder.remove_status_indicator("dead")
holder.visible_message(span_warning("\The [src] literally just dies!"))
..()
+
+//Moved flying logic out of update_icons
+/mob/living/carbon/human/stop_flying()
+ if((. = ..()))
+ update_wing_showing()
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index ca89d370102..ab8be0c5ef3 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -287,8 +287,8 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
var/icon_x_offset = 0
var/icon_y_offset = 0
- if(istype(tail_style, /datum/sprite_accessory/tail/taur)) // Tail icon 'cookie cutters' are filled in where icons are preserved. We need to invert that.
- if(tail_style.clip_mask)
+ if(istype(tail_style, /datum/sprite_accessory/tail)) // Tail icon 'cookie cutters' are filled in where icons are preserved. We need to invert that.
+ if(tail_style.clip_mask) // trim it if we need to, for taur body types that don't have sprite sheets at all.
Cutter = new(icon = (tail_style.clip_mask_icon ? tail_style.clip_mask_icon : tail_style.icon), icon_state = tail_style.clip_mask_state)
Cutter.Blend("#000000", ICON_MULTIPLY) // Make it all black.
@@ -613,6 +613,8 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
update_inv_belt()
update_inv_back()
update_inv_wear_suit()
+ //check for tail related layers, mainly to resolve roundstart/spawn issues
+ update_tail_showing()
update_inv_r_hand()
update_inv_l_hand()
update_inv_handcuffed()
@@ -631,30 +633,37 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
remove_layer(UNIFORM_LAYER)
- //Shoes can be affected by uniform being drawn onto them
+ // Shoes can be affected by uniform being drawn onto them
update_inv_shoes()
if(!w_uniform)
return
+ // Wearing a suit that prevents uniform rendering (e.g. non-RIG full suits)
if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space/rig))
- return //Wearing a suit that prevents uniform rendering
+ return
var/obj/item/clothing/under/under = w_uniform
+ var/uniform_sprite = (istype(under) && !isnull(under.update_icon_define)) ? under.update_icon_define : INV_W_UNIFORM_DEF_ICON
- var/uniform_sprite
- if(istype(under) && !isnull(under.update_icon_define))
- uniform_sprite = under.update_icon_define
- else
- uniform_sprite = INV_W_UNIFORM_DEF_ICON
+ var/icon/c_mask = null
- //Build a uniform sprite
- var/icon/c_mask = tail_style?.clip_mask
- if(c_mask)
- var/obj/item/clothing/suit/S = wear_suit
- if((wear_suit?.flags_inv & HIDETAIL) || (istype(S) && S.taurized)) // Reasons to not mask: 1. If you're wearing a suit that hides the tail or if you're wearing a taurized suit.
- c_mask = null
- overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = uniform_sprite, default_layer = UNIFORM_LAYER, clip_mask = c_mask)
+ // Check if a taur body is active on the mob
+ var/tail_is_rendered = (overlays_standing[get_tail_layer()] || overlays_standing[TAIL_UPPER_LAYER_HIGH])
+
+ // Clip uniform pants/legs off at the waist IF:
+ // Taur body with a mask and not fitted for taurs. Which is basically all of them lmaooo.
+ if(tail_is_rendered && tail_style?.clip_mask && (istype(under) && !under.taurized))
+ c_mask = tail_style.clip_mask
+
+ // Build uniform sprite with clip mask applied
+ overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(
+ body_type = species.get_bodytype(src),
+ slot_name = slot_w_uniform_str,
+ default_icon = uniform_sprite,
+ default_layer = UNIFORM_LAYER,
+ clip_mask = c_mask
+ )
apply_layer(UNIFORM_LAYER)
/mob/living/carbon/human/update_inv_wear_id()
@@ -849,31 +858,37 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
remove_layer(SUIT_LAYER)
- //Hide/show other layers if necessary
+ // Hide/show uniform & shoes
update_inv_w_uniform()
update_inv_shoes()
+
+ // Always ensure tail/taur states are updated so overlay existence is current
update_tail_showing()
update_wing_showing()
if(!wear_suit)
- return //No point, no suit.
+ return // No point, no suit.
var/obj/item/clothing/suit/suit = wear_suit
- var/suit_sprite
-
- if(istype(suit) && !isnull(suit.update_icon_define))
- suit_sprite = suit.update_icon_define
- else
- suit_sprite = INV_SUIT_DEF_ICON
+ var/suit_sprite = (istype(suit) && !isnull(suit.update_icon_define)) ? suit.update_icon_define : INV_SUIT_DEF_ICON
var/icon/c_mask = null
- var/tail_is_rendered = overlays_standing[TAIL_LOWER_LAYER] || overlays_standing[tail_layering]
- var/valid_clip_mask = tail_style?.clip_mask
- if(tail_is_rendered && valid_clip_mask && !(istype(suit) && suit.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden.
- c_mask = valid_clip_mask
- overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = suit_sprite, default_layer = SUIT_LAYER, clip_mask = c_mask)
+ // Check if a taur body is active and requires clipping the lower half of the suit off
+ var/tail_is_rendered = (overlays_standing[get_tail_layer()] || overlays_standing[TAIL_UPPER_LAYER_HIGH])
+ // Apply the clip mask to trim our suit for taur body fitting
+ if(tail_is_rendered && tail_style?.clip_mask && !(istype(suit) && suit.taurized))
+ c_mask = tail_style.clip_mask
+
+ // Generate suit overlay
+ overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(
+ body_type = species.get_bodytype(src),
+ slot_name = slot_wear_suit_str,
+ default_icon = suit_sprite,
+ default_layer = SUIT_LAYER,
+ clip_mask = c_mask
+ )
apply_layer(SUIT_LAYER)
/mob/living/carbon/human/update_inv_pockets()
@@ -986,11 +1001,13 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
apply_layer(L_HAND_LAYER)
/mob/living/carbon/human/proc/get_tail_layer()
- var/list/lower_layer_dirs = list(SOUTH, EAST, WEST) //Tail below clothing on side views too.
- if(tail_style)
+ var/list/lower_layer_dirs = LOWER_TAIL_DIRS // Tail below clothing on side views too.
+ if(!tail_style) // Sanity checks good checks.
+ return
+ else
lower_layer_dirs = tail_style.lower_layer_dirs.Copy()
- if(dir in lower_layer_dirs)
+ if(istaurtail(tail_style) || (dir in lower_layer_dirs))
return TAIL_LOWER_LAYER
else
return TAIL_UPPER_LAYER
@@ -999,130 +1016,378 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
if(QDESTROYING(src))
return
- remove_layer(TAIL_UPPER_LAYER)
- remove_layer(TAIL_UPPER_LAYER_HIGH)
- remove_layer(TAIL_UPPER_LAYER_LOW)
- remove_layer(TAIL_LOWER_LAYER)
+ // Clear previous tail layer assignments
+ for(var/layers in TAIL_LAYER_CLEARING)
+ remove_layer(layers)
var/tail_layer = get_tail_layer()
- if(src.tail_style && src.tail_style.clip_mask_state)
- tail_layer = TAIL_UPPER_LAYER // Use default, let clip mask handle everything
+ // Use default, let clip mask handle everything
+ if(tail_style && tail_style.clip_mask_state && !istaurtail(tail_style))
+ tail_layer = TAIL_UPPER_LAYER
if(tail_layer == TAIL_UPPER_LAYER)
tail_layer = tail_layering
update_vore_tail_sprite()
- var/obj/item/organ/external/chest = organs_by_name[BP_TORSO]
-
var/image/tail_image = get_tail_image()
if(tail_image)
- tail_image.layer = BODY_LAYER+tail_layer
- overlays_standing[tail_layer] = tail_image
- apply_layer(tail_layer)
- return
-
- var/species_tail = species?.get_tail(src) // Species tail icon_state prefix.
-
- //This one is actually not that bad I guess.
- if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
- var/icon/tail_s = get_tail_icon()
- tail_image = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+tail_layer)
- tail_image.alpha = chest?.transparent ? 180 : 255
- overlays_standing[tail_layer] = tail_image
- animate_tail_reset()
+ // Process tailsock & North-facing layer overrides
+ // apply_tailsock_layer is our heavy lifter for tail applying!
+ tail_image = apply_tailsock_layer(tail_image, tail_layer, apply_to_mob = TRUE)
//TODO: Is this the appropriate place for this, and not on species...?
-/mob/living/carbon/human/proc/get_tail_icon()
- var/icon_key = "[species.get_race_key(src)][r_skin][g_skin][b_skin][r_hair][g_hair][b_hair]"
- var/icon/tail_icon = GLOB.tail_icon_cache[icon_key]
- if(!tail_icon)
- //generate a new one
- var/species_tail_anim = species.get_tail_animation(src)
- if(!species_tail_anim && species.icobase_tail) species_tail_anim = species.icobase //Allow override of file for non-animated tails
- if(!species_tail_anim) species_tail_anim = 'icons/effects/species.dmi'
- tail_icon = new/icon(species_tail_anim)
- tail_icon.Blend(rgb(r_skin, g_skin, b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
- // The following will not work with animated tails.
- var/use_species_tail = species.get_tail_hair(src)
- if(use_species_tail)
- var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]")
- hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //Check for species color_mult
- tail_icon.Blend(hair_icon, ICON_OVERLAY)
- GLOB.tail_icon_cache[icon_key] = tail_icon
+//Yes, and we can make it better too.
+/mob/living/carbon/human/proc/get_tail_image_species()
+ var/race_key = species.get_race_key(src)
+ var/icon_key = "[race_key]_[r_skin]_[g_skin]_[b_skin]_[r_hair]_[g_hair]_[b_hair]"
- return tail_icon
+ var/mutable_appearance/tail_app = GLOB.tail_icon_cache[icon_key]
+ if(tail_app)
+ return image(tail_app)
+
+ var/species_tail_anim = species.get_tail_animation(src)
+ if(!species_tail_anim && species.icobase_tail)
+ species_tail_anim = species.icobase
+ if(!species_tail_anim)
+ species_tail_anim = 'icons/effects/species.dmi'
+
+ // Base tail appearance
+ tail_app = mutable_appearance(species_tail_anim, "[tail_style]")
+ tail_app.color = rgb(r_skin, g_skin, b_skin)
+ tail_app.blend_mode = species.color_mult ? BLEND_MULTIPLY : BLEND_ADD
+
+ // Hair / Secondary overlay
+ var/use_species_tail = species.get_tail_hair(src)
+ if(use_species_tail)
+ var/tail_species_state = "[species.get_tail(src)]_[use_species_tail]"
+ var/mutable_appearance/hair_app = mutable_appearance('icons/effects/species.dmi', tail_species_state)
+ hair_app.color = rgb(r_hair, g_hair, b_hair)
+ hair_app.blend_mode = species.color_mult ? BLEND_MULTIPLY : BLEND_ADD
+
+ tail_app.overlays += hair_app
+
+ // Cache the tail for later use
+ GLOB.tail_icon_cache[icon_key] = tail_app
+ return image(tail_app)
+
+/mob/living/carbon/human/proc/get_tail_image()
+ // Pull torso alpha channel information
+ var/torso_alpha = 255
+ var/obj/item/organ/external/chest = organs_by_name[BP_TORSO]
+ if(chest)
+ torso_alpha = chest.alpha
+
+ // Synthetic check
+ var/datum/robolimb/model = isSynthetic()
+ if(istype(model) && model.includes_tail && !tail_style && !tail_hidden)
+ var/mutable_appearance/syn_tail = mutable_appearance(synthetic.icon, "tail")
+ syn_tail.color = rgb(r_skin, g_skin, b_skin)
+ var/image/syn_img = image(syn_tail)
+ syn_img.alpha = torso_alpha
+ return syn_img
+
+ // Custom tail check
+ if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !istaurtail(tail_style)) && !tail_hidden)
+ var/target_icon = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon
+ var/target_state = (wagging && tail_style.ani_state) ? tail_style.ani_state : tail_style.icon_state
+
+ // arrange our taur loafing effects
+ if(tail_style.can_loaf && !is_shifted)
+ pixel_y = resting ? -tail_style.loaf_offset * size_multiplier : default_pixel_y
+
+ // base tail appearance
+ var/mutable_appearance/base_tail = mutable_appearance(target_icon, target_state)
+ if(tail_style.do_colouration)
+ base_tail.color = rgb(r_tail, g_tail, b_tail)
+
+ // basic tail image to build upon
+ var/image/working = image(icon = target_icon, icon_state = null)
+ working.overlays += base_tail
+
+ if(tail_style.extra_overlay)
+ var/ex1_state = (wagging && tail_style.ani_state) ? tail_style.extra_overlay_w : tail_style.extra_overlay
+ var/mutable_appearance/ex1 = mutable_appearance(target_icon, ex1_state)
+ ex1.color = rgb(r_tail2, g_tail2, b_tail2)
+ working.overlays += ex1
+
+ if(tail_style.extra_overlay2)
+ var/ex2_state = (wagging && tail_style.ani_state) ? tail_style.extra_overlay2_w : tail_style.extra_overlay2
+ var/mutable_appearance/ex2 = mutable_appearance(target_icon, ex2_state)
+ ex2.color = rgb(r_tail3, g_tail3, b_tail3)
+ working.overlays += ex2
+
+ if(tail_style.em_block)
+ working.overlays += em_block_image_generic(working)
+
+ if(istaurtail(tail_style) || islongtail(tail_style))
+ working.pixel_x = tail_style.offset_x
+ working.pixel_y = tail_style.offset_y
+
+ if(istaurtail(tail_style))
+ var/datum/sprite_accessory/tail/taur/taurtype = tail_style
+ if(taurtype.can_ride && !riding_datum)
+ riding_datum = new /datum/riding/taur(src)
+ add_verb(src, /mob/living/carbon/human/proc/taur_mount)
+ add_verb(src, /mob/living/proc/toggle_rider_reins)
+
+ // Combine custom tail alpha variable with the torso's alpha channel
+ working.alpha = (a_tail != null) ? min(a_tail, torso_alpha) : torso_alpha
+ return working
+
+ // no custom tail? let's get the species default then
+ if(species && tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL) && !tail_hidden)
+ var/image/species_tail_img = get_tail_image_species()
+ if(species_tail_img)
+ species_tail_img.alpha = torso_alpha
+ return species_tail_img
+ return null
/mob/living/carbon/human/proc/set_tail_state(t_state)
+ if(QDESTROYING(src) || !tail_style)
+ return null
+
+ // wag compatibility check
+ if(tail_style.ani_state)
+ wagging = (t_state == tail_style.ani_state)
+ else
+ wagging = FALSE
+
+ // refresh our tail, please ~
+ update_tail_showing()
+
var/tail_layer = get_tail_layer()
- if(src.tail_style && src.tail_style.clip_mask_state)
- tail_layer = TAIL_UPPER_LAYER // Use default, let clip mask handle everything
- if(tail_layer == TAIL_UPPER_LAYER)
- tail_layer = tail_layering
- var/image/tail_overlay = overlays_standing[tail_layer]
+ return overlays_standing[tail_layer]
- remove_layer(TAIL_UPPER_LAYER)
- remove_layer(TAIL_UPPER_LAYER_HIGH)
- remove_layer(TAIL_UPPER_LAYER_LOW)
- remove_layer(TAIL_LOWER_LAYER)
+//rather than repeatedly trying to assert offsets while rendering the code, let's kick this out into a more managable proc shall we
+/mob/living/carbon/human/proc/get_tail_offsets(obj/item/clothing/suit/socksuit, datum/sprite_accessory/tail/tailtype)
+ var/off_x = tailtype ? tailtype.offset_x : 0
+ var/off_y = tailtype ? tailtype.offset_y : 0
- if(tail_overlay)
- overlays_standing[tail_layer] = tail_overlay
- if(species.get_tail_animation(src))
- tail_overlay.icon_state = t_state
- . = tail_overlay
+ // Add suit offset if the suit isn't using an icon override
+ if(socksuit && !socksuit.icon_override)
+ off_x += socksuit.pixel_x
+ off_y += socksuit.pixel_y
- apply_layer(tail_layer)
+ return list(off_x, off_y)
-//Not really once, since BYOND can't do that.
-//Update this if the ability to flick() images or make looping animation start at the first frame is ever added.
-//You can sort of flick images now with flick_overlay -Aro
-/mob/living/carbon/human/proc/animate_tail_once()
- if(QDESTROYING(src))
- return
+/mob/living/carbon/human/proc/apply_tailsock_layer(image/tailoverlays, target_layer, apply_to_mob = TRUE)
+ if(!tailoverlays)
+ return null
- var/t_state = "[species.get_tail(src)]_once"
- var/tail_layer = get_tail_layer()
- if(src.tail_style && src.tail_style.clip_mask_state)
- tail_layer = TAIL_UPPER_LAYER // Use default, let clip mask handle everything
+ var/obj/item/clothing/suit/socksuit = wear_suit
+ var/datum/sprite_accessory/tail/tailtype = tail_style
- var/image/tail_overlay = overlays_standing[tail_layer]
- if(tail_overlay && tail_overlay.icon_state == t_state)
- return //let the existing animation finish
+ // Simplify our offset maths
+ var/list/offsets = get_tail_offsets(socksuit, tailtype)
+ var/total_off_x = offsets[1]
+ var/total_off_y = offsets[2]
- tail_overlay = set_tail_state(t_state) // Calls remove_layer & apply_layer
- if(tail_overlay)
- spawn(20)
- //check that the animation hasn't changed in the meantime
- if(overlays_standing[tail_layer] == tail_overlay && tail_overlay.icon_state == t_state)
- animate_tail_stop()
+ // Fallback in case target_layer wasn't passed by the parent proc
+ if(!target_layer)
+ target_layer = get_tail_layer()
+ if(!target_layer)
+ target_layer = tail_layering
-/mob/living/carbon/human/proc/animate_tail_start()
- if(QDESTROYING(src))
- return
+ var/image/tail_img = image(tailoverlays)
+ tail_img.layer = target_layer
+ tail_img.pixel_x = total_off_x
+ tail_img.pixel_y = total_off_y
- set_tail_state("[species.get_tail(src)]_slow[rand(0,9)]")
+ // Get our tailsock ready
+ var/has_sock = FALSE
+ var/icon/sock_icon = null
+ var/sock_state = null
-/mob/living/carbon/human/proc/animate_tail_fast()
- if(QDESTROYING(src))
- return
+ if(socksuit && socksuit.requires_tailsock && socksuit.tailsock_toggle && tailtype)
+ has_sock = TRUE
+ sock_icon = tailtype.tailsock_icon ? tailtype.tailsock_icon : socksuit.icon
- set_tail_state("[species.get_tail(src)]_loop[rand(0,9)]")
+ if(wagging && tailtype.tailsock_wagicon)
+ sock_state = tailtype.tailsock_wagicon
+ else if(tailtype.tailsock_iconstate)
+ sock_state = tailtype.tailsock_iconstate
+ else if(socksuit.item_state)
+ sock_state = socksuit.item_state
+
+ var/image/upper_sock_img = null
+
+ //whack on our lower layer directional tailsock, if needed
+ if(has_sock && sock_icon && sock_state)
+ upper_sock_img = image(icon = sock_icon, icon_state = sock_state)
+ upper_sock_img.alpha = socksuit.alpha
+ if(socksuit.tailsock_color)
+ upper_sock_img.color = socksuit.tailsock_color
+
+ if(target_layer != TAIL_LOWER_LAYER)
+ var/mutable_appearance/sock_overlay = mutable_appearance(sock_icon, sock_state)
+ if(socksuit.tailsock_color)
+ sock_overlay.color = socksuit.tailsock_color
+ //allow sneaky suits to have sneaky suit socks too
+ sock_overlay.alpha = socksuit.alpha
+ sock_overlay.layer = FLOAT_LAYER + 0.1
+ tail_img.overlays += sock_overlay
+
+ //we don't need a sock, so let's make a fake tail to appear on top of our clothes because that looks nicer
+ //We basically have every sock given their markings at this point. If your tail shows, it has its markings too.
+ else if(tailtype)
+ //just in case we have a null tailsock_icon somehow
+ var/icon/sock_mark_icon = tailtype.tailsock_icon ? tailtype.tailsock_icon : tailtype.icon
+ // If we don't need a sock, and we're not worrying about coloring (snowflake)
+ if(!tail_style.do_colouration)
+ var/n_state = (wagging && tailtype.ani_state) ? tailtype.ani_state : tailtype.icon_state
+ //we'll just get our default as our bonus layer
+ upper_sock_img = image(icon = tailtype.icon, icon_state = n_state)
+ // Generate the snipped base tail using the dedicated tailsock icon states instead of the full body state
+ else
+ var/n_state = (wagging && tailtype.tailsock_wagicon) ? tailtype.tailsock_wagicon : tailtype.tailsock_iconstate
+ upper_sock_img = image(icon = sock_mark_icon, icon_state = n_state)
+ var/mutable_appearance/base_north = mutable_appearance(sock_mark_icon, n_state)
+ if(tailtype.do_colouration)
+ base_north.color = rgb(r_tail, g_tail, b_tail)
+ upper_sock_img.overlays += base_north
+
+ // Attach secondary markings if present
+ if(tailtype.tailsock_markings)
+ var/m1_nstate = (wagging) ? tailtype.tailsock_wagmarkings : tailtype.tailsock_markings
+ var/mutable_appearance/m1_north = mutable_appearance(sock_mark_icon, m1_nstate)
+ m1_north.color = rgb(r_tail2, g_tail2, b_tail2)
+ m1_north.layer = FLOAT_LAYER + 0.01
+ upper_sock_img.overlays += m1_north
+
+ if(tailtype.tailsock_markings2)
+ var/m2_nstate = (wagging) ? tailtype.tailsock_wagmarkings2 : tailtype.tailsock_markings2
+ var/mutable_appearance/m2_north = mutable_appearance(sock_mark_icon, m2_nstate)
+ m2_north.color = rgb(r_tail3, g_tail3, b_tail3)
+ m2_north.layer = FLOAT_LAYER + 0.02
+ upper_sock_img.overlays += m2_north
+
+ //voodoo protection of butt theft
+ if(apply_to_mob)
+ //paste normal tail on their intended level
+ overlays_standing[target_layer] = tail_img
+ apply_layer(target_layer)
+
+ // apply our taur sock to its correct layer, voodoo is south only so should be fine... right?? Right byond?????
+ if(upper_sock_img)
+ //backpacks render over everything north face unless this is specifically set higher on the image.layer - even if it's in the higher index....
+ //have I mentioned how much I hate this system??
+ upper_sock_img.layer = TAIL_UPPER_LAYER_HIGH
+ upper_sock_img.pixel_x = total_off_x
+ upper_sock_img.pixel_y = total_off_y
+ overlays_standing[TAIL_UPPER_LAYER_HIGH] = upper_sock_img
+ apply_layer(TAIL_UPPER_LAYER_HIGH)
+
+ return tail_img
/mob/living/carbon/human/proc/animate_tail_reset()
- if(QDESTROYING(src))
+ if(QDESTROYING(src) || !tail_style)
return
- if(stat != DEAD)
- set_tail_state("[species.get_tail(src)]_idle[rand(0,9)]")
+ if(stat == DEAD)
+ set_tail_state(tail_style.icon_state)
+ toggle_tail(FALSE) // Stop wagging on death
else
- set_tail_state("[species.get_tail(src)]_static")
- toggle_tail(FALSE) //So tails stop when someone dies. TODO - Fix this hack ~Leshana
+ // Resets tail state based on current wagging flag
+ set_tail_state(wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state)
+
+/mob/living/carbon/human/proc/animate_tail_start()
+ if(QDESTROYING(src) || !tail_style)
+ return
+
+ toggle_tail(TRUE)
+ if(tail_style.ani_state)
+ set_tail_state(tail_style.ani_state)
/mob/living/carbon/human/proc/animate_tail_stop()
+ if(QDESTROYING(src) || !tail_style)
+ return
+
+ toggle_tail(FALSE)
+ set_tail_state(tail_style.icon_state)
+
+/mob/living/carbon/human/proc/update_vore_belly_sprite()
if(QDESTROYING(src))
return
- set_tail_state("[species.get_tail(src)]_static")
+ remove_layer(VORE_BELLY_LAYER)
+
+ var/image/vore_belly_image = get_vore_belly_image()
+ if(vore_belly_image)
+ vore_belly_image.layer = BODY_LAYER+VORE_BELLY_LAYER
+ overlays_standing[VORE_BELLY_LAYER] = vore_belly_image
+ vore_belly_image.plane = PLANE_CH_STOMACH //This one line of code. This ONE LINE OF CODE TOOK 6 HOURS TO FIGURE OUT. THANK YOU REDCAT.
+ vore_belly_image.appearance_flags = appearance_flags
+
+ apply_layer(VORE_BELLY_LAYER)
+
+/mob/living/carbon/human/proc/get_vore_belly_image()
+ if(!(wear_suit && wear_suit.flags_inv & HIDETAIL))
+ var/vs_fullness = vore_fullness_ex["stomach"]
+ var/icon/vorebelly_s = new/icon(icon = 'icons/mob/vore/Bellies.dmi', icon_state = "[species.vore_belly_default_variant]Belly[vs_fullness][struggle_anim_stomach ? "" : " idle"]")
+ vorebelly_s.Blend(vore_sprite_color["stomach"], vore_sprite_multiply["stomach"] ? ICON_MULTIPLY : ICON_ADD)
+ var/image/working = image(vorebelly_s)
+ working.overlays += em_block_image_generic(working)
+ return working
+ return null
+
+/mob/living/carbon/human/proc/vore_belly_animation()
+ if(!struggle_anim_stomach)
+ struggle_anim_stomach = TRUE
+ update_vore_belly_sprite()
+ spawn(1.2 SECONDS)
+ struggle_anim_stomach = FALSE
+ update_vore_belly_sprite()
+
+/mob/living/carbon/human/proc/update_vore_tail_sprite()
+ if(QDESTROYING(src))
+ return
+
+ remove_layer(VORE_TAIL_LAYER)
+ var/image/vore_tail_image = get_vore_tail_image()
+ if(vore_tail_image)
+ vore_tail_image.layer = BODY_LAYER + VORE_TAIL_LAYER
+ // This one line of code. THIS ONE LINE OF CODE TOOK 6 HOURS TO FIGURE OUT. THANK YOU REDCAT.
+ vore_tail_image.plane = PLANE_CH_STOMACH
+ vore_tail_image.appearance_flags = appearance_flags
+ overlays_standing[VORE_TAIL_LAYER] = vore_tail_image
+ apply_layer(VORE_TAIL_LAYER)
+
+/mob/living/carbon/human/proc/get_vore_tail_image()
+ if(!tail_style || !istaurtail(tail_style) || !tail_style.vore_tail_sprite_variant)
+ return null
+
+ var/vs_fullness = vore_fullness_ex["taur belly"]
+ var/loaf_alt = lying && tail_style.belly_variant_when_loaf
+ var/fullness_icons = min(tail_style.fullness_icons, vs_fullness)
+ var/target_state = "Taur[tail_style.vore_tail_sprite_variant]-Belly-[fullness_icons][loaf_alt ? " loaf" : (struggle_anim_taur ? "" : " idle")]"
+ //optimizing this with mutable_appearance, since it includes support for animations!
+ var/mutable_appearance/vorebelly_ma = mutable_appearance(tail_style.bellies_icon_path, target_state)
+ var/obj/item/clothing/suit/sockable = wear_suit
+ //scootchin' on by here to tailsock the tummy since it's important.
+ if(sockable && sockable.tailsock_toggle && sockable.tailsock_color)
+ vorebelly_ma.color = sockable.tailsock_color
+ else
+ var/base_color = vore_sprite_color["taur belly"]
+ vorebelly_ma.color = base_color
+
+ var/image/working = image(vorebelly_ma)
+ working.pixel_x = -16
+
+ if(tail_style.em_block) // Let 'em glow still
+ working.overlays += em_block_image_generic(working)
+
+ return working
+
+/mob/living/carbon/human/proc/vore_tail_animation()
+ if(tail_style.struggle_anim && !struggle_anim_taur)
+ struggle_anim_taur = TRUE
+ update_vore_tail_sprite()
+ spawn(12)
+ // Prevent runtimes if the mob is destroyed while the animation timer was ticking
+ if(!src || QDESTROYING(src))
+ return
+ struggle_anim_taur = FALSE
+ update_vore_tail_sprite()
/mob/living/carbon/human/proc/update_wing_showing()
if(QDESTROYING(src))
@@ -1133,18 +1398,70 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
var/image/wing_image = get_wing_image(FALSE)
+ // Fetch wear_suit and check for tailsock coloration, because it makes sense to.
+ var/obj/item/clothing/suit/socksuit = wear_suit
+ var/wing_color = (istype(socksuit) && socksuit.requires_tailsock && socksuit.tailsock_toggle && socksuit.tailsock_color) ? socksuit.tailsock_color : null
+
if(wing_image)
- wing_image.layer = BODY_LAYER+WING_LAYER
+ wing_image.layer = BODY_LAYER + WING_LAYER
+ if(wing_color)
+ wing_image.color = wing_color
overlays_standing[WING_LAYER] = wing_image
+
if(wing_style && wing_style.multi_dir)
wing_image = get_wing_image(TRUE)
if(wing_image)
- wing_image.layer = BODY_LAYER+WING_LOWER_LAYER
+ wing_image.layer = BODY_LAYER + WING_LOWER_LAYER
+ if(wing_color)
+ wing_image.color = wing_color
overlays_standing[WING_LOWER_LAYER] = wing_image
apply_layer(WING_LAYER)
apply_layer(WING_LOWER_LAYER)
+/mob/living/carbon/human/proc/get_wing_image(under_layer)
+ if(QDESTROYING(src))
+ return
+
+ //If you are FBP with wing style and didn't set a custom one
+ if(synthetic && synthetic.includes_wing && !wing_style && !wings_hidden)
+ var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing?
+ wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
+ var/image/working = image(wing_s)
+ working.overlays += em_block_image_generic(working) // Leaving this as overlays +=
+ return working
+
+ //If you have custom wings selected
+ if(wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL) && !wings_hidden)
+ var/wing_state = (flapping && wing_style.ani_state) ? wing_style.ani_state : wing_style.icon_state
+ if(wing_style.multi_dir)
+ wing_state += "_[under_layer ? "back" : "front"]"
+ var/icon/wing_s = new/icon("icon" = wing_style.icon, "icon_state" = wing_state)
+ if(wing_style.do_colouration)
+ wing_s.Blend(rgb(src.r_wing, src.g_wing, src.b_wing), wing_style.color_blend_mode)
+ if(wing_style.extra_overlay)
+ var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay)
+ overlay.Blend(rgb(src.r_wing2, src.g_wing2, src.b_wing2), wing_style.color_blend_mode)
+ wing_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+ if(wing_style.extra_overlay2)
+ var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2)
+ if(wing_style.ani_state)
+ overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2_w)
+ overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode)
+ wing_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+ else
+ overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode)
+ wing_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+ var/image/working = image(wing_s)
+ working.alpha = src.a_wing
+ if(wing_style.em_block)
+ working.overlays += em_block_image_generic(working) // Leaving this as overlays +=
+ working.pixel_x -= wing_style.wing_offset
+ return working
+
/mob/living/carbon/human/update_modifier_visuals()
if(QDESTROYING(src))
return
@@ -1220,49 +1537,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
overlays_standing[SURGERY_LAYER] = total
apply_layer(SURGERY_LAYER)
-/mob/living/carbon/human/proc/get_wing_image(under_layer)
- if(QDESTROYING(src))
- return
-
- //If you are FBP with wing style and didn't set a custom one
- if(synthetic && synthetic.includes_wing && !wing_style && !wings_hidden)
- var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing?
- wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
- var/image/working = image(wing_s)
- working.overlays += em_block_image_generic(working) // Leaving this as overlays +=
- return working
-
- //If you have custom wings selected
- if(wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL) && !wings_hidden)
- var/wing_state = (flapping && wing_style.ani_state) ? wing_style.ani_state : wing_style.icon_state
- if(wing_style.multi_dir)
- wing_state += "_[under_layer ? "back" : "front"]"
- var/icon/wing_s = new/icon("icon" = wing_style.icon, "icon_state" = wing_state)
- if(wing_style.do_colouration)
- wing_s.Blend(rgb(src.r_wing, src.g_wing, src.b_wing), wing_style.color_blend_mode)
- if(wing_style.extra_overlay)
- var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay)
- overlay.Blend(rgb(src.r_wing2, src.g_wing2, src.b_wing2), wing_style.color_blend_mode)
- wing_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- if(wing_style.extra_overlay2)
- var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2)
- if(wing_style.ani_state)
- overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2_w)
- overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode)
- wing_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- else
- overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode)
- wing_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- var/image/working = image(wing_s)
- working.alpha = src.a_wing
- if(wing_style.em_block)
- working.overlays += em_block_image_generic(working) // Leaving this as overlays +=
- working.pixel_x -= wing_style.wing_offset
- return working
-
/mob/living/carbon/human/proc/get_ears_overlay()
//If you are FBP with ear style and didn't set a custom one
var/datum/robolimb/model = isSynthetic()
@@ -1319,145 +1593,6 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
return rendered
-/mob/living/carbon/human/proc/get_tail_image()
- //If you are FBP with tail style and didn't set a custom one
- var/datum/robolimb/model = isSynthetic()
- if(istype(model) && model.includes_tail && !tail_style && !tail_hidden)
- var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail")
- tail_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD)
- return image(tail_s)
-
- //If you have a custom tail selected
- if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !istaurtail(tail_style)) && !tail_hidden)
- var/icon/tail_s = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = (wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state))
- if(tail_style.can_loaf && !is_shifted)
- pixel_y = (resting) ? -tail_style.loaf_offset*size_multiplier : default_pixel_y //move player down, then taur up, to fit the overlays correctly. Taur Loafing
- if(tail_style.do_colouration)
- tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode)
- if(tail_style.extra_overlay)
- var/icon/overlay = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay)
- if(wagging && tail_style.ani_state)
- overlay = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay_w)
- overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
- tail_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- else
- overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
- tail_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
-
- if(tail_style.extra_overlay2)
- var/icon/overlay = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2)
- if(wagging && tail_style.ani_state)
- overlay = new/icon("icon" = (tail_style.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2_w)
- overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode)
- tail_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
- else
- overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode)
- tail_s.Blend(overlay, ICON_OVERLAY)
- qdel(overlay)
-
- var/image/working = image(tail_s)
- if(tail_style.em_block)
- working.overlays += em_block_image_generic(working) // Leaving this as overlays +=
-
- if(istaurtail(tail_style))
- var/datum/sprite_accessory/tail/taur/taurtype = tail_style
- working.pixel_x = tail_style.offset_x
- working.pixel_y = tail_style.offset_y
- if(taurtype.can_ride && !riding_datum)
- riding_datum = new /datum/riding/taur(src)
- add_verb(src, /mob/living/carbon/human/proc/taur_mount)
- add_verb(src, /mob/living/proc/toggle_rider_reins)
- else if(islongtail(tail_style))
- working.pixel_x = tail_style.offset_x
- working.pixel_y = tail_style.offset_y
- working.alpha = src.a_tail
- return working
- return null
-
-// TODO - Move this to where it should go ~Leshana
-/mob/living/proc/stop_flying()
- if(QDESTROYING(src))
- return
- flying = FALSE
- return 1
-
-/mob/living/carbon/human/stop_flying()
- if((. = ..()))
- update_wing_showing()
-
-/mob/living/carbon/human/proc/update_vore_belly_sprite()
- if(QDESTROYING(src))
- return
-
- remove_layer(VORE_BELLY_LAYER)
-
- var/image/vore_belly_image = get_vore_belly_image()
- if(vore_belly_image)
- vore_belly_image.layer = BODY_LAYER+VORE_BELLY_LAYER
- overlays_standing[VORE_BELLY_LAYER] = vore_belly_image
- vore_belly_image.plane = PLANE_CH_STOMACH //This one line of code. This ONE LINE OF CODE TOOK 6 HOURS TO FIGURE OUT. THANK YOU REDCAT.
- vore_belly_image.appearance_flags = appearance_flags
-
- apply_layer(VORE_BELLY_LAYER)
-
-/mob/living/carbon/human/proc/get_vore_belly_image()
- if(!(wear_suit && wear_suit.flags_inv & HIDETAIL))
- var/vs_fullness = vore_fullness_ex["stomach"]
- var/icon/vorebelly_s = new/icon(icon = 'icons/mob/vore/Bellies.dmi', icon_state = "[species.vore_belly_default_variant]Belly[vs_fullness][struggle_anim_stomach ? "" : " idle"]")
- vorebelly_s.Blend(vore_sprite_color["stomach"], vore_sprite_multiply["stomach"] ? ICON_MULTIPLY : ICON_ADD)
- var/image/working = image(vorebelly_s)
- working.overlays += em_block_image_generic(working)
- return working
- return null
-
-/mob/living/carbon/human/proc/vore_belly_animation()
- if(!struggle_anim_stomach)
- struggle_anim_stomach = TRUE
- update_vore_belly_sprite()
- spawn(12)
- struggle_anim_stomach = FALSE
- update_vore_belly_sprite()
-
-/mob/living/carbon/human/proc/update_vore_tail_sprite()
- if(QDESTROYING(src))
- return
-
- remove_layer(VORE_TAIL_LAYER)
-
- var/image/vore_tail_image = get_vore_tail_image()
- if(vore_tail_image)
- vore_tail_image.layer = BODY_LAYER+VORE_TAIL_LAYER
- overlays_standing[VORE_TAIL_LAYER] = vore_tail_image
- vore_tail_image.plane = PLANE_CH_STOMACH //This one line of code. This ONE LINE OF CODE TOOK 6 HOURS TO FIGURE OUT. THANK YOU REDCAT.
- vore_tail_image.appearance_flags = appearance_flags
-
- apply_layer(VORE_TAIL_LAYER)
-
-/mob/living/carbon/human/proc/get_vore_tail_image()
- if(tail_style && istaurtail(tail_style) && tail_style.vore_tail_sprite_variant)
- var/vs_fullness = vore_fullness_ex["taur belly"]
- var/loaf_alt = lying && tail_style.belly_variant_when_loaf
- var/fullness_icons = min(tail_style.fullness_icons, vs_fullness)
- var/icon/vorebelly_s = new/icon(icon = tail_style.bellies_icon_path, icon_state = "Taur[tail_style.vore_tail_sprite_variant]-Belly-[fullness_icons][loaf_alt ? " loaf" : (struggle_anim_taur ? "" : " idle")]")
- vorebelly_s.Blend(vore_sprite_color["taur belly"], vore_sprite_multiply["taur belly"] ? ICON_MULTIPLY : ICON_ADD)
- var/image/working = image(vorebelly_s)
- working.pixel_x = -16
- if(tail_style.em_block)
- working.overlays += em_block_image_generic(working)
- return working
- return null
-
-/mob/living/carbon/human/proc/vore_tail_animation()
- if(tail_style.struggle_anim && !struggle_anim_taur)
- struggle_anim_taur = TRUE
- update_vore_tail_sprite()
- spawn(12)
- struggle_anim_taur = FALSE
- update_vore_tail_sprite()
-
/mob/living/carbon/human/proc/GetAppearanceFromPrefs(flavourtext, oocnotes)
/* Jank code that effectively creates the client's mob from save, then copies its appearance to our current mob.
Intended to be used with shapeshifter species so we don't reset their organs in doing so.*/
diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm
index 95211856e8d..213b9ff50e8 100644
--- a/code/modules/mob/living/living_vr.dm
+++ b/code/modules/mob/living/living_vr.dm
@@ -1,8 +1,14 @@
/mob/living/Check_Shoegrip()
if(flying)
- return 1
+ return TRUE
..()
+/mob/living/proc/stop_flying()
+ if(QDESTROYING(src))
+ return
+ flying = FALSE
+ return TRUE
+
/mob/living/verb/customsay()
set category = "IC.Settings"
set name = "Customize Speech Verbs"
diff --git a/code/modules/mob/new_player/sprite_accessories_wing.dm b/code/modules/mob/new_player/sprite_accessories_wing.dm
index 2f4ab2efbac..a5a81324ae0 100644
--- a/code/modules/mob/new_player/sprite_accessories_wing.dm
+++ b/code/modules/mob/new_player/sprite_accessories_wing.dm
@@ -14,7 +14,7 @@
em_block = TRUE
var/extra_overlay // Icon state of an additional overlay to blend in.
var/extra_overlay2 //Tertiary.
- 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/clothing_can_hide = TRUE // 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 = DEVELOPER_WARNING_NAME
var/ani_state // State when flapping/animated
diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/tails/old_tail_accessories.dm
similarity index 99%
rename from code/modules/mob/new_player/sprite_accessories_tail.dm
rename to code/modules/mob/new_player/tails/old_tail_accessories.dm
index 9a496f03fe5..67800c9f7b4 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail.dm
+++ b/code/modules/mob/new_player/tails/old_tail_accessories.dm
@@ -1,10 +1,10 @@
/*
////////////////////////////
/ =--------------------= /
-/ == Tail Definitions == /
-/ =--------------------= /
+/ =OLD Tail Definitions= /
+/ =-FOR REFERENCE ONLY-= /
////////////////////////////
-*/
+
/datum/sprite_accessory/tail
name = DEVELOPER_WARNING_NAME
icon = 'icons/mob/human_races/sprite_accessories/tails.dmi'
@@ -33,7 +33,7 @@
///ADDITIONALLY, IF YOU ADD A SPECIAL VWAG, YOU NEED TO INCLUDE ani_state, extra_overlay_w, and extra_overlay2_w INTO icon_loaf TOO!
var/can_loaf = FALSE
var/loaf_offset = 0
- var/list/lower_layer_dirs = list(SOUTH, WEST, EAST)
+ var/list/lower_layer_dirs = LOWER_TAIL_DIRS
var/icon_loaf = null
// Taur Vore
@@ -281,6 +281,7 @@
name = "xenomorph tail 2"
desc = ""
icon_state = "xenotail"
+ do_colouration = FALSE
/datum/sprite_accessory/tail/eboop
name = "EGN mech tail (dual color)"
@@ -825,6 +826,7 @@
name = "Zeng-Hu Tajaran Synth tail"
desc = ""
icon_state = "zenghu_taj"
+ do_colouration = FALSE
//Taurs moved to a separate file due to extra code around them
@@ -1982,4 +1984,4 @@
do_colouration = TRUE
color_blend_mode = ICON_MULTIPLY
extra_overlay = "chu_markings"
- extra_overlay2 = "chu_tipmarkings"
+ extra_overlay2 = "chu_tipmarkings"*/
diff --git a/code/modules/mob/new_player/tails/sprite_accessories_tail.dm b/code/modules/mob/new_player/tails/sprite_accessories_tail.dm
index e7e411d5046..35ab52019ae 100644
--- a/code/modules/mob/new_player/tails/sprite_accessories_tail.dm
+++ b/code/modules/mob/new_player/tails/sprite_accessories_tail.dm
@@ -8,7 +8,6 @@
/datum/sprite_accessory/tail
name = DEVELOPER_WARNING_NAME
var/desc = DEVELOPER_WARNING_NAME
-// icon = 'icons/mob/human_races/sprite_accessories/tails.dmi'
do_colouration = TRUE //Set to FALSE to disable coloration using the tail color.
/// Only appliciable if do_coloration = TRUE, ICON_MULTIPLY is a white bias, ICON_ADD is a black bias for colorations of sprites.
/// Virtually all sprites now are white-biased greyscale. The ones that aren't are pre-colored, typically donator snowflake.
@@ -34,7 +33,7 @@
///ADDITIONALLY, IF YOU ADD A SPECIAL VWAG, YOU NEED TO INCLUDE ani_state, extra_overlay_w, and extra_overlay2_w INTO icon_loaf TOO!
var/can_loaf = FALSE
var/loaf_offset = 0
- var/list/lower_layer_dirs = list(SOUTH, WEST, EAST)
+ var/list/lower_layer_dirs = LOWER_TAIL_DIRS
var/icon_loaf = null
// Taur Vore
@@ -44,10 +43,42 @@
var/struggle_anim = FALSE
var/bellies_icon_path = 'icons/mob/vore/Taur_Bellies.dmi'
+ // Tail Socks
+ /// This can usually be the default icon, since the base icon is a complete unit.
+ /// Taur tails are snipped off to account for the butt positioning being easier to deal with.
+ var/tailsock_icon
+ var/tailsock_iconstate
+ /// Same for wag states, we just need the sprite itself, not any of the custom overlays
+ /// Fat Taur additions are just the belly variant, we layer this one before the vore one to account for that too.
+ var/tailsock_wagicon
+ // Vore belly overlays are handled in update_icons, because we just overlay the tummy colored to the tailsock if we're wearing a suit and it has a sock enabled.
+ // For north facing taur tails, using the sock + whatever tail related markings are visible when not in a sock but need to be drawn higher up.
+ // These are set to "none" to prevent null icon state issues
+ var/tailsock_markings = "none"
+ var/tailsock_markings2 = "none"
+ var/tailsock_wagmarkings = "none"
+ var/tailsock_wagmarkings2 = "none"
+
/datum/sprite_accessory/tail/New()
. = ..()
if(clip_mask_state)
clip_mask = icon(icon = (clip_mask_icon ? clip_mask_icon : icon), icon_state = clip_mask_state)
+ //because the compiler doesn't like this being preset I guess whatever loser.
+ if(!tailsock_icon)
+ tailsock_icon = initial(icon)
+ if(!tailsock_iconstate)
+ tailsock_iconstate = initial(icon_state)
+ if(!tailsock_wagicon)
+ tailsock_wagicon = initial(ani_state)
+ //use the same naming conventions, these are for north face stuff. follows the icon file anyway, so tail_whatever, tail_sock
+ if(extra_overlay)
+ tailsock_markings = extra_overlay
+ if(extra_overlay2)
+ tailsock_markings2 = extra_overlay2
+ if(extra_overlay_w)
+ tailsock_wagmarkings = extra_overlay_w
+ if(extra_overlay2_w)
+ tailsock_wagmarkings2 = extra_overlay2_w
// Default invis tail
/datum/sprite_accessory/tail/invisible
diff --git a/code/modules/mob/new_player/tails/tails_animal.dm b/code/modules/mob/new_player/tails/tails_animal.dm
index c138e337aec..d3b7c90674e 100644
--- a/code/modules/mob/new_player/tails/tails_animal.dm
+++ b/code/modules/mob/new_player/tails/tails_animal.dm
@@ -88,12 +88,21 @@
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_animal.dmi'
icon_state = "wagtail"
+/datum/sprite_accessory/tail/peacocktail //it's been a long enough while, I'm gunna go ahead and just...
+ name = "Peacock tail, colorable (vwag)"
+ icon = 'icons/mob/human_races/sprite_accessories/tails/tails_animal.dmi'
+ icon_state = "peacocktail"
+ ani_state = "peacocktail_w"
+ do_colouration = TRUE
+
/datum/sprite_accessory/tail/ketrai_wag
name = "fennix tail (vwag)"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_animal.dmi'
icon_state = "ketraitail"
ani_state = "ketraitail_w"
do_colouration = FALSE
+ tailsock_iconstate = "ketraitail_sock"
+ tailsock_wagicon = "ketraitail_w_sock"
/datum/sprite_accessory/tail/ketrainew_wag
name = "new fennix tail (vwag)"
@@ -101,6 +110,8 @@
icon_state = "ketraitailnew"
ani_state = "ketraitailnew_w"
do_colouration = FALSE
+ tailsock_iconstate = "ketraitailnew_sock"
+ tailsock_wagicon = "ketraitailnew_w_sock"
/datum/sprite_accessory/tail/redpanda
name = "red panda"
@@ -234,6 +245,7 @@
name = "Kitsune 2 tails, colorable"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_animal.dmi'
icon_state = "doublekitsune"
+ extra_overlay = "doublekitsune-tips"
/datum/sprite_accessory/tail/doublekitsunealt
name = "Kitsune 2 tails, colorable, alt"
@@ -331,6 +343,7 @@
name = "turkey"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_animal.dmi'
icon_state = "turkey"
+ do_colouration = FALSE
/datum/sprite_accessory/tail/shark_markings
name = "akula tail, colorable, tail and fins"
@@ -392,6 +405,7 @@
name = "Raccoon gray tail"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_animal.dmi'
icon_state = "raccoon_tail"
+ tailsock_iconstate = "raccoon_tail_sock"
do_colouration = FALSE
/datum/sprite_accessory/tail/striped_tail
diff --git a/code/modules/mob/new_player/tails/tails_bug.dm b/code/modules/mob/new_player/tails/tails_bug.dm
index 2597826bbbe..d4a8e83c177 100644
--- a/code/modules/mob/new_player/tails/tails_bug.dm
+++ b/code/modules/mob/new_player/tails/tails_bug.dm
@@ -3,6 +3,7 @@
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_bug.dmi'
icon_state = "beethorax"
do_colouration = FALSE
+ tailsock_iconstate = "beethorax_sock"
/datum/sprite_accessory/tail/buggo
name = "Bug abdomen, colorable"
diff --git a/code/modules/mob/new_player/tails/tails_exotic.dm b/code/modules/mob/new_player/tails/tails_exotic.dm
index cc890c29208..0bc0029f582 100644
--- a/code/modules/mob/new_player/tails/tails_exotic.dm
+++ b/code/modules/mob/new_player/tails/tails_exotic.dm
@@ -13,13 +13,13 @@
/datum/sprite_accessory/tail/nevreanwagdc
name = "nevrean wagtail, dual-color"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_exotic.dmi'
- icon_state = "wagtail"
+ icon_state = "nevreanwagtail"
extra_overlay = "wagtail_dc_tail"
/datum/sprite_accessory/tail/nevreanwagdc_alt
name = "nevrean wagtail, marked, dual-color"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_exotic.dmi'
- icon_state = "wagtail2_dc"
+ icon_state = "nevreanwagtail2_dc"
extra_overlay = "wagtail2_dc_mark"
/datum/sprite_accessory/tail/spade_color
@@ -38,11 +38,14 @@
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_exotic.dmi'
icon_state = "snag"
do_colouration = FALSE
+ tailsock_iconstate = "snag_sock"
/datum/sprite_accessory/tail/xenotail
name = "xenomorph tail 2"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_exotic.dmi'
icon_state = "xenotail"
+ do_colouration = FALSE
+ tailsock_iconstate = "xenotail_sock"
/datum/sprite_accessory/tail/xenotail_fullcolour
name = "xenomorph tail (fully colourable)"
@@ -94,12 +97,15 @@
name = "tailmaw, colorable"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_exotic.dmi'
icon_state = "tailmaw"
+ tailsock_iconstate = "tailmaw_sock"
/datum/sprite_accessory/tail/newtailmaw
name = "new tailmaw (vwag)"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_exotic.dmi'
icon_state = "newtailmaw"
+ tailsock_iconstate = "tailmaw_sock"
ani_state = "newtailmaw_w"
+ tailsock_wagicon = "tailmaw_w_sock"
/datum/sprite_accessory/tail/shadekin_short
name = "Shadekin Short Tail, colorable"
diff --git a/code/modules/mob/new_player/tails/tails_long.dm b/code/modules/mob/new_player/tails/tails_long.dm
index 6c72ce72955..56c70365a28 100644
--- a/code/modules/mob/new_player/tails/tails_long.dm
+++ b/code/modules/mob/new_player/tails/tails_long.dm
@@ -104,14 +104,12 @@
/datum/sprite_accessory/tail/longtail/flagtail
name = "Flagtail"
- icon = 'icons/rogue-star/tails_64x32_rs.dmi'
icon_state = "flagtail"
extra_overlay = "flagtail-1"
extra_overlay2 = "flagtail-2"
/datum/sprite_accessory/tail/longtail/chonksqrl
name = "Squirrel (Big)"
- icon = 'icons/rogue-star/tails_64x32_rs.dmi'
icon_state = "chonksqrl"
extra_overlay = "chonksqrl-m1"
extra_overlay2 = "chonksqrl-m2"
diff --git a/code/modules/mob/new_player/tails/tails_reptile.dm b/code/modules/mob/new_player/tails/tails_reptile.dm
index 4a583dea903..8c2260cf0b0 100644
--- a/code/modules/mob/new_player/tails/tails_reptile.dm
+++ b/code/modules/mob/new_player/tails/tails_reptile.dm
@@ -24,36 +24,28 @@
icon_state = "bigsnaketail"
ani_state = "bigsnaketail_w"
-/datum/sprite_accessory/tail/bigsnaketailstripes
+/datum/sprite_accessory/tail/bigsnaketail/stripes
name = "large snake tail, striped (vwag)"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_reptile.dmi'
- icon_state = "bigsnaketailstripes"
extra_overlay = "bigsnaketailstripes-tips"
- ani_state = "bigsnaketailstripes_w"
extra_overlay_w = "bigsnaketailstripes-tips_w"
-/datum/sprite_accessory/tail/bigsnaketailstripes_alt
+/datum/sprite_accessory/tail/bigsnaketail/stripes_alt
name = "large snake tail, striped, alt (vwag)"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_reptile.dmi'
- icon_state = "bigsnaketailstripesalt"
extra_overlay = "bigsnaketailstripesalt-tips"
- ani_state = "bigsnaketailstripesalt_w"
extra_overlay_w = "bigsnaketailstripesalt-tips_w"
-/datum/sprite_accessory/tail/bigsnaketaildual
+/datum/sprite_accessory/tail/bigsnaketail/dual
name = "large snake tail, dual color (vwag)"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_reptile.dmi'
- icon_state = "bigsnaketaildual"
extra_overlay = "bigsnaketaildual-tips"
- ani_state = "bigsnaketaildual_w"
extra_overlay_w = "bigsnaketaildual-tips_w"
-/datum/sprite_accessory/tail/bigsnaketailunder
+/datum/sprite_accessory/tail/bigsnaketail/under
name = "large snake tail, under (vwag)"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_reptile.dmi'
- icon_state = "bigsnaketailunder"
extra_overlay = "bigsnaketailunder-tips"
- ani_state = "bigsnaketailunder_w"
extra_overlay_w = "bigsnaketailunder-tips_w"
/datum/sprite_accessory/tail/tail_smooth
@@ -62,11 +54,11 @@
icon_state = "tail_smooth"
ani_state = "tail_smooth_w"
-/datum/sprite_accessory/tail/tail_smooth_dual
+/datum/sprite_accessory/tail/tail_smooth/dual
name = "Smooth Lizard Tail, dual color"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_reptile.dmi'
- icon_state = "tail_smooth"
extra_overlay = "tail_smooth_markings"
+ extra_overlay_w = "tail_smooth_w_markings"
/datum/sprite_accessory/tail/Easterntail
name = "Eastern Dragon (Animated)"
@@ -112,6 +104,7 @@
name = "kururak tail"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_reptile.dmi'
icon_state = "kururak"
+ do_colouration = FALSE
/datum/sprite_accessory/tail/snaketail_stripes
name = "snake tail with stripes, dual-color"
diff --git a/code/modules/mob/new_player/tails/tails_snowflake.dm b/code/modules/mob/new_player/tails/tails_snowflake.dm
index ec68ac78ba8..9a13699db27 100644
--- a/code/modules/mob/new_player/tails/tails_snowflake.dm
+++ b/code/modules/mob/new_player/tails/tails_snowflake.dm
@@ -5,14 +5,8 @@
ani_state = "peacocktail_red_w"
ckeys_allowed = list("prettiebyrd")
do_colouration = FALSE
-
-/datum/sprite_accessory/tail/peacocktail //ditto
- name = "Peacock tail, colorable (vwag)"
- icon = 'icons/mob/human_races/sprite_accessories/tails/tails_snowflake.dmi'
- icon_state = "peacocktail"
- ani_state = "peacocktail_w"
- do_colouration = FALSE
- ckeys_allowed = list("prettiebyrd")
+ tailsock_iconstate = "peacocktail_red_sock"
+ tailsock_wagicon = "peacocktail_red_w_sock"
/datum/sprite_accessory/tail/perrin_tentacles
name = "octopus tentacles"
@@ -20,6 +14,7 @@
icon_state = "perrintentacles"
ckeys_allowed = list("codeme", "siennaathens")
do_colouration = FALSE
+ tailsock_iconstate = "perrintentacles_sock"
/datum/sprite_accessory/tail/kara //SatinIsle fluff item
name = "Pterokara Tail"
@@ -27,6 +22,7 @@
icon_state = "kara_tail"
ckeys_allowed = list("satinisle")
do_colouration = FALSE
+ tailsock_iconstate = "kara_tail_sock"
/datum/sprite_accessory/tail/molenar_kitsune
name = "quintail kitsune tails (Molenar)"
@@ -34,6 +30,7 @@
icon_state = "molenar-kitsune"
ckeys_allowed = list("molenar")
do_colouration = FALSE
+ tailsock_iconstate = "molenar-kitsune_sock"
/datum/sprite_accessory/tail/miria_fluffdragon
name = "fluffdragon tail (Miria Masters)"
@@ -41,6 +38,7 @@
icon_state = "miria-fluffdragontail"
ckeys_allowed = list("miriamasters")
do_colouration = FALSE
+ tailsock_iconstate = "miria-fluffdragontail_sock"
/datum/sprite_accessory/tail/miria_kitsune
name = "Black kitsune tails (Miria Masters)"
@@ -48,6 +46,7 @@
icon_state = "miria-kitsunetail"
ckeys_allowed = list("miriamasters")
do_colouration = FALSE
+ tailsock_iconstate = "miria-kitsunetail_sock"
/datum/sprite_accessory/tail/molenar_deathclaw
name = "deathclaw bits (Molenar)"
@@ -55,6 +54,7 @@
icon_state = "molenar-deathclaw"
ckeys_allowed = list("molenar","silvertalismen","jertheace")
do_colouration = FALSE
+ tailsock_iconstate = "molenar-deathclaw_sock"
/datum/sprite_accessory/tail/runac
name = "fennecsune tails (Runac)"
@@ -62,6 +62,7 @@
icon_state = "runac"
ckeys_allowed = list("rebcom1807")
do_colouration = FALSE
+ tailsock_iconstate = "runac_sock"
/datum/sprite_accessory/tail/reika //Leaving this since it was too hard to split the wings from the tail.
name = "fox tail (+ beewings) (Reika)"
@@ -69,6 +70,7 @@
icon_state = "reika"
ckeys_allowed = list("rikaru19xjenkins")
do_colouration = FALSE
+ tailsock_iconstate = "reika_sock"
/datum/sprite_accessory/tail/rosey
name = "tritail kitsune tails (Rosey)"
@@ -76,6 +78,7 @@
icon_state = "rosey_three"
ckeys_allowed = list("joey4298")
do_colouration = FALSE
+ tailsock_iconstate = "rosey_three_sock"
/datum/sprite_accessory/tail/rosey2
name = "pentatail kitsune tails (Rosey)" //I predict seven tails next. ~CK
@@ -83,6 +86,15 @@
icon_state = "rosey_five"
do_colouration = FALSE
ckeys_allowed = list("joey4298")
+ tailsock_iconstate = "rosey_five_sock"
+
+/datum/sprite_accessory/tail/longtail/roiz_long_lizard
+ name = "Long Lizard Tail (Roiz Lizden)"
+ icon = 'icons/mob/human_races/sprite_accessories/tails/tails_long.dmi'
+ icon_state = "roiz_tail_s"
+ do_colouration = FALSE
+ ckeys_allowed = list("spoopylizz")
+ tailsock_iconstate = "roiz_tail_sock"
/datum/sprite_accessory/tail/scree
name = "green taj tail (Scree)"
@@ -90,6 +102,7 @@
icon_state = "scree"
ckeys_allowed = list("scree")
do_colouration = FALSE
+ tailsock_iconstate = "scree_sock"
/datum/sprite_accessory/tail/aronai
name = "aronai tail (Aronai)"
@@ -97,6 +110,7 @@
icon_state = "aronai"
ckeys_allowed = list("arokha")
do_colouration = FALSE
+ tailsock_iconstate = "aronai_sock"
/datum/sprite_accessory/tail/cabletail
name = "cabletail"
@@ -104,6 +118,7 @@
icon_state = "tuckercabletail"
ckeys_allowed = list("tucker0666")
do_colouration = FALSE
+ tailsock_iconstate = "tuckercabletail_sock"
/datum/sprite_accessory/tail/featherfluff_tail
name = "featherfluff_tail"
@@ -111,6 +126,7 @@
icon_state = "tuckerfeather_tail"
ckeys_allowed = list("tucker0666")
do_colouration = FALSE
+ tailsock_iconstate = "tuckerfeather_tail_sock"
/datum/sprite_accessory/tail/holly
name = "tigress tail (Holly)"
@@ -118,3 +134,4 @@
icon_state = "hoodootail"
ckeys_allowed = list("hoodoo")
do_colouration = FALSE
+ tailsock_iconstate = "hoodootail_sock"
diff --git a/code/modules/mob/new_player/tails/tails_synth.dm b/code/modules/mob/new_player/tails/tails_synth.dm
index bc415996b18..1ec6eae95b5 100644
--- a/code/modules/mob/new_player/tails/tails_synth.dm
+++ b/code/modules/mob/new_player/tails/tails_synth.dm
@@ -8,6 +8,7 @@
name = "Zeng-Hu Tajaran Synth tail"
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_synth.dmi'
icon_state = "zenghu_taj"
+ do_colouration = FALSE
/datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts
name = "Ward-Takahashi Tail"
diff --git a/code/modules/mob/new_player/tails/tails_teshari.dm b/code/modules/mob/new_player/tails/tails_teshari.dm
index f91700389de..96804dc4128 100644
--- a/code/modules/mob/new_player/tails/tails_teshari.dm
+++ b/code/modules/mob/new_player/tails/tails_teshari.dm
@@ -52,6 +52,7 @@
icon = 'icons/mob/human_races/sprite_accessories/tails/tails_teshari.dmi'
icon_state = "beethorax_tesh"
do_colouration = FALSE
+ tailsock_iconstate = "beethorax_tesh_sock"
/datum/sprite_accessory/tail/teshbuggo
name = "Teshari bug abdomen, colorable"
diff --git a/code/modules/mob/new_player/taur/not_taur_legs.dm b/code/modules/mob/new_player/taur/not_taur_legs.dm
index ec7838b3083..ab636977a68 100644
--- a/code/modules/mob/new_player/taur/not_taur_legs.dm
+++ b/code/modules/mob/new_player/taur/not_taur_legs.dm
@@ -27,7 +27,8 @@
clip_mask_icon = 'icons/mob/human_races/sprite_accessories/biglegs.dmi'
clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms.
-/datum/sprite_accessory/tail/taur/bigleggy
+//By making big leggy a subtype of longtail, it gets the offset but doesn't conflict with taur specific settings.
+/datum/sprite_accessory/tail/longtail/bigleggy
name = "Big Leggies"
icon = 'icons/mob/human_races/sprite_accessories/biglegs.dmi'
icon_state = "bigleggy"
@@ -36,46 +37,47 @@
fullness_icons = 3
ani_state = "bigleggy_stanced"
extra_overlay_w = "bigleggy_markings_stanced"
+ clip_mask_icon = 'icons/mob/human_races/sprite_accessories/biglegs.dmi'
clip_mask_state = "taur_clip_mask_def" //Leaving this here to make it clear it it's INTENTIONAL it shows above clothes. Use the marking if you want it to show UNDER clothes!
-/datum/sprite_accessory/tail/taur/bigleggy/canine
+/datum/sprite_accessory/tail/longtail/bigleggy/canine
name = "Big Leggies (Canine Tail)"
extra_overlay2 = "bigleggy_canine"
extra_overlay2_w = "bigleggy_canine"
-/datum/sprite_accessory/tail/taur/bigleggy/feline
+/datum/sprite_accessory/tail/longtail/bigleggy/feline
name = "Big Leggies (Feline Tail)"
extra_overlay2 = "bigleggy_feline"
extra_overlay2_w = "bigleggy_feline"
-/datum/sprite_accessory/tail/taur/bigleggy/reptile
+/datum/sprite_accessory/tail/longtail/bigleggy/reptile
name = "Big Leggies (Reptile Tail)"
extra_overlay2 = "bigleggy_reptile"
extra_overlay2_w = "bigleggy_reptile"
-/datum/sprite_accessory/tail/taur/bigleggy/snake
+/datum/sprite_accessory/tail/longtail/bigleggy/snake
name = "Big Leggies (Snake Tail)"
extra_overlay2 = "bigleggy_snake"
extra_overlay2_w = "bigleggy_snake"
-/datum/sprite_accessory/tail/taur/bigleggy/fox
+/datum/sprite_accessory/tail/longtail/bigleggy/fox
name = "Big Leggies (Fox Tail)"
extra_overlay2 = "bigleggy_vulpine"
extra_overlay2_w = "bigleggy_vulpine"
-/datum/sprite_accessory/tail/taur/bigleggy/bird
+/datum/sprite_accessory/tail/longtail/bigleggy/bird
name = "Big Leggies (Bird)"
extra_overlay = "bigleggy_m_bird"
extra_overlay2 = "bigleggy_bird"
extra_overlay_w = "bigleggy_m_bird_stanced"
extra_overlay2_w = "bigleggy_bird"
-/datum/sprite_accessory/tail/taur/bigleggy/plug
+/datum/sprite_accessory/tail/longtail/bigleggy/plug
name = "Big Leggies (Plug Tail)"
extra_overlay2 = "bigleggy_plug"
extra_overlay2_w = "bigleggy_plug"
-/datum/sprite_accessory/tail/taur/bigleggy/AlienSlug
+/datum/sprite_accessory/tail/longtail/bigleggy/AlienSlug
name = "Big Leggies (Alien Slug Tail)"
icon_state = "bigleggy_full_alienslug"
extra_overlay = "bigleggy_alienslug"
diff --git a/code/modules/mob/new_player/taur/sprite_accessories_taur.dm b/code/modules/mob/new_player/taur/sprite_accessories_taur.dm
index fad0baa2b9b..272ee18b0aa 100644
--- a/code/modules/mob/new_player/taur/sprite_accessories_taur.dm
+++ b/code/modules/mob/new_player/taur/sprite_accessories_taur.dm
@@ -6,11 +6,12 @@
var/can_ride = TRUE //whether we're real rideable taur or just in that category
offset_x = -16
em_block = TRUE
-
+ /// Suit sprites are stored in icons/inventory/suit/taursuits_[name]
var/icon/suit_sprites = null //File for suit sprites, if any.
var/icon/under_sprites = null
var/icon_sprite_tag // This is where we put stuff like _Horse, so we can assign icons easier.
+ tailsock_icon = 'icons/mob/human_races/sprite_accessories/taurs/taur_socks.dmi'
//Could do nested lists but it started becoming a nightmare. It'd be more fun for lookups of a_intent and m_intent, but then subtypes need to
//duplicate all the messages, and it starts getting awkward. These are singletons, anyway!
@@ -41,6 +42,14 @@
hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case.
clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms.
+/datum/sprite_accessory/tail/taur/New()
+ . = ..()
+ //give us the default sprite state, hijacking icon_sprite_tag that was only ever used for saddlebags.
+ if(icon_sprite_tag)
+ tailsock_iconstate = "[icon_sprite_tag]_sock"
+ ///few taurs have working tailwags, but to ensure future proofing and no null icons the taur_sock.dmi file has these prepared.
+ tailsock_wagicon = "[icon_sprite_tag]_w_sock"
+
/datum/riding/taur
keytype = /obj/item/material/twohanded/riding_crop // Crack!
nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs.
diff --git a/code/modules/mob/new_player/taur/taur_animal.dm b/code/modules/mob/new_player/taur/taur_animal.dm
index 0aba39e842c..7bbc944f76a 100644
--- a/code/modules/mob/new_player/taur/taur_animal.dm
+++ b/code/modules/mob/new_player/taur/taur_animal.dm
@@ -1,13 +1,17 @@
/datum/sprite_accessory/tail/taur/bunny
name = "Bunny (Taur, Fat vwag)"
- icon = 'icons/rogue-star/tails_64x32_rs.dmi'
+ icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
icon_state = "bnytr"
+ suit_sprites = 'icons/inventory/suit/taursuits_bnytr.dmi'
+ icon_sprite_tag = "bnytr"
extra_overlay = "bnytr-m1"
extra_overlay2 = "bnytr-m2"
ani_state = "bnytr-f"
extra_overlay_w = "bnytr-m1"
extra_overlay2_w = "bnytr-f-m2"
-
+ tailsock_wagicon = "bnytr-f_sock"
+ tailsock_wagmarkings = "bnytr-m1"
+ tailsock_wagmarkings2 = "bnytr-f-m2"
can_loaf = TRUE
icon_loaf = 'icons/rogue-star/loafs_64x32.dmi'
loaf_offset = 4
@@ -16,7 +20,7 @@
name = "Cow (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
icon_state = "cow_s"
- suit_sprites = 'icons/mob/taursuits_cow.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_cow.dmi'
icon_sprite_tag = "cow"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
@@ -41,19 +45,19 @@
/datum/sprite_accessory/tail/taur/cow/fat
name = "Fat Cow (Taur)"
+ icon_sprite_tag = "fatcow"
icon_state = "fatcow_s"
/datum/sprite_accessory/tail/taur/cow/fat_wag
name = "Cow (Taur, Fat vwag)"
- icon_state = "cow_s"
ani_state = "fatcow_s"
+ tailsock_wagicon = "fatcow_sock"
/datum/sprite_accessory/tail/taur/cow/paw // this grabs suit sprites from the normal cow, the outline is the same
name = "Cow w/ paws (Taur)"
icon_state = "pawcow_s"
+ icon_sprite_tag = "pawcow" //little suit booties in place of the hoof cutouts.
extra_overlay = "pawcow_markings"
- suit_sprites = 'icons/mob/taursuits_cow.dmi'
- icon_sprite_tag = "cow"
msg_owner_disarm_run = "You quickly push %prey to the ground with your paw!"
msg_prey_disarm_run = "%owner pushes you down to the ground with their paw!"
@@ -75,7 +79,9 @@
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
icon_state = "deer_s"
extra_overlay = "deer_markings"
- suit_sprites = 'icons/mob/taursuits_deer.dmi'
+ ani_state = "deer_w"
+ extra_overlay_w = "deer_markings_w"
+ suit_sprites = 'icons/inventory/suit/taursuits_deer.dmi'
icon_sprite_tag = "deer"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
@@ -104,6 +110,7 @@
icon_state = "deer_s"
ani_state = "fatdeer_s"
extra_overlay_w = "fatdeer_markings"
+ tailsock_wagicon = "fatdeer_sock"
/datum/sprite_accessory/tail/taur/deer/fatdeer
name = "Fat Deer (Dual-color Taur)"
@@ -114,7 +121,7 @@
name = "Feline (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
icon_state = "feline_s" //I just want to talk to whomever thought every feline varient needed this same sprite but uniquely renamed...
- suit_sprites = 'icons/mob/taursuits_deer.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_feline.dmi'
icon_sprite_tag = "feline"
extra_overlay = "feline_markings"
ani_state = "feline_w"
@@ -125,10 +132,13 @@
vore_tail_sprite_variant = "Feline"
belly_variant_when_loaf = TRUE
fullness_icons = 1
+ tailsock_markings = "none"
+ tailsock_wagmarkings = "none"
/datum/sprite_accessory/tail/taur/feline/fat
name = "Fat Feline (Taur)"
icon_state = "fatfeline_s"
+ icon_sprite_tag = "fatfeline"
extra_overlay = "fatfeline_markings" //feet, belly, and chest
ani_state = "fatfeline_w"
extra_overlay_w = "fatfeline_markings"
@@ -138,12 +148,15 @@
name = "Fat Feline (Taur, Fat vwag)"
ani_state = "fatfeline_s" //static fat sprite
can_loaf = TRUE
+ icon_sprite_tag = "fatfeline"
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
loaf_offset = 3
+ tailsock_wagicon = "fatfeline_sock"
/datum/sprite_accessory/tail/taur/feline/fatfeline_2c
name = "Fat Feline 3-color (Taur)"
icon_state = "fatfeline_s"
+ icon_sprite_tag = "fatfeline"
extra_overlay = "fatfeline2_markings" // chest and belly
extra_overlay2 = "fatfeline2_markings_2" // feet
can_loaf = TRUE
@@ -154,7 +167,6 @@
icon_state = "feline_s"
extra_overlay = "feline2_markings"
extra_overlay2 = "feline2_markings_2"
- //icon_sprite_tag = "feline2c"
can_loaf = TRUE
/datum/sprite_accessory/tail/taur/feline/feline_2c_wag
@@ -162,19 +174,16 @@
extra_overlay = "feline2_markings"
extra_overlay2 = "feline2_markings_2"
ani_state = "fatfeline_s"
- extra_overlay = "fatfeline2_markings"
- extra_overlay2 = "fatfeline2_markings_2"
+ extra_overlay_w = "fatfeline2_markings"
+ extra_overlay2_w = "fatfeline2_markings_2"
loaf_offset = 3
/datum/sprite_accessory/tail/taur/feline/tiger
name = "Tiger (Taur)"
- suit_sprites = 'icons/mob/taursuits_deer.dmi'
icon_sprite_tag = "feline"
- extra_overlay = "feline_markings"
extra_overlay2 = "tiger_markings"
extra_overlay2_w = "tiger_markings_w"
can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
loaf_offset = 5
vore_tail_sprite_variant = "Feline"
belly_variant_when_loaf = TRUE
@@ -183,21 +192,25 @@
/datum/sprite_accessory/tail/taur/feline/tiger/fat
name = "Fat Tiger (Taur)"
icon_state = "fatfeline_s"
+ icon_sprite_tag = "fatfeline"
extra_overlay = "fatfeline_markings"
extra_overlay2 = "fattiger_markings"
extra_overlay2_w = "fattiger_markings_w"
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
loaf_offset = 3
+ tailsock_markings2 = "tiger_markings"
+ tailsock_wagmarkings2 = "tiger_markings_w"
/datum/sprite_accessory/tail/taur/feline/tiger/fat_vwag
name = "Tiger (Taur, Fat vwag)"
ani_state = "fatfeline_s"
extra_overlay_w = "fatfeline_markings"
extra_overlay2_w = "fattiger_markings"
+ tailsock_wagicon = "fatfeline_sock"
/datum/sprite_accessory/tail/taur/fox
name = "Fox (Taur, 3-color)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_fox.dmi'
icon_state = "fox"
extra_overlay = "fox_markings"
extra_overlay2 = "fox_markings2"
@@ -210,6 +223,7 @@
/datum/sprite_accessory/tail/taur/fox/kitsune
name = "Kitsune (Taur)"
icon_state = "kitsune"
+ icon_sprite_tag = "kitsune"
extra_overlay = "kitsune_markings"
extra_overlay2 = "kitsune_markings2"
@@ -223,8 +237,8 @@
name = "Horse (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
icon_state = "horse_s"
- under_sprites = 'icons/mob/taursuits_horse.dmi'
- suit_sprites = 'icons/mob/taursuits_horse.dmi'
+ under_sprites = 'icons/inventory/suit/taursuits_horse.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_horse.dmi'
icon_sprite_tag = "horse"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
@@ -250,12 +264,12 @@
/datum/sprite_accessory/tail/taur/horse/big
name = "Kentauri (Taur)"
icon_state = "kentauri_s"
+ icon_sprite_tag = "kentauri"
extra_overlay = "kentauri_markings"
/datum/sprite_accessory/tail/taur/horse/horse_2c
name = "Horse & colorable tail (Taur)"
extra_overlay = "horse_markings"
- //icon_sprite_tag = "wolf2c"
/datum/sprite_accessory/tail/taur/otie
name = "Otie (Taur)"
@@ -263,7 +277,10 @@
icon_state = "otie_s"
extra_overlay = "otie_markings"
extra_overlay2 = "otie_markings_2"
- suit_sprites = 'icons/mob/taursuits_otie.dmi'
+ ani_state = "otie_w"
+ extra_overlay_w = "otie_markings_w"
+ extra_overlay2_w = "otie_markings_2w"
+ suit_sprites = 'icons/inventory/suit/taursuits_otie.dmi'
icon_sprite_tag = "otie"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
@@ -271,10 +288,15 @@
vore_tail_sprite_variant = "Otie"
belly_variant_when_loaf = TRUE
fullness_icons = 1
+ tailsock_markings = "none"
+ tailsock_wagmarkings = "none"
+ tailsock_markings2 = "otie_markings"
+ tailsock_wagmarkings2 = "otie_markings_w"
/datum/sprite_accessory/tail/taur/rat
name = "Rat (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_rat.dmi'
icon_state = "rat_s"
extra_overlay = "rat_markings"
clip_mask_state = "taur_clip_mask_rat"
@@ -283,18 +305,22 @@
/datum/sprite_accessory/tail/taur/redpanda
name = "Red Panda (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_redpanda.dmi'
icon_state = "redpanda"
+ icon_sprite_tag = "redpanda"
/datum/sprite_accessory/tail/taur/redpanda/dc
name = "Red Panda (Taur dual-color)"
icon_state = "redpanda_dc"
extra_overlay = "redpanda_dc_markings"
+ tailsock_markings = "redpanda_markings"
/datum/sprite_accessory/tail/taur/sergal/wheaties
name = "Sergal (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_sergal.dmi'
icon_state = "sergwheat"
- icon_sprite_tag = "wolf"
+ icon_sprite_tag = "sergal"
vore_tail_sprite_variant = "N"
fullness_icons = 3
struggle_anim = TRUE
@@ -302,7 +328,6 @@
/datum/sprite_accessory/tail/taur/sergal/wheaties/fat
name = "Fat Sergal (Taur)"
icon_state = "fatsergal"
- icon_sprite_tag = "wolf"
vore_tail_sprite_variant = "N"
fullness_icons = 3
struggle_anim = TRUE
@@ -312,7 +337,7 @@
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
icon_state = "sergwheat"
extra_overlay = "sergwheat_markings"
- icon_sprite_tag = "wolf"
+ suit_sprites = 'icons/inventory/suit/taursuits_sergal.dmi'
vore_tail_sprite_variant = "N"
fullness_icons = 3
struggle_anim = TRUE
@@ -321,7 +346,6 @@
name = "Fat Sergal (Taur, dual-color)"
icon_state = "fatsergal"
extra_overlay = "sergwheat_markings"
- icon_sprite_tag = "wolf"
vore_tail_sprite_variant = "N"
fullness_icons = 3
struggle_anim = TRUE
@@ -332,6 +356,7 @@
icon_state = "skunk_s"
extra_overlay = "skunk_markings"
extra_overlay2 = "skunk_markings_2"
+ suit_sprites = 'icons/inventory/suit/taursuits_skunk.dmi'
icon_sprite_tag = "skunk"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
@@ -344,8 +369,8 @@
name = "Wolf (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
icon_state = "wolf_s"
- under_sprites = 'icons/mob/taursuits_wolf.dmi'
- suit_sprites = 'icons/mob/taursuits_wolf.dmi'
+ under_sprites = 'icons/inventory/suit/taursuits_wolf.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_wolf.dmi'
icon_sprite_tag = "wolf"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
@@ -358,75 +383,96 @@
name = "Fat Wolf (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
icon_state = "fatwolf_s"
- icon_sprite_tag = "wolf" //This could be modified later.
+ icon_sprite_tag = "fatwolf"
loaf_offset = 3
/datum/sprite_accessory/tail/taur/wolf/fat_wag
name = "Wolf (Taur, Fat vwag)"
- icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
- icon_state = "wolf_s"
ani_state = "fatwolf_s"
-
-/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c
- name = "Fat Wolf 3-color (Taur)"
- icon_state = "fatwolf2_s"
- extra_overlay = "fatwolf2_markings"
- extra_overlay2 = "fatwolf2_markings_2"
- loaf_offset = 3
-
-/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c/fatwolfalt
- name = "Fat Wolf 3-color-alt (Taur)"
- icon_state = "fatwolfalt_s"
- extra_overlay = "fatwolfalt_markings1"
- extra_overlay2 = "fatwolfalt_markings2"
- icon_sprite_tag = "wolf"
+ tailsock_wagicon = "fatwolf_s"
/datum/sprite_accessory/tail/taur/wolf/wolf_2c
name = "Wolf 3-color (Taur)"
- icon_state = "wolf_s"
- extra_overlay = "wolf_markings"
- extra_overlay2 = "wolf_markings_2"
- //icon_sprite_tag = "wolf2c"
+ extra_overlay = "wolf2_markings"
+ extra_overlay2 = "wolf2_markings_2"
/datum/sprite_accessory/tail/taur/wolf/wolf_2c_wag
name = "Wolf 3-color (Taur, Fat vwag)"
- icon_state = "wolf2_s"
extra_overlay = "wolf2_markings"
extra_overlay2 = "wolf2_markings_2"
+ ani_state = "fatwolf_s"
extra_overlay_w = "fatwolf2_markings"
extra_overlay2_w = "fatwolf2_markings_2"
- ani_state = "fatwolf2_s"
+
+/datum/sprite_accessory/tail/taur/wolf/fat/wolf_2c
+ name = "Fat Wolf 3-color (Taur)"
+ extra_overlay = "fatwolf2_markings"
+ extra_overlay2 = "fatwolf2_markings_2"
+ loaf_offset = 3
+ icon_sprite_tag = "fatwolf"
+
+/datum/sprite_accessory/tail/taur/wolf/fat/altwolf_2c
+ name = "Fat Wolf 3-color-alt (Taur)"
+ extra_overlay = "fatwolfalt_markings1"
+ extra_overlay2 = "fatwolfalt_markings2"
+ icon_sprite_tag = "fatwolf"
/datum/sprite_accessory/tail/taur/wolf/wolf_3
name = "WolfTG (Taur)" //It's Citadel, not TG. :V
- icon_state = "wolf3_s"
+ icon_state = "wolftg"
+ suit_sprites = 'icons/inventory/suit/taursuits_husky.dmi'
+ clip_mask_state = "taur_clip_mask_husky"
do_colouration = FALSE //this is already pre-colored.
+ tailsock_markings = "wolftg"
+ tailsock_wagmarkings = "wolftg_w"
+ icon_sprite_tag = "wolftg"
/datum/sprite_accessory/tail/taur/wolf/husky
name = "Husky (Taur)"
+ suit_sprites = 'icons/inventory/suit/taursuits_husky.dmi'
+ clip_mask_state = "taur_clip_mask_husky"
icon_state = "husky_s"
+ extra_overlay = "husky_markings" //Only affects the black back / tail fluff sections, so it works for the fat one too
+ ani_state = "husky_w"
+ extra_overlay_w = "husky_markings_w"
+ icon_sprite_tag = "husky"
/datum/sprite_accessory/tail/taur/wolf/huskyfat
name = "Fat Husky (Taur)"
- icon_state = "huskyf_s"
+ icon_state = "fathusky_s"
+ extra_overlay = "husky_markings"
+ ani_state = "fathusky_w"
+ extra_overlay_w = "husky_markings_w"
+ icon_sprite_tag = "fathusky"
/datum/sprite_accessory/tail/taur/zorgoia
name = "Zorgoia (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
icon_state = "zorgoia"
extra_overlay = "zorgoia_fluff"
+ icon_sprite_tag = "zorgoia"
+ suit_sprites = 'icons/inventory/suit/taursuits_zorgoia.dmi'
/datum/sprite_accessory/tail/taur/zorgoia/fat
name = "Zorgoia (Fat Taur)"
- extra_overlay = "zorgoia_fat2"
+ icon_state = "zorgoia_fat"
+ extra_overlay = "zorgoia_fat_fluff"
+ icon_sprite_tag = "zorgoia_fat"
/datum/sprite_accessory/tail/taur/zorgoia_new
name = "Zorgoia (Taur) (New)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi'
icon_state = "zorgoia_new"
+ icon_sprite_tag = "zorgoia_new"
extra_overlay = "zorgoia_new_fluff"
+ suit_sprites = 'icons/inventory/suit/taursuits_zorgoia.dmi'
+
+/datum/sprite_accessory/tail/taur/zorgoia_new/fatvwag
+ name = "Zorgoia (Taur, vwag) (New)"
+ ani_state = "zorgoia_new_fat"
+ extra_overlay_w = "zorgoia_new_fat_fluff"
/datum/sprite_accessory/tail/taur/zorgoia_new/fat
name = "Zorgoia (Fat Taur) (New)"
icon_state = "zorgoia_new_fat"
- extra_overlay = "zorgoia_new_fat_overlay"
+ extra_overlay = "zorgoia_new_fat_fluff"
diff --git a/code/modules/mob/new_player/taur/taur_exotic.dm b/code/modules/mob/new_player/taur/taur_exotic.dm
index 97f0ec4b787..cc55fd769ec 100644
--- a/code/modules/mob/new_player/taur/taur_exotic.dm
+++ b/code/modules/mob/new_player/taur/taur_exotic.dm
@@ -15,7 +15,6 @@
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi'
icon_state = "giantspidertaur"
do_colouration = FALSE
- extra_overlay = null
icon_sprite_tag = "giantspidertaur"
msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!"
@@ -43,42 +42,38 @@
/datum/sprite_accessory/tail/taur/giantspider/carrier
name = "Carrier Spider (Taur)"
icon_state = "carrierspidertaur"
- extra_overlay = null
icon_sprite_tag = "carrierspidertaur"
/datum/sprite_accessory/tail/taur/giantspider/phoron
name = "Phorogenic Spider (Taur)"
icon_state = "phoronspidertaur"
- extra_overlay = null
icon_sprite_tag = "phoronspidertaur"
/datum/sprite_accessory/tail/taur/giantspider/spark
name = "Voltaic Spider (Taur)"
icon_state = "sparkspidertaur"
- extra_overlay = null
icon_sprite_tag = "sparkspidertaur"
/datum/sprite_accessory/tail/taur/giantspider/frost
name = "Frost Spider (Taur)"
icon_state = "frostspidertaur"
- extra_overlay = null
icon_sprite_tag = "frostspidertaur"
/datum/sprite_accessory/tail/taur/giantspider/ant //technically not a spider, but it inherits the same messages
name = "Ant (dual color)"
icon_state = "ant_s"
- do_colouration = TRUE
extra_overlay = "ant_markings"
clip_mask_state = "taur_clip_mask_wasp"
- icon_sprite_tag = "wasp"
+ icon_sprite_tag = "ant"
+ do_colouration = TRUE
/datum/sprite_accessory/tail/taur/giantspider/wasp //same as above, but for wasps
name = "Wasp (dual color)"
icon_state = "wasp_s"
- do_colouration = TRUE
extra_overlay = "wasp_markings"
clip_mask_state = "taur_clip_mask_wasp"
icon_sprite_tag = "wasp"
+ do_colouration = TRUE
/datum/sprite_accessory/tail/taur/mermaid
name = "Mermaid (Taur)"
@@ -121,22 +116,23 @@
/datum/sprite_accessory/tail/taur/mermaid/alt/marked
name = "Mermaid Koi (Taur)"
- icon_state = "altmermaid_s"
extra_overlay = "altmermaid_markings"
extra_overlay2 = "altmermaid_markings2"
/datum/sprite_accessory/tail/taur/horse/scoli
name = "Scolipede (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_scoli.dmi'
icon_state = "scoli_s"
extra_overlay = "scoli_markings1"
extra_overlay2 = "scoli_markings2"
+ icon_sprite_tag = "scoli"
/datum/sprite_accessory/tail/taur/spider
name = "Spider (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi'
icon_state = "spider_s"
- suit_sprites = 'icons/mob/taursuits_spider.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_spider.dmi'
icon_sprite_tag = "spider"
msg_owner_disarm_run = "You quickly push %prey to the ground with your leg!"
@@ -157,6 +153,7 @@
/datum/sprite_accessory/tail/taur/sloog
name = "Sloog (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_sloog.dmi'
icon_state = "sloog"
extra_overlay = "sloog_glowstripe"
extra_overlay_w = "sloog_glowstripe"
@@ -166,7 +163,6 @@
name = "Slug (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi'
icon_state = "slug_s"
- suit_sprites = 'icons/mob/taursuits_deer.dmi' //Yes it sounds odd, but they share the same sprites.
icon_sprite_tag = "slug"
vore_tail_sprite_variant = "Slug"
fullness_icons = 1
@@ -200,15 +196,15 @@
/datum/sprite_accessory/tail/taur/slug/snail
name = "Snail (Taur)"
- icon_state = "slug_s"
extra_overlay = "snail_shell_marking"
+ icon_sprite_tag = "snail"
/datum/sprite_accessory/tail/taur/tents
name = "Tentacles (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi'
icon_state = "tent_s"
icon_sprite_tag = "tentacle"
- can_ride = 0
+ can_ride = FALSE
msg_prey_stepunder = "You run between %prey's tentacles."
msg_owner_stepunder = "%owner runs between your tentacles."
@@ -241,6 +237,7 @@
name = "Tree Roots (Oak)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi'
icon_state = "tree_oak_roots"
+ icon_sprite_tag = "tree_oak_roots"
can_ride = FALSE
/*
diff --git a/code/modules/mob/new_player/taur/taur_reptile.dm b/code/modules/mob/new_player/taur/taur_reptile.dm
index aef6dd538da..00697207c11 100644
--- a/code/modules/mob/new_player/taur/taur_reptile.dm
+++ b/code/modules/mob/new_player/taur/taur_reptile.dm
@@ -1,10 +1,9 @@
-/datum/sprite_accessory/tail/taur/drake //Enabling on request, no suit compatibility but then again see 2 above.
+/datum/sprite_accessory/tail/taur/drake
name = "Drake (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_reptile.dmi'
icon_state = "drake_s"
extra_overlay = "drake_markings"
-/// suit_sprites = 'icons/mob/taursuits_drake.dmi'
- suit_sprites = 'icons/mob/taursuits_drake_ch.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_drake.dmi'
icon_sprite_tag = "drake"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
@@ -17,98 +16,71 @@
name = "Fat Drake (Taur)"
icon_state = "fatdrake_s"
extra_overlay = "fatdrake_markings"
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
+ icon_sprite_tag = "fatdrake"
+ vore_tail_sprite_variant = "FatDrake"
loaf_offset = 6
/datum/sprite_accessory/tail/taur/drake/drake_vwag
name = "Drake (Taur, Fat vwag)"
- icon_state = "drake_s"
- extra_overlay = "drake_markings"
ani_state = "fatdrake_s"
extra_overlay_w = "fatdrake_markings"
- can_loaf = TRUE
-
-/datum/sprite_accessory/tail/taur/drake/extended
- name = "Fat Drake Extended (Taur)"
- icon_state = "extended_fatdrake"
- extra_overlay = "extended_fatdrake_markings"
- extra_overlay2 = "extended_fatdrake_markings2"
- fullness_icons = 2
- can_loaf = TRUE //Soon //Actually, NOW
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi' //This file needs to be nuked during the removal of 'taurs_ch_loaf.dmi' into the normal loaf file.
- loaf_offset = 5
-
-/datum/sprite_accessory/tail/taur/drake/extended/spotty
- name = "Fat Spotted Drake Extended (Taur)"
- vore_tail_sprite_variant = "FatDrake"
- icon_state = "spottedextended_fatdrake"
- extra_overlay = "spottedextended_fatdrake_markings"
- extra_overlay_w = "spottedextended_fatdrake_markings"
- extra_overlay2 = "spottedextended_fatdrake_markings_2"
- extra_overlay2_w = "spottedextended_fatdrake_markings_2"
- fullness_icons = 2
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi' //This file needs to be nuked during the removal of 'taurs_ch_loaf.dmi' into the normal loaf file.
- loaf_offset = 5
/datum/sprite_accessory/tail/taur/drake/spotty
name = "Spotted Drake (Taur, Tricolor)"
- icon_state = "spotteddrake_s"
- extra_overlay = "spotteddrake_markings"
extra_overlay_w = "spotteddrake_markings"
- extra_overlay2 = "spotteddrake_markings_2"
- extra_overlay2_w = "spotteddrake_markings_2"
- suit_sprites = 'icons/mob/taursuits_drake_ch.dmi'
- icon_sprite_tag = "drake"
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi' //This file needs to be nuked during the removal of 'taurs_ch_loaf.dmi' into the normal loaf file.
+ extra_overlay2_w = "spotteddrake_markings"
loaf_offset = 6
/datum/sprite_accessory/tail/taur/drake/fat/spotty
name = "Fat Spotted Drake (Taur, Tricolor)"
vore_tail_sprite_variant = "FatDrake"
- icon_state = "fatspotteddrake_s"
- extra_overlay = "fatspotteddrake_markings"
- extra_overlay_w = "fatspotteddrake_markings"
- extra_overlay2 = "fatspotteddrake_markings_2"
- extra_overlay2_w = "fatspotteddrake_markings_2"
+ extra_overlay2 = "fatspotteddrake_markings"
+ extra_overlay2_w = "fatspotteddrake_markings"
fullness_icons = 2
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi' //This file needs to be nuked during the removal of 'taurs_ch_loaf.dmi' into the normal loaf file.
loaf_offset = 6
-/datum/sprite_accessory/tail/taur/drake/extended_alt
+/datum/sprite_accessory/tail/taur/drake/drake_vwag/spotty
+ name = "Spotted Drake (Taur, Tricolor, Fat vwag)"
+ extra_overlay2 = "spotteddrake_markings"
+ extra_overlay2_w = "fatspotteddrake_markings"
+ loaf_offset = 6
+
+/datum/sprite_accessory/tail/taur/drake/extended
name = "Drake Extended (Taur)"
vore_tail_sprite_variant = "Drake"
- icon_state = "extended_drake"
- extra_overlay = "extended_drake_markings"
- extra_overlay_w = "extended_drake_markings"
- extra_overlay2 = "extended_drake_markings_2"
- extra_overlay2_w = "extended_drake_markings_2"
+ icon_state = "extendeddrake"
+ extra_overlay = "extendeddrake_markings"
+ extra_overlay_w = "extendeddrake_markings"
+ extra_overlay2 = "extendeddrake_markings_2"
+ extra_overlay2_w = "extendeddrake_markings_2"
+ icon_sprite_tag = "extendeddrake"
fullness_icons = 3
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
loaf_offset = 5
-/datum/sprite_accessory/tail/taur/drake/extended_alt/spotted
+/datum/sprite_accessory/tail/taur/drake/extended/spotted
name = "Spotted Drake Extended (Taur)"
- vore_tail_sprite_variant = "Drake"
- icon_state = "spottedextended_drake"
- extra_overlay = "spottedextended_drake_markings"
- extra_overlay_w = "spottedextended_drake_markings"
- extra_overlay2 = "spottedextended_drake_markings_2"
- extra_overlay2_w = "spottedextended_drake_markings_2"
- fullness_icons = 3
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi' //This file needs to be nuked during the removal of 'taurs_ch_loaf.dmi' into the normal loaf file.
- loaf_offset = 5
+ extra_overlay2 = "spottedextendeddrake_markings"
+ extra_overlay2_w = "spottedextendeddrake_markings"
+
+/datum/sprite_accessory/tail/taur/drake/extended/fat
+ name = "Fat Drake Extended (Taur)"
+ icon_state = "extendedfatdrake"
+ extra_overlay = "extendedfatdrake_markings"
+ extra_overlay2 = "extendedfatdrake_markings_2"
+ icon_sprite_tag = "extendedfatdrake"
+ vore_tail_sprite_variant = "FatDrake"
+ fullness_icons = 2
+
+/datum/sprite_accessory/tail/taur/drake/extended/fat/spotty
+ name = "Fat Spotted Drake Extended (Taur)"
+ extra_overlay2 = "spottedextendedfatdrake_markings"
+ extra_overlay2_w = "spottedextendedfatdrake_markings"
/datum/sprite_accessory/tail/taur/lizard
name = "Lizard (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_reptile.dmi'
icon_state = "lizard_s"
- suit_sprites = 'icons/mob/taursuits_lizard_ch.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_lizard.dmi'
icon_sprite_tag = "lizard"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
@@ -116,36 +88,16 @@
vore_tail_sprite_variant = "Lizard"
fullness_icons = 1
-/datum/sprite_accessory/tail/taur/lizard/fatlizard
- name = "Fat Lizard (Taur)"
- icon_state = "fatlizard_s"
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
- loaf_offset = 3
-
/datum/sprite_accessory/tail/taur/lizard/lizard_wag
name = "Lizard (Taur, Fat vwag)"
icon_state = "lizard_s"
ani_state = "fatlizard_s"
-/datum/sprite_accessory/tail/taur/lizard/lizard_2c
+/datum/sprite_accessory/tail/taur/lizard/twocolor
name = "Lizard dual-color (Taur)"
- icon_state = "lizard_s"
extra_overlay = "lizard_markings"
- //icon_sprite_tag = "lizard2c"
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
- loaf_offset = 5
-/datum/sprite_accessory/tail/taur/lizard/fatlizard_2c
- name = "Fat Lizard (Taur, dual-color)"
- icon_state = "fatlizard_s"
- extra_overlay = "fatlizard_markings"
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
- loaf_offset = 3
-
-/datum/sprite_accessory/tail/taur/lizard/lizard_2c_wag
+/datum/sprite_accessory/tail/taur/lizard/twocolor_wag
name = "Fat Lizard (Taur, dual-color, Fat vwag)"
icon_state = "lizard_s"
extra_overlay = "lizard_markings"
@@ -154,32 +106,40 @@
/datum/sprite_accessory/tail/taur/lizard/spotty
name = "Spotted Lizard (Taur, Tricolor)"
- icon_state = "spottedlizard_s"
- extra_overlay = "spottedlizard_markings"
- extra_overlay_w = "spottedlizard_markings"
- extra_overlay2 = "spottedlizard_markings_2"
- extra_overlay2_w = "spottedlizard_markings_2"
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi' //This file needs to be nuked during the removal of 'taurs_ch_loaf.dmi' into the normal loaf file.
- loaf_offset = 5
+ extra_overlay2 = "spottedlizard_markings"
+ extra_overlay2_w = "spottedlizard_markings"
-/datum/sprite_accessory/tail/taur/lizard/spotty_fat
- name = "Fat Spotted Lizard (Taur, Tricolor)"
- icon_state = "fatspottedlizard_s"
- extra_overlay = "fatspottedlizard_markings"
- extra_overlay_w = "fatspottedlizard_markings"
- extra_overlay2 = "fatspottedlizard_markings_2"
- extra_overlay2_w = "fatspottedlizard_markings_2"
- can_loaf = TRUE
- icon_loaf = 'icons/mob/vore/taurs_loaf.dmi' //This file needs to be nuked during the removal of 'taurs_ch_loaf.dmi' into the normal loaf file.
+/datum/sprite_accessory/tail/taur/lizard/spotty_wag
+ name = "Spotted Lizard (Taur, Tricolor, Fat vwag)"
+ ani_state = "fatlizard_s"
+ extra_overlay_w = "fatlizard_markings"
+ extra_overlay2 = "fatspottedlizard_markings"
+ extra_overlay2_w = "fatspottedlizard_markings"
+
+/datum/sprite_accessory/tail/taur/lizard/fatlizard
+ name = "Fat Lizard (Taur)"
+ icon_state = "fatlizard_s"
+ icon_sprite_tag = "fatlizard"
loaf_offset = 3
+/datum/sprite_accessory/tail/taur/lizard/fatlizard/twocolor
+ name = "Fat Lizard (Taur, dual-color)"
+ extra_overlay = "fatlizard_markings"
+
+/datum/sprite_accessory/tail/taur/lizard/fatlizard/spotty
+ name = "Fat Spotted Lizard (Taur, Tricolor)"
+ extra_overlay = "fatlizard_markings"
+ extra_overlay_w = "fatlizard_markings"
+ extra_overlay2 = "fatspottedlizard_markings"
+ extra_overlay2_w = "fatspottedlizard_markings"
+
/datum/sprite_accessory/tail/taur/naga
name = "Naga (Taur)"
+ //TODO: MOAR NAGA SUITS
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_reptile.dmi'
icon_state = "naga_s"
- suit_sprites = 'icons/mob/taursuits_naga.dmi'
- //icon_sprite_tag = "naga"
+ suit_sprites = 'icons/inventory/suit/taursuits_naga.dmi'
+ icon_sprite_tag = "naga"
vore_tail_sprite_variant = "Naga"
fullness_icons = 1
@@ -214,51 +174,41 @@
name = "Naga (Taur, Fat, dual color)"
icon_state = "fatnaga_s"
extra_overlay = "fatnaga_markings"
- suit_sprites = null
+ icon_sprite_tag = "fatnaga"
-/datum/sprite_accessory/tail/taur/naga/naga_2c
+/datum/sprite_accessory/tail/taur/naga/naga_twocolor
name = "Naga dual-color (Taur)"
- icon_state = "naga_s"
extra_overlay = "naga_markings"
- //icon_sprite_tag = "naga2c"
+//should really be called 'thin naga'
/datum/sprite_accessory/tail/taur/naga/alt
name = "Naga alt (Taur)"
- icon_state = "naga_alt_s"
+ icon_state = "altnaga_s"
vore_tail_sprite_variant = "NagaAlt"
+ suit_sprites = 'icons/inventory/suit/taursuits_naga_alt.dmi'
fullness_icons = 1
+ icon_sprite_tag = "altnaga"
-/datum/sprite_accessory/tail/taur/naga/alt/second
- name = "Naga dual-color alt (Taur)"
- extra_overlay = "naga_alt_markings"
-
-/datum/sprite_accessory/tail/taur/naga/alt_2c
+/datum/sprite_accessory/tail/taur/naga/alt/twocolor
name = "Naga alt style dual-color (Taur)"
- suit_sprites = 'icons/mob/taursuits_naga.dmi' //TODO: PORT CHOMPS NAGA_ALT AND MAKE THESE NAGA_ALT.
- icon_state = "altnaga_s"
extra_overlay = "altnaga_markings"
- //icon_sprite_tag = "altnaga2c"
-/datum/sprite_accessory/tail/taur/naga/alt_3c
+/datum/sprite_accessory/tail/taur/naga/alt/threecolor
name = "Naga alt style tri-color (Taur)"
- suit_sprites = 'icons/mob/taursuits_naga.dmi' //TODO: PORT CHOMPS NAGA_ALT AND MAKE THESE NAGA_ALT.
- icon_state = "altnaga_s"
extra_overlay = "altnaga_markings"
extra_overlay2 = "altnaga_stripes"
-/datum/sprite_accessory/tail/taur/naga/alt_3c_rattler
+/datum/sprite_accessory/tail/taur/naga/alt/threecolor_rattler
name = "Naga alt style tri-color, rattler (Taur)"
- suit_sprites = 'icons/mob/taursuits_naga.dmi' //TODO: PORT CHOMPS NAGA_ALT AND MAKE THESE NAGA_ALT.
- icon_state = "altnaga_s"
extra_overlay = "altnaga_markings"
extra_overlay2 = "altnaga_rattler"
-/datum/sprite_accessory/tail/taur/naga/alt_3c_tailmaw
+/datum/sprite_accessory/tail/taur/naga/alt/threecolor_tailmaw
name = "Naga alt style tri-color, tailmaw (Taur)"
- suit_sprites = 'icons/mob/taursuits_naga.dmi' //TODO: PORT CHOMPS NAGA_ALT AND MAKE THESE NAGA_ALT.
icon_state = "altnagatailmaw_s"
extra_overlay = "altnagatailmaw_markings"
extra_overlay2 = "altnagatailmaw_eyes"
+ icon_sprite_tag = "altnagatailmaw"
/datum/sprite_accessory/tail/taur/noodle
name = "Eastern Dragon (Taur)"
@@ -266,7 +216,7 @@
icon_state = "noodle_s"
extra_overlay = "noodle_markings"
extra_overlay2 = "noodle_markings_2"
- suit_sprites = 'icons/mob/taursuits_noodle.dmi'
+ suit_sprites = 'icons/inventory/suit/taursuits_noodle.dmi'
clip_mask_state = "taur_clip_mask_noodle"
icon_sprite_tag = "noodle"
diff --git a/code/modules/mob/new_player/taur/taur_snowflake.dm b/code/modules/mob/new_player/taur/taur_snowflake.dm
index a199be11013..542102bd2cb 100644
--- a/code/modules/mob/new_player/taur/taur_snowflake.dm
+++ b/code/modules/mob/new_player/taur/taur_snowflake.dm
@@ -1,16 +1,4 @@
// Special snowflake tails/taurhalves
-
-//spoopylizz: Roiz Lizden
-/datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 64x32 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 = 'icons/mob/human_races/sprite_accessories/taurs/taurs_snowflake.dmi'
- icon_state = "roiz_tail_s"
- do_colouration = FALSE
- ckeys_allowed = list("spoopylizz")
- hide_body_parts = null
- clip_mask_icon = null
- clip_mask_state = null
-
//grallstonefist: Ranihrönn Skrolk
/datum/sprite_accessory/tail/taur/altmermaid/orcamermaid
name = "Mermaid Orca (Taur)"
@@ -19,6 +7,7 @@
can_ride = TRUE
do_colouration = FALSE
ckeys_allowed = list("grallstonefist")
+ tailsock_markings = "orcamermaid_marking"
//wickedtemp: Chakat Tempest
/datum/sprite_accessory/tail/taur/feline/tempest
diff --git a/code/modules/mob/new_player/taur/taur_synth.dm b/code/modules/mob/new_player/taur/taur_synth.dm
index dfa1da1ec03..485a1e96ad6 100644
--- a/code/modules/mob/new_player/taur/taur_synth.dm
+++ b/code/modules/mob/new_player/taur/taur_synth.dm
@@ -3,6 +3,7 @@
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "sectdrone"
extra_overlay = "sectdrone_markings"
+ icon_sprite_tag = "sectdrone"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
vore_tail_sprite_variant = "SectDrone"
@@ -10,6 +11,7 @@
struggle_anim = TRUE
loaf_offset = 3
fullness_icons = 3
+ clip_mask_state = "taur_clip_mask_sectdrone"
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!"
@@ -26,21 +28,21 @@
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!"
-/datum/sprite_accessory/tail/taur/sect_drone/drone_wag
+/datum/sprite_accessory/tail/taur/sectdrone/drone_wag
name = "Sect Drone (Taur, Fat vwag)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
- icon_state = "sect_drone"
- extra_overlay = "sect_drone_markings"
- ani_state = "fat_sect_drone"
- extra_overlay_w = "fat_sect_drone_markings"
- icon_sprite_tag = "sect_drone"
+ icon_state = "sectdrone"
+ extra_overlay = "sectdrone_markings"
+ ani_state = "fatsectdrone"
+ extra_overlay_w = "fatsectdrone_markings"
+ icon_sprite_tag = "sectdrone"
-/datum/sprite_accessory/tail/taur/sect_drone/fat
+/datum/sprite_accessory/tail/taur/sectdrone/fat
name = "Fat Sect Drone (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
- icon_state = "fat_sect_drone"
- extra_overlay = "fat_sect_drone_markings"
- icon_sprite_tag = "sect_drone"
+ icon_state = "fatsectdrone"
+ extra_overlay = "fatsectdrone_markings"
+ icon_sprite_tag = "sectdrone"
/datum/sprite_accessory/tail/taur/horse/synthhorse
name = "SynthHorse dual-color (Taur)"
@@ -48,7 +50,7 @@
icon_state = "synthhorse_s"
extra_overlay = "synthhorse_markings"
extra_overlay2 = "synthhorse_glow"
- //icon_sprite_tag = "synthhorse"
+ icon_sprite_tag = "synthhorse"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
loaf_offset = 3
@@ -59,7 +61,7 @@
icon_state = "synthfeline_s"
extra_overlay = "synthfeline_markings"
extra_overlay2 = "synthfeline_glow"
- //icon_sprite_tag = "synthfeline"
+ icon_sprite_tag = "synthfeline"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
loaf_offset = 3
@@ -70,6 +72,7 @@
icon_state = "fatsynthfeline_s"
extra_overlay = "fatsynthfeline_markings"
extra_overlay2 = "fatsynthfeline_glow"
+ icon_sprite_tag = "fatsynthfeline"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
loaf_offset = 3
@@ -78,6 +81,7 @@
name = "SynthFeline dual-color (Taur, Fat vwag)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "synthfeline_s"
+ icon_sprite_tag = "synthfeline"
extra_overlay = "synthfeline_markings"
extra_overlay2 = "synthfeline_glow"
ani_state = "fatsynthfeline_s"
@@ -88,6 +92,7 @@
name = "Synthetic chassis - agile (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "synthtaur1_s"
+ icon_sprite_tag = "synthtaur1"
extra_overlay = "synthtaur1_markings"
extra_overlay2 = "synthtaur1_glow"
clip_mask_state = "taur_clip_mask_synthtaur1"
@@ -95,7 +100,8 @@
/datum/sprite_accessory/tail/taur/synthetic/syntheticagi_fat
name = "Synthetic chassis - agile (Taur, Fat)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
- icon_state = "synthtaur1_s"
+ icon_state = "synthtaur1_fat_s"
+ icon_sprite_tag = "synthtaur1_fat"
extra_overlay = "synthtaur1_fat_markings"
extra_overlay2 = "synthtaur1_glow"
clip_mask_state = "taur_clip_mask_synthtaur1"
@@ -104,9 +110,10 @@
name = "Synthetic chassis - agile (Taur, Fat vwag)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "synthtaur1_s"
+ icon_sprite_tag = "synthtaur1"
extra_overlay = "synthtaur1_markings"
extra_overlay2 = "synthtaur1_glow"
- ani_state = "synthtaur1_s"
+ ani_state = "synthtaur1_fat_s"
extra_overlay_w = "synthtaur1_fat_markings"
extra_overlay2_w = "synthtaur1_glow"
clip_mask_state = "taur_clip_mask_synthtaur1"
@@ -115,9 +122,9 @@
name = "SynthLizard dual-color (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "synthlizard_s"
+ icon_sprite_tag = "synthlizard"
extra_overlay = "synthlizard_markings"
extra_overlay2 = "synthlizard_glow"
- //icon_sprite_tag = "synthlizard"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_loaf.dmi'
loaf_offset = 3
@@ -128,6 +135,7 @@
name = "Fat SynthLizard dual-color (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "fatsynthlizard_s"
+ icon_sprite_tag = "fatsynthlizard"
extra_overlay = "fatsynthlizard_markings"
extra_overlay2 = "fatsynthlizard_glow"
can_loaf = TRUE
@@ -138,6 +146,7 @@
name = "SynthLizard dual-color (Taur, Fat vwag)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "synthlizard_s"
+ icon_sprite_tag = "fatsynthlizard"
extra_overlay = "synthlizard_markings"
extra_overlay2 = "synthlizard_glow"
ani_state = "fatsynthlizard_s"
@@ -148,6 +157,7 @@
name = "Synthetic Naga dual-color (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "synthnaga"
+ icon_sprite_tag = "synthnaga"
extra_overlay = "synthnaga_belly"
/datum/sprite_accessory/tail/taur/longvirus
@@ -155,21 +165,22 @@
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "longvirus_s"
extra_overlay = "longvirus_markings"
- icon_sprite_tag = "virus"
+ icon_sprite_tag = "longvirus"
/datum/sprite_accessory/tail/taur/wolf/synthwolf
name = "SynthWolf dual-color (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "synthwolf_s"
+ icon_sprite_tag = "synthwolf"
extra_overlay = "synthwolf_markings"
extra_overlay2 = "synthwolf_glow"
- //icon_sprite_tag = "synthwolf"
loaf_offset = 3
/datum/sprite_accessory/tail/taur/wolf/fatsynthwolf
name = "Fat SynthWolf dual-color (Taur)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
icon_state = "fatsynthwolf_s"
+ icon_sprite_tag = "fatsynthwolf"
extra_overlay = "fatsynthwolf_markings"
extra_overlay2 = "fatsynthwolf_glow"
loaf_offset = 3
@@ -177,6 +188,7 @@
/datum/sprite_accessory/tail/taur/wolf/fatsynthwolf_wag
name = "SynthWolf dual-color (Taur, Fat vwag)"
icon = 'icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi'
+ icon_sprite_tag = "synthwolf"
icon_state = "synthwolf_s"
extra_overlay = "synthwolf_markings"
extra_overlay2 = "synthwolf_glow"
diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
index 20b870042bb..56291f4c4e3 100644
--- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm
@@ -1147,7 +1147,7 @@ Departamental Swimsuits, for general use
/obj/item/clothing/suit/storage/hooded/wintercoat/jessie
name = "Handmade Winter Suit"
desc = "A durable, but somewhat ragged lower portion of a snow suit fitted for a wolftaur."
- icon = 'icons/mob/taursuits_wolf.dmi'
+ icon = 'icons/inventory/suit/taursuits_snowflake.dmi'
icon_state = "jessiecoat"
/obj/item/clothing/suit/storage/hooded/wintercoat/jessie/mob_can_equip(mob/living/carbon/human/H, slot, disable_warning = FALSE, ignore_obstruction, go_over_slot = FALSE)
@@ -1163,7 +1163,7 @@ Departamental Swimsuits, for general use
name = "Kat's Fox Taur Armor"
desc = "A set of security armor, light weight and easy to run in for a Taur, this item protects the \
entire body."
- icon = 'icons/mob/taursuits_wolf.dmi'
+ icon = 'icons/inventory/suit/taursuits_snowflake.dmi'
icon_state = "katesuit"
item_state_slots = null
@@ -1181,7 +1181,7 @@ Departamental Swimsuits, for general use
desc = "Taur engineering voidsuit. Recolored navy blue and white. Slightly tweaked as well to \
get close to having security voidsuit protection as possible with a slight reduction in movement \
speed to compensate for custom padding and armor Kateryna made herself."
- icon = 'icons/mob/taursuits_wolf.dmi'
+ icon = 'icons/inventory/suit/taursuits_snowflake.dmi'
icon_state = "lilithsuit"
species_restricted = null
armor = list(melee = 40, bullet = 20, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20)
@@ -1534,7 +1534,7 @@ Departamental Swimsuits, for general use
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
desc = "A series of armor plates painted black, deployed from a back-mounted module. They fit smoothly over the unit's armor plates and projects a skintight bubble shield over the unit's uncovered parts. Faceplate and coolant unit not included."
species_restricted = null
- icon = 'icons/mob/taursuits_lizard.dmi'
+ icon = 'icons/inventory/suit/taursuits_snowflake.dmi'
icon_state = "hasd_suit"
pixel_x = -16
diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm
index 7409739ac13..874ac88bc7d 100644
--- a/code/modules/vore/fluffstuff/custom_items_vr.dm
+++ b/code/modules/vore/fluffstuff/custom_items_vr.dm
@@ -452,7 +452,7 @@
name = "custom security cuirass"
desc = "An armored vest that protects against some damage. It appears to be created for a wolfhound. The name 'Serdykov L. Antoz' is written on a tag inside one of the haunchplates."
species_restricted = null //Species restricted since all it cares about is a taur half
- icon = 'icons/mob/taursuits_wolf.dmi'
+ icon = 'icons/inventory/suit/taursuits_snowflake.dmi'
icon_state = "serdy_armor"
item_state = "serdy_armor"
body_parts_covered = CHEST|LEGS|ARMS //It's a full body suit, minus hands and feet. Arms and legs should be protected, not just the torso. Retains normal security armor values still.
diff --git a/icons/inventory/suit/item.dmi b/icons/inventory/suit/item.dmi
index 48df8ecf526..a3a83205528 100644
Binary files a/icons/inventory/suit/item.dmi and b/icons/inventory/suit/item.dmi differ
diff --git a/icons/inventory/suit/item_teshari.dmi b/icons/inventory/suit/item_teshari.dmi
index 5af0e7e500f..87649e0b25f 100644
Binary files a/icons/inventory/suit/item_teshari.dmi and b/icons/inventory/suit/item_teshari.dmi differ
diff --git a/icons/inventory/suit/mob.dmi b/icons/inventory/suit/mob.dmi
index 1b6a246d076..673a3de6749 100644
Binary files a/icons/inventory/suit/mob.dmi and b/icons/inventory/suit/mob.dmi differ
diff --git a/icons/inventory/suit/mob_digi.dmi b/icons/inventory/suit/mob_digi.dmi
index a1d021cec2d..23944186f97 100644
Binary files a/icons/inventory/suit/mob_digi.dmi and b/icons/inventory/suit/mob_digi.dmi differ
diff --git a/icons/inventory/suit/mob_unused.dmi b/icons/inventory/suit/mob_unused.dmi
new file mode 100644
index 00000000000..ddb1fcfe50e
Binary files /dev/null and b/icons/inventory/suit/mob_unused.dmi differ
diff --git a/icons/inventory/suit/taursuits_bnytr.dmi b/icons/inventory/suit/taursuits_bnytr.dmi
new file mode 100644
index 00000000000..73fe439b1a7
Binary files /dev/null and b/icons/inventory/suit/taursuits_bnytr.dmi differ
diff --git a/icons/inventory/suit/taursuits_cow.dmi b/icons/inventory/suit/taursuits_cow.dmi
new file mode 100644
index 00000000000..07d262ef7de
Binary files /dev/null and b/icons/inventory/suit/taursuits_cow.dmi differ
diff --git a/icons/inventory/suit/taursuits_deer.dmi b/icons/inventory/suit/taursuits_deer.dmi
new file mode 100644
index 00000000000..e9cdfe16b0d
Binary files /dev/null and b/icons/inventory/suit/taursuits_deer.dmi differ
diff --git a/icons/inventory/suit/taursuits_drake.dmi b/icons/inventory/suit/taursuits_drake.dmi
new file mode 100644
index 00000000000..2a2992e32fb
Binary files /dev/null and b/icons/inventory/suit/taursuits_drake.dmi differ
diff --git a/icons/inventory/suit/taursuits_feline.dmi b/icons/inventory/suit/taursuits_feline.dmi
new file mode 100644
index 00000000000..fdf4cfc0af5
Binary files /dev/null and b/icons/inventory/suit/taursuits_feline.dmi differ
diff --git a/icons/inventory/suit/taursuits_fox.dmi b/icons/inventory/suit/taursuits_fox.dmi
new file mode 100644
index 00000000000..1e1224f6594
Binary files /dev/null and b/icons/inventory/suit/taursuits_fox.dmi differ
diff --git a/icons/inventory/suit/taursuits_horse.dmi b/icons/inventory/suit/taursuits_horse.dmi
new file mode 100644
index 00000000000..b16800432f9
Binary files /dev/null and b/icons/inventory/suit/taursuits_horse.dmi differ
diff --git a/icons/inventory/suit/taursuits_husky.dmi b/icons/inventory/suit/taursuits_husky.dmi
new file mode 100644
index 00000000000..fca67b55bd1
Binary files /dev/null and b/icons/inventory/suit/taursuits_husky.dmi differ
diff --git a/icons/inventory/suit/taursuits_lizard.dmi b/icons/inventory/suit/taursuits_lizard.dmi
new file mode 100644
index 00000000000..1544bf3dd87
Binary files /dev/null and b/icons/inventory/suit/taursuits_lizard.dmi differ
diff --git a/icons/mob/taursuits_naga.dmi b/icons/inventory/suit/taursuits_naga.dmi
similarity index 100%
rename from icons/mob/taursuits_naga.dmi
rename to icons/inventory/suit/taursuits_naga.dmi
diff --git a/icons/mob/taursuits_naga_alt.dmi b/icons/inventory/suit/taursuits_naga_alt.dmi
similarity index 100%
rename from icons/mob/taursuits_naga_alt.dmi
rename to icons/inventory/suit/taursuits_naga_alt.dmi
diff --git a/icons/inventory/suit/taursuits_noodle.dmi b/icons/inventory/suit/taursuits_noodle.dmi
new file mode 100644
index 00000000000..b7ac494bda0
Binary files /dev/null and b/icons/inventory/suit/taursuits_noodle.dmi differ
diff --git a/icons/inventory/suit/taursuits_otie.dmi b/icons/inventory/suit/taursuits_otie.dmi
new file mode 100644
index 00000000000..370395430a9
Binary files /dev/null and b/icons/inventory/suit/taursuits_otie.dmi differ
diff --git a/icons/inventory/suit/taursuits_rat.dmi b/icons/inventory/suit/taursuits_rat.dmi
new file mode 100644
index 00000000000..bf2090837c9
Binary files /dev/null and b/icons/inventory/suit/taursuits_rat.dmi differ
diff --git a/icons/inventory/suit/taursuits_redpanda.dmi b/icons/inventory/suit/taursuits_redpanda.dmi
new file mode 100644
index 00000000000..28ac3625767
Binary files /dev/null and b/icons/inventory/suit/taursuits_redpanda.dmi differ
diff --git a/icons/inventory/suit/taursuits_scoli.dmi b/icons/inventory/suit/taursuits_scoli.dmi
new file mode 100644
index 00000000000..e26c41d43a2
Binary files /dev/null and b/icons/inventory/suit/taursuits_scoli.dmi differ
diff --git a/icons/inventory/suit/taursuits_sergal.dmi b/icons/inventory/suit/taursuits_sergal.dmi
new file mode 100644
index 00000000000..6c1ed3615e5
Binary files /dev/null and b/icons/inventory/suit/taursuits_sergal.dmi differ
diff --git a/icons/inventory/suit/taursuits_skunk.dmi b/icons/inventory/suit/taursuits_skunk.dmi
new file mode 100644
index 00000000000..d377e70042d
Binary files /dev/null and b/icons/inventory/suit/taursuits_skunk.dmi differ
diff --git a/icons/inventory/suit/taursuits_sloog.dmi b/icons/inventory/suit/taursuits_sloog.dmi
new file mode 100644
index 00000000000..18cbfd7c96e
Binary files /dev/null and b/icons/inventory/suit/taursuits_sloog.dmi differ
diff --git a/icons/inventory/suit/taursuits_snowflake.dmi b/icons/inventory/suit/taursuits_snowflake.dmi
new file mode 100644
index 00000000000..e11bf84c912
Binary files /dev/null and b/icons/inventory/suit/taursuits_snowflake.dmi differ
diff --git a/icons/mob/taursuits_spider.dmi b/icons/inventory/suit/taursuits_spider.dmi
similarity index 100%
rename from icons/mob/taursuits_spider.dmi
rename to icons/inventory/suit/taursuits_spider.dmi
diff --git a/icons/inventory/suit/taursuits_wolf.dmi b/icons/inventory/suit/taursuits_wolf.dmi
new file mode 100644
index 00000000000..53af8a62697
Binary files /dev/null and b/icons/inventory/suit/taursuits_wolf.dmi differ
diff --git a/icons/inventory/suit/taursuits_zorgoia.dmi b/icons/inventory/suit/taursuits_zorgoia.dmi
new file mode 100644
index 00000000000..b1068284269
Binary files /dev/null and b/icons/inventory/suit/taursuits_zorgoia.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/README.md b/icons/mob/human_races/sprite_accessories/README.md
new file mode 100644
index 00000000000..7ef1676671b
--- /dev/null
+++ b/icons/mob/human_races/sprite_accessories/README.md
@@ -0,0 +1,9 @@
+Looking to add a new tail? Issue with one?
+
+Due to limitations with Byond, we have to essentially copypasta all tail sections to avoid ghosts or layering issues. The current overlay system expects all four directions to be present and on the same layer. If you try to force a north only, but your sprite still contains all four directionals, then they'll be all four directions. And so, only the exposed tail markings will be shown.
+
+Yes it's very silly but it was tried so many times to only get the north face of the main sprite to lay atop of things...
+
+Tailsocks layer on top of tails. Suits without a tailsock will apply their markings and still layer over clothing. HIDETAIL clothing tag is removed as a result of these changes, the verb to hide your tail works anyway if that's your choice!
+
+Snowflake colored tails (usually do_coloration = FALSE ones) need to have a whitescaled version of themselves added appended with _sock, as well as tailsock_iconstate = "[icon_state]_sock" in order to properly get a unique, tailsock colorized overlay. Tailmaws are another example, they've been given little space suit bubble helmets!
diff --git a/icons/mob/human_races/sprite_accessories/tails/not_tail_legs.dmi b/icons/mob/human_races/sprite_accessories/tails/not_tail_legs.dmi
index 1704b042a43..c1c6d6b5530 100644
Binary files a/icons/mob/human_races/sprite_accessories/tails/not_tail_legs.dmi and b/icons/mob/human_races/sprite_accessories/tails/not_tail_legs.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/tails/tails_animal.dmi b/icons/mob/human_races/sprite_accessories/tails/tails_animal.dmi
index cc63d30fd18..132658bd24e 100644
Binary files a/icons/mob/human_races/sprite_accessories/tails/tails_animal.dmi and b/icons/mob/human_races/sprite_accessories/tails/tails_animal.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/tails/tails_bug.dmi b/icons/mob/human_races/sprite_accessories/tails/tails_bug.dmi
index b18ee1fd4fd..c8231f323dd 100644
Binary files a/icons/mob/human_races/sprite_accessories/tails/tails_bug.dmi and b/icons/mob/human_races/sprite_accessories/tails/tails_bug.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/tails/tails_exotic.dmi b/icons/mob/human_races/sprite_accessories/tails/tails_exotic.dmi
index 7d981ea65a1..1e883904b4b 100644
Binary files a/icons/mob/human_races/sprite_accessories/tails/tails_exotic.dmi and b/icons/mob/human_races/sprite_accessories/tails/tails_exotic.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/tails/tails_long.dmi b/icons/mob/human_races/sprite_accessories/tails/tails_long.dmi
index 26bea3e70e9..bae0a202724 100644
Binary files a/icons/mob/human_races/sprite_accessories/tails/tails_long.dmi and b/icons/mob/human_races/sprite_accessories/tails/tails_long.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/tails/tails_reptile.dmi b/icons/mob/human_races/sprite_accessories/tails/tails_reptile.dmi
index f066c8a0745..f32d9789628 100644
Binary files a/icons/mob/human_races/sprite_accessories/tails/tails_reptile.dmi and b/icons/mob/human_races/sprite_accessories/tails/tails_reptile.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/tails/tails_snowflake.dmi b/icons/mob/human_races/sprite_accessories/tails/tails_snowflake.dmi
index 3363d8cd62f..75572a1c9ed 100644
Binary files a/icons/mob/human_races/sprite_accessories/tails/tails_snowflake.dmi and b/icons/mob/human_races/sprite_accessories/tails/tails_snowflake.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/tails/tails_synth.dmi b/icons/mob/human_races/sprite_accessories/tails/tails_synth.dmi
index 045946929e0..e83c082641c 100644
Binary files a/icons/mob/human_races/sprite_accessories/tails/tails_synth.dmi and b/icons/mob/human_races/sprite_accessories/tails/tails_synth.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/tails/tails_teshari.dmi b/icons/mob/human_races/sprite_accessories/tails/tails_teshari.dmi
index 78fff086001..7a0130ce09a 100644
Binary files a/icons/mob/human_races/sprite_accessories/tails/tails_teshari.dmi and b/icons/mob/human_races/sprite_accessories/tails/tails_teshari.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/taurs/taur_socks.dmi b/icons/mob/human_races/sprite_accessories/taurs/taur_socks.dmi
new file mode 100644
index 00000000000..ebed58cf8a2
Binary files /dev/null and b/icons/mob/human_races/sprite_accessories/taurs/taur_socks.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi b/icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi
index a8db3ca9a19..15684c57d45 100644
Binary files a/icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi and b/icons/mob/human_races/sprite_accessories/taurs/taurs_animal.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi b/icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi
index c15c56e959d..2a98d3587ba 100644
Binary files a/icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi and b/icons/mob/human_races/sprite_accessories/taurs/taurs_exotic.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/taurs/taurs_reptile.dmi b/icons/mob/human_races/sprite_accessories/taurs/taurs_reptile.dmi
index 88b0b3765d0..0cb79956faa 100644
Binary files a/icons/mob/human_races/sprite_accessories/taurs/taurs_reptile.dmi and b/icons/mob/human_races/sprite_accessories/taurs/taurs_reptile.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/taurs/taurs_snowflake.dmi b/icons/mob/human_races/sprite_accessories/taurs/taurs_snowflake.dmi
index 217d92ff748..66b19b20c5c 100644
Binary files a/icons/mob/human_races/sprite_accessories/taurs/taurs_snowflake.dmi and b/icons/mob/human_races/sprite_accessories/taurs/taurs_snowflake.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi b/icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi
index 8824df3d334..90e2e228724 100644
Binary files a/icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi and b/icons/mob/human_races/sprite_accessories/taurs/taurs_synth.dmi differ
diff --git a/icons/mob/human_races/sprite_accessories/taurs/taurs_teshari.dmi b/icons/mob/human_races/sprite_accessories/taurs/taurs_teshari.dmi
index 49d1a5ded0c..99c95581a5b 100644
Binary files a/icons/mob/human_races/sprite_accessories/taurs/taurs_teshari.dmi and b/icons/mob/human_races/sprite_accessories/taurs/taurs_teshari.dmi differ
diff --git a/icons/mob/taursuits_cow.dmi b/icons/mob/taursuits_cow.dmi
deleted file mode 100644
index 5ca5ebda39b..00000000000
Binary files a/icons/mob/taursuits_cow.dmi and /dev/null differ
diff --git a/icons/mob/taursuits_deer.dmi b/icons/mob/taursuits_deer.dmi
deleted file mode 100644
index 6c53a6f4d09..00000000000
Binary files a/icons/mob/taursuits_deer.dmi and /dev/null differ
diff --git a/icons/mob/taursuits_drake.dmi b/icons/mob/taursuits_drake.dmi
deleted file mode 100644
index ca0db57532f..00000000000
Binary files a/icons/mob/taursuits_drake.dmi and /dev/null differ
diff --git a/icons/mob/taursuits_drake_ch.dmi b/icons/mob/taursuits_drake_ch.dmi
deleted file mode 100644
index e4271405714..00000000000
Binary files a/icons/mob/taursuits_drake_ch.dmi and /dev/null differ
diff --git a/icons/mob/taursuits_horse.dmi b/icons/mob/taursuits_horse.dmi
deleted file mode 100644
index 95b613d426b..00000000000
Binary files a/icons/mob/taursuits_horse.dmi and /dev/null differ
diff --git a/icons/mob/taursuits_lizard.dmi b/icons/mob/taursuits_lizard.dmi
deleted file mode 100644
index a6b9858f177..00000000000
Binary files a/icons/mob/taursuits_lizard.dmi and /dev/null differ
diff --git a/icons/mob/taursuits_lizard_ch.dmi b/icons/mob/taursuits_lizard_ch.dmi
deleted file mode 100644
index f4385ef1130..00000000000
Binary files a/icons/mob/taursuits_lizard_ch.dmi and /dev/null differ
diff --git a/icons/mob/taursuits_noodle.dmi b/icons/mob/taursuits_noodle.dmi
deleted file mode 100644
index 0917630a462..00000000000
Binary files a/icons/mob/taursuits_noodle.dmi and /dev/null differ
diff --git a/icons/mob/taursuits_otie.dmi b/icons/mob/taursuits_otie.dmi
deleted file mode 100644
index 06e083854ea..00000000000
Binary files a/icons/mob/taursuits_otie.dmi and /dev/null differ
diff --git a/icons/mob/taursuits_wolf.dmi b/icons/mob/taursuits_wolf.dmi
deleted file mode 100644
index 68495a9e4bc..00000000000
Binary files a/icons/mob/taursuits_wolf.dmi and /dev/null differ
diff --git a/icons/rogue-star/tails_64x32_rs.dmi b/icons/rogue-star/tails_64x32_rs.dmi
index 5c6745f95ee..059f175816c 100644
Binary files a/icons/rogue-star/tails_64x32_rs.dmi and b/icons/rogue-star/tails_64x32_rs.dmi differ
diff --git a/tools/TaurClothingCutter/CoatCutter.dmi b/tools/TaurClothingCutter/CoatCutter.dmi
new file mode 100644
index 00000000000..734d47a6b63
Binary files /dev/null and b/tools/TaurClothingCutter/CoatCutter.dmi differ
diff --git a/tools/TaurClothingCutter/DressCutter.dmi b/tools/TaurClothingCutter/DressCutter.dmi
new file mode 100644
index 00000000000..fa04927e4ab
Binary files /dev/null and b/tools/TaurClothingCutter/DressCutter.dmi differ
diff --git a/tools/TaurClothingCutter/LongCoatCutter.dmi b/tools/TaurClothingCutter/LongCoatCutter.dmi
new file mode 100644
index 00000000000..773cf09b4fc
Binary files /dev/null and b/tools/TaurClothingCutter/LongCoatCutter.dmi differ
diff --git a/tools/TaurClothingCutter/LongDressCutter.dmi b/tools/TaurClothingCutter/LongDressCutter.dmi
new file mode 100644
index 00000000000..7ce329f269e
Binary files /dev/null and b/tools/TaurClothingCutter/LongDressCutter.dmi differ
diff --git a/tools/TaurClothingCutter/LongSuitCutter.dmi b/tools/TaurClothingCutter/LongSuitCutter.dmi
new file mode 100644
index 00000000000..3dbf59763c6
Binary files /dev/null and b/tools/TaurClothingCutter/LongSuitCutter.dmi differ
diff --git a/tools/TaurClothingCutter/SingleCutter.dmi b/tools/TaurClothingCutter/SingleCutter.dmi
new file mode 100644
index 00000000000..8bf7796da60
Binary files /dev/null and b/tools/TaurClothingCutter/SingleCutter.dmi differ
diff --git a/tools/TaurClothingCutter/SuitCutter.dmi b/tools/TaurClothingCutter/SuitCutter.dmi
new file mode 100644
index 00000000000..5b4b476701b
Binary files /dev/null and b/tools/TaurClothingCutter/SuitCutter.dmi differ
diff --git a/tools/TaurClothingCutter/Taur Templates/LongCutTemplate.png b/tools/TaurClothingCutter/Taur Templates/LongCutTemplate.png
new file mode 100644
index 00000000000..0ff4e7851cf
Binary files /dev/null and b/tools/TaurClothingCutter/Taur Templates/LongCutTemplate.png differ
diff --git a/tools/TaurClothingCutter/Taur Templates/ShortCutTemplate.png b/tools/TaurClothingCutter/Taur Templates/ShortCutTemplate.png
new file mode 100644
index 00000000000..bfb131ca6a3
Binary files /dev/null and b/tools/TaurClothingCutter/Taur Templates/ShortCutTemplate.png differ
diff --git a/tools/TaurClothingCutter/Taur Templates/taur_coats_template.dmi b/tools/TaurClothingCutter/Taur Templates/taur_coats_template.dmi
new file mode 100644
index 00000000000..79b72e630a5
Binary files /dev/null and b/tools/TaurClothingCutter/Taur Templates/taur_coats_template.dmi differ
diff --git a/tools/TaurClothingCutter/Taur Templates/taur_dresses_template.dmi b/tools/TaurClothingCutter/Taur Templates/taur_dresses_template.dmi
new file mode 100644
index 00000000000..2ffaa024d76
Binary files /dev/null and b/tools/TaurClothingCutter/Taur Templates/taur_dresses_template.dmi differ
diff --git a/tools/TaurClothingCutter/Taur Templates/taur_fullsuit_template.dmi b/tools/TaurClothingCutter/Taur Templates/taur_fullsuit_template.dmi
new file mode 100644
index 00000000000..94a1bc0a41d
Binary files /dev/null and b/tools/TaurClothingCutter/Taur Templates/taur_fullsuit_template.dmi differ
diff --git a/tools/TaurClothingCutter/TaurClothing.md b/tools/TaurClothingCutter/TaurClothing.md
new file mode 100644
index 00000000000..aaad0f8341e
--- /dev/null
+++ b/tools/TaurClothingCutter/TaurClothing.md
@@ -0,0 +1,35 @@
+This small Byond program takes all the icons in SpritesToSnip.dmi,
+cuts them using all the icons in Taur_Cutter.dmi, and produces a file save
+dialog for you to download the resulting DMI.
+
+Useful for cutting up species sprites from full body ones. Or whatever else.
+
+--Arokha/Aronai
+
+
+-- Hijacked by Poojawa to facilitate easier sprite porting -> tauric sprites.
+
+Taur suits have been divided into three different categories: Coats, Dresses, and fullsuits. These are found in suitstocovert folders. Please adhere to the general sorting that's been done already when adding new clothing.
+
+Standard folder contains the sprites compatible with Wolf, Fox, Horse, Cow, Deer, Lizard, Skunk, Red Panda (Wah), Sergal, and Feline bodies. For Otie, 'Goia, Noodle, Drake, and Rat bodies, these body types require the 'Long' sprite variants that look absolutely fucking awful if further stretched in the base sprites. If you're doing Otie specific, you'll want to copy/paste the north facing version from your short body sprites onto the long body one. Otie's north facing isn't as tall as rat or noodle's are, so that'll be a thing.
+
+Currently the only body types the sprites are really designed for are ones based off of the Canine, Feline, and to some extent lizard bodies. The fat versions of sprites have a special sock overlay and don't need to be custom edited unless the legs themselves are changed. All other sprites theoretically can be used, but will take significant work to bueautify them. See more with the unsuitable note below
+
+There's taur templates of each type too found in the Taur Templates folder, Most of them have a large purple mask applied for special exceptions of suits that 'spill over' the human sprite (Imperium Monk robe, Wedding gown, etc), Everything inside of this mask and the sprite itself will be used to 'snip out' the needed pixels, so keep that in mind! Copy and paste each species template sprites into their respective Cutter.dmi. Only one at a time! Each of CoatCutter, DressCutter, SuitCutter should have the one species inside of it, so Wolf, Wolf, Wolf. Etc.
+
+Also included in this folder are two png templates for your preferred sprite editing software. Save time by seeing exactly where the stray pixels are in each body! This saves SO MUCH TIME.
+
+In Dreammaker -> Build -> Compile and Run -> Cut . The default for Cut Suits is taursuit_.dmi so you can save your species in as taursuit_[species] and go. Cut Dresses and Cut Coats will save into their own files. Long Cut is the same, it just uses the long subfolder instead of the standard one.
+
+Once all three are done, please ensure to combine them all into your species specific dmi, Preferrably Suits + Coats + Dresses for consistency in sorting. Remember to close the client when you're done! You won't be able to recompile the cutter in dream maker otherwise. That's the solution to 'x.dmi cannot be found' errors. Bedsheet.dmi is seperate because it's so goofy oversized that it works as a one-size fits all, so just copy that in after you paste the dresses in.
+
+If the species is in taursuits_unsuitable.dmi then they won't get the benefits of these suit cutters. That'll take changing in their sprite_accessories_taur.dm listing. It's an all-or-nothing type overhaul, so you'll need every listed suit in that species' suit file. Yes I'm aware of how daunting it is. Fortunately the "sock" template for them can be used to get a reasonable head start, but you'll still be suffering from a lot of work to fix each non standard body. Each Taur body is a little over 400 seperate suit icons, with 4 states each totalling around 1,600 suit icons each, multiplied by however many animation frames in the icon as well (The nasa suit is 16 total, the comic coat is 48 !!). Of course, a fourth of those are just flipped East/West facing, so you're *only* having do deal with ~1,200 of 'em!
+
+In addition to this, tails are given socks as well, so you don't need to model them, just make sure the tail's added! It will overlay over the suit icon if applicable, for space suits and the like.
+
+Cut Taurs is if you're just doing a limited run of one suit type icon, you can throw all the relevant species into the relevant cutter, the resulting file will contain all tauric versions of your clothing item after cutout. Avoid doing this with the major ones. You will never be able to sort them out with any sanity!
+
+If You're porting a new taur entirely:
+Be sure to add pixel padding, the assembled human sprite has some. The purple outline is the padding. This accounts for stuff like armor vests or heavier coats/suits. You'll want enough clothing pixels to work with to follow up and edit!
+
+It would be helpful if you 'build' a four directional template sprite for use as an overlay for alignment as well, just export a template as a png! Some taur bodies have weird spine positions, or legs that stick out a bit too much, etc. It is what it is.
\ No newline at end of file
diff --git a/tools/TaurClothingCutter/TaurClothingCutter.dm b/tools/TaurClothingCutter/TaurClothingCutter.dm
new file mode 100644
index 00000000000..e5c67a790bf
--- /dev/null
+++ b/tools/TaurClothingCutter/TaurClothingCutter.dm
@@ -0,0 +1,289 @@
+/*
+ These are simple defaults for your project.
+ */
+
+world
+ fps = 25 // 25 frames per second
+ icon_size = 32 // 32x32 icon size by default
+
+ view = 6 // show up to 6 tiles outward from center (13x13 view)
+
+
+// Make objects move 8 pixels per tick when walking
+//usr << ftp(usr.working,"[usr.outfile].dmi")
+mob
+ step_size = 8
+
+obj
+ step_size = 8
+
+
+/client/verb/suit_split()
+ set name = "Cut Suits"
+ set desc = "Loads fullsuits.dmi and cuts them with SuitCutter.dmi"
+ set category = "Cut Standard"
+
+ //Our clothes
+ var/icon/SuitsToSnip = icon('suitstocovert/standard/fullsuits.dmi')
+
+ //Our Species specific cutter icons
+ var/icon/SuitCutter = icon('SuitCutter.dmi')
+
+ //For each original project, batch it!
+ for(var/CutterState in icon_states(SuitCutter))
+ var/icon/RunningOutput = new ()
+ for(var/SuitState in icon_states(SuitsToSnip))
+ //Our default to cut out from's state
+ var/icon/Original = icon(SuitsToSnip,SuitState)
+ //Our cookie cutter form
+ var/icon/Cutter = icon(SuitCutter,CutterState)
+
+ //We have to make these all black to cut with
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+
+ //Blend with AND to cut
+ Original.Blend(Cutter,ICON_AND) //AND, not ADD
+
+ //Make a useful name, ideally we want to keep the same name to avoid headaches later.
+ var/good_name = "[SuitState]"
+
+ //Add to the output with the good name
+ RunningOutput.Insert(Original,good_name)
+ //Give the output. dmis get overwritten when exported to. So break up your saves in sequence and then import them all into the main file.
+ usr << ftp(RunningOutput,"taursuits_[CutterState].dmi")
+
+// Lazy duplicate verbs to cut down on micro requirements. Just copy/paste the species into each cutter file, all wolf, all fox, etc.
+/client/verb/coat_split()
+ set name = "Cut Coats"
+ set desc = "Loads coats.dmi and cuts them with CoatCutter.dmi"
+ set category = "Cut Standard"
+
+ var/icon/CoatsToSnip = icon('suitstocovert/standard/coats.dmi')
+ var/icon/CoatCutter = icon('CoatCutter.dmi')
+
+ for(var/CutterState in icon_states(CoatCutter))
+ var/icon/RunningOutput = new ()
+ for(var/CoatState in icon_states(CoatsToSnip))
+ var/icon/Original = icon(CoatsToSnip,CoatState)
+ var/icon/Cutter = icon(CoatCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[CoatState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_coats.dmi")
+
+/client/verb/dress_split()
+ set name = "Cut Dresses"
+ set desc = "Loads dresses.dmi and cuts them with DressCutter.dmi"
+ set category = "Cut Standard"
+
+ var/icon/DressesToSnip = icon('suitstocovert/standard/dresses.dmi')
+ var/icon/DressCutter = icon('DressCutter.dmi')
+
+ for(var/CutterState in icon_states(DressCutter))
+ var/icon/RunningOutput = new ()
+ for(var/DressState in icon_states(DressesToSnip))
+ var/icon/Original = icon(DressesToSnip,DressState)
+ var/icon/Cutter = icon(DressCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[DressState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_dresses.dmi")
+
+/client/verb/lsuit_split()
+ set name = "Long Cut Suits"
+ set desc = "Loads long fullsuit.dmi and cuts them with SuitCutter.dmi"
+ set category = "Long Cut"
+
+ var/icon/SuitsToSnip = icon('suitstocovert/long/fullsuits.dmi')
+ var/icon/SuitCutter = icon('LongSuitCutter.dmi')
+
+ for(var/CutterState in icon_states(SuitCutter))
+ var/icon/RunningOutput = new ()
+ for(var/SuitState in icon_states(SuitsToSnip))
+ var/icon/Original = icon(SuitsToSnip,SuitState)
+ var/icon/Cutter = icon(SuitCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[SuitState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"taursuits_[CutterState].dmi")
+
+/client/verb/lcoat_split()
+ set name = "Long Cut Coats"
+ set desc = "Loads long coats.dmi and cuts them with CoatCutter.dmi"
+ set category = "Long Cut"
+
+ var/icon/CoatsToSnip = icon('suitstocovert/long/coats.dmi')
+ var/icon/CoatCutter = icon('LongCoatCutter.dmi')
+
+ for(var/CutterState in icon_states(CoatCutter))
+ var/icon/RunningOutput = new ()
+ for(var/CoatState in icon_states(CoatsToSnip))
+ var/icon/Original = icon(CoatsToSnip,CoatState)
+ var/icon/Cutter = icon(CoatCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[CoatState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_coats.dmi")
+
+/client/verb/ldress_split()
+ set name = "Long Cut Dresses"
+ set desc = "Loads long dresses.dmi and cuts them with DressCutter.dmi"
+ set category = "Long Cut"
+
+ var/icon/DressesToSnip = icon('suitstocovert/long/dresses.dmi')
+ var/icon/DressCutter = icon('LongDressCutter.dmi')
+
+ for(var/CutterState in icon_states(DressCutter))
+ var/icon/RunningOutput = new ()
+ for(var/DressState in icon_states(DressesToSnip))
+ var/icon/Original = icon(DressesToSnip,DressState)
+ var/icon/Cutter = icon(DressCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[DressState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_dresses.dmi")
+
+//Single Split
+/client/verb/single_outfit_split()
+ set name = "Cut Single Outfit"
+ set desc = "Loads singleoutfit.dmi and cuts them with SingleCutter.dmi"
+ set category = "Cut Single"
+
+ var/icon/SuitsToSnip = icon('suitstocovert/singleoutfit.dmi')
+ var/icon/SingleCutter = icon('SingleCutter.dmi')
+
+ for(var/CutterState in icon_states(SingleCutter))
+ var/icon/RunningOutput = new ()
+ for(var/SuitState in icon_states(SuitsToSnip))
+ var/icon/Original = icon(SuitsToSnip,SuitState)
+ var/icon/Cutter = icon(SingleCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[SuitState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_outfit.dmi")
+
+//Single Suit
+
+/client/verb/single_suit_split()
+ set name = "Cut Single Suit"
+ set desc = "Loads singleoutfit.dmi and cuts them with SuitCutter.dmi"
+ set category = "Cut Single"
+
+ var/icon/SuitsToSnip = icon('suitstocovert/singleoutfit.dmi')
+ var/icon/SuitCutter = icon('SuitCutter.dmi')
+
+ for(var/CutterState in icon_states(SuitCutter))
+ var/icon/RunningOutput = new ()
+ for(var/SuitState in icon_states(SuitsToSnip))
+ var/icon/Original = icon(SuitsToSnip,SuitState)
+ var/icon/Cutter = icon(SuitCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[SuitState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_suit.dmi")
+
+/client/verb/lsingle_suit_split()
+ set name = "Cut Single Long Suit"
+ set desc = "Loads singleoutfit.dmi and cuts them with LongSuitCutter.dmi"
+ set category = "Cut Single"
+
+ var/icon/SuitsToSnip = icon('suitstocovert/singleoutfit.dmi')
+ var/icon/SuitCutter = icon('LongSuitCutter.dmi')
+
+ for(var/CutterState in icon_states(SuitCutter))
+ var/icon/RunningOutput = new ()
+ for(var/SuitState in icon_states(SuitsToSnip))
+ var/icon/Original = icon(SuitsToSnip,SuitState)
+ var/icon/Cutter = icon(SuitCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[SuitState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_suit.dmi")
+
+//Single Coat
+
+/client/verb/single_coat_split()
+ set name = "Cut Single Coat"
+ set desc = "Loads singleoutfit.dmi and cuts them with CoatCutter.dmi"
+ set category = "Cut Single"
+
+ var/icon/CoatsToSnip = icon('suitstocovert/singleoutfit.dmi')
+ var/icon/CoatCutter = icon('CoatCutter.dmi')
+
+ for(var/CutterState in icon_states(CoatCutter))
+ var/icon/RunningOutput = new ()
+ for(var/CoatState in icon_states(CoatsToSnip))
+ var/icon/Original = icon(CoatsToSnip,CoatState)
+ var/icon/Cutter = icon(CoatCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[CoatState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_coat.dmi")
+
+/client/verb/lsingle_coat_split()
+ set name = "Cut Single Long Coat"
+ set desc = "Loads singleoutfit.dmi and cuts them with LongCoatCutter.dmi"
+ set category = "Cut Single"
+
+ var/icon/CoatsToSnip = icon('suitstocovert/singleoutfit.dmi')
+ var/icon/CoatCutter = icon('LongCoatCutter.dmi')
+
+ for(var/CutterState in icon_states(CoatCutter))
+ var/icon/RunningOutput = new ()
+ for(var/CoatState in icon_states(CoatsToSnip))
+ var/icon/Original = icon(CoatsToSnip,CoatState)
+ var/icon/Cutter = icon(CoatCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[CoatState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_coat.dmi")
+
+//Single Dress
+
+/client/verb/single_dress_split()
+ set name = "Cut Single Dress"
+ set desc = "Loads singleoutfit.dmi and cuts them with DressCutter.dmi"
+ set category = "Cut Single"
+
+ var/icon/DressToSnip = icon('suitstocovert/singleoutfit.dmi')
+ var/icon/DressCutter = icon('DressCutter.dmi')
+
+ for(var/CutterState in icon_states(DressCutter))
+ var/icon/RunningOutput = new ()
+ for(var/DressState in icon_states(DressToSnip))
+ var/icon/Original = icon(DressToSnip,DressState)
+ var/icon/Cutter = icon(DressCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[DressState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_dress.dmi")
+
+/client/verb/lsingle_dress_split()
+ set name = "Cut Single Long Dress"
+ set desc = "Loads singleoutfit.dmi and cuts them with LongDressCutter.dmi"
+ set category = "Cut Single"
+
+ var/icon/DressToSnip = icon('suitstocovert/singleoutfit.dmi')
+ var/icon/DressCutter = icon('LongDressCutter.dmi')
+
+ for(var/CutterState in icon_states(DressCutter))
+ var/icon/RunningOutput = new ()
+ for(var/DressState in icon_states(DressToSnip))
+ var/icon/Original = icon(DressToSnip,DressState)
+ var/icon/Cutter = icon(DressCutter,CutterState)
+ Cutter.Blend(rgb(0,0,0),ICON_MULTIPLY)
+ Original.Blend(Cutter,ICON_AND)
+ var/good_name = "[DressState]"
+ RunningOutput.Insert(Original,good_name)
+ usr << ftp(RunningOutput,"[CutterState]_dress.dmi")
diff --git a/tools/TaurClothingCutter/TaurClothingCutter.dme b/tools/TaurClothingCutter/TaurClothingCutter.dme
new file mode 100644
index 00000000000..2581677912e
--- /dev/null
+++ b/tools/TaurClothingCutter/TaurClothingCutter.dme
@@ -0,0 +1,18 @@
+// DM Environment file for TaurClothingCutter.dme.
+// All manual changes should be made outside the BEGIN_ and END_ blocks.
+// New source code should be placed in .dm files: choose File/New --> Code File.
+
+// BEGIN_INTERNALS
+// END_INTERNALS
+
+// BEGIN_FILE_DIR
+#define FILE_DIR .
+// END_FILE_DIR
+
+// BEGIN_PREFERENCES
+// END_PREFERENCES
+
+// BEGIN_INCLUDE
+#include "TaurClothingCutter.dm"
+// END_INCLUDE
+
diff --git a/tools/TaurClothingCutter/suitstocovert/long/bedsheet.dmi b/tools/TaurClothingCutter/suitstocovert/long/bedsheet.dmi
new file mode 100644
index 00000000000..cdf3144c35b
Binary files /dev/null and b/tools/TaurClothingCutter/suitstocovert/long/bedsheet.dmi differ
diff --git a/tools/TaurClothingCutter/suitstocovert/long/coats.dmi b/tools/TaurClothingCutter/suitstocovert/long/coats.dmi
new file mode 100644
index 00000000000..292b3a0c4bf
Binary files /dev/null and b/tools/TaurClothingCutter/suitstocovert/long/coats.dmi differ
diff --git a/tools/TaurClothingCutter/suitstocovert/long/dresses.dmi b/tools/TaurClothingCutter/suitstocovert/long/dresses.dmi
new file mode 100644
index 00000000000..c9a45e0103b
Binary files /dev/null and b/tools/TaurClothingCutter/suitstocovert/long/dresses.dmi differ
diff --git a/tools/TaurClothingCutter/suitstocovert/long/fullsuits.dmi b/tools/TaurClothingCutter/suitstocovert/long/fullsuits.dmi
new file mode 100644
index 00000000000..db27ff05588
Binary files /dev/null and b/tools/TaurClothingCutter/suitstocovert/long/fullsuits.dmi differ
diff --git a/tools/TaurClothingCutter/suitstocovert/singleoutfit.dmi b/tools/TaurClothingCutter/suitstocovert/singleoutfit.dmi
new file mode 100644
index 00000000000..f126381c8b1
Binary files /dev/null and b/tools/TaurClothingCutter/suitstocovert/singleoutfit.dmi differ
diff --git a/tools/TaurClothingCutter/suitstocovert/standard/bedsheet.dmi b/tools/TaurClothingCutter/suitstocovert/standard/bedsheet.dmi
new file mode 100644
index 00000000000..9fbf4a7ad70
Binary files /dev/null and b/tools/TaurClothingCutter/suitstocovert/standard/bedsheet.dmi differ
diff --git a/tools/TaurClothingCutter/suitstocovert/standard/coats.dmi b/tools/TaurClothingCutter/suitstocovert/standard/coats.dmi
new file mode 100644
index 00000000000..5f6c3d83358
Binary files /dev/null and b/tools/TaurClothingCutter/suitstocovert/standard/coats.dmi differ
diff --git a/tools/TaurClothingCutter/suitstocovert/standard/dresses.dmi b/tools/TaurClothingCutter/suitstocovert/standard/dresses.dmi
new file mode 100644
index 00000000000..ce196c94a59
Binary files /dev/null and b/tools/TaurClothingCutter/suitstocovert/standard/dresses.dmi differ
diff --git a/tools/TaurClothingCutter/suitstocovert/standard/fullsuits.dmi b/tools/TaurClothingCutter/suitstocovert/standard/fullsuits.dmi
new file mode 100644
index 00000000000..ed274fb71b4
Binary files /dev/null and b/tools/TaurClothingCutter/suitstocovert/standard/fullsuits.dmi differ
diff --git a/tools/TaurClothingCutter/suitstocovert/suit_flares.dmi b/tools/TaurClothingCutter/suitstocovert/suit_flares.dmi
new file mode 100644
index 00000000000..5909946a9b1
Binary files /dev/null and b/tools/TaurClothingCutter/suitstocovert/suit_flares.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 06ac2301ddb..0a38cdff4fc 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2580,6 +2580,7 @@
#include "code\modules\clothing\clothing_accessories.dm"
#include "code\modules\clothing\clothing_icons.dm"
#include "code\modules\clothing\clothing_vr.dm"
+#include "code\modules\clothing\tail_sock.dm"
#include "code\modules\clothing\accessories\accessory.dm"
#include "code\modules\clothing\accessories\accessory_vr.dm"
#include "code\modules\clothing\accessories\altevian_vr.dm"