From f842ddbf7ac6da5a1e7a03dcadc41f650d269ee6 Mon Sep 17 00:00:00 2001 From: Danny Kay Date: Wed, 3 Sep 2025 15:17:12 -0700 Subject: [PATCH 1/2] tail --- .../Mobs/Customization/markings/tail_example.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/tail_example.yml diff --git a/Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/tail_example.yml b/Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/tail_example.yml new file mode 100644 index 00000000000..45baa24f04c --- /dev/null +++ b/Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/tail_example.yml @@ -0,0 +1,14 @@ +# Hi Jess! This is an example of how to make a tail marking. +# In this file we will show how to make two different kinds of tail markings: +# 1. A simple tail marking that uses the old system (please dont use this) +# 2. A more complex tail marking that uses the new system (recommended) +# This process involves three files: +# 1. The .yml file (this file) which defines the marking and its properties +# 2. The .rsi file which contains the sprites for the marking +# 3. The .ftl file which contains the text to show in the customization menu +# You will need to make all three files for your marking to work properly. +# This file will focus on the .yml file, but I will briefly explain the other two files as well. + + + + From b2c0667fac75b1a90a484663b4ec50d81a757326 Mon Sep 17 00:00:00 2001 From: Danny Kay Date: Wed, 3 Sep 2025 16:58:41 -0700 Subject: [PATCH 2/2] tail --- .../Locale/en-US/_COYOTE/tail_example.ftl | 58 ++++++++ Resources/Locale/en-US/_Floof/anthro.ftl | 14 +- .../Customization/Markings/tail_example.yml | 135 ++++++++++++++++++ .../Customization/markings/anthro_tails.yml | 68 ++++----- .../Customization/markings/tail_example.yml | 14 -- 5 files changed, 232 insertions(+), 57 deletions(-) create mode 100644 Resources/Locale/en-US/_COYOTE/tail_example.ftl create mode 100644 Resources/Prototypes/_COYOTE/Entities/Mobs/Customization/Markings/tail_example.yml delete mode 100644 Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/tail_example.yml diff --git a/Resources/Locale/en-US/_COYOTE/tail_example.ftl b/Resources/Locale/en-US/_COYOTE/tail_example.ftl new file mode 100644 index 00000000000..50fbfe1411a --- /dev/null +++ b/Resources/Locale/en-US/_COYOTE/tail_example.ftl @@ -0,0 +1,58 @@ +# Hi Jess! This is an example of how to make a tail marking. +# In this file we will show how to make two different kinds of tail markings: +# 1. A simple tail marking that uses the old system (please dont use this) +# 2. A more complex tail marking that uses the new system (recommended) +# This process involves three files: +# 1. The .yml file (this file) which defines the marking and its properties +# 2. The .rsi file which contains the sprites for the marking +# 3. The .ftl file which contains the text to show in the customization menu +# You will need to make all three files for your marking to work properly. +# This file will focus on the .ftl file + +# Continued from Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/tail_example.yml +# regarding the Simple tail marking, this is how you would define the text for it: +# For this, we will need multiple entries: +# 1. The name that shows up in the customization menu for the marking itself +# This is formatted as such: marking-[marking ID] = [display name] +# 2+. The name(s) that show up in the customization menu for the individual layers of the marking +# This is formatted as such: marking-[marking ID]-[sprite state] = [display name] + +# In this example, our tail's ID is "TailFox" +# The sprite states are "tail_fox_primary" and "tail_fox_secondary" +# So the entries would look like this: +marking-TailFox = Fox Tail +marking-TailFox-tail_fox_primary = Fox Tail (Primary) +marking-TailFox-tail_fox_secondary = Fox Tail (Secondary) +# easy huh? Now you can make a simple tail marking! + +# Now, for the more complex tail marking, we will use the new system. +# This is essentially the same as the old system, but there tend to be more layers. +# In this example, our tail's ID is "TailBatl" +# The sprite states are "m_tail_batl_BEHIND_primary", "m_tail_batl_BEHIND_secondary", +# "m_tail_batl_FRONT_primary", and "m_tail_batl_FRONT_secondary" +# So the entries would look like this: +marking-TailBatl = Bat Tail, Long +marking-TailBatl-m_tail_batl_BEHIND_primary = Bat Tail, Long (Primary) +marking-TailBatl-m_tail_batl_BEHIND_secondary = Bat Tail, Long (Secondary) +marking-TailBatl-m_tail_batl_FRONT_primary = Bat Tail, Long (Primary) +marking-TailBatl-m_tail_batl_FRONT_secondary = Bat Tail, Long (Secondary) +# So you may have noticed that we define a name for each layer, even if some of them +# would be hidden, due to colorLinks. This is intentional, and it is a fallback that +# keeps the linters from complaining and aids with searchability. + +# HUGE NOTE AOUT FTL FILES: +# Every entry MUST be unique across the entire game. +# This means that there can only ever be one "marking-TailFox" entry defined in the entire game. +# If there are duplicates *anywhere* in *any* FTL file, the game will throw an error and refuse to start. +# If your game suddenly breaks and the won't tell you why, check for duplicate entries in your FTL files. + +# Another little note: +# Where should these files go? +# Put them in: Locale/en-US/_Coyote/ + +# ANother note: +# If your marking has a name that looks wierd, like ingame it looks like "marking-TailFox" instead of "Fox Tail", +# then check for typos in both the .yml and .ftl files to make sure the IDs and state names match exactly. +# If you have any questions, feel free to ask me! +# - Dan 'Superlagg' Kelly + diff --git a/Resources/Locale/en-US/_Floof/anthro.ftl b/Resources/Locale/en-US/_Floof/anthro.ftl index 787f55e2a2d..bd7a2fb824b 100644 --- a/Resources/Locale/en-US/_Floof/anthro.ftl +++ b/Resources/Locale/en-US/_Floof/anthro.ftl @@ -271,10 +271,6 @@ marking-MEarsFox-m_ears_fox_ADJ_secondary = Fox Ears (Inside) marking-MEarsFox-m_ears_fox_ADJ_primary = Fox Ears (Outside) marking-MEarsFox = Fox Ears (M) -marking-TailFox-tail_fox_primary = Fox Tail (Primary) -marking-TailFox-tail_fox_secondary = Fox Tail (Secondary) -marking-TailFox = Fox Tail - marking-Tail9sune-m_tail_9sune_BEHIND_primary = Kitsune, 9 Tails (Primary) marking-Tail9sune-m_tail_9sune_BEHIND_secondary = Kitsune, 9 Tails (Secondary) marking-Tail9sune-m_tail_9sune_FRONT_primary = Kitsune, 9 Tails (Primary) @@ -293,11 +289,11 @@ marking-TailAvian2-m_tail_avian2_FRONT_primary = Avian Tailfeathers, Birb (Prima marking-TailAvian2-m_tail_avian2_FRONT_secondary = Avian Tailfeathers, Birb (Secondary) marking-TailAvian2 = Avian Tailfeathers, Birb -marking-TailBatl-m_tail_batl_BEHIND_primary = Bat Tail, Long (Primary) -marking-TailBatl-m_tail_batl_BEHIND_secondary = Bat Tail, Long (Secondary) -marking-TailBatl-m_tail_batl_FRONT_primary = Bat Tail, Long (Primary) -marking-TailBatl-m_tail_batl_FRONT_secondary = Bat Tail, Long (Secondary) -marking-TailBatl = Bat Tail, Long +# marking-TailBatl-m_tail_batl_BEHIND_primary = Bat Tail, Long (Primary) +# marking-TailBatl-m_tail_batl_BEHIND_secondary = Bat Tail, Long (Secondary) +# marking-TailBatl-m_tail_batl_FRONT_primary = Bat Tail, Long (Primary) +# marking-TailBatl-m_tail_batl_FRONT_secondary = Bat Tail, Long (Secondary) +# marking-TailBatl = Bat Tail, Long marking-TailBats-m_tail_bats_BEHIND_primary = Bat Tail, Short (Primary) marking-TailBats-m_tail_bats_BEHIND_secondary = Bat Tail, Short (Secondary) diff --git a/Resources/Prototypes/_COYOTE/Entities/Mobs/Customization/Markings/tail_example.yml b/Resources/Prototypes/_COYOTE/Entities/Mobs/Customization/Markings/tail_example.yml new file mode 100644 index 00000000000..cad0518669b --- /dev/null +++ b/Resources/Prototypes/_COYOTE/Entities/Mobs/Customization/Markings/tail_example.yml @@ -0,0 +1,135 @@ +# Hi Jess! This is an example of how to make a tail marking. +# In this file we will show how to make two different kinds of tail markings: +# 1. A simple tail marking that uses the old system (please dont use this) +# 2. A more complex tail marking that uses the new system (recommended) +# This process involves three files: +# 1. The .yml file (this file) which defines the marking and its properties +# 2. The .rsi file which contains the sprites for the marking +# 3. The .ftl file which contains the text to show in the customization menu +# You will need to make all three files for your marking to work properly. +# This file will focus on the .yml file, but I will briefly explain the other two files as well. + +# First, the simple tail marking: +# v- Defines that this is a marking +- type: marking + # Unique ID for this marking, used internally, and by the FTL file + id: TailFox + # This defines which layer the marking will be applied to, by default. + # Must be something defined in Content.Shared/Humanoid/HumanoidVisualLayers.cs + # Ask Dan if you need help with this! + bodyPart: Tail + # This defines which category the marking belongs to, in the customization menu. + # Must be something defined in Content.Shared/Humanoid/Markings/MarkingCategories.cs + markingCategory: Tail + # This is the kinds of species that can use this marking. + # These are strings that are associated with species, you can look them up - kindAllowance: + # Their respective species YMLs, just search for BasicHumanlike or BasicFurry + # These by default will only allow humans and furries to use this marking. + # Which excludes resomi and vox, cus they have wierd sprites. + kindAllowance: [BasicHumanlike, BasicFurry] + # This is where the sprites for the marking are defined. + # Each one defines a layer of the marking, and each get a color slider attached to them. + sprites: + - sprite: Floof/Mobs/Customization/skyrattails.rsi + state: tail_fox_secondary + - sprite: Floof/Mobs/Customization/skyrattails.rsi + state: tail_fox_primary + # Note how the names are NOT set here! Check over in tail_example.ftl to see how to set them! + # see u there~ + +# Now, the more complex tail marking. This one uses the new system, and is recommended. +# However it is more complex, and requires more work. But, not that much more work! +# The main difference is that the individual sprites are assigned more data in order to +# define how they are inserted into the character's sprite. This allows for more complex +# layering and color linking, so you can have tails that have parts that go behind the character, +# and parts that go in front of the character, as well as parts that share colors. +# If you are importing sprites from SS13, this is the method you want to use. + +# anyway lets get into it: +# This is the same as before... +- type: marking + id: TailBatl + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Vulpkanin, Rodentia, SlimePerson, Human, Harpy, IPC, Arachne, Felinid, Oni, Kitsune] + kindAllowance: [BasicHumanlike, BasicFurry] + # Here is where the new stuff starts! + # This is where we define which layer each of the sprites will be drawn on. + # The format here is: + # : + # The layer names are defined in Content.Shared/Humanoid/HumanoidVisualLayers.cs + # Ask Dan if you need help with this! Every state MUST have a layer defined here. + # There are three layers that are commonly used for tails: + # TailBehind - for parts of the tail that go behind the character + # TailOversuit - for parts of the tail that go in front of the character, but under backpacks + # Tail - for parts of the tail that go over everything, including backpacks + # In this example, we have two parts of the tail that go behind the character, + # and two parts that go in front of the character, but under backpacks. + # Use Tail for tails that would reasonably go over backpacks, like uppy-tails or WINGS + layering: + m_tail_batl_BEHIND_primary: TailBehind + m_tail_batl_BEHIND_secondary: TailBehind + m_tail_batl_FRONT_primary: TailOversuit + m_tail_batl_FRONT_secondary: TailOversuit + # However, this causes an issue! Every sprite would get its own color slider, + # even the ones that are 'reasonably' supposed to be the same 'part' of that tail! + # To fix this, we use colorLinks. This allows us to have one state inherit the coloration + # of another state, and thus share a color slider. + # The format here is: + # : + # NOTE: the FRONT or BEHIND or whatever is NOT important to the system, they were just there + # because SS13 did it that way. My system doesnt really care what the state is named, just that they match up. + # So in this case... + # m_tail_batl_BEHIND_primary will use the color set by m_tail_batl_FRONT_primary, + # and only display the color slider for m_tail_batl_FRONT_primary. + # Same for the secondary color. + colorLinks: + m_tail_batl_BEHIND_primary: m_tail_batl_FRONT_primary + m_tail_batl_BEHIND_secondary: m_tail_batl_FRONT_secondary + # Finally, we define the sprites themselves. This is the same as before. + # All states need to be in the same RSI file, it makes things easier. + sprites: + - sprite: Floof/Mobs/Customization/skyrattails.rsi + state: m_tail_batl_FRONT_primary + - sprite: Floof/Mobs/Customization/skyrattails.rsi + state: m_tail_batl_FRONT_secondary + - sprite: Floof/Mobs/Customization/skyrattails.rsi + state: m_tail_batl_BEHIND_primary + - sprite: Floof/Mobs/Customization/skyrattails.rsi + state: m_tail_batl_BEHIND_secondary + # Again, names are not set here, check the .ftl file for that. + # see u there~ + +# BUT DAN, you say, HOW DO I MAKE THE .RSI FILE??? +# Good question! Ask Fenny. +# The RSI that he'll give you will need to be placed in the right folder. +# The path for these examples is: +# Resources/Textures/Floof/Mobs/Customization/skyrattails.rsi +# However, when put into a YML file, the Resources/Textures/ part is omitted. +# So in the YML file, it is just Floof/Mobs/Customization/skyrattails.rsi + +# However, since we are making things for COYOTE, you will need to put the RSI into the COYOTE folder. +# So the path for COYOTE will be: +# Resources/Textures/_CS/Mobs/Markings/YourFileNameHere.rsi +# And in the YML file, it will be: +# _CS/Mobs/Markings/YourFileNameHere.rsi +# if the folder doesnt exist, make it! + +# BUT WHAT ABOUT WINGS??? +# Good news, they are done exactly the same way as tails! +# There isnt a special bodyPart for wings, just use Tail. +# There isnt even a special markingCategory for wings, just use Tail. +# The layering options are the same as tails, TailBehind, TailOversuit, and Tail +# yes this sucks, but it is what it is. + + +# OKAY HOW DO I TEST THIS IN GAME??? +# Compile and run the game +# When it loads and you get in, open the console (default key is ~) +# Type in golobby to go to the lobby +# Then, pick the markings you made from the customization menu as you would in game +# If you did everything right, it should show up with the right colors and text! +# Also be sure to spawn in with the markings applied, to make sure they layer with clothes and backpacks properly. +# you can Start the game with startround to do this, and you can use golobby any time you want + +# DONT USE GOLOBBY ON THE LIVE SERVER IT DOES NOT HAVE A WARNING IT WILL END THE GAME IMMEDIATELY diff --git a/Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/anthro_tails.yml b/Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/anthro_tails.yml index be03e6dcfcf..110b6339def 100644 --- a/Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/anthro_tails.yml +++ b/Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/anthro_tails.yml @@ -1,16 +1,16 @@ ##### TAILS ##### -- type: marking - id: TailFox - bodyPart: Tail - markingCategory: Tail - speciesRestriction: [Vulpkanin, Rodentia, SlimePerson, Human, Harpy, IPC, Arachne, Felinid, Oni, Kitsune] - kindAllowance: [BasicHumanlike, BasicFurry] - sprites: - - sprite: Floof/Mobs/Customization/skyrattails.rsi - state: tail_fox_secondary - - sprite: Floof/Mobs/Customization/skyrattails.rsi - state: tail_fox_primary +#- type: marking +# id: TailFox +# bodyPart: Tail +# markingCategory: Tail +# speciesRestriction: [Vulpkanin, Rodentia, SlimePerson, Human, Harpy, IPC, Arachne, Felinid, Oni, Kitsune] +# kindAllowance: [BasicHumanlike, BasicFurry] +# sprites: +# - sprite: Floof/Mobs/Customization/skyrattails.rsi +# state: tail_fox_secondary +# - sprite: Floof/Mobs/Customization/skyrattails.rsi +# state: tail_fox_primary - type: marking id: Tail9sune @@ -86,29 +86,29 @@ - sprite: Floof/Mobs/Customization/skyrattails.rsi state: m_tail_avian2_BEHIND_secondary -- type: marking - id: TailBatl - bodyPart: Tail - markingCategory: Tail - speciesRestriction: [Vulpkanin, Rodentia, SlimePerson, Human, Harpy, IPC, Arachne, Felinid, Oni, Kitsune] - kindAllowance: [BasicHumanlike, BasicFurry] - layering: - m_tail_batl_BEHIND_primary: TailBehind - m_tail_batl_BEHIND_secondary: TailBehind - m_tail_batl_FRONT_primary: TailOversuit - m_tail_batl_FRONT_secondary: TailOversuit - colorLinks: - m_tail_batl_BEHIND_primary: m_tail_batl_FRONT_primary - m_tail_batl_BEHIND_secondary: m_tail_batl_FRONT_secondary - sprites: - - sprite: Floof/Mobs/Customization/skyrattails.rsi - state: m_tail_batl_FRONT_primary - - sprite: Floof/Mobs/Customization/skyrattails.rsi - state: m_tail_batl_FRONT_secondary - - sprite: Floof/Mobs/Customization/skyrattails.rsi - state: m_tail_batl_BEHIND_primary - - sprite: Floof/Mobs/Customization/skyrattails.rsi - state: m_tail_batl_BEHIND_secondary +#- type: marking +# id: TailBatl +# bodyPart: Tail +# markingCategory: Tail +# speciesRestriction: [Vulpkanin, Rodentia, SlimePerson, Human, Harpy, IPC, Arachne, Felinid, Oni, Kitsune] +# kindAllowance: [BasicHumanlike, BasicFurry] +# layering: +# m_tail_batl_BEHIND_primary: TailBehind +# m_tail_batl_BEHIND_secondary: TailBehind +# m_tail_batl_FRONT_primary: TailOversuit +# m_tail_batl_FRONT_secondary: TailOversuit +# colorLinks: +# m_tail_batl_BEHIND_primary: m_tail_batl_FRONT_primary +# m_tail_batl_BEHIND_secondary: m_tail_batl_FRONT_secondary +# sprites: +# - sprite: Floof/Mobs/Customization/skyrattails.rsi +# state: m_tail_batl_FRONT_primary +# - sprite: Floof/Mobs/Customization/skyrattails.rsi +# state: m_tail_batl_FRONT_secondary +# - sprite: Floof/Mobs/Customization/skyrattails.rsi +# state: m_tail_batl_BEHIND_primary +# - sprite: Floof/Mobs/Customization/skyrattails.rsi +# state: m_tail_batl_BEHIND_secondary - type: marking id: TailBats diff --git a/Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/tail_example.yml b/Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/tail_example.yml deleted file mode 100644 index 45baa24f04c..00000000000 --- a/Resources/Prototypes/_Floof/Entities/Mobs/Customization/markings/tail_example.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Hi Jess! This is an example of how to make a tail marking. -# In this file we will show how to make two different kinds of tail markings: -# 1. A simple tail marking that uses the old system (please dont use this) -# 2. A more complex tail marking that uses the new system (recommended) -# This process involves three files: -# 1. The .yml file (this file) which defines the marking and its properties -# 2. The .rsi file which contains the sprites for the marking -# 3. The .ftl file which contains the text to show in the customization menu -# You will need to make all three files for your marking to work properly. -# This file will focus on the .yml file, but I will briefly explain the other two files as well. - - - -