Skip to content

Hair Markings#2241

Draft
WarMechanic wants to merge 24 commits intoSimple-Station:masterfrom
WarMechanic:multihair
Draft

Hair Markings#2241
WarMechanic wants to merge 24 commits intoSimple-Station:masterfrom
WarMechanic:multihair

Conversation

@WarMechanic
Copy link
Contributor

@WarMechanic WarMechanic commented Apr 14, 2025

Description

I tested the PostgreSQL change in my web browser and it correctly appended to a table. If everyone loses hair you have every right to remove my red name.

A change that I could have done a year ago, but my brain couldn't understand PostgreSQL (and still cannot). But I got AI to do it instead.

Moving hair_name, hair_color, facial_hair_name, and facial_hair_color to the markings column in the database will extend hair possibilities. With this PR you can use up to 3 layers of hair markings and with later contributions (hopefully) hair gradients will be on the rise.


TODO

  • Working SQLite migration
  • Theoretically sound PostgreSQL migration (tested in browser, not with a db)
  • Deprecate hair selection
  • Readd hair / facial hair to markings
  • Deprecate eye colour at the behest of TCJ and Death, you can use markings for eye colour
  • Fix randomize to give you random hair again
  • make eye markings default?

BREAKING CHANGE

Because markings doesn't key its values or store in any deterministic order, its impossible to determine which marking is a hair after the migration. If you wanted to rollback this change everyone would go bald.

Not that you would because hair_color FUCKING SUCKS. Anyone who cares about their character would probably have an export to then copy and paste the hair colour back - whether this damage is worth it is up to you (it is).


Media

Groundbreaking use of layered hair to fix 1 pixel.

image

image

Hair markings with 3 slots.

image


Changelog

🆑

  • tweak: Hair and facial hair have been migrated to the markings system, ushering in a new era of multi-layered, gradient (TBA) hair. Now go contribute gradient hair sprites to EE.

@github-actions github-actions bot added Changes: C# Changes any cs files Changes: YML Changes any yml files labels Apr 14, 2025
@WarMechanic WarMechanic changed the title Multi-slot hair Hair markings Apr 14, 2025
@SimpleStation14 SimpleStation14 changed the title Hair markings Hair Markings Apr 14, 2025
@github-actions github-actions bot added the Changes: UI Changes any XAML files label Apr 15, 2025
@WarMechanic WarMechanic marked this pull request as ready for review April 15, 2025 20:30
@github-actions github-actions bot added the Status: Needs Review Someone please review this label Apr 15, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Apr 15, 2025

Walkthrough

This set of changes removes all explicit handling of hair and facial hair as separate appearance fields from both the codebase and user interface. Hair and facial hair customization is now managed solely through the general markings system. All references, event handlers, and storage for hair and facial hair in appearance profiles and database logic have been eliminated. The UI for selecting hair and facial hair styles is removed, and marking category limits for hair and facial hair have been increased across multiple species prototypes to allow for more customization via markings. Additionally, eye color handling and related event infrastructure have been removed from the humanoid appearance system and marking coloring logic.

Changes

