* Borg type switching.
This allows borgs (new spawn or constructed) to select their chassis type on creation, like in SS13. This removes the need for the many different chassis types, and means round-start borgs can actually play the game immediately instead of waiting for science to unlock everything.
New borgs have an additional action that allows them to select their type. This opens a nice window with basic information about the borgs and a select button. Once a type has been selected it is permanent for that borg chassis.
These borg types also immediately start the borg with specific modules, so they do not need to be printed. Additional modules can still be inserted for upgrades, though this is now less critical. The built-in modules cannot be removed, but are shown in the UI.
The modules that each borg type starts with:
* Generic: tools
* Engineering: advanced tools, construction, RCD, cable
* Salvage: Grappling gun, appraisal, mining
* Janitor: cleaning, light replacer
* Medical: treatment
* Service: music, service, clowning
Specialized borgs have 3 additional module slots available on top of the ones listed above, generic borgs have 5.
Borg types are specified in a new BorgTypePrototype. These prototypes specify all information about the borg type. It is assigned to the borg entity through a mix of client side, server, and shared code. Some of the involved components were made networked, others are just ensured they're set on both sides of the wire.
The most gnarly change is the inventory template prototype, which needs to change purely to modify the borg hat offset. I managed to bodge this in with an API that *probably* won't explode for specifically for this use case, but it's still not the most clean of API designs.
Parts for specific borg chassis have been removed (so much deleted YAML) and specialized borg modules that are in the base set of a type have been removed from the exosuit fab as there's no point to printing those.
The ability to "downgrade" a borg so it can select a new chassis, like in SS13, is something that would be nice, but was not high enough priority for me to block the feature on. I did keep it in mind with some of the code, so it may be possible in the future.
There is no fancy animation when selecting borg types like in SS13, because I didn't think it was high priority, and it would add a lot of complex code.
* Fix sandbox failure due to collection expression.
* Module tweak
Fix salvage borg modules still having research/lathe recipes
Engie borg has regular tool module, not advanced.
* Fix inventory system breakage
* Fix migrations
Some things were missing
* Guidebook rewordings & review
* MinWidth on confirm selection button
(cherry picked from commit 1bebb3390ccedfdae173f0f681be6578146057ca)
(cherry picked from commit 44ca0d5228e4b3faf507a5915007f956c8475541)
# Description
This PR fixes an ANCIENT bug with the clothing system, whereby it wasn't
possible to have individual non-hardcoded clothing layers at the same
time as species-specific layers. Now we can have species-specific shaded
layers, such as the lights on hardsuits/tacsuits. To make use of this
new feature, I've started making new sprites for "Unpainted" suits,
which will largely replace the suits you get from either Cargo or the
Techfabs. Unpainted suits will generally be gunmetal grey, unless they
are made of a notably different material.
# TODO
<details><summary><h1>Media</h1></summary>
<p>




New unpainted Elite Tacsuit

</p>
</details>
# Changelog
🆑
- add: Clothing now supports having multiple species-specific layers,
and species-specific shaders.
- add: New "Unpainted" engineering hardsuit, and "Unpainted" Shanlin
Tacsuit. More to come soon.
- add: Unpainted variant of the "Shiwei" tacsuit(AKA: Elite suit). This
one is uniquely titanium white instead of the standard gunmetal grey. It
can either be ordered through cargo at an exhorbitant cost, or
manufactured with the Prototype Tacsuits research.
(cherry picked from commit 031a6c835b26a24d72a41d42294d7115640d3d17)
# Description
Adds the Plasmamen as a playable species. Plasmamen are a skeletal
species who depend on Plasma to live, and oxygen is highly fatal to
them. Being exposed to oxygen will set them on fire, unless they wear
their envirosuits.
## Species Guidebook
<img width=500px
src="https://github.com/user-attachments/assets/a1ef91ef-87b2-4ae0-8b5c-922a0c34777f">
<img width=500px
src="https://github.com/user-attachments/assets/110f0fa0-7dc4-410b-a2c0-a517f0311484">
**SPECIAL:**
- Plasmamen speak the language Calcic, a language they share with
Skeletons.
## Shitmed Integration
Plasmamen are the first ever species designed with Shitmed in mind, with
one of their core mechanics (self-ignition) powered entirely by Shitmed.
Whether or not a Plasmaman ignites from oxygen exposure depends only on
their body parts. A Plasmaman with only their head exposed will not burn
as much as an entirely naked Plasmaman. You can **transfer** Plasmaman
body parts to non-Plasmamen through **surgery** so that they also ignite
from oxygen exposure. Meanwhile, a Plasmaman with a non-Plasmaman head
can expose their head without self-igniting.
https://github.com/user-attachments/assets/0aa33070-04be-4ded-b668-3afb9f4ddd7c
## Technical Details
This also cherry-picks
https://github.com/space-wizards/space-station-14/pull/28595 as a
quality-of-life feature to ensure Plasmamen keep their internals on upon
toggling their helmet with a breath mask on.
## TODO
### RELEASE-NECESSARY
<details>
- [x] Port more envirosuits / enviro helms (job-specific) and their
sprites
- [x] Remove breath masks from default plasmaman loadouts because the
envirohelms already allow them to breathe internals
- [x] Change default plasma tank to higher-capacity version
- [x] Prevent plasmamen from buying jumpsuits and helmets other than
envirosuits
- ~~[ ] **Client UI update for loadout groups min/max items and default
items**~~
- [x] Plasmaman-specific mask sprites from TG
- [x] Disable too cold alert for plasmamen
- [x] Create/port sprites for these jobs
- [x] Courier
- [x] Forensic Mantis
- [x] Corpsman (Resprite security envirosuit)
- [x] Prison Guard (Resprite security envirosuit)
- [x] Magistrate (No Paradise envirosuit so use new colorable
envirosuit)
- [x] Blueshield (Port from Paradise and tg-ify?)
- [x] NanoTrasen Representative (No Paradise envirosuit so use new
colorable envirosuit)
- [x] Martial Artist (use new colorable envirosuit and make pure white)
- [x] Musician (use new colorable envirosuit)
- [x] Reporter (use new colorable envirosuit)
- [x] Zookeeper (use new colorable envirosuit)
- [x] Service Worker (use new colorable envirosuit)
- [x] Gladiator
- [x] Technical Assistant
- [x] Medical Intern
- [x] Acolyte / Research Assistant
- [x] Security Cadet
- [x] Assistant
- You know what. These intern jobs are fine. They can use their normal
equivalent's envirosuits.
- [x] Logistics Officer (use new colorable envirosuit)
- [x] Adjust sprites to be closer to actual job
- [x] Captain (Shift color to be closer to ss14 captain)
- [x] ~~CMO (Remove yellow accents)~~
- [x] Port HoP envirogloves sprite
- [x] unique sprite for self-extinguish verb
- [x] Refactor conditional gear stuff to live only in
StartingGearPrototype with `SubGear`
`List<ProtoId<StartingGearPrototype>>` field and `List<Requirement>`
field for sub-gear requirements
- [x] Add starting gear for paradox anomaly, and antags and ghost roles
- [x] Paradox
- [x] Nukies
- [x] Disaster victims
- [x] Listening post operative
- [x] Make all envirosuit helmets have a glowing (unshaded) visor
- [x] Envirosuit extinguish visuals
- [x] JobPrototype: AfterLoadoutSpecial
- [x] Set prisoner envirohelm battery to potato, command/sec/dignitary
to high-powered
- [x] Set base envirosuit extinguishes to 4, sec 6 and command 8
- [x] Improve plasmaman organ extraction experience
- [x] Body parts now give 1 plasma sheet each, while Torso gives 3
- [x] Organs can be juiced to get plasma
- [x] Make envirohelm flashlights battery-powered
- [x] Plasmamen visuals
- [x] Grayscale sprites for color customization, and set default
skintone color to Plasmaman classic skintone
- [x] Plasmaman eye organ sprite
- [x] Add basic loadouts
- [x] Add way to refill envirosuit charges (refill at medical protolathe
after some research)
</details>
### Low Importance
<details>
- [x] Envirogloves
- [ ] (SCOPE CREEP) Plasma tanks sprite (only normal emergency/extended,
rather low priority)
- [ ] (SCOPE CREEP) Modify envirosuit helmet sprites to have a
transparent visor
- [ ] Glowing eyes/mouth marking
- [x] More cargo content with plasma tanks / envirosuits
- [x] Plasmaman survival kit like slime
- [x] Additional plasma tanks
- [ ] (SCOPE CREEP) Plasmaman EVA suits
- [x] ~~Add envirosuits to clothesmate~~
- [x] Add more plasma tanks to random lockers and job lockers
- [x] Turn envirosuit auto-extinguish into extinguish action
- [x] move self-extinguish verb stuff to shared for prediction of the
verb
- [x] move self-extinguisher stuff away from extinguisher namespace
- [x] unique sprite for self-extinguish icon
- [x] ~~IDEA: purple glowy fire extinguisher ~~
- [x] on self-extinguish, check for pressure immunity OR ignite from gas
immunity properly
- [x] See envirosuit extinguish charges in examine
- [x] Milk heals on ingestion
- [x] Plasma heals on ingestion
- [x] Self-ignition doesn't occur on a stasis bed
- [x] ~~Self-ignition doesn't occur when dead~~
- [x] Guidebook entry
- [x] Make self-ignition ignore damage resistances from fire suits
- [x] ~~Make self-ignition ignore damage resistances from armor~~
- [x] ~~Unable to rot?~~
- [x] Make the envirosuit helmet toggle on for the character dummy in
lobby
- [ ] (SCOPE CREEP) One additional Plasmaman trait
- [x] ~~Showers extinguish water as well as water tiles~~
- Unnecessary as stasis beds now prevent ignition, allowing surgery on a
plasmaman on stasis beds.
- [x] Unique punch animations for Plasmafire Punch/Toxoplasmic Punch
traits
- [x] Actually remove toxoplasmic it's just slop filler tbh
- [ ] Talk sounds
- [ ] Normal
- [ ] Question
- [ ] Yell
- [x] Positive moodlet for drinking milk / more positive moodlet for
drinking plasma
- [x] Increase moodlet bonus and also minimum reagent required for the
plasma/milk moodlets
- [x] Increase fire rate base stacks on ignite cause putting out your
helmet for a few secs isn't that dangerous due to the fire stacks
immediately decaying
- [x] I think halving firestack fade from -0.1 to -0.05 might work to do
the same thing too
- [ ] (SCOPE CREEP) Get bone laugh sounds from monke
'monkestation/sound/voice/laugh/skeleton/skeleton_laugh.ogg'
- [ ] (SCOPE CREEP) When EVA plasmaman suit is added, 25% caustic resist
- [x] Envirosuit helmet
- [x] Equivalent of 100% bio / 100% fire / 75% acid resist
- [x] Envirosuit
- [x] Equivalent of 100% bio / 100% fire / 75% acid resist
- [x] Envirogloves
- [x] Equivalent of 100% bio / 95% fire / 95% acid resist
- [x] Put breath mask back on
- [x] Refactor: put body parts covered data into component instead of
being hardcoded
</details>
## Media
**Custom Plasmaman Outfits**
All of these use the same **absolutely massive** [envirosuit
RSI](0c3af432df/Resources/Textures/Clothing/Uniforms/Envirosuits/color.rsi)
and [envirohelm
RSI](0c3af432df/Resources/Textures/Clothing/Head/Envirohelms/color.rsi)
to quickly create the envirosuits that didn't exist in SS13 where the
envirosuit sprites were ported.
From Left to Right: Magistrate, Prison Guard, Boxer, Reporter, Logistics
Officer
<img width=200px
src="https://github.com/user-attachments/assets/bf990841-7d9e-4f4e-abae-8f29a3980ca1">
<img width=200px
src="https://github.com/user-attachments/assets/07ca7af7-4f43-4504-9eac-4ca9188ae98e">
<img width=200px
src="https://github.com/user-attachments/assets/0d20332c-826f-4fec-8396-74e84c23b074">
<img width=200px
src="https://github.com/user-attachments/assets/1634364e-7cb3-457b-b638-e1b562b7c0c5">
<img width=200px
src="https://github.com/user-attachments/assets/c2881764-f2fa-4e40-9fbf-35d1b717c432">
**Plasmaman Melee Attack**
https://github.com/user-attachments/assets/6e694f2c-3e03-40bf-ae27-fc58a3e4cb6c
**Chat bubble**
<img width=240px
src="https://github.com/user-attachments/assets/e3c17e6d-5050-410f-a42c-339f0bfa30a1">
**Plasmaman Body**
<img width=140px
src="https://github.com/user-attachments/assets/7ed90a47-9c33-487d-bd44-c50cec9f16dd">
With different colors:
<img width=140px
src="https://github.com/user-attachments/assets/0a28068e-7392-4062-950b-f60d2602da84">
<img width=140px
src="https://github.com/user-attachments/assets/9b652311-0305-4ec0-be60-e404697617a2">
**Skeleton Language**

**(Bonus) Skeleton chat bubble**
<img width=240px
src="https://github.com/user-attachments/assets/a2e2be5c-f3ae-49d9-b655-8688de45b512">
**Self-Extinguish**
https://github.com/user-attachments/assets/6c68e2ef-8010-4f00-8c24-dce8a8065be8
The self-extinguish is also accessible as a verb, which also means that
others can activate your self-extinguish if they open the strip menu.
<img width=200px
src="https://github.com/user-attachments/assets/291ab86d-2250-46ec-ae0c-80084ab04407">
The self-extinguish action has different icons depending on the status
of the self extinguish.
Left to right: Ready, On Cooldown, Out Of Charges
<img
src="https://github.com/user-attachments/assets/0340de8a-9440-43b1-8bff-1c8f962faa0c">
<img
src="https://github.com/user-attachments/assets/11f73558-6dc1-444d-b2ef-2f15f55174ca">
<img
src="https://github.com/user-attachments/assets/030ed737-f178-4c60-ba0c-109659e7d9cb">
**Envirosuit Extinguisher Refill**
<img width=300px
src="https://github.com/user-attachments/assets/9379294b-e3f3-436d-81bc-2584631869ef">
<img width=300px
src="https://github.com/user-attachments/assets/807b9e9e-7b4b-4593-aa1f-d9d24ac6985c">
**Loadouts**
<img width=400px
src="https://github.com/user-attachments/assets/55713b87-29bb-41b3-b7a3-88fbc6e5e797">
<img width=400px
src="https://github.com/user-attachments/assets/ab1757fa-9b70-4a66-b5ae-20fd9cabe935">
<img width=400px
src="https://github.com/user-attachments/assets/aacc4cf7-9ce1-4099-b8c7-108bef1f3bde">
<img width=400px
src="https://github.com/user-attachments/assets/58604dc2-82ef-4d42-b9e2-639548c93f40">
**Plasma Envirosuit Crate**
<img width=400px
src="https://github.com/user-attachments/assets/fa362387-9c10-47c3-b1af-2c11e6b00163">
<img width=400px
src="https://github.com/user-attachments/assets/bf773722-9034-4469-967d-e00dbf8c77a7">
**Internals Crate (Plasma)**
<img width=400px
src="https://github.com/user-attachments/assets/fcd4ff2e-09e9-423a-9b21-96817f6042a4">
<img width=400px
src="https://github.com/user-attachments/assets/bf773722-9034-4469-967d-e00dbf8c77a7">
**Glow In The Dark**

## Changelog
🆑 Skubman
- add: The Plasmaman species has arrived! They need to breathe plasma to
live, and a special jumpsuit to prevent oxygen from igniting them. In
exchange, they deal formidable unarmed Heat damage, are never hungry nor
thirsty, and are immune to cold and radiation damage. Read more about
Plasmamen in their Guidebook entry.
- tweak: Internals are no longer toggled off if you take your helmet off
but still have a gas mask on and vice versa.
- tweak: Paradox Anomalies will now spawn with the original person's
Loadout items.
- fix: Fixed prisoners not being able to have custom Loadout names and
descriptions, and heirlooms if they didn't have a backpack when joining.
---------
Signed-off-by: Skubman <ba.fallaria@gmail.com>
Signed-off-by: VMSolidus <evilexecutive@gmail.com>
Co-authored-by: Plykiya <58439124+Plykiya@users.noreply.github.com>
Co-authored-by: VMSolidus <evilexecutive@gmail.com>
(cherry picked from commit e68e0c3f4b9cf263e07efc888b32a091df62fb51)
# Description
This PR was originally going to be called "Psionic Refactor V3 Part 2,
Items Of Power", but I began getting shakes and started vomiting when I
saw the list of Components that make items do things when equipped, and
I had a conniption about how much code there is constantly being
repeated. So instead of this PR adding Items Of Power, I added a
universal modular generic system for making clothing items do things
when equipped and unequipped. Which hooks into the library of
TraitFunctions that we've previously created. I also added a few
"Inverse" versions of trait functions that can be used by these new
clothing functions.
<!--
# Changelog
🆑
- add: Added a universal modular system for making clothing items DO
things when equipped and unequipped. This will be used for "Psionic
Artifacts" in conjunction with the Psionic Refactor V3.
-->
(cherry picked from commit 731e14f100d8161c0f8f7eb1bc5accc2abaa24da)
* Displacement Map Visualizer QoL (#27392)
* Update Displacement Map Visualizer.lua
* Add files via upload
* Fix background layer being offset
This was caused by not taking the cel's own bounds into account.
Aseprite doesn't make an image layer "full size" if it only covers a
small part of the sprite.
---------
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
* Displacement maps now works on any layers (#27405)
* try
* pipupi
* Update ClientClothingSystem.cs
* Update vox.yml
* Update ClientClothingSystem.cs
* Fix Vox clothing in character creation menu (#29709)
Update vox.yml
* Vox displacement updates (#29824)
* more vox displacement maps
* A
* remove vox insuls sprites
* sci magboots
* Update vox.yml
* Update meta.json
---------
Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
* Displacement maps big update (#30093)
* split logic into own system
* add support for different size displacement maps
* some clothes may not use displacement maps
* displacement maps spport hand sprites
* Update DisplacementMapSystem.cs
* rename things
* fuck stencilmask
* fix bugs
* no masks
* Update jumpsuits.yml
* fix species specific sprites
* Update ClothingSystem.cs
* shoes + ears displacement, some bugfix
* Update DisplacementMapSystem.cs
* Vox head displacement map (#30699)
* head displacement for vox
* fixe
* fix index stepping to avoid pushing front layers into back layers (#32553)
Co-authored-by: charlie <charlie.sc.wong@veiwsonic.com>
* Mothroaches can now wear hamster-wearable clothes + pet inventory tweaks (#28956)
* moth displacement + inventory tweaks
* Fix off by 1 on the head sprites
* Move files to main mothroach folder
* Fix mask up a bit
* Fix side mask sprites
* Change format because it changed forever ago
* fix mothroach spawner
* remove nyano femaleMask
---------
Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com>
Co-authored-by: Charlie <mio780308@gmail.com>
Co-authored-by: charlie <charlie.sc.wong@veiwsonic.com>
Co-authored-by: Verm <32827189+Vermidia@users.noreply.github.com>
* Clown shoes make you waddle, as God intended
* OOPS
* Toned down, client system name fix
* Tidy namespacing for @deltanedas
* Refactor to handle prediction better, etc.
* Resolve PR comments.
## Mirror of PR #25941: [Obsolete `Logger` cleanup for
`EntitySystem`s](https://github.com/space-wizards/space-station-14/pull/25941)
from <img src="https://avatars.githubusercontent.com/u/10567778?v=4"
alt="space-wizards" width="22"/>
[space-wizards](https://github.com/space-wizards)/[space-station-14](https://github.com/space-wizards/space-station-14)
###### `aafe81512258b5a80776ada1f471b58e7507ca2d`
PR opened by <img
src="https://avatars.githubusercontent.com/u/27449516?v=4"
width="16"/><a href="https://github.com/LordCarve"> LordCarve</a> at
2024-03-09 12:19:14 UTC
PR merged by <img
src="https://avatars.githubusercontent.com/u/19864447?v=4"
width="16"/><a href="https://github.com/web-flow"> web-flow</a> at
2024-03-10 00:15:13 UTC
---
PR changed 25 files with 41 additions and 45 deletions.
The PR had the following labels:
- Status: Needs Review
---
<details open="true"><summary><h1>Original Body</h1></summary>
> <!-- Please read these guidelines before opening your PR:
https://docs.spacestation14.io/en/getting-started/pr-guideline -->
> <!-- The text between the arrows are comments - they will not be
visible on your PR. -->
>
> ## About the PR
> <!-- What did you change in this PR? -->
> Changed almost all[^1] obsolete `Logger` calls in Content's
`EntitySystem`s to use `Log` instead. `Log` automatically selects the
system-specific `Sawmill`, so this isn't just a refactor - it makes logs
slightly more accurate (puts them in appropriate sawmill/context rather
than the root sawmill).
>
> ## Why / Balance
> <!-- Why was it changed? Link any discussions or issues here. Please
discuss how this would affect game balance. -->
> Using `Logger` directly for logging is marked obsolete. Assumed this
is a desired change.
>
> ## Technical details
> <!-- If this is a code change, summarize at high level how your new
code works. This makes it easier to review. -->
> This changes some log contexts, but generally in a desirable way:
> - For most, it put logs in `system.appropriate` `Sawmill` rather than
root.
> - For some that were forced into another `Sawmill` it changes it to a
more specific one, i.e. from `atmos` it becomes `system.gas_filter` or
`system.automatic_atmos` and `system.station` into
`system.station_jobs`.
> - For the rest it remains unchanged
>
> **I assumed that all of the above was desirable because this seems to
be the standard convention** - I imagine that was the idea behind the
`Log` in all `EntitySystem`s coupled with `[Obsolete] Logger` methods -
**but if my assumptions are incorrect and/or there are exceptions,
please let me know and I will adjust.**
>
> [^1]: There is only one `EntitySystem` that I didn't update -
`ExamineSystemShared`. That is because the `Logger` is in a `static`
method and refactoring that away causes a lot of cascading changes. May
do it as a separate PR to avoid overly diluting this one.
>
> ## Media
> <!--
> PRs which make ingame changes (adding clothing, items, new features,
etc) are required to have media attached that showcase the changes.
> Small fixes/refactors are exempt.
> Any media may be used in SS14 progress reports, with clear credit
given.
>
> If you're unsure whether your PR will require media, ask a maintainer.
>
> Check the box below to confirm that you have in fact seen this (put an
X in the brackets, like [X]):
> -->
>
> - [X] I have added screenshots/videos to this PR showcasing its
changes ingame, **or** this PR does not require an ingame showcase
>
> ## Breaking changes
> <!--
> List any breaking changes, including namespace, public
class/method/field changes, prototype renames; and provide instructions
for fixing them. This will be pasted in #codebase-changes.
> -->
> Log output changes. `EntitySystem` logs now go to the expected
`Sawmill` for the system rather than hardcoded/root one.
> Any log analyzers anticipating these logs' context must be updated.
</details>
Co-authored-by: LordCarve <27449516+LordCarve@users.noreply.github.com>
* initial commit
- species prototype modifications
- markings points as its own file
- shared humanoid component
* adds a tool to convert sprite accessories to markings (in go)
* removes a fmt call
* converts sprite accessory to markings
* adds hair and facial hair to marking categories
* multiple changes
- humanoid visualizer system
- markings modifications for visualizer
- modifications to shared humanoid component
- lays out a base for humanoid system
* hidden layers, ports some properties from appearance component, shrinks DefaultMarkings a little
* squishes the initialize event calls into one function
adds stuff to set species/skin color externally from a server message - currently laid out as if it a dirty call to a networked component, may be subject to change (server-side has not been implemented yet)
* makes the sprite pipeline more obvious
* apply all markings, hidden layer set replacement
* ensures that markings are cleared when the new set is applied
* starts refactoring markingsset (unfinished)
* more additions to the markingset api
* adds constructor logic to markingset
* adds a method to filter out markings in a set based on a given species
* fixes enumerators in markingset
* adds validator into MarkingSet, fixes ForwardMarkingEnumerator
* modifications to the humanoid visual system
* ensuredefault in markingset
* oop
* fixes up data keys, populates OnAppearanceChange in visualizer
* changes to humanoid component, markings
marking equality is now more strict, humanoidcomponent is now implemented for client as a child of sharedhumanoidcomponent
* markings are now applied the visualizer by diffing them
* base sprites are now applied to humanoids from humanoidvisualizer
* passes along base sprite settings to the marking application so that markings know to follow skin color/alpha or not (see: slimes)
* custom base layers on humanoids
* merges all data keys into one data class for humanoid visualizers
* setappearance in sharedhumanoidsystem, removes custombaselayercolors
* humanoidcomponent, system (empty) in server
* adds some basic public API functions to HumanoidSystem
* add marking, remove marking
* changes appearance MarkingsSet to a List<Marking>, adds listener for PlayerSpawnCompleteEvent in HumanoidSystem
* ensuredefaultmarkings, oninit for humanoids
* markingmanager API changes
* removes MarkingsSet
* LoadProfile, adjusts randomization in humanoid appearance to account for species
* base layer settings in humanoidsystem, eye color from profile
* rearranges files to centralize under Humanoid namespace
* more reorganization, deletes some stuff
gotta break stuff to make other things work, right?
goodbye SpriteAccessory...
* fixes a good chunk of server-side issues
still does not compile, yet
* singlemarkingpicker xaml layout
* singlemarkingpicker logic
* magic mirror window (varying pieces of it, mostly client-oriented)
* removes some imports, gives MagicMirror a BUI class (not filled in yet)
* populates magic mirror BUI functionality / window callbacks
* fixes up some errors in humanoidprofileeditor
* changes to SingleMarkingPicker
SingleMarkingPicker now accepts a List<Marking>, species, and total possible markings available in that marking category
* fixes up hair pickers on humanoid profile editor
* fixes the errors in markingpicker
* markingsystem is now gone
* fixes a bunch of build errors
* so that's why i did it like that
* namespace issues, adds robustxamlloader to singlemarkingpicker
* another robustxamlloader
* human, lizard sprites/points
* prototype fixes, deletion of old spriteaccessory
* component registration, fixes dwarf skin toning
no, 'ReptilianToned' does not exist
* removes component registration from abstract humanoid component
* visualizer data now cloneable
* serialize for visualizer key
* zero-count edge case
* missing semi-colon moment
* setspecies in humanoidsystem
* ensures that default markings, if empty, will cause ensuredefault to skip over that given category
* tryadd instead of add
* whoops
* diff and apply should properly apply markings now
* always ensure default, fixes double load for player spawning
* apply skin color now sets the skin color property in humanoidcomponent
* removes sprite from a few species prototypes
* sprite changes for specific base layers based on humanoid sex
* layer ordering fix, and a missing base layer should now disallow markings on that layer
* anymarking base layer, adds the right leg/foot for humans
* loading a profile will now clear all markings on that humanoid
* adds missing layers for humans
* separates species.yml into respective species prototype files
* ensures that if layer visibility was changed, all markings have to be reapplied
* server-side enforcement of hiding hair (and other head-related markings) when equipping things that hide hair
* slime fix, clothingsystem now dictates layer visibility server side
* sussy
* layer settings should now ensure a marking should match the skin tone
* whoops
* skincolor static class and functions in UI
* skin color validation in humanoidcharacterappearance
* markingpicker now shows only the markings for the selected category in used
* getter for slot in singlemarkingpicker now ensures slot is 0 if markings exists
* FilterSpecies no longer attempts to do removal while iterating
* expands for SingleMarkingPicker
* humanoid base dummy has blank layers now (and snout/tail/headside/headtop)
* fixes an issue with visualizer system if the marking count was different but the markings themselves were (somewhat) the same
* whoops
* adds edge case handlers for count differences in humanoid markings
* preview now loads profile instead of directly setting appearance
* moves marking set loading to update controls
* clones a marking set in markingpicker by using the deep clone constructor
* whoops (deep cloning a marking now copies the marking id)
* adds replace function for markingset
* points should now update after the markings are remove/added
* merging base layer sprites into a humanoid should now clear them before merging
* sets dirty range start to count only if the dirty range start was never set above 0
* fixes up some issues with singlemarkingpicker
* color selector sliders in single marking picker should now expand
* hair from hair pickers should now apply in profile loading (client-side)
* category in singlemarkingpicker now sets the private category variable
* slot selector should now populate
* single marking picker buttons now have text, also shows the category name over all user-clickable elements
* removes a comment
* removing hair slots now sets it to bald, defaults to zero used slots if current hair is bald on hair/facial hair
* random skin color, eye color
* populate colors now checks if the marking count is greater than zero in singlemarkingpicker
* hair/facial hair pickers now just get the first possible hair from the respective species list
* different approach to random skin color
* oh, that's why it wasn't working
* randomize everything now just updates every single control
* selecting a new marking in SingleMarkingPicker should attempt to copy over old colors, populate list now uses cache,
* markingmanager now uses OnlyWhitelisted to populate by category and species
* filterspecies now uses onlyWhitelist to filter markings based on whitelist or not
* oops
* ui fix for singlemarkingpicker, ensures that cache is not null if it is null when populatelist is called
* order of operations for the horizontal expand for add/remove
* hair pickers should now update when you add/remove the hair slot
* fixes variable naming error in character appearance
* loc string fix in singlemarkingpicker
* lizards, vox now have onlyWhitelist, vox restriction for hair/facialhairs
* having zero possible hairs should no longer cause an exception in randomization
* setting species should now update hair pickers
* ignore categories for marking picker
* and a clear as well for the category button
* places that functionality in its own function instead
* adds eye base sprite, vox now also have their own custom eye sprites
* loading a profile client-side should do FilterSpecies for markings now
* client-side load profile does filter species after adding in the hairs now
* magic mirror
* callbacks now call the callback instead of adding it on construct
* whoops
* in removemarking too
* adds missing synchronize calls
* comments out an updateinterface call in magic mirror
* magic mirror window title, minimum sizing
* fixes minsize, adds warning for players who try to set their hair for species that have no hair
* removes spaces in xaml
* namespace changes/organization
* whoopsie (merge conflicts)
* re-enables identity from humanoid component
* damagevisuals now uses the enum given to it instead of the layerstate given on that layer tied to the enum
* removes commas from json
* changes to visuals system so the change is consistent
* chest
* reptilian
* visualizer system now handles body sprite setting/coloration, similar to how characterappearance did it
not a big fan of this
* adds a check in applybasesprites
* adding/removing parts should now make them invisible on a humanoid
* body part removal/adding now enumerates over sublayers instead
* synchro now runs in bodycomponent startup
* parts instead of slots
* humanoidcompnent check
* switches from rsi to actualrsi
* removes all the body stuff (too slow)
* cleans up resolves from humanoid visualizer system
* merging sprites now checks if the base sprites have been modified or not (through things like species changes, or custom base sprite changes)
* not forgetting that one again
* merging now returns an actual dirty value
* replaces the sequenceequal with a more accurate solution
* permanent layers, layer visibility on add/remove part in body
* should send all hidden layers over now
* isdirty in visualizer system for base layers
* isdirty checks count as well
* ok, IsDirty should now set the base layers if the merged sprites are different
* equals override in HumanoidSpritePrototypes.cs
temporary until record prototypes :heck:
* makes fields readonly, equates IDs instead
* adds forced markings through marking picker
* forced in humanoidsystem api, ignorespecies in markingpicker
* marking bui
* makes that serializable as well
* ignore species/forced toggles now work
* adds icon to modifier verb, interface and keys to humanoid bases
* needs the actual enum value to open, no?
* makes the key the actual key
* actions now propagate upwards
* ignore species when set now repopulates markingpicker
* modifiable base layers in the markings window
* oops!
* layout changes
* info box should now appear
* adds ignorespecies for marking picker, collapsible for base layer section of appearance modification window
* collapsible layout moment
* if base layers have changed, all markings are now dirty (and if a base layer is missing, the marking is still 'applied' but it's now just invisible
* small change to marking visibility
* small changes to modifier UI
* markings now match skin on zombification
* zombie stuff
* makes the line edit in marking modifier window more obvious
* disables vox on round start
* horizontal expand on the single label in base layer modifiers
* humanoid profiles in prototypes
* randomhumanoidappearance won't work if the humanoid has a profile already stored
* removes unused code
* documentation in humanoidsystem server-side
* documentation in shared/client
* whoops
* converts accessory into marking in locale files (also adds marking loc string into single marking picker)
* be gone, shared humanoid appearance system from the last upstream merge
* species ignore on randomization (defaults to no ignored species)
* more upstream merge parts that bypassed any errors before merge
* addresses review (also just adds typeserializers in some places)
* submodule moment
* upstream merge issues