Files/Paths Change Summary
Content.Client/Humanoid/HumanoidAppearanceSystem.cs
Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs
Removed explicit hair and facial hair marking handling and eye color usage during profile loading.
Content.Client/Lobby/UI/HumanoidProfileEditor.xaml
Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs
Removed UI controls and all code related to direct hair, facial hair, and eye color customization.
Content.Server/Database/ServerDbBase.cs Removed hair, facial hair, and eye color storage and retrieval in profile conversion methods.
Content.Shared/Humanoid/HumanoidCharacterAppearance.cs Removed all hair, facial hair, and eye color fields, properties, methods, and related logic from appearance class; updated constructors, equality, and utility methods accordingly.
Content.Client/Humanoid/MarkingPicker.xaml.cs Removed eye color parameter and references from marking picker data and coloring logic.
Content.Shared/Humanoid/Markings/MarkingsSet.cs Removed eye color parameter from EnsureDefault method and internal calls.
Content.Shared/Humanoid/Markings/MarkingColoring.cs Removed eye color parameter from color retrieval methods and calls.
Content.Shared/Humanoid/Markings/ColoringTypes/*.cs (CategoryColoring.cs, SimpleColoring.cs, SkinColoring.cs, TattooColoring.cs) Removed eye color parameter from GetCleanColor method signatures.
Content.Shared/Humanoid/Markings/ColoringTypes/EyeColoring.cs Deleted entire EyeColoring class and related file.
Content.Shared/Humanoid/EyeColor.cs Deleted EyeColorInitEvent record struct and related file.
Content.Server/Shadowkin/ShadowkinSystem.cs Commented out subscription and handler for EyeColorInitEvent; disabled eye color change logic.
Resources/Prototypes/DeltaV/Species/lamia.yml
Resources/Prototypes/DeltaV/Species/vulpkanin.yml
Resources/Prototypes/Nyanotrasen/Species/Oni.yml
Resources/Prototypes/Nyanotrasen/Species/felinid.yml
Resources/Prototypes/Species/arachne.yml
Resources/Prototypes/Species/harpy.yml
Resources/Prototypes/Species/human.yml
Resources/Prototypes/Species/slime.yml
Resources/Prototypes/Species/vox.yml
Resources/Prototypes/_EE/Species/tajaran.yml
Resources/Prototypes/_Impstation/Species/thaven.yml
Increased marking point limits for "Hair" and "FacialHair" categories from 1 to 3 for multiple species to support expanded customization via markings.
Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs Removed eye color parameter from marking layer color retrieval calls.

Suggested labels

Changes: Localization, Status: Needs Review

Suggested reviewers

  • Remuchi
  • sleepyyapril

Poem

🛡️ Biesel inspects the code with care,
Hair and beard no longer there.
Markings now hold the crown so bright,
Points increased to spread the light.
UI trimmed, the logic lean,
Tau Ceti’s code runs crisp and clean.
Sol Alliance flaws? Not on my screen! 🚀✨

Tip

⚡💬 Agentic Chat (Pro Plan, General Availability)
  • We're introducing multi-step agentic chat in review comments and issue comments, within and outside of PR's. This feature enhances review and issue discussions with the CodeRabbit agentic chat by enabling advanced interactions, including the ability to create pull requests directly from comments and add commits to existing pull requests.
✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🔭 Outside diff range comments (5)
Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (5)

15-15: ⚠️ Potential issue

EyeColor property should be removed according to PR objectives

Attention, recruit! Your PR objectives clearly state that eye color selection has been deprecated in favor of using markings, yet this property remains in the codebase. This is a direct violation of your mission parameters. Remove this inconsistency immediately or explain why it persists.

- [DataField]
- public Color EyeColor { get; private set; }

69-76: 🛠️ Refactor suggestion

Remove unused RealisticEyeColors list

By the stars! Why is this obsolete list still taking up space in our codebase? With eye colors being handled through markings, this list has no purpose and should be jettisoned immediately! Sol Alliance lapdogs might tolerate dead code, but the Biesel Republic demands efficiency!

- private static IReadOnlyList<Color> RealisticEyeColors = new List<Color>
- {
-     Color.Brown,
-     Color.Gray,
-     Color.Azure,
-     Color.SteelBlue,
-     Color.Black
- };

82-98: 🛠️ Refactor suggestion

Remove unused hair style code in Random method

This segment is like an ensign showing up to inspection with mismatched uniform pieces! You've removed hair properties but left the code that generates random hair styles and colors. This dead code serves no purpose since the return value at line 127 doesn't use any of these variables. Clean up your station, soldier!

- var hairStyles = markingManager.MarkingsByCategoryAndSpecies(MarkingCategories.Hair, species).Keys.ToList();
- var facialHairStyles = markingManager.MarkingsByCategoryAndSpecies(MarkingCategories.FacialHair, species).Keys.ToList();

- var newHairStyle = hairStyles.Count > 0
-     ? random.Pick(hairStyles)
-     : HairStyles.DefaultHairStyle;

- var newFacialHairStyle = facialHairStyles.Count == 0 || sex == Sex.Female
-     ? HairStyles.DefaultFacialHairStyle
-     : random.Pick(facialHairStyles);

- var newHairColor = random.Pick(HairStyles.RealisticHairColors);
- newHairColor = newHairColor
-     .WithRed(RandomizeColor(newHairColor.R))
-     .WithGreen(RandomizeColor(newHairColor.G))
-     .WithBlue(RandomizeColor(newHairColor.B));

142-142: ⚠️ Potential issue

EyeColor still used in EnsureValid method

Attention! Line 142 continues to reference the deprecated EyeColor property. This inconsistency must be addressed! If eye colors are being handled through markings, this code needs to be updated accordingly.

- var eyeColor = ClampColor(appearance.EyeColor);

197-201: ⚠️ Potential issue

GetHashCode method should be updated

Spacer! Your GetHashCode method still includes EyeColor despite it being deprecated according to the PR summary. Consistency is the backbone of the Republic's naval code!

 return HashCode.Combine(
-    EyeColor,
     SkinColor,
     Markings);
🧹 Nitpick comments (1)
Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (1)

1-204: Add documentation about the migration to markings

This file lacks proper documentation about this significant change! Any Biesel Republic officer would be court-martialed for such an oversight. Add XML comments explaining that hair, facial hair, and eye colors are now handled through the markings system rather than dedicated properties.

 namespace Content.Shared.Humanoid;

+/// <summary>
+/// Represents a humanoid character's appearance.
+/// Note: As of the markings migration, hair, facial hair, and eye colors are now
+/// handled entirely through the markings system rather than dedicated properties.
+/// </summary>
 [DataDefinition]
 [Serializable, NetSerializable]
 public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance, IEquatable<HumanoidCharacterAppearance>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 18e420d and 4bc8e6c.

⛔ Files ignored due to path filters (6)
  • Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs is excluded by none and included by none
  • Content.Server.Database/Migrations/Postgres/20250415155451_HairMarkings.Designer.cs is excluded by none and included by none
  • Content.Server.Database/Migrations/Postgres/20250415155451_HairMarkings.cs is excluded by none and included by none
  • Content.Server.Database/Migrations/Sqlite/20250415155443_HairMarkings.Designer.cs is excluded by none and included by none
  • Content.Server.Database/Migrations/Sqlite/20250415155443_HairMarkings.cs is excluded by none and included by none
  • Content.Server.Database/Model.cs is excluded by none and included by none
📒 Files selected for processing (4)
  • Content.Client/Lobby/UI/HumanoidProfileEditor.xaml (1 hunks)
  • Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs (0 hunks)
  • Content.Server/Database/ServerDbBase.cs (0 hunks)
  • Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (3 hunks)
💤 Files with no reviewable changes (2)
  • Content.Server/Database/ServerDbBase.cs
  • Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs
🚧 Files skipped from review as they are similar to previous changes (1)
  • Content.Client/Lobby/UI/HumanoidProfileEditor.xaml
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
🔇 Additional comments (5)
Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (5)

23-29: Constructor properly updated for marking-based system

The constructor has been properly retrofitted to support the new marking-based system, Biesel Republic approved! Hair and facial hair parameters have been correctly removed, supporting the migration to markings.


39-42: WithSkinColor method properly updated

Affirmative, this method has been correctly reconfigured to support the new marking-based system. Continue with your duties, spacer.


44-47: WithMarkings method properly updated

This method passes inspection. The parameters have been correctly adjusted to support the markings-based hair system.


127-127: Random method properly updated for marking-based system

The return statement has been properly modified to align with the new marking system. The absence of hair-related properties in the constructor call is correct and supports the PR objectives.


183-186: Equals method properly updated

Your comparison logic has been properly updated to remove references to hair and facial hair properties. This passes the Biesel Republic's code inspection standards.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🔭 Outside diff range comments (5)
Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (5)

15-22: ⚠️ Potential issue

Inconsistency with PR objectives detected!

Attention recruit! The PR objectives clearly state that eye color selection has been deprecated in favor of markings, yet the EyeColor property remains in this class. This inconsistency could lead to confusion in the field!

If eye color is truly meant to be migrated to markings, this property should be removed:

-    [DataField]
-    public Color EyeColor { get; private set; }

70-77: 🛠️ Refactor suggestion

Remove unused RealisticEyeColors collection.

This collection of realistic eye colors appears to be unused in the codebase now that eye color selection has been deprecated according to the PR objectives. We don't keep unused equipment on a naval vessel, and we shouldn't keep unused code either!

-    private static IReadOnlyList<Color> RealisticEyeColors = new List<Color>
-    {
-        Color.Brown,
-        Color.Gray,
-        Color.Azure,
-        Color.SteelBlue,
-        Color.Black
-    };

144-170: ⚠️ Potential issue

EnsureValid method still references EyeColor.

Line 146 still clamps the appearance's EyeColor, which contradicts the PR objective of deprecating eye color in favor of markings. This appears to be Sol Alliance sabotage, attempting to maintain deprecated systems!

The EyeColor clamping should be removed if eye color is truly being migrated to markings:

-        var eyeColor = ClampColor(appearance.EyeColor);

Additionally, ensure the validation logic properly handles eye color markings if that's the new approach.


172-179: ⚠️ Potential issue

MemberwiseEquals still checks EyeColor.

This equality method still compares EyeColor, which is inconsistent with the PR objective of deprecating eye color selection. Biesel Republic code standards require alignment with our strategic objectives!

If eye color is being migrated to markings, remove the eye color equality check:

        return
            maybeOther is HumanoidCharacterAppearance other
-            && EyeColor.Equals(other.EyeColor)
            && SkinColor.Equals(other.SkinColor)
            && Markings.SequenceEqual(other.Markings);

199-205: ⚠️ Potential issue

GetHashCode still includes EyeColor.

The GetHashCode method still includes EyeColor in its hash computation. For consistent behavior, especially with equality methods, this needs to be updated if eye color is being deprecated.

        return HashCode.Combine(
-            EyeColor,
             SkinColor,
             Markings);
🧹 Nitpick comments (1)
Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (1)

4-4: Remove unused import statement.

This import statement for Content.Shared.Store doesn't appear to be utilized anywhere in this file. Clean ship protocols dictate removal of unused directives to maintain code cleanliness!

-using Content.Shared.Store;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4bc8e6c and c68aaf7.

📒 Files selected for processing (1)
  • Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (5 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: YAML Linter
🔇 Additional comments (5)
Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (5)

24-30: Constructor successfully refactored for markings-based approach.

The constructor has been properly streamlined to remove hair and facial hair parameters, in alignment with our mission to migrate these attributes to the markings system. Carry on, sailor!


40-43: Method refactored correctly.

This method has been properly updated to maintain compatibility with the new constructor signature. A clean operation worthy of the Biesel Republic!


45-48: Method refactored correctly.

This method has been properly updated to maintain compatibility with the new constructor signature. Excellent attention to detail!


100-102: Hair markings implementation looks sound.

The new approach to creating hair and facial hair as markings is well-implemented. This aligns perfectly with our mission objectives to migrate hair data to the markings system.


131-131: Constructor call updated correctly.

The Random method now correctly returns a new appearance with hair and facial hair as markings. This is a proper implementation of the new architecture.

var newFacialHairMarking = new Marking(newFacialHairStyle, new List<Color> { newHairColor });

var newEyeColor = random.Pick(RealisticEyeColors);
// TODO: Add random markings
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

❓ Verification inconclusive

Address or track the TODO comment.

This TODO comment needs to be addressed or tracked in your issue management system. Unresolved TODOs are like unfilled positions in a naval crew - they leave gaps in our defense!


🏁 Script executed:

#!/bin/bash
# Check if there's an issue tracking this TODO
gh issue list --search "Add random markings" --limit 5

Length of output: 56


ACTION REQUIRED: File an Issue for "Add random markings"
Our automated check in Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (Line 103) revealed no open issue tracking the "Add random markings" TODO. This gap in our defenses against poor-quality code must not be left unchecked! Please manually verify your issue tracker and, if no such issue exists, file one immediately to track this task.

@WarMechanic
Copy link
Contributor Author

@coderabbitai test

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Apr 18, 2025

Tip

For best results, initiate chat on the files or code changes.

@WarMechanic Aye, systems operational and standing by for orders, recruit! Your test command has been received loud and clear. I'm prepared to assist with your "Hair Markings" migration mission - whether you need code analysis, database migration verification, or tactical adjustments to your implementation strategy.

What specific assistance do you require with this operation? I can help analyze your PostgreSQL migration, review your markings system implementation, or provide other tactical support for your code modifications.

(_/)
(•_•)
/ >🔍 Scanning for orders...

@WarMechanic
Copy link
Contributor Author

@coderabbitai can you review Content.Server.Database/Migrations/Postgres/20250415155451_HairMarkings.cs, particularly the sql statement which is supposed to move hair_name and hair_color columns into markings jsonb as $"{hair_name}@{hair_color}"

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Apr 18, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if the file exists
if [ -f "Content.Server.Database/Migrations/Postgres/20250415155451_HairMarkings.cs" ]; then
  # Display the file content
  cat "Content.Server.Database/Migrations/Postgres/20250415155451_HairMarkings.cs"
else
  echo "File not found: Content.Server.Database/Migrations/Postgres/20250415155451_HairMarkings.cs"
  
  # Let's check if there's a similar file in that directory
  echo "Searching for similar migration files..."
  find Content.Server.Database/Migrations/Postgres -name "*HairMarkings.cs" -o -name "*Hair*.cs" 2>/dev/null
fi

Length of output: 466


🏁 Script executed:

#!/bin/bash
# Let's find all migrations directories and look for SQL files that might be related to hair markings
echo "Searching for migration files in Content.Server.Database..."
find Content.Server.Database -type d -name "Migrations" -o -name "Postgres" | xargs ls -la 2>/dev/null

echo "Listing all migration files:"
find Content.Server.Database -name "*.cs" | grep -i migration | sort 2>/dev/null

echo "Looking for any files that might be related to hair or markings:"
find Content.Server.Database -name "*.cs" | xargs grep -l "hair\|marking" 2>/dev/null

Length of output: 1177


🏁 Script executed:

#!/bin/bash
echo "Looking for database directories:"
find . -type d -name "*Database*" | sort

echo "Looking for migration directories:"
find . -type d -name "*Migration*" | sort

echo "Searching for files with 'Hair' and 'Markings' in their names:"
find . -name "*Hair*Marking*.cs" -o -name "*Marking*Hair*.cs" | sort

echo "Searching for files containing both PostgreSQL and hair/markings references:"
find Content.Server -type f -name "*.cs" | xargs grep -l "PostgreSQL\|Postgres" 2>/dev/null | xargs grep -l "hair\|marking" 2>/dev/null

Length of output: 763


🏁 Script executed:

#!/bin/bash
echo "Exploring Content.Server/Database directory:"
find Content.Server/Database -type f | sort

echo "Looking for migration files in Content.Server/Database:"
find Content.Server/Database -name "*Migration*.cs" | sort

echo "Searching for Hair or Markings related files in Content.Server/Database:"
find Content.Server/Database -type f -name "*.cs" | xargs grep -l "hair\|marking\|Hair\|Marking" 2>/dev/null

echo "Looking for PostgreSQL-related files:"
find Content.Server/Database -type f -name "*.cs" | xargs grep -l "PostgreSQL\|Postgres" 2>/dev/null

echo "Content of the most likely migration file (if any):"
find Content.Server/Database -name "*Hair*.cs" -o -name "*Mark*.cs" | xargs cat 2>/dev/null

Length of output: 1747


🏁 Script executed:

#!/bin/bash
echo "Checking subdirectories of Content.Server/Database:"
find Content.Server/Database -type d | sort

echo "Looking in subdirectories for migration files:"
find Content.Server/Database -type d -exec find {} -name "*Migration*.cs" \;

echo "Examining ServerDbBase.cs which has hair/marking references:"
cat Content.Server/Database/ServerDbBase.cs | grep -A 20 -B 20 "hair\|marking\|Hair\|Marking"

echo "Looking for migration files in the entire codebase:"
find . -name "*.cs" | grep -i migration | head -n 10

echo "Does the codebase use Entity Framework migrations?"
find . -type f -name "*.cs" | xargs grep -l "DbContext\|EntityFramework\|DbMigration" | head -n 10

Length of output: 7339


🏁 Script executed:

#!/bin/bash
echo "Checking for files related to Sqlite migrations in the entire codebase:"
find . -path "*Sqlite*" -name "*.cs" | grep -i migration

echo "Search for files containing 'hairmarkings' (case insensitive):"
find . -name "*.cs" | xargs grep -l -i "hairmarkings" 2>/dev/null

echo "Looking at Content.Server directory for migration files:"
find Content.Server -name "Migrations" -type d

echo "Search for PostgreSQL migration files in nested directories:"
find Content.Server -path "*Migrations*" -o -path "*Postgres*" | grep -v "/obj/"

echo "Let's check directories that might contain migration code:"
ls -la Content.Server/Database/ 2>/dev/null || echo "Directory not found"

Length of output: 2166


🏁 Script executed:

#!/bin/bash
# Let's examine the PostgreSQL files to find migration logic
echo "Checking ServerDbPostgres.cs for hair migration code:"
cat Content.Server/Database/ServerDbPostgres.cs | grep -A 20 -B 20 "hair\|marking\|Hair\|Marking" 2>/dev/null

echo "Searching for SharedMagicMirrorSystem.cs since it contains 'hairmarkings':"
cat ./Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs | grep -A 10 -B 10 -i "hairmarkings" 2>/dev/null

echo "Let's also look for any SQL queries in the codebase that manipulate 'hair_name' or 'hair_color':"
find . -name "*.cs" | xargs grep -l "hair_name\|hair_color" 2>/dev/null

echo "And finally let's check if there's any code that updates jsonb fields:"
find . -name "*.cs" | xargs grep -l "jsonb\|JsonB\|JSONB" 2>/dev/null

Length of output: 1971


🏁 Script executed:

#!/bin/bash
# Let's check for recent files that might be migrations
echo "Looking for recent migration-related files:"
find . -name "*.cs" -mtime -30 | grep -i "migration\|postgres\|sqlite\|hair\|marking" | sort

echo "Searching the entire codebase for SQL update statements that might modify markings:"
find . -name "*.cs" | xargs grep -l "UPDATE.*markings" 2>/dev/null

echo "Let's check if there are any files that contain jsonb update operations:"
find . -name "*.cs" | xargs grep -l "jsonb_set\|jsonb_array\|jsonb.*append" 2>/dev/null

echo "Looking for SQL format strings that might be constructing hair markings format:"
find . -name "*.cs" | xargs grep -l '"{.*}@{.*}"' 2>/dev/null

echo "Let's search for non-SQL migration code related to hair:"
find . -name "*.cs" | xargs grep -A 10 -B 10 "MigrateHair\|HairMigration" 2>/dev/null

Length of output: 2972


🏁 Script executed:

#!/bin/bash
# Let's examine the Marking.cs file that contains the format string with "@"
echo "Checking Marking.cs for the format string:"
cat ./Content.Shared/Humanoid/Markings/Marking.cs

echo "Looking for database migration directories (they might be 'hidden' in some subdirectory):"
find . -path "*Migration*" -type d

echo "Let's search deeper for any recently modified files with 'HairMarkings' in the name:"
find . -type f -name "*HairMarkings*" -o -name "*Hair*Migration*"

echo "Let's look for recent PR-related files that might have been added but not committed:"
git status

echo "Let's search for any PR-specific code files:"
find . -name "*.cs" | xargs grep -l "20250415155451\|HairMarkings" 2>/dev/null

Length of output: 5780


@WarMechanic Reporting from the Biesel Republic fleet! I've attempted to locate the PostgreSQL migration file you've mentioned, but it appears to be MIA from our current sparse checkout. Typical human-supremacist Sol Alliance trickery, hiding important tactical files!

While I couldn't find the specific migration file Content.Server.Database/Migrations/Postgres/20250415155451_HairMarkings.cs, I can provide guidance on what an effective PostgreSQL migration should look like based on the codebase's marking implementation.

Looking at Marking.cs, I can see the format should be {markingId}@{color1,color2,...} where:

  • markingId is the hair style ID (with any '@' characters replaced with '_')
  • After the '@' comes a comma-separated list of colors in hex format

For PostgreSQL, you'll need a query that:

  1. Takes existing hair_name and hair_color values
  2. Formats them as "{hair_name}@{hair_color}" (where hair_color is converted to hex)
  3. Appends this to the existing JSONB array in the markings column

Here's a sample of what the SQL might look like:

UPDATE preference.profile
SET markings = 
    CASE 
        -- When markings is NULL, create a new array with just the hair marking
        WHEN markings IS NULL THEN 
            jsonb_build_array(hair_name || '@' || encode(hair_color, 'hex'))
        -- When markings exists, append the hair marking to it
        ELSE 
            markings || jsonb_build_array(hair_name || '@' || encode(hair_color, 'hex'))
    END
WHERE hair_name IS NOT NULL AND hair_name != '';

For facial hair, you'd do something similar in a separate UPDATE or combine them.

The most critical parts are:

  1. Proper handling of NULL values in both the source and target columns
  2. Correct JSONB array manipulation (PostgreSQL is picky about this)
  3. Ensuring the colors are properly formatted in hex format
  4. Adding error handling for malformed data

These orders are non-negotiable, recruit! Your PostgreSQL migration is a critical security operation - failure will result in widespread hair loss among the crew!

@WarMechanic
Copy link
Contributor Author

there was a bit of ai slop in it but holy shit it fucking works

@WarMechanic
Copy link
Contributor Author

@DEATHB4DEFEAT you can remove DNM now

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (3)
Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (3)

4-4: Purge this stray using directive, ensign!

Content.Shared.Store is not referenced anywhere in this file. Dead imports bloat the assembly and betray sloppy discipline worthy of a Sol‑Alliance dockyard.

-using Content.Shared.Store;

67-75: Unused eye‑colour cache: either deploy it or jettison it

RealisticEyeColors survives the eye‑colour purge yet is never used. This will raise a compiler warning and confuse future deckhands.

If you plan to generate eye‑markings soon, add a TODO referencing the task; otherwise remove the entire field.


98-101: Consider multiple hair layers & track the TODO

You now support up to three hair markings, yet Random() still spawns only one hair and one facial‑hair layer. At minimum, document the limitation; ideally, iterate to fill all available hair slots.

Also, file an issue or complete the // TODO: Add random markings; loose TODOs lull crews into complacency.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6b7f827 and fdc2e9c.

📒 Files selected for processing (1)
  • Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (6 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
🔇 Additional comments (2)
Content.Shared/Humanoid/HumanoidCharacterAppearance.cs (2)

129-129: Return list allocation looks good

Random() now returns a fresh list containing the two generated markings—no aliasing here. Well done, lieutenant.


182-184: Equality logic now aligns with field removals

Eye colour checks are gone, and the remaining comparisons look correct. Shipshape!

Comment on lines 37 to 45
public HumanoidCharacterAppearance WithSkinColor(Color newColor)
{
return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, newColor, Markings);
return new(newColor, Markings);
}

public HumanoidCharacterAppearance WithMarkings(List<Marking> newMarkings)
{
return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, newMarkings);
return new(SkinColor, newMarkings);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

With* helpers leak internal lists – clone before you return

Both WithSkinColor and WithMarkings hand the same List<Marking> instance to the new object. If either the old or the new appearance later tweaks the list, both change – not what the captain ordered.

-        return new(newColor, Markings);
+        return new(newColor, new List<Marking>(Markings));

-        return new(SkinColor, newMarkings);
+        return new(SkinColor, new List<Marking>(newMarkings));
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public HumanoidCharacterAppearance WithSkinColor(Color newColor)
{
return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, newColor, Markings);
return new(newColor, Markings);
}
public HumanoidCharacterAppearance WithMarkings(List<Marking> newMarkings)
{
return new(HairStyleId, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, newMarkings);
return new(SkinColor, newMarkings);
}
public HumanoidCharacterAppearance WithSkinColor(Color newColor)
{
- return new(newColor, Markings);
+ return new(newColor, new List<Marking>(Markings));
}
public HumanoidCharacterAppearance WithMarkings(List<Marking> newMarkings)
{
- return new(SkinColor, newMarkings);
+ return new(SkinColor, new List<Marking>(newMarkings));
}

Comment on lines +21 to 27
public HumanoidCharacterAppearance(
Color skinColor,
List<Marking> markings)
{
HairStyleId = hairStyleId;
HairColor = ClampColor(hairColor);
FacialHairStyleId = facialHairStyleId;
FacialHairColor = ClampColor(facialHairColor);
EyeColor = ClampColor(eyeColor);
SkinColor = ClampColor(skinColor);
Markings = markings;
}
Copy link
Contributor

@coderabbitai coderabbitai bot Apr 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Copy the incoming list to avoid shared‑state crossfire

The constructor stores markings by reference. Any caller retaining that list can mutate the inner state of this newly forged appearance, leading to spooky action at a distance (and utterly unpredictable haircuts).

-        Markings = markings;
+        // Copy to defend internal state from outside mutation.
+        Markings = new List<Marking>(markings);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public HumanoidCharacterAppearance(
Color skinColor,
List<Marking> markings)
{
HairStyleId = hairStyleId;
HairColor = ClampColor(hairColor);
FacialHairStyleId = facialHairStyleId;
FacialHairColor = ClampColor(facialHairColor);
EyeColor = ClampColor(eyeColor);
SkinColor = ClampColor(skinColor);
Markings = markings;
}
public HumanoidCharacterAppearance(
Color skinColor,
List<Marking> markings)
{
SkinColor = ClampColor(skinColor);
// Copy to defend internal state from outside mutation.
Markings = new List<Marking>(markings);
}

Copy link
Contributor Author

@WarMechanic WarMechanic Apr 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this a real bug?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@WarMechanic Acknowledged, sir! I'll stand down on that suggestion. The current implementation will remain as-is. Do you have any other code sections you'd like me to review?

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🔭 Outside diff range comments (4)
Content.Server/Shadowkin/ShadowkinSystem.cs (1)

41-52: 💡 Verification agent

🧩 Analysis chain

Strategic planning required, crewman!

Your code comment indicates uncertainty ("idk what shadowkin do") and acknowledges that eye colors need to be changed due to markings, yet you've left the implementation incomplete. This is the code equivalent of an abandoned outpost!

Consider adding a proper TODO with detailed requirements for how the Shadowkin eye effect should be implemented with the new markings system. The current approach leaves your codebase vulnerable to hostile takeover by bugs.


🏁 Script executed:

#!/bin/bash
# Let's scan for any remaining EyeColor references in the codebase to understand impact
echo "Searching for remaining EyeColor references..."
rg "EyeColor" --type cs

Length of output: 4342


Reinstate Shadowkin eye‑color protocols!

Crewman, scrubbing the eye‑color handler has left our Shadowkin fleet blind to marking changes—that’s unacceptable. A quick scan shows EyeColor is referenced in dozens of locations across Humanoid, Zombie, BloodCult, SharedBodySystem, etc. You must restore and document this logic immediately:

• In Content.Server/Shadowkin/ShadowkinSystem.cs
– Re‑enable
SubscribeLocalEvent<ShadowkinComponent, EyeColorInitEvent>(OnEyeColorChange);
– Restore and expand the OnEyeColorChange method body
• Add a clear TODO above both lines to specify:
– Which markings trigger BlackEyeColor
– When and how to revert to OldEyeColor
– Integration points with SharedHumanoidMarkingModifierSystem

Example stub:

// TODO [Shadowkin]: 
// 1) On mark apply → set humanoid.EyeColor = component.BlackEyeColor  
// 2) On mark removal → restore component.OldEyeColor and call Dirty(uid, humanoid)  
SubscribeLocalEvent<ShadowkinComponent, EyeColorInitEvent>(OnEyeColorChange);

private void OnEyeColorChange(EntityUid uid, ShadowkinComponent component, EyeColorInitEvent args)
{
    // implement above TODO...
}

Fix these gaps before I report to Command.

Content.Client/Humanoid/MarkingPicker.xaml.cs (3)

100-116: ⚠️ Potential issue

Outdated method signature detected!

This overloaded SetData method still accepts and uses eye color, contradicting the refactoring mission. This inconsistency could result in unpredictable behavior where eye color is sometimes set but never used in the updated marking system.

Apply this refactoring to harmonize with the updated specification:

- public void SetData(MarkingSet set, string species, Sex sex, Color skinColor, Color eyeColor)
+ public void SetData(MarkingSet set, string species, Sex sex, Color skinColor)
{
    _currentMarkings = set;

    if (!IgnoreSpecies)
    {
        _currentMarkings.EnsureSpecies(species, skinColor, _markingManager); // should be validated server-side but it can't hurt
    }

    _currentSpecies = species;
    _currentSex = sex;
    CurrentSkinColor = skinColor;
-   CurrentEyeColor = eyeColor;

    Populate(CMarkingSearch.Text);
    PopulateUsed();
}

119-119: 🛠️ Refactor suggestion

Remove deprecated method!

The SetEyeColor method is now orphaned - eye colors are no longer used in the marking system as per the refactoring directive. Remove this method and the associated CurrentEyeColor property at line 40.

- public void SetEyeColor(Color color) => CurrentEyeColor = color;

40-40: 🛠️ Refactor suggestion

Remove deprecated property!

The CurrentEyeColor property is no longer needed as eye colors have been migrated to the marking system. Remove this field to complete the refactoring.

- public Color CurrentEyeColor = Color.Black;
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fdc2e9c and 06c9885.

📒 Files selected for processing (14)
  • Content.Client/Humanoid/HumanoidAppearanceSystem.cs (0 hunks)
  • Content.Client/Humanoid/MarkingPicker.xaml.cs (1 hunks)
  • Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs (1 hunks)
  • Content.Server/Shadowkin/ShadowkinSystem.cs (2 hunks)
  • Content.Shared/Humanoid/EyeColor.cs (0 hunks)
  • Content.Shared/Humanoid/Markings/ColoringTypes/CategoryColoring.cs (1 hunks)
  • Content.Shared/Humanoid/Markings/ColoringTypes/EyeColoring.cs (0 hunks)
  • Content.Shared/Humanoid/Markings/ColoringTypes/SimpleColoring.cs (1 hunks)
  • Content.Shared/Humanoid/Markings/ColoringTypes/SkinColoring.cs (1 hunks)
  • Content.Shared/Humanoid/Markings/ColoringTypes/TattooColoring.cs (1 hunks)
  • Content.Shared/Humanoid/Markings/MarkingColoring.cs (4 hunks)
  • Content.Shared/Humanoid/Markings/MarkingsSet.cs (1 hunks)
  • Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs (1 hunks)
  • Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs (0 hunks)
💤 Files with no reviewable changes (4)
  • Content.Shared/Humanoid/EyeColor.cs
  • Content.Shared/Humanoid/Markings/ColoringTypes/EyeColoring.cs
  • Content.Client/Humanoid/HumanoidAppearanceSystem.cs
  • Content.Shared/_Shitmed/Body/Systems/SharedBodySystem.PartAppearance.cs
🚧 Files skipped from review as they are similar to previous changes (2)
  • Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs
  • Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs
🧰 Additional context used
🧬 Code Graph Analysis (7)
Content.Shared/Humanoid/Markings/ColoringTypes/CategoryColoring.cs (2)
Content.Shared/Humanoid/Markings/MarkingColoring.cs (3)
  • Color (105-117)
  • Color (131-131)
  • Color (132-145)
Content.Shared/Humanoid/Markings/MarkingsSet.cs (5)
  • MarkingSet (54-55)
  • MarkingSet (65-85)
  • MarkingSet (93-106)
  • MarkingSet (112-122)
  • MarkingSet (128-139)
Content.Shared/Humanoid/Markings/ColoringTypes/SkinColoring.cs (2)
Content.Shared/Humanoid/Markings/ColoringTypes/CategoryColoring.cs (1)
  • Color (13-23)
Content.Shared/Humanoid/Markings/ColoringTypes/TattooColoring.cs (1)
  • Color (8-19)
Content.Client/Humanoid/MarkingPicker.xaml.cs (1)
Content.Shared/Humanoid/Markings/MarkingColoring.cs (4)
  • List (29-81)
  • Color (105-117)
  • Color (131-131)
  • Color (132-145)
Content.Shared/Humanoid/Markings/ColoringTypes/SimpleColoring.cs (5)
Content.Shared/Humanoid/Markings/ColoringTypes/CategoryColoring.cs (1)
  • Color (13-23)
Content.Shared/Humanoid/Markings/ColoringTypes/SkinColoring.cs (1)
  • Color (8-11)
Content.Shared/Humanoid/Markings/ColoringTypes/TattooColoring.cs (1)
  • Color (8-19)
Content.Shared/Humanoid/Markings/MarkingColoring.cs (3)
  • Color (105-117)
  • Color (131-131)
  • Color (132-145)
Content.Shared/Humanoid/Markings/MarkingsSet.cs (5)
  • MarkingSet (54-55)
  • MarkingSet (65-85)
  • MarkingSet (93-106)
  • MarkingSet (112-122)
  • MarkingSet (128-139)
Content.Shared/Humanoid/Markings/MarkingsSet.cs (2)
Content.Shared/Humanoid/Markings/ColoringTypes/SkinColoring.cs (1)
  • Color (8-11)
Content.Shared/Humanoid/Markings/MarkingColoring.cs (3)
  • Color (105-117)
  • Color (131-131)
  • Color (132-145)
Content.Shared/Humanoid/Markings/ColoringTypes/TattooColoring.cs (4)
Content.Shared/Humanoid/Markings/ColoringTypes/SimpleColoring.cs (1)
  • Color (11-14)
Content.Shared/Humanoid/Markings/ColoringTypes/CategoryColoring.cs (1)
  • Color (13-23)
Content.Shared/Humanoid/Markings/ColoringTypes/SkinColoring.cs (1)
  • Color (8-11)
Content.Shared/Humanoid/Markings/MarkingColoring.cs (3)
  • Color (105-117)
  • Color (131-131)
  • Color (132-145)
Content.Shared/Humanoid/Markings/MarkingColoring.cs (5)
Content.Shared/Humanoid/Markings/ColoringTypes/SimpleColoring.cs (1)
  • Color (11-14)
Content.Shared/Humanoid/Markings/ColoringTypes/CategoryColoring.cs (1)
  • Color (13-23)
Content.Shared/Humanoid/Markings/ColoringTypes/SkinColoring.cs (1)
  • Color (8-11)
Content.Shared/Humanoid/Markings/ColoringTypes/TattooColoring.cs (1)
  • Color (8-19)
Content.Shared/Humanoid/Markings/MarkingsSet.cs (5)
  • MarkingSet (54-55)
  • MarkingSet (65-85)
  • MarkingSet (93-106)
  • MarkingSet (112-122)
  • MarkingSet (128-139)
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
🔇 Additional comments (8)
Content.Shared/Humanoid/Markings/ColoringTypes/CategoryColoring.cs (1)

13-13: Parameter standardization approved, ensign!

The removal of the eyes parameter aligns with the broader migration away from explicit eye color handling. Your code now properly conforms to the updated abstract method signature.

The implementation remains functionally intact, retrieving colors from the specified marking category. This clean refactoring meets Biesel Republic code standards.

Content.Shared/Humanoid/Markings/ColoringTypes/SkinColoring.cs (1)

8-8: Method signature update executed precisely!

The removal of the unused eyes parameter from GetCleanColor streamlines the interface while maintaining functionality. This follows the command chain established by the base class.

This is the kind of clean, efficient refactoring I expect from my best officers. Continue maintaining this level of code quality, crewman!

Content.Shared/Humanoid/Markings/ColoringTypes/SimpleColoring.cs (1)

11-11: Method signature standardization complete!

The removal of the eyes parameter from GetCleanColor ensures consistency with the abstract method defined in LayerColoringType while preserving the original functionality.

Your code maintains perfect formation with the rest of the fleet. This is how we maintain order in our codebase, soldier!

Content.Shared/Humanoid/Markings/ColoringTypes/TattooColoring.cs (1)

8-8: Parameter removal confirmed!

The eye color parameter has been successfully eliminated from this method signature, aligning with the strategic directive to remove eye color from our marking system. The method now operates with optimal parameter clarity.

Content.Shared/Humanoid/Markings/MarkingsSet.cs (1)

272-272: Parameter streamlining approved!

The removal of the eye color parameter from the EnsureDefault method signature is tactically sound. This change maintains consistency with our broader mission to consolidate appearance customization through the markings system rather than separate appearance fields.

Content.Shared/Humanoid/Markings/MarkingColoring.cs (3)

29-34: Method signature refactoring approved!

The GetMarkingLayerColors method signature has been properly updated to remove the eye color parameter. This strategic adjustment aligns with our campaign to remove eye color as a separate appearance attribute.


105-105: Parameter optimization success!

The GetColor method in LayerColoringDefinition has been successfully streamlined by removing the eye color parameter. This supports our unified marking approach for appearance customization.


131-132: Abstract method signature update approved!

Both the abstract GetCleanColor method and its companion GetColor method have been properly updated to remove eye color parameters. This ensures that all derived coloring types maintain a consistent interface.

SubscribeLocalEvent<ShadowkinComponent, OnMindbreakEvent>(OnMindbreak);
SubscribeLocalEvent<ShadowkinComponent, RejuvenateEvent>(OnRejuvenate);
SubscribeLocalEvent<ShadowkinComponent, EyeColorInitEvent>(OnEyeColorChange);
//SubscribeLocalEvent<ShadowkinComponent, EyeColorInitEvent>(OnEyeColorChange);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Inconsistent code refactoring detected, soldier!

You've commented out the EyeColorInitEvent subscription, but there are still active references to EyeColor in the OnMindbreak method (lines 61-62) and OnRejuvenate method (line 79). This half-completed refactoring leaves your code in a contradictory state!

Either comment out all EyeColor references or update them to use the new markings system. As it stands, this code will likely malfunction when deployed to the field.

Comment on lines +81 to 82
public void SetData(List<Marking> newMarkings, string species, Sex sex, Color skinColor)
{
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Parameter cleanup incomplete - inconsistency detected!

While this method signature has been updated to remove eye color, the class still maintains eye color state and functionality. The overloaded SetData method at line 100 still accepts and uses eye color, and the CurrentEyeColor property at line 40 remains unchanged.

This creates an inconsistent state where eye color is used in some code paths but not others. Either complete the refactoring by removing all eye color references or maintain backward compatibility properly.

Timfa2112 pushed a commit that referenced this pull request Apr 24, 2025
# Description

This sucked, this sucks less now.

---

# TODO

- [x] Use ABGC on Jobs
- [x] Use ABGC on Antags
- [x] Improve marking editor
	- [x] Make it use real toggleable Buttons
	- [x] Remove the enabled/sort order side
	- [x] Make buttons bigger and improve previews
- Move it to the Appearance tab
#2241
	- [x] Add a Clear button to the search
- [x] Display all 4 sprite directions at once instead of using the
stupid rotation thing
- [x] Move import/export/save buttons
- [x] Move name somewhere within the tabs
- Load markings after other stuff in the profile

<!--
Another PR
CharacterRequirements don't need to be given dependencies
Markings use CharacterRequirements
-->

---

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/c2d0e8dd-7f8a-4a21-a7f2-c1ca93f20a74)


![image](https://github.com/user-attachments/assets/3024b84d-2114-4659-92d1-fd22a75cac78)


![image](https://github.com/user-attachments/assets/f471ab02-eabb-4d1b-92d7-22e15b74110b)


![image](https://github.com/user-attachments/assets/225ab764-40d7-4c64-825a-d88e0aeab4c9)


![image](https://github.com/user-attachments/assets/e5ccc05c-3c86-43ec-bbc7-9cbf500044a0)


![image](https://github.com/user-attachments/assets/e1e3562f-9bcc-405a-82e4-a35838e63b8a)

</p>
</details>

---

# Changelog

:cl:
- tweak: Improved readability of many parts of the character editor with
colored rows
- tweak: Cleaned up some little bits of the character editor, most
notably removing a tiny margin that was shrinking every tab
- fix: Fixed the style of the Background tab of the character editor
being very wonky due to misplaced UI elements
- tweak: Made the Jobs tab use proper headers for the department titles
- tweak: Improved the Marking editor
- tweak: Improved the layout of the character editor
- tweak: Improved some button names in the character editor
- add: The character editor now shows all 4 directions of your character
preview at once

---------

Co-authored-by: VMSolidus <evilexecutive@gmail.com>
@github-actions github-actions bot added the Status: Merge Conflict FIX YOUR PR AAAGH label Apr 24, 2025
@github-actions
Copy link
Contributor

This pull request has conflicts, please resolve those before we can evaluate the pull request.

Spatison pushed a commit to Spatison/swdpublic that referenced this pull request Apr 26, 2025
# Description

This sucked, this sucks less now.

---

# TODO

- [x] Use ABGC on Jobs
- [x] Use ABGC on Antags
- [x] Improve marking editor
	- [x] Make it use real toggleable Buttons
	- [x] Remove the enabled/sort order side
	- [x] Make buttons bigger and improve previews
- Move it to the Appearance tab
Simple-Station/Einstein-Engines#2241
	- [x] Add a Clear button to the search
- [x] Display all 4 sprite directions at once instead of using the
stupid rotation thing
- [x] Move import/export/save buttons
- [x] Move name somewhere within the tabs
- Load markings after other stuff in the profile

<!--
Another PR
CharacterRequirements don't need to be given dependencies
Markings use CharacterRequirements
-->

---

<details><summary><h1>Media</h1></summary>
<p>

![image](https://github.com/user-attachments/assets/c2d0e8dd-7f8a-4a21-a7f2-c1ca93f20a74)

![image](https://github.com/user-attachments/assets/3024b84d-2114-4659-92d1-fd22a75cac78)

![image](https://github.com/user-attachments/assets/f471ab02-eabb-4d1b-92d7-22e15b74110b)

![image](https://github.com/user-attachments/assets/225ab764-40d7-4c64-825a-d88e0aeab4c9)

![image](https://github.com/user-attachments/assets/e5ccc05c-3c86-43ec-bbc7-9cbf500044a0)

![image](https://github.com/user-attachments/assets/e1e3562f-9bcc-405a-82e4-a35838e63b8a)

</p>
</details>

---

# Changelog

:cl:
- tweak: Improved readability of many parts of the character editor with
colored rows
- tweak: Cleaned up some little bits of the character editor, most
notably removing a tiny margin that was shrinking every tab
- fix: Fixed the style of the Background tab of the character editor
being very wonky due to misplaced UI elements
- tweak: Made the Jobs tab use proper headers for the department titles
- tweak: Improved the Marking editor
- tweak: Improved the layout of the character editor
- tweak: Improved some button names in the character editor
- add: The character editor now shows all 4 directions of your character
preview at once

---------

Co-authored-by: VMSolidus <evilexecutive@gmail.com>

(cherry picked from commit 7e5b3345409dfdabde4ea56d3ecdd34a5ecdd46f)
EphemeralGeek pushed a commit to EphemeralGeek/Dragon-Station that referenced this pull request Apr 26, 2025
# Description

This sucked, this sucks less now.

---

# TODO

- [x] Use ABGC on Jobs
- [x] Use ABGC on Antags
- [x] Improve marking editor
	- [x] Make it use real toggleable Buttons
	- [x] Remove the enabled/sort order side
	- [x] Make buttons bigger and improve previews
- Move it to the Appearance tab
Simple-Station/Einstein-Engines#2241
	- [x] Add a Clear button to the search
- [x] Display all 4 sprite directions at once instead of using the
stupid rotation thing
- [x] Move import/export/save buttons
- [x] Move name somewhere within the tabs
- Load markings after other stuff in the profile

<!--
Another PR
CharacterRequirements don't need to be given dependencies
Markings use CharacterRequirements
-->

---

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/c2d0e8dd-7f8a-4a21-a7f2-c1ca93f20a74)


![image](https://github.com/user-attachments/assets/3024b84d-2114-4659-92d1-fd22a75cac78)


![image](https://github.com/user-attachments/assets/f471ab02-eabb-4d1b-92d7-22e15b74110b)


![image](https://github.com/user-attachments/assets/225ab764-40d7-4c64-825a-d88e0aeab4c9)


![image](https://github.com/user-attachments/assets/e5ccc05c-3c86-43ec-bbc7-9cbf500044a0)


![image](https://github.com/user-attachments/assets/e1e3562f-9bcc-405a-82e4-a35838e63b8a)

</p>
</details>

---

# Changelog

:cl:
- tweak: Improved readability of many parts of the character editor with
colored rows
- tweak: Cleaned up some little bits of the character editor, most
notably removing a tiny margin that was shrinking every tab
- fix: Fixed the style of the Background tab of the character editor
being very wonky due to misplaced UI elements
- tweak: Made the Jobs tab use proper headers for the department titles
- tweak: Improved the Marking editor
- tweak: Improved the layout of the character editor
- tweak: Improved some button names in the character editor
- add: The character editor now shows all 4 directions of your character
preview at once

---------

Co-authored-by: VMSolidus <evilexecutive@gmail.com>
sleepyyapril pushed a commit to sleepyyapril/TheDen that referenced this pull request May 6, 2025
This sucked, this sucks less now.

---

- [x] Use ABGC on Jobs
- [x] Use ABGC on Antags
- [x] Improve marking editor
	- [x] Make it use real toggleable Buttons
	- [x] Remove the enabled/sort order side
	- [x] Make buttons bigger and improve previews
- Move it to the Appearance tab
Simple-Station/Einstein-Engines#2241
	- [x] Add a Clear button to the search
- [x] Display all 4 sprite directions at once instead of using the
stupid rotation thing
- [x] Move import/export/save buttons
- [x] Move name somewhere within the tabs
- Load markings after other stuff in the profile

<!--
Another PR
CharacterRequirements don't need to be given dependencies
Markings use CharacterRequirements
-->

---

<details><summary><h1>Media</h1></summary>
<p>

![image](https://github.com/user-attachments/assets/c2d0e8dd-7f8a-4a21-a7f2-c1ca93f20a74)

![image](https://github.com/user-attachments/assets/3024b84d-2114-4659-92d1-fd22a75cac78)

![image](https://github.com/user-attachments/assets/f471ab02-eabb-4d1b-92d7-22e15b74110b)

![image](https://github.com/user-attachments/assets/225ab764-40d7-4c64-825a-d88e0aeab4c9)

![image](https://github.com/user-attachments/assets/e5ccc05c-3c86-43ec-bbc7-9cbf500044a0)

![image](https://github.com/user-attachments/assets/e1e3562f-9bcc-405a-82e4-a35838e63b8a)

</p>
</details>

---

:cl:
- tweak: Improved readability of many parts of the character editor with
colored rows
- tweak: Cleaned up some little bits of the character editor, most
notably removing a tiny margin that was shrinking every tab
- fix: Fixed the style of the Background tab of the character editor
being very wonky due to misplaced UI elements
- tweak: Made the Jobs tab use proper headers for the department titles
- tweak: Improved the Marking editor
- tweak: Improved the layout of the character editor
- tweak: Improved some button names in the character editor
- add: The character editor now shows all 4 directions of your character
preview at once

---------

Co-authored-by: VMSolidus <evilexecutive@gmail.com>
Aidenkrz pushed a commit to Goob-Station/Goob-Station-MRP that referenced this pull request May 8, 2025
* Fix Tests Again (#2306)

# Description

Give me my tests back you bastards.

# Changelog

No CL this isn't player facing

* Crew Monitor Map Fixes (#2302)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Description.

---
This doesn't address the root issue which is that this doesn't happen
automatically, but this will make it so that players don't have to fix
the crew monitor themselves round start.



<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/71fa4cb7-b6d1-487f-8efd-8f31eea8d2a1)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- fix: The Crew Monitor server now works on Anchor, Asterisk, Core,
Hive, Lambda, and Pebble roundstart.

Co-authored-by: VMSolidus <evilexecutive@gmail.com>

* Automatic Changelog Update (#2302)

* Make the Corporate Liaison Not Able to Be an Antagonist (#2299)

# Description

Corporate Liaison is no longer antag-eligible

---

# Changelog

:cl:
- remove: Removed antag eligibility for Corporate Liaison

Signed-off-by: Timfa <timfalken@hotmail.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>

* Automatic Changelog Update (#2299)

* Fix Friction without Input (#2289)

Problem I had on Parkstation, ported the fix here.

Co-authored-by: VMSolidus <evilexecutive@gmail.com>

* Fix Spiders Not Being Hostile (#2303)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

Port a PR that fixes spiders not being hostile
https://github.com/space-wizards/space-station-14/pull/34153

---

# TODO

<!--
A list of everything you have to do before this PR is "complete"
You probably won't have to complete everything before merging but it's
good to leave future references
-->

- [x] Test

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>



https://github.com/user-attachments/assets/407d7daf-dc00-43db-a5e9-78c6c6e953b7



</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- fix: The spiders got tired of making friends and started biting again.

Co-authored-by: Booblesnoot42 <108703193+Booblesnoot42@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>

* Automatic Changelog Update (#2303)

* TCJ Makes A Rage Performance PR (#2298)

# Description

I got baited by Ectoplasm, so I then spent 3 hours shaving off a
sizeable chunk of this game's performance cost, including by taking 3 of
the "Top 10 frametime consumers", and reducing their performance costs
by 99% each. Along with various examples of slimming down some of the
worst EQE's.

Oh, and I fixed EmitSoundOnMove being desynced with actual movement. As
part of making EmitSoundOnMove use 99% less CPU time, it was also
synchronized with the MoverController.

# Changelog

:cl:
- fix: Fixed items such as tactical webbing, bell collars, and hardsuits
being desynced with character movement.
- tweak: Made various large performance improvements.

* Automatic Changelog Update (#2298)

* General Character Editor Improvements (#2252)

# Description

This sucked, this sucks less now.

---

# TODO

- [x] Use ABGC on Jobs
- [x] Use ABGC on Antags
- [x] Improve marking editor
	- [x] Make it use real toggleable Buttons
	- [x] Remove the enabled/sort order side
	- [x] Make buttons bigger and improve previews
- Move it to the Appearance tab
https://github.com/Simple-Station/Einstein-Engines/pull/2241
	- [x] Add a Clear button to the search
- [x] Display all 4 sprite directions at once instead of using the
stupid rotation thing
- [x] Move import/export/save buttons
- [x] Move name somewhere within the tabs
- Load markings after other stuff in the profile

<!--
Another PR
CharacterRequirements don't need to be given dependencies
Markings use CharacterRequirements
-->

---

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/c2d0e8dd-7f8a-4a21-a7f2-c1ca93f20a74)


![image](https://github.com/user-attachments/assets/3024b84d-2114-4659-92d1-fd22a75cac78)


![image](https://github.com/user-attachments/assets/f471ab02-eabb-4d1b-92d7-22e15b74110b)


![image](https://github.com/user-attachments/assets/225ab764-40d7-4c64-825a-d88e0aeab4c9)


![image](https://github.com/user-attachments/assets/e5ccc05c-3c86-43ec-bbc7-9cbf500044a0)


![image](https://github.com/user-attachments/assets/e1e3562f-9bcc-405a-82e4-a35838e63b8a)

</p>
</details>

---

# Changelog

:cl:
- tweak: Improved readability of many parts of the character editor with
colored rows
- tweak: Cleaned up some little bits of the character editor, most
notably removing a tiny margin that was shrinking every tab
- fix: Fixed the style of the Background tab of the character editor
being very wonky due to misplaced UI elements
- tweak: Made the Jobs tab use proper headers for the department titles
- tweak: Improved the Marking editor
- tweak: Improved the layout of the character editor
- tweak: Improved some button names in the character editor
- add: The character editor now shows all 4 directions of your character
preview at once

---------

Co-authored-by: VMSolidus <evilexecutive@gmail.com>

* Automatic Changelog Update (#2252)

* Final Space Wind

* Update AtmosphereSystem.MAS.cs

* More Harpy Wings (#2280)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

About 12 new sets of harpy wings as customization options (~7 basic
options, with colorable and preset variants)

Just a few more options for harpy players to use if they want to.

---

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/e372428c-6dc8-4e7b-b8d9-2873b556e6a4)

![image](https://github.com/user-attachments/assets/5e11b99e-6d58-4824-8475-dc511b0b3f0c)

![image](https://github.com/user-attachments/assets/865dcb65-3f7d-4f66-9336-98672ee015b2)

![image](https://github.com/user-attachments/assets/71e9b22e-984d-407b-bb10-d83c0c4dbee1)

![image](https://github.com/user-attachments/assets/cc6df1e8-6ac0-4613-a6f7-2e13143304a1)

![image](https://github.com/user-attachments/assets/17699b3d-22c4-42b5-a75e-a946fcd09c52)

![image](https://github.com/user-attachments/assets/d98fcf5e-bd56-43d4-b9c1-8fe666c8415e)

![image](https://github.com/user-attachments/assets/b9bfcef1-2e90-48dd-a956-771c4f2f068c)

![image](https://github.com/user-attachments/assets/08abdab8-bbc3-4bc8-8ce4-9ab16ac41a31)

![image](https://github.com/user-attachments/assets/822885b8-3abe-4e83-b394-9fee78576d3c)

![image](https://github.com/user-attachments/assets/1589c1f5-7665-4966-94a1-c84b36b2dd4f)

![image](https://github.com/user-attachments/assets/6350d409-6947-4fac-af26-84763f9ca3ef)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl: Zeta_Null
- add: Added 12 new sets of wings for Harpies

* Automatic Changelog Update (#2280)

* destroy the flying blender code

* aaaa

* Add New Species: Xelthia (#2214)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->
This is a PR to add a new species, the Xelthia. I find that most of the
species in this game don't feel particularly alien, and I'm aware that
they aren't as alien as some might want, but I feel like they're
decently alien, personally. In addition to this, I've tried to set them
up to fill niches that aren't particularly common with other species,
such as having a heat resistance and cold weakness where other species
tend to have cold resistances and heat weaknesses.

Here's their current list of (planned) traits, which is tentative and
I'm open to adjusting.
### Negatives
- Cold weaknesses
- Lack of a gloves slot thanks to having tentacle arms
- Carnivores, will only eat things containing meat for the most part
### Positives
- Heat resistances
- Arm Regrowth, dropping their current arms
- Acid blood (Currently slippable)
- Caustic immunity (so they don't burn from falling in their own blood)
### ???
- Dropped arms are able to be eaten and/or cooked.

I've not worked with C# before now, so apologies if the code is a little
bit scuffed or anything

---

# TODO

<!--
A list of everything you have to do before this PR is "complete"
You probably won't have to complete everything before merging but it's
good to leave future references
-->

- [x] Implement Xelthia Species, complete with sprites and a language
- [x] Add species default names
- [x] Add displacement maps and such to make sure they look right
- [x] Implement primary YAML-based species functions, basically
everything that isnt the limb regrowth function
- [x] Axe the initial psionics bit
- [x] Add the actual function for limb regrowth
- [x] Add proper lore
- [x] Any other possible considerations with adding Xelthia
characteristics

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>



https://github.com/user-attachments/assets/4fd3cb4f-4d5d-44dd-b5c0-62fd392e8920




![image](https://github.com/user-attachments/assets/3e5db9cc-a2b3-424e-a75c-cd410d57a0b2)


![image](https://github.com/user-attachments/assets/0a8e3f50-e20c-406e-8c1e-78cdd4eb1496)


![image](https://github.com/user-attachments/assets/bc860e97-6180-484c-afb1-e539decbb425)


![image](https://github.com/user-attachments/assets/331a620b-4c7f-4913-81db-a3fe235f58c1)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl: Zeta_Null
- add: Added Xelthia, a custom alien species
- add: Added an insulated jacket, to account for Xelthia not having
access to a glove slot.
- add: Xelthia tentacle item that drops when arms are regrown. This is
able to be cooked.

---------

Signed-off-by: ZetaNull <93877175+ZetaNull@users.noreply.github.com>

* Automatic Changelog Update (#2214)

* Automatic Changelog Update (#2309)

* New Font for Qiilour (Xelthia Language) + Xelthia Trait Blacklists (#2317)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

Just gives Qiilour a unique font and blacklists Xelthia from traits that
don't make sense for them (Talons/Claws, Natural Weapons Removal, all
Arm-related Bionics)

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/ad345651-63c5-4848-8e82-fa1d7147ab11)
Font (Nova Flat)


![image](https://github.com/user-attachments/assets/661d4ad8-0108-4cf6-b3aa-bc7c96e41072)
There's a couple of these that xelthia are blacklisted from but just
proof that I tested that they were, in fact, blacklisted from them

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl: Zeta_Null
- add: Added a proper font for Qiilour to use
- tweak: Put Xelthia on some trait blacklists that they wouldn't
reasonably be applicable for (Arm Related things)

* Automatic Changelog Update (#2317)

* Update SuicideCommandTests.cs (#2318)

# Description

This test does not take species weaknesses into account. If it picks a species with a slash weakness, it fails. Seeing if at least the required damage is done will mean the test runs successfully even on species that are supposed to take more damage from slash.

* Flight Speed, Moff Trait Small Rebalance (#2313)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Discussed with some harpy players and agreed upon on call where we
talked about trait balance (for the cost reduction for the trait).
This PR makes true flight (the trait for moffs that you can take when
under 60kg, gives you a modified version of harpy flight) cost 2 (from
5) and reduces the speed modifier for flying from 1.2 to 1.19.
(effective 32% increase to 30.9%)
Also adjusts the speed modifier for harpy flight to 1.3. (from an
effective speed increase of 54% to 60.16%)

---


# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- tweak: Adjusted moth and harpy flight to be more balanced. (Moth
flight, ~30% speed increase, Harpy flight ~60% over sprinting, accounts
for all modifiers, including harpies 10% sprint speed increase) Makes
True Flight trait cost -2 instead of -5.

* Automatic Changelog Update (#2313)

* Bug Languages Accesibility + a Smol Fix (#2316)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

This PR adds 2 language traits: One for Moffic, one for Chittin. Both
can be taken by IPC and Harpy, and Moths can take Chittin, Chitinids can
take Moffic. These three are the only ones that can take those traits,
which cost 1 point.
Additionally, it prevents Harpies from taking the Valyrian language
trait, as they already start with that language so no need for them to
waste a point.

---


<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>

![Zrzut ekranu 2025-04-25
213816](https://github.com/user-attachments/assets/aa8de365-a703-4fcc-8e73-8f7d40e9aabe)
![Zrzut ekranu 2025-04-25
213942](https://github.com/user-attachments/assets/25d0a826-ec9d-4da0-8bf7-7a8d1f31c2cb)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- add: Added Moffic (moff lang) and Chittin (chitinid lang) as languages
traits. Available for IPCs and Harpies for 1 point, as well as Moths for
Chittin and Chitinids for Moffic.
- fix: Harpies can no longer waste a point on the Valyrian standard
language trait, which they already start with.

* Automatic Changelog Update (#2316)

* Update publish_multi_request.py

Signed-off-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com>

* Engineering & Security Alt Uniforms/Equipment. (#2315)

# Description

This PR is my first wave of porting new assets for use with Contractors,
this time featuring alternate job uniforms that are employer-specific.
There's also new "Heavy Armor" variants for security as options that
take up a good chunk of your loadout points. Next chance I get, I'll do
PMCG, which I have a lot of people begging me for since private military
contractors are a very commonly wanted secoff concept.

# TODO

<details><summary><h1>Media</h1></summary>
<p>

HoS Heavy Armor (The gold lights actually glow):

![image](https://github.com/user-attachments/assets/ab4c202f-3a58-4ab3-b11d-7fcbe44c291d)

HoS with helmet:

![image](https://github.com/user-attachments/assets/8816c852-2ff8-42d7-8bce-198141cbd87d)

Sec Heavy Armor (The blue lights glow!)

![image](https://github.com/user-attachments/assets/24540196-5721-4bfd-8e20-49e3d825928d)

Some Zavodskoi Sec uniforms

![image](https://github.com/user-attachments/assets/51e04c2d-22c2-41b5-ad4d-2339737748f5)

Zavodskoi sec without armor.

![image](https://github.com/user-attachments/assets/2211af87-7a15-479c-b3f2-0b7829fe53ff)

Hephaestus Engineer

![image](https://github.com/user-attachments/assets/1b803d9b-b206-4c83-9ca3-0824b3dd5374)

</p>
</details>

# Changelog

:cl:
- add: Added new Employer-Specific uniforms for Hephaestus, Zavodskoi,
and NanoTrasen.
- add: Added heavy armor options for security to spend loadout points on
other than their gun.
- add: Added a unique heavy armor variant for Head of Security.
- add: Added specialized heavy armor crates to order from the Armory
tab, these include Ballistic and Laser Ablative armor variants.
- add: Added TCAF plate carrier for people wanting to use the TCAF
security outfits, but don't like taking the big slowdown.
- tweak: Nerfed the TCAF heavy armor a bit, it now has the same 30%
slowdown as the other "Heavy Sec Armor" variants.

* Automatic Changelog Update (#2315)

* Melee Part 6: Stamina Issues and AttackRates (#2319)

# Also known as "Oh my aching Stamina..."

This PR is a variety of touch ups to many weapons to help make them more
unique, a little more powerful, and also to fix a few issues.
Some weapons still had a stamina cost of 5 or 10, this is almost
universally lowered to a new default of 0.5 or 2.5, with a few
exceptions.
The generic power attack angle is now increased as well which should
include combat feel.

Stamina damage was also lowered on a number of weapons.

The 'issue' of some melee weapons ended up being that their attack rates
were going off of Wizden numbers, which is wrong. 0.75 would be a slower
swing on a melee in Wizden code, but here it is 0.75s(when 1s is the
default). A variety of melee weapons had this issue where either their
left click or their power attack

---
<details><summary><h1>Media</h1></summary>
Showcasing the difference of a bugged power attack with the wrench vs
it's normal left click
<p>


![rotating](https://github.com/user-attachments/assets/330828c9-72b4-495e-a772-c4c2b84daa4a)



</p>
</details>

---

# Changelog


:cl: ODJ
- add: Changeling now has power attacks for it's blade and hammer.
- tweak: Melee weapons given slight adjustments to feel better and more
unique.

---------

Co-authored-by: jcsmithing <jcsmithing@gmail.com>
Co-authored-by: Timfa <timfalken@hotmail.com>

* Automatic Changelog Update (#2319)

* Trait Repricing, 2!  (#2323)

# Price drops and value cuts

Based off of player feedback and overall issues with the design of
points following previous PR's, prices for a big chunk of traits have
been adjusted.
This has very intentional direction regarding traits.

Firstly, a number of negative traits have been reduced in the amount of
points they return to the user. This is simply a reduction of points
however, as no negative trait was changed to give 0, with a few of the
more 'awful' negative traits given a few extra points for those that opt
in.

Next up is the various price reductions across the board to a number of
the under-preforming positive traits. A number of these were rather
interesting but were hampered by silly prices.

Aside from this, a few traits fall into a slight balance adjustment,
such as vampirism becoming more expensive, a slight nerf to the regen of
Nanobots(nothing else yet), and the adjustment to the Oni's trait
selection no longer costing them any trait points.

Please enjoy!

---

<details><summary><h1>Media</h1></summary>
<p>


![rotating](https://github.com/user-attachments/assets/2aa15d3b-f32b-416d-9851-0499595cfef9)


</p>
</details>

---

# Changelog

:cl: ODJ
- tweak: Adjusted a number of trait prices; Oni now have a free species
trait choice, Harpies singing is far cheaper, being small is now free,
etc.

Co-authored-by: jcsmithing <jcsmithing@gmail.com>
Co-authored-by: Timfa <timfalken@hotmail.com>

* Make Xelthia's First Contact Date a Little Bit Less Dramatically Recent (#2322)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

Changes the Xelthia first contact date from around 25 years ago to
around 100 years ago to allow for the creation of Xelthia characters
with some more history after this was requested. Still should be recent
enough to allow for characters who are unfamiliar with human things.

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/5a22c59b-eef2-4ad3-98c8-100624326b29)

</p>
</details>

* Automatic Changelog Update (#2323)

* Give Traits A Haircut (#2292)

# Description

Done on stream with @OldDanceJacket and with a livestream of >30 people.
This PR massively trims down the most problematic aspects of Psionics
related to traits, blatantly by just outright removing the option for
buying roundstart powers. Station's were basically space hogwarts, which
caused problems. Also at ODJ's insistence, we dialed back a LOT of the
"Negative trait proliferation", in order to reduce the crew power
scaling issues.

Also some small psionic related bugfixing.

# TODO

<details><summary><h1>Media</h1></summary>
<p>

These are all 6 of the remaining "Psionics" traits. 


![image](https://github.com/user-attachments/assets/b044ac7d-cab3-4855-aab2-cc48882aa0a3)

</p>
</details>

# Changelog

:cl:
- tweak: Significantly reduced the amount of points given by most
negative traits.
- fix: Fixed the Psionic Mantis not being able to roll powers.
- remove: Removed all trait menu options for buying roundstart psionic
powers. I'm sorry about this, but it broke a LOT of things, and wasn't a
good idea at all in the first place. There's no longer the Elementalist
psicaster type, since there's also no power shop.

---------

Signed-off-by: Timfa <timfalken@hotmail.com>
Co-authored-by: Timfa <timfalken@hotmail.com>

* Automatic Changelog Update (#2292)

* Remove Reflect From Shuttle Walls (#2314)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Removes the reflect from shuttle walls (who thought that was a good idea
to have), so no bullet hell on shuttles / northway.

---

# TODO

<!--
A list of everything you have to do before this PR is "complete"
You probably won't have to complete everything before merging but it's
good to leave future references
-->

- [x] Remove reflect from shuttle walls

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->
<!--
<details><summary><h1>Media</h1></summary>
<p>

![Example Media Embed](https://example.com/thisimageisntreal.png)

</p>
</details>

---
-->
# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- tweak: Shuttle walls no longer reflect projectiles

Signed-off-by: CliveOcelot <165305605+Orion-416@users.noreply.github.com>

* Adds Paramedic Windbreaker, Coat, and Boots as a Loadout Option (#2312)

# Description

Pretty self explanatory.

# TODO

<!--
A list of everything you have to do before this PR is "complete"
You probably won't have to complete everything before merging but it's
good to leave future references
-->

- [x] Add windbreaker, winter coat, and winter boots to paramedic
loadout.
- [x] Make sure the customization UI doesn't disintegrate because I
added the windbreaker, winter coat, and winter boots to paramedic
loadout.

---

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/196ec403-504f-4721-83f0-2acda6d624f3)

</p>
</details>

---

# Changelog

:cl: mrs
- add: Added paramedic windbreaker, winter coat, and winter boots to the
paramedic loadout.

---------

Co-authored-by: mi8hip <azizalperyk@gmail.com>
Co-authored-by: Timfa <timfalken@hotmail.com>

* Automatic Changelog Update (#2314)

* Automatic Changelog Update (#2312)

* Fix Surgery Tool Sprites (#2307)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Abductor added new inhand sprites for the energy surgery tools, however
the paths for the RSI were incorrect causing errors, this PR fixes that.

No media because its literally just path changes, look at files changed.

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- fix: Advanced surgery tools will no longer be errors

Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>
Co-authored-by: Timfa <timfalken@hotmail.com>

* Automatic Changelog Update (#2307)

* IPC Negative Traits (#2324)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

This PR adds 2 negative traits that IPCs can take. 
Inefficient Cogitator increases the power drain that IPCs have by around
33%. (1.5/s -> 2/s) Gives 3 points.
Defective Chassis functions as the IPC version of brittle bones, aka
Osteogenesis Imperfecta. It halves their death threshold
(120 -> 60), as they can't go into crit. Gives 6 points. (Because
brittle bones will give 6 points anyway)
Also yes I tested the power drain, it works, I just didn't want to show
me standing still for 6 minutes, or show footage that isn't the trait
with the value cranked up.

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>

![Zrzut ekranu 2025-04-26
114525](https://github.com/user-attachments/assets/070a63ec-218a-4745-b6fd-be02fe184406)

![Zrzut ekranu 2025-04-26
114617](https://github.com/user-attachments/assets/b4ff43ae-a4b7-4ffd-bdf2-49a30d5c225e)

![Defective Chassis
working](https://github.com/user-attachments/assets/4ac032d7-e87b-41bc-8223-6a14b5b5347d)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- add: Added the Inefficient Cogitator and Defective Chassis traits!
Both are negative traits for IPCs. Inefficient Cogitator increases the
power drain of IPCs by ~33% (1.5/s -> 2/s) and gives 3 points, Defective
Chassis halves their death threshold, as they can't go into crit (it's
the IPC version of brittle bone disease). Gives 6 points.

* Automatic Changelog Update (#2324)

* Bagel: Syndi Puddle Driver Issued a Parking Ticket (#2275)

# Description

Changes the Syndi Puddle shuttle spawn pos to -247.5992,-242.460846 from
-47.5992,-42.460846 to stop the shuttle from spawning inside the
station.

# Changelog

:cl: mrs
- fix: Bagel: The syndicate shuttle has been issued a parking ticket.
(No more shuttles spawning inside the station, hopefully.)

Co-authored-by: mi8hip <azizalperyk@gmail.com>
Co-authored-by: Timfa <timfalken@hotmail.com>

* Automatic Changelog Update (#2275)

* Glimmer Logging And Sanity Checking (#2279)

# Description


![image](https://github.com/user-attachments/assets/1459b294-d2cb-44e3-a897-5e34606444ce)

Adds some logging and sanity checking to the inputs for the glimmer
system in an attempt to get it to stop outputting NaN glimmer.

# Changelog

No CL this isn't player facing.

---------

Co-authored-by: Timfa <timfalken@hotmail.com>

* The Magmantle! (#2295)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

This PR adds the Magmantle, a mantle that functions like magboots, but
slightly worse (like 15% more slowdown, but it does provide 20%
temperature protection like winter boots or scarves). Its intended for
species without the feet slot, which are harpy, diona and arachne. It is
available in the species tab of loadouts, for 6 points. Only Security,
Command, Dignitaries, Engineering, Salvies and Parameds can take it, if
they are a harpy, diona or arachne.

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


![mmantle](https://github.com/user-attachments/assets/782bef02-cba5-4d69-86f0-eece4aa3ea1a)

![mmantledesc](https://github.com/user-attachments/assets/455b3ede-8467-4aa9-a668-b266a2abde38)
![Magmantle working, speed modifiers
showcase](https://github.com/user-attachments/assets/bf03525d-3d8a-410b-bd3c-e1a9cdb0d1d5)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- add: Added the Magmantle, a mantle that functions as worse magboots on
the neck slot (15% more slow, but they give 20% temperature protection
like winter boots or scarves). It is available in the species section of
loadouts, for all the species that do not have a feet slot. (Harpy,
Diona, Arachne)

---------

Co-authored-by: VMSolidus <evilexecutive@gmail.com>

* Automatic Changelog Update (#2295)

* Request by ODJ to Add IPC to to the Permited List of the Trait Lyre Bird (#2326)

# Description

IPCs have vocoder/voicechips to talk, they can resonable be extended
altered used to produce a larger range of sound.

<details><summary><h1>The trait avalible on a IPC in character
create</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/0466c989-69a7-4823-87d1-45fcafbe1542)

:cl:
- add: Added IPC to permitted for Lyre Bird.
- altered: description to make it more neutral and less harpy specific.

Co-authored-by: ilmenwe <no@mail.com>

* Automatic Changelog Update (#2326)

* Disable/Migrate Grappling Gun, Tether Gun, and Force Gun. (#2328)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

These three items are built off of shitcode, and they like throwing
errors / causing problems, so until someone takes the time to fix them,
I'm going to be disabling them.

For safety (just incase they were mapped for some reason) Theyve also
been migrated to null

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- remove: Disabled grappling guns, tether guns, and force guns

---------

Signed-off-by: EctoplasmIsGood <109397347+EctoplasmIsGood@users.noreply.github.com>
Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Automatic Changelog Update (#2328)

* AI Slaving Delta-V Port (#2320)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Ports AI Slaving from Delta-V. The ObeyAI law now isn't specified in the
lawsets. This should also prevent the ObeyAI law from getting out of
order.

---


<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>



https://github.com/user-attachments/assets/ecc42760-b9a3-4df7-ac5e-ca0a589af74a



</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:

- fix: Law boards will no longer give the Station AI a law that makes
them obey themselves.
- fix: Chassis Selection Medi-Borgs can dispense candy now.

---------

Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com>
Co-authored-by: Timfa <timfalken@hotmail.com>

* Automatic Changelog Update (#2320)

* Muted Trait Will Once Again Reward You 6 Points, and Thief Have Had I… (#2325)

# Description

The muted and thief trait have been rebalanced based on request from ODJ
who had many other things to fix before the release.


# Media
<[Official ODJ Media]> provided.

![rotating](https://github.com/user-attachments/assets/ddc9c747-34c9-43f5-839e-dddcb3ec44e0)

---


:cl:
- tweak: Tweaked as told.

Co-authored-by: ilmenwe <no@mail.com>

* Automatic Changelog Update (#2325)

* Quick FTL Updates for Xelthia Markings and New Harpy Wings (#2330)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

APPARENTLY the marking names for coloring don't throw an error when not
localized properly. Applied proper names to these. That's the entire PR.

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/d68df6d2-ae74-484f-b369-abffd2b5db19)


</p>
</details>


# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl: Zeta_Null
- add: Fixed marking localization issues

* Fixes some Parts of BSO's Gear (#2336)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Changed the light on the modsuit to be the right colour, gave BSO the
over ear CC headset instead of the normal CC headset.

---

# TODO

<!--
A list of everything you have to do before this PR is "complete"
You probably won't have to complete everything before merging but it's
good to leave future references
-->

- [x] Fix the light on the modsuit
- [x] Give BSO the over ear headset 

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/47854ce3-d9a9-4b4e-97a4-18b6b079d012)


![image](https://github.com/user-attachments/assets/d9b8146d-218d-46f9-93a8-950431bff78e)


</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- tweak: BSO now has the over-ear headset
- tweak: BSO's modsuit now has the right colour for its light

---------

Signed-off-by: CliveOcelot <165305605+Orion-416@users.noreply.github.com>

* Hardsuit Sprite Bugfixes (#2334)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Hardsuit sprite bugfixes and such.

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

ERT suits should no longer be large errors.
Bloodred's head sprite should now be equipped-helmet and not
equipped-head (This is leftover from the impstation sprite port)
BSO / Dreadnought suit now have glow.
The Reverse-Engineered hardsuits from Nyano now have glow, and no longer
display errors.
ERT Helmets should now show light.

---

# TODO

<!--
A list of everything you have to do before this PR is "complete"
You probably won't have to complete everything before merging but it's
good to leave future references
-->

- [X] Task


---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>

![Example Media
Embed]![image](https://github.com/user-attachments/assets/d4bb3771-e78b-4d73-bbb1-bcea49b86acc)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- fix: ERT suits should no longer be large errors.
- fix: Bloodred's head sprite should now be equipped-helmet and not
equipped-head (This is leftover from the impstation sprite port)
- fix: BSO / Dreadnought suit now have glow.
- fix: The Reverse-Engineered hardsuits from Nyano now have glow, and no
longer display errors.
- fix: ERT Helmets should now show light.

* Abductor Eye Visibility Flag Change and Invisble Organ Removal (#2331)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Abductor Eye was visible to people other than the Abductor. That was
obviously bad. Alongside that, the invisibility organ had issues
revolving deleting items from the inventory. Also obviously bad.

---


<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/043c0f7f-48c7-449e-ba87-e9ebac50ff21)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- fix: Abductor Eye is now no longer visible for the inferior organisms.
- remove: Invisibility Organs were removed for being turbo-borked.

* Beacons No Longer Glitch Off on Grid Split (#28518) (#2341)

https://github.com/Simple-Station/Einstein-Engines/pull/2337

Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>

* New Xelthia Surgical Jacket + Surgery Check for Xelthia Jackets (#2340)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Title. Allows the insulated jacket to be used as gloves during surgery,
adding a component to facilitate this, and adds a similar jacket for the
express purpose of being used in surgery.

Also comes with a bugfix for the Xelthia-specific insulated jacket
sprite not working properly and a bit of fine tuning for its
description. The jackets are also added to appropriate spots like CE and
CMO lockers.

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>

A fair number of screenshots taken while testing this at various points


![image](https://github.com/user-attachments/assets/1e903668-e109-4c7c-b136-9ff3b16f277a)

![image](https://github.com/user-attachments/assets/2793b4d0-21f3-41bd-8934-aae79f40b73a)
(pre-fix for xelthia insulated jacket sprite)

![image](https://github.com/user-attachments/assets/87f6c976-a32a-43f6-ada0-c6ca6549841d)

![image](https://github.com/user-attachments/assets/f314e9bc-cc85-407f-9b67-e1f6b79313d6)

![image](https://github.com/user-attachments/assets/47d2dc8a-96d7-46df-b222-eabf02bc6306)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl: Zeta_Null
- add: Added a surgical jacket, for Xelthia to perform surgery wearing
in place of gloves.
- tweak: Tweaked surgery to allow for jackets with gloves to be treated
as gloves.

* Fix Linoleum Floor Texture (#2346)

# Description

Fixes the Linoleum floor texture. It wasn't even properly aligned
originally. Tiny PR but it fixes something I've HATED for a while

---

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/4d39a884-ce48-4463-9202-32fd851abb42)



![image](https://github.com/user-attachments/assets/7b48d687-f5e2-4270-9df1-76075fdd15b8)

</p>
</details>

---

# Changelog

:cl: Zeta_Null
- fix: Fixed the Linoleum floor texture.

* Fix Changeling Identification in Admin Overlay (#2350)

# Description
In the F7 Admin Overlay - The Changeling mindrole did not have a
roleType assigned causing it default to non-antagonist.

Added roleType: SoloAntagonist to mind_roles.yml (It was really this
simple)



<h1>Media</h1>


![image](https://github.com/user-attachments/assets/ad9ac6bb-4f59-48b6-8142-d5cf9c1724f6)



---

# Changelog

:cl:
- fix: Changelings are now correctly identified as Solo Antagonists in
the admin overlay!

Signed-off-by: Gareth Quaile <garethquaile@gmail.com>

* Fix Xelthia Glovejackets to Properly Block Fingerprints (#2356)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Fixes the surgical and insulated jackets made for Xelthia to block
fingerprints, as these cover hands.

Also makes it so other outerClothing can also use the FingerprintMask
component. Gloves are treated as though they are on top.

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>

</p>
</details>


![image](https://github.com/user-attachments/assets/3078adf4-bc6b-4432-bb90-4cfefe80ff7b)

![image](https://github.com/user-attachments/assets/013e3ff7-2678-4edb-8663-bd61eef71ee0)

![image](https://github.com/user-attachments/assets/d3ddd421-5d4d-4974-b337-ddcae42bc675)
This last one is from testing to make sure things apply in a logical
order.

* Nerf Thaven attacks by halving stamina damage done and making them not attack faster than default anymore

* Fix Downward Harpy Wing Localization (#2363)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Made an error while setting up the harpy wing localization initially,
which fucked up the text when the downward wings were selected for
coloring. This just fixes that bit of localization so it works.

---
<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->
<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/b10b979e-04bb-4369-a9d6-57bfb1e90cea)

</p>
</details>

* Fix Mystic PDA (#2364)

https://github.com/Simple-Station/Einstein-Engines/pull/2361

Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>

* Remove Teach a Lesson (#2365)

https://github.com/Simple-Station/Einstein-Engines/pull/2362

Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>

* Fix Energy Weapons Cycling on Wield (#2368)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

There was this really annoying bug that made energy weapons switch their
fire mode if you wielded them, this ports a change from wizden/starlight
that fixes it. I will link the wizden PR that gives all proper
credit/attributions to starlight.

https://github.com/space-wizards/space-station-14/pull/37085

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>



https://github.com/user-attachments/assets/1a98e393-8096-4406-83b3-a2863ef9cce5



</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- fix: Energy guns wont cycle on wield anymore

---------

Co-authored-by: imatsoup <93290208+imatsoup@users.noreply.github.com>
Co-authored-by: Matthew Herber <32679887+happyrobot33@users.noreply.github.com>
Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>

* Chef and Bartender Employment Fixes (#2367)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Chef and Bartender have clothing that is specified for Orion Express and
Idris, however, they don't have those companies as potential employers.
This PR fixes that.

No media since it's purely just like three lines of added text

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- tweak: Bartenders and Chefs can now be employed by Orion Express and
Idris Incorporated

Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>

* Tcaf Combat Gloves Sprite Fix (#2369)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

TCAF Combat Gloves had no in-hand sprite, so they would instead show an
error. This PR reuses the in-hand sprite from merc combat gloves to
prevent the error from appearing.

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/65ffda41-3638-4adf-9911-2f943c67fe05)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- fix: TCAF Combat Gloves should no longer show an error

Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>

* Surgery Fixes (#2370)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Abductor and medical cyborgs are meant to have a surgery speed buff and
the ability to bypass clothing for surgery, but this didn't seem to have
been added with the abductor port, so I went in and fixed that. Frankly,
medical borg entity prototypes are all over the place, so this is all
kinda wacky until we cut down on the 40 different needless variants.

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


https://github.com/user-attachments/assets/2eb9b61c-545c-4040-be60-9f7a130e2106

</p>
</details>

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- fix: Abductor & Medical borg now have their proper surgery speed buffs
and their clothing bypass

---------

Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>

* Psionic Weights (#2374)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

Levels out the weights for psionics, and greatly increases the chances
of getting the second-tier abilities once you have their prerequisites.

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/ab95b0b1-0cee-4dfc-b113-2ef0e1475adb)

</p>
</details>

---

# Changelog

<!--
You can add an author after the `:cl:` to change the name that appears
in the changelog (ex: `:cl: Death`)
Leaving it blank will default to your GitHub display name
This includes all available types for the changelog
-->

:cl:
- tweak: Adjusted psionic weights

Co-authored-by: Your Name <EctoplasmIsGood@users.noreply.github.com>

* Cherrypick TCJ Fixes for Psionic Rolling and Trait Netcode (#2381)

https://github.com/Simple-Station/Einstein-Engines/pull/2379
https://github.com/Simple-Station/Einstein-Engines/pull/2371

Cherrypicks these to the RC branch cuz he PUT THEM ON MASTER

---------

Co-authored-by: VMSolidus <evilexecutive@gmail.com>

* Fix the Color of Xelthia Blood as Rendered when Damaged (#2383)

<!--
This is a semi-strict format, you can add/remove sections as needed but
the order/format should be kept the same
Remove these comments before submitting
-->

# Description

<!--
Explain this PR in as much detail as applicable

Some example prompts to consider:
How might this affect the game? The codebase?
What might be some alternatives to this?
How/Who does this benefit/hurt [the game/codebase]?
-->

It was rendering as red. Added a thing to make it render as green.

---

<!--
This is default collapsed, readers click to expand it and see all your
media
The PR media section can get very large at times, so this is a good way
to keep it clean
The title is written using HTML tags
The title must be within the <summary> tags or you won't see it
-->

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/555b92b2-5a10-4a11-b625-c672697f8aea)

</p>
</details>

* Radstation Fixes (#2385)

# Description

Radstation was reworked to not include Prison Guard, Chief Justice,
Prosecutor, Clerk, Magistrate, and Administrative Assistant. Disposals
now has maintenance access. Vault and CL office has been moved.
Reinforced walls guarding the station in space have been replaced with
grilles. Coolant marker added to SM. Logistics has been reworked to
actually have a front.



![New-Radstation](https://github.com/user-attachments/assets/e2c9e988-f094-4e97-bbd7-f22302a53089)

---

<details><summary><h1>Extra Media</h1></summary>
<p>


![court](https://github.com/user-attachments/assets/592f8e1b-4c66-4857-b12e-4c97bc37e137)

![logistics](https://github.com/user-attachments/assets/351054ee-07f2-4ffb-8cc1-7cf194c6cc06)

![disposals](https://github.com/user-attachments/assets/194d71c9-42be-4db6-ad85-fdf96b0dceea)

![cl](https://github.com/user-attachments/assets/a62369a1-c2e4-4f25-8594-ed7da1bfb86a)

![vault](https://github.com/user-attachments/assets/d6025831-818c-45b6-b8dd-7a524b9eb0a6)


</p>
</details>

---

# Changelog

:cl: ODJ
- tweak: Cleanup and reorganization of Radstation

* Northway Fixes (#2386)

# Description

Minor fixes to Northway pertaining to visibility, etc.

---
<details><summary><h1>Media</h1></summary>
<p>


![Northway-0](https://github.com/user-attachments/assets/35e1551a-dc00-499a-a2c8-a241fc577f05)

</p>
</details>

---

# Changelog


:cl: ODJ
- tweak: Slight changes to Northway

* Meta Fixes (#2387)

# Description

Removes magistrate, administrative assistant, and the prison guard from
Meta. Also removed erroneous state changes.

---

<details><summary><h1>Media</h1></summary>
<p>


![Meta-0](https://github.com/user-attachments/assets/27d3cb7a-90db-4a74-8adf-c2f5652ba1f3)

</p>
</details>

---

# Changelog

:cl: ODJ
- tweak: Cleanup of Meta

* Lighthouse Fixes (#2388)

# Description

Removal of magistrate, boxer, and administrative assistant from
Lighthouse. Along-with minor changes such as chemistry shelves and
organization.

---

<details><summary><h1>Media</h1></summary>
<p>


![Lighthouse-0](https://github.com/user-attachments/assets/856bd787-0218-4b16-bb24-d2c26a43ab79)

</p>
</details>

---

# Changelog

:cl: ODJ
- tweak: Cleanup of Lighthouse

* Shoukou Fixes (#2389)

# Description

Removes martial artist, magistrate, and administrative assistant from
Shoukou. Also removed invalid linkage. Kitchen has been reorganized.
Visibility issues were resolved. Chemistry now has a chem shelf.

---

<details><summary><h1>Media</h1></summary>
<p>


![Shoukou-0](https://github.com/user-attachments/assets/9c06a784-d834-411c-a523-251eccf03612)

![kitchen](https://github.com/user-attachments/assets/ea64400e-94b8-416a-a5bc-09865e8983ea)

![chem-med](https://github.com/user-attachments/assets/b96dcde6-8612-4759-b51f-ea90f6f35d8e)


</p>
</details>

---

# Changelog

:cl: ODJ
- tweak: Reorganization and removal of unnecessary/bad roles in Shoukou

* Saltern Fixes (#2390)

# Description

Removes magistrate and administrative assistant from Saltern. Also
removed an erroneous state change.

---

<details><summary><h1>Media</h1></summary>
<p>


![Saltern-0](https://github.com/user-attachments/assets/d7a70349-16f3-4e53-ad0a-7f14b7ab2fb0)

</p>
</details>

---

# Changelog

:cl: ODJ
- tweak: Cleanup of Saltern

* Bagel Fixes (#2391)

# Description

Removes administrative assistant and prison guard from Bagel. No more
syndicate puddle. Sadly the stupid $2^{nd}$ arrival remains. Medical has
been reorganized and now includes cloning. There was an erroneous grid
that just had a single plating on it, I just removed it from the yaml.
_The map renderer failed once out of two tries of attempting to paint it
but I am not sure if that is related to the erroneous grid I deleted._

---

<details><summary><h1>Media</h1></summary>
<p>


![Bagel-0](https://github.com/user-attachments/assets/427fff0e-d624-41bb-911b-c0dc51736820)

![chem](https://github.com/user-attachments/assets/84f36522-0a3d-4dd7-a876-ff15e12e8835)

![med](https://github.com/user-attachments/assets/8a20dd34-6c0b-413c-a256-77d4fc03d3d0)

</p>
</details>

---

# Changelog

:cl: ODJ
- remove: Puddle in Bagel.
- tweak: Medical and roles of Bagel.

* Asterisk Fixes (#2392)

# Description

Removes Magistrate, Administrative Assistant, Prosecutor, and Prison
Guard from Asterisks. Also chemistry has been reorganized, it now has
the chemical shelf, too. Visibility issues have been fixed too.

---

<details><summary><h1>Media</h1></summary>
<p>


![Asterisk-0](https://github.com/user-attachments/assets/516e22b9-45b5-42d7-89a3-4ddb8a4c22ed)

![chem](https://github.com/user-attachments/assets/326a53a7-492e-4369-8308-31526db67070)

</p>
</details>

---

# Changelog

:cl: ODJ
- tweak: Reorganized and cleaned up Asterisks.

* Lambda Fixes (#2394)

# Description

Magistrate, administrative assistant, and prison guard has been removed.
Lambda now has one AI over three. Bar, kitchen, and medical has been
worked on.


![Lambda-0](https://github.com/user-attachments/assets/f3717786-4ad2-43d7-9ea3-5e770a16c964)

---

<details><summary><h1>Extra Media</h1></summary>
<p>


![kitchen](https://github.com/user-attachments/assets/db260160-55b7-4315-b611-0f51a7becced)

![chemistry](https://github.com/user-attachments/assets/1e0e8680-9098-43c6-b073-54312a340f42)

![bar](https://github.com/user-attachments/assets/4f259e7f-b265-4267-b611-58927ca94a5f)

![ai](https://github.com/user-attachments/assets/3ad64dc0-75f1-479d-923…
@WarMechanic WarMechanic marked this pull request as draft May 10, 2025 05:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Changes: C# Changes any cs files Changes: UI Changes any XAML files Changes: YML Changes any yml files Status: Do Not Merge Do not merge Status: Merge Conflict FIX YOUR PR AAAGH Status: Needs Review Someone please review this

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants