Skip to content

Doll species - #5013

Open
Citrea-Lingua wants to merge 40 commits into
ss14Starlight:starlight-devfrom
Citrea-Lingua:Doll-Species
Open

Doll species#5013
Citrea-Lingua wants to merge 40 commits into
ss14Starlight:starlight-devfrom
Citrea-Lingua:Doll-Species

Conversation

@Citrea-Lingua

@Citrea-Lingua Citrea-Lingua commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

Short description

Adds the doll species from https://discord.com/channels/1272545509562777621/1464734978859466833

Why we need to add this

Spooky, non-humanoid species, and multiple players seemed to be interested in it ^^

Here's their guidebook entry, for a species description~


The common perception of Dolls is one of cold, unmoving faces and eerily fluid motion. This is, of course, a deliberately chosen look - as they fear being outcast or even hunted, were people to look underneath their shell.

In reality, Dolls are a recently discovered, sapient strain of meat anomaly creatures, hiding their rather disturbing forms underneath a hard, ceramic-like shell. It is more than just a suit - a Doll's shell is a core part of their very self. While they are able to leave it behind, they are unwilling to do so, save for extreme emergencies, and outside attempts to remove it are oft met with violent resistance.

Diet

Dolls are anomalous creatures of flesh. As such, their diet consists of meat and blood, though they do not care whether it has been cooked beforehand. Consuming blood will also slowly heal a Doll, including their shell - though the mechanism for this is unknown.

Racial Features

  • Slowly heal from consuming blood
  • Organs move independently
  • Takes 30% more blunt damage

The Shell

You have an outer shell hiding away your meaty tendrils. You should keep it on at all times! At need, you can break off small, spare pieces of your shell - which is a pretty painful process - to use as a makeshift knife, or to give to another doll, should the worst happen and their shell was stolen.

With Shell

  • Takes 30% less slashing damage
  • Takes 30% less piercing damage
  • Takes 30% more heat damage

Without Shell

  • Takes 30% more slashing damage
  • Takes 30% more piercing damage

Notably:
The damage resistance changes with the amount of installed shell pieces. As a side effect, organs and other parts applying additive damage modifiers are now possible.
New MarkingOrganComponent allows applying and removing markings when an organ is installed or removed.

Media (Video/Screenshots)

image image image

TODO

  • Final checks, comments and input
  • Do a rebase to current dev state

Checks

  • I do not require assistance to complete the PR.
  • Before posting/requesting review of a PR, I have verified that the changes work.
  • I have added screenshots/videos of the changes, or this PR does not change in-game mechanics.
  • I affirm that my changes are licensed under the Starlight Fork License and grant permission for use in this repository under its conditions.

Changelog
🆑 Citrea, Ashley Black, Maitake & Seven Shades (Plus various people suggesting names)

  • add: Central Command has begun hiring "Dolls".

@github-actions github-actions Bot added S: Needs Review Status: Requires additional reviews before being fully accepted. Not to be replaced by S: Approved. Changes: Sprites Changes: C# Changes: Prototypes Changes: Guidebook S: Untriaged Status: Indicates an item has not been triaged and doesn't have appropriate labels. size/L labels Jul 4, 2026
@github-actions

github-actions Bot commented Jul 4, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions github-actions Bot added the S: Merge Conflict Status: Needs to resolve merge conflicts before it can be accepted label Jul 4, 2026
@Rinary1

Rinary1 commented Jul 13, 2026

Copy link
Copy Markdown
Member

Closed as stale

@Rinary1 Rinary1 closed this Jul 13, 2026
@Conflee

Conflee commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Drafts should probably have more leeway for being marked stale, thats the whole point of marking as a draft.

@Citrea-Lingua

Copy link
Copy Markdown
Contributor Author

Not only is this a draft, it is a draft specifically for people to test.
shrug

@Conflee Conflee reopened this Jul 13, 2026
@Rinary1

Rinary1 commented Jul 15, 2026

Copy link
Copy Markdown
Member

Drafts should probably have more leeway for being marked stale, thats the whole point of marking as a draft.

the whole point of marking as a draft is that it's PR in active development, so people can check it before it will be ready for review. This PR isn't in active development as I see

@Rinary1 Rinary1 closed this Jul 15, 2026
@Citrea-Lingua

Copy link
Copy Markdown
Contributor Author

I am reasonably happy with it now, and will reopen this for final checks, comments and ideas before I mark it as ready to go.
Changes since last time: Dolls can no longer vent crawl or cast off their own shells, both were simply too janky, and hard to balance around. The infrastructure for this is still present, if someone wants to use that code for other things, I could see a few applications.
Adjusted guidebook entry to match.

@Citrea-Lingua Citrea-Lingua reopened this Aug 21, 2026
@coderabbitai

coderabbitai Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 30dae502-8718-433e-b5f5-24d460d172c4

📥 Commits

Reviewing files that changed from the base of the PR and between c852cf2 and 72c84e4.

📒 Files selected for processing (2)
  • Content.Shared/Damage/Components/DamageableComponent.cs
  • Resources/Prototypes/_Starlight/Body/Parts/doll.yml
💤 Files with no reviewable changes (1)
  • Content.Shared/Damage/Components/DamageableComponent.cs
🚧 Files skipped from review as they are similar to previous changes (1)
  • Resources/Prototypes/_Starlight/Body/Parts/doll.yml

Included review availability: Your plan provides up to 2 included reviews per hour; 0 remain after this review.


📝 Summary

Summary

Adds the Doll species, a sapient meat-anomaly species concealed beneath ceramic shells.

Gameplay and user impact

  • Adds Doll character creation, names, markings, sprites, and guidebook content.
  • Dolls consume meat and blood. Blood restores health.
  • Dolls take 30% more blunt damage.
  • Shells reduce slashing and piercing damage by 30% and increase heat damage by 30%.
  • Adds independently moving organs and Doll-specific surgery for shell removal, repair, and reattachment.
  • Adds shell-piece generation and fake-death actions.
  • Prevents vent crawling when a crawler cannot carry items and the vent contains items.
  • Adds Doll-specific food, reagent, alcohol, and survival-loadout interactions.

Notable implementation changes

  • Adds ShellComponent, ShellSystem, OrganShellComponent, MarkingOrganComponent, and DamageModifierOrganComponent.
  • Adds additive damage modifier storage and APIs to DamageableComponent and DamageableSystem.
  • Updates OrganSystem to apply markings, damage modifiers, and shell components during organ installation and removal.
  • Adds SurgeryActionSystem and Doll-specific surgery steps and procedures.
  • Adds Doll body, organ, body-part, species, marking, action, reagent, food, and guidebook prototypes.
  • Updates surgery requirements, meat tagging, vent-crawl handling, fake-death validation, and item-spawn behavior.

Risk areas

  • OrganSystem changes affect surgery, markings, shell state, and damage modifiers for existing species.
  • Additive damage modifier APIs can change damage calculation for other entities.
  • Shared surgery requirement changes can affect existing surgery configurations.
  • SharedMagicSystem.OnSpawnItemInHand changes prediction, cleanup, pickup handling, event dispatch, and self-damage behavior.
  • CritMobActionsSystem.OnFakeDeath now permits fake death for any living entity, not only critical entities.
  • The Doll prototype combines custom organs, body parts, metabolism, markings, vent crawling, shell state, and surgery.
  • The doll name localization contains a duplicated names-last-doll-dataset-38 key.

Guideline gaps

  • The PR context does not provide rationale for unrelated changes to fake death, magic item spawning, meat tagging, vent crawling, and survival loadouts.
  • The PR context does not explain why ShellSystem is server-side while related shell and surgery infrastructure is shared.
  • The PR context does not identify ownership comments for the new Starlight components and systems.
  • The PR context does not document breaking changes from surgery requirement changes or fake-death eligibility changes.
  • The PR description says that Dolls cannot cast off their shells, but the implementation adds shell-piece generation and shell-shedding actions. The intended player-facing scope is unclear.
  • The context does not state whether the new Doll localization has translations beyond English.
  • The context does not explain the design impact of Doll-specific survival loadouts and changed Elf loadout behavior.

Walkthrough

Adds the Doll species with custom organs, body parts, shell mechanics, surgery, metabolism, survival supplies, damage handling, localization, guidebook content, and sprite metadata. It also updates fake-death, magic item spawning, and vent-crawl behavior.

Changes

Doll species and shell mechanics

Layer / File(s) Summary
Doll species foundation
Resources/Prototypes/_Starlight/Species/*, Resources/Prototypes/_Starlight/Body/*/doll.yml, Resources/Prototypes/_Starlight/Entities/Mobs/.../doll.yml
Defines the Doll species, body layout, organs, body parts, appearance prototypes, name datasets, and shell markings.
Shell actions and surgery
Content.Shared/_Starlight/Actions/*, Content.Server/_Starlight/Actions/EntitySystems/ShellSystem.cs, Content.Server/_Starlight/Medical/Surgery/OrganSystem.cs, Resources/Prototypes/_Starlight/Surgery/*
Adds shell action registration, shell component changes, marking and damage-modifier organ handling, shell removal and restoration, action-driven surgery, and Doll-specific surgery paths.

Shared behavior and support

Layer / File(s) Summary
Damage, magic, and vent rules
Content.Shared/Damage/*, Content.Shared/Magic/*, Content.Shared/_Starlight/VentCrawl/*, Content.Server/Mobs/CritMobActionsSystem.cs
Adds per-source damage modifiers, self-damage for spawned items, living-entity fake death, and inventory-aware vent entry.
Metabolism and survival
Resources/Prototypes/Reagents/*, Resources/Prototypes/_Starlight/Reagents/*, Resources/Prototypes/_Starlight/Catalog/Fills/Boxes/emergency.yml, Resources/Prototypes/*/Loadouts/*, Resources/Prototypes/_Starlight/tags.yml
Adds Doll metabolizer behavior, blood food and reagent rules, Blood tags, survival boxes, and species-specific loadouts.
Localization, guidebook, and sprites
Resources/Locale/en-US/_Starlight/*, Resources/ServerInfo/*, Resources/Textures/_Starlight/*Doll*/**/meta.json
Adds Doll names, labels, guidebook content, action text, marking text, and sprite metadata.

Estimated code review effort: 5 (Critical) | ~120 minutes

Merge Risk: 🟡 Moderate · up to 72c84

The Doll species feature still contains several gameplay and content correctness issues, including bypassable movement restrictions, incorrect shell-state behavior, missing body functionality, and inaccurate survival equipment or player-facing text. The PR is not merge-ready until these bounded issues are fixed or explicitly accepted by the appropriate owners.

Sequence Diagram(s)

sequenceDiagram
  participant Doll
  participant ActionSystem
  participant SurgeryActionSystem
  participant OrganSystem
  participant DamageableSystem
  Doll->>ActionSystem: use shell-piece or surgery action
  ActionSystem->>SurgeryActionSystem: dispatch configured action event
  SurgeryActionSystem->>OrganSystem: select and execute surgery step
  OrganSystem->>DamageableSystem: apply shell damage modifiers
  OrganSystem-->>Doll: update shell components, markings, and actions
Loading

Suggested reviewers: walksanatora

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 30.77% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 26 functions across 13 files. (1 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description check ✅ Passed The description directly explains the Doll species, its mechanics, supporting content, testing status, and related assets.
Title check ✅ Passed “Doll species” is concise, specific, and accurately identifies the primary change.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 30.77% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 26 functions across 13 files. (1 skipped: 1 unsupported.)


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added the S: Merge Conflict Status: Needs to resolve merge conflicts before it can be accepted label Aug 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

@github-actions github-actions Bot removed the S: Merge Conflict Status: Needs to resolve merge conflicts before it can be accepted label Aug 29, 2026
@github-actions

github-actions Bot commented Aug 29, 2026

Copy link
Copy Markdown
Contributor

Content + Integration Test Results

Failed Tests

Failed Tests
❌ JobWeightTest
Multiple failures or warnings in test:
  1) Test was dirty-disposed.
     at Robust.UnitTesting.Pool.TestPair`2.OnDirtyDispose() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 44
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Robust.UnitTesting.Pool.TestPair`2.OnDirtyDispose()
   at Robust.UnitTesting.Pool.TestPair`2.DisposeAsync() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 146
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Robust.UnitTesting.Pool.TestPair`2.DisposeAsync()
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown() in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Fixtures/GameTest.cs:line 262
  2) TearDown : System.InvalidOperationException : Collection was modified; enumeration operation may not execute.
  --TearDown
   at Robust.Client.GameStates.ClientGameStateManager.PartialStateReset(GameState state, Boolean resetAllEntities, Boolean deleteClientEntities, Boolean deleteClientChildren) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Client/GameStates/ClientGameStateManager.cs:line 1294
   at Robust.Client.GameStates.ClientGameStateManager.ApplyGameState() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Client/GameStates/ClientGameStateManager.cs:line 426
   at Robust.Client.GameController.Tick(FrameEventArgs frameEventArgs) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Client/GameController/GameController.cs:line 617
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationGameLoop.SingleThreadRunUntilEmpty() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1250
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationGameLoop.Run() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1237
   at Robust.UnitTesting.RobustIntegrationTest.ClientIntegrationInstance.ThreadMain() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1047
--- End of stack trace from previous location ---
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationInstance.WaitIdleImplAsync(Boolean throwOnUnhandled, CancellationToken cancellationToken) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 566
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationInstance.WaitRunTicks(Int32 ticks) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 653
   at Robust.UnitTesting.Pool.TestPair`2.RunTicksSync(Int32 ticks) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Helpers.cs:line 185
   at Robust.UnitTesting.Pool.TestPair`2.RunUntilSynced() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Helpers.cs:line 226
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown() in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Fixtures/GameTest.cs:line 243
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown() in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Fixtures/GameTest.cs:line 262
   at NUnit.Framework.Internal.Commands.SetUpTearDownItem.RunTearDown(TestExecutionContext context)

Trace:


1)    at Robust.UnitTesting.Pool.TestPair`2.OnDirtyDispose() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 44
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Robust.UnitTesting.Pool.TestPair`2.OnDirtyDispose()
   at Robust.UnitTesting.Pool.TestPair`2.DisposeAsync() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Recycle.cs:line 146
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
   at Robust.UnitTesting.Pool.TestPair`2.DisposeAsync()
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown() in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Fixtures/GameTest.cs:line 262
2) --TearDown
   at Robust.Client.GameStates.ClientGameStateManager.PartialStateReset(GameState state, Boolean resetAllEntities, Boolean deleteClientEntities, Boolean deleteClientChildren) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Client/GameStates/ClientGameStateManager.cs:line 1294
   at Robust.Client.GameStates.ClientGameStateManager.ApplyGameState() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Client/GameStates/ClientGameStateManager.cs:line 426
   at Robust.Client.GameController.Tick(FrameEventArgs frameEventArgs) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.Client/GameController/GameController.cs:line 617
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationGameLoop.SingleThreadRunUntilEmpty() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1250
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationGameLoop.Run() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1237
   at Robust.UnitTesting.RobustIntegrationTest.ClientIntegrationInstance.ThreadMain() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 1047
--- End of stack trace from previous location ---
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationInstance.WaitIdleImplAsync(Boolean throwOnUnhandled, CancellationToken cancellationToken) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 566
   at Robust.UnitTesting.RobustIntegrationTest.IntegrationInstance.WaitRunTicks(Int32 ticks) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/RobustIntegrationTest.cs:line 653
   at Robust.UnitTesting.Pool.TestPair`2.RunTicksSync(Int32 ticks) in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Helpers.cs:line 185
   at Robust.UnitTesting.Pool.TestPair`2.RunUntilSynced() in /home/runner/work/space-station-14/space-station-14/RobustToolbox/Robust.UnitTesting/Pool/TestPair.Helpers.cs:line 226
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown() in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Fixtures/GameTest.cs:line 243
   at Content.IntegrationTests.Fixtures.GameTest.DoTeardown() in /home/runner/work/space-station-14/space-station-14/Content.IntegrationTests/Fixtures/GameTest.cs:line 262
   at NUnit.Framework.Internal.Commands.SetUpTearDownItem.RunTearDown(TestExecutionContext context)
Tests 📝 Passed ✅ Failed ❌ Duration ⏱️
1698 1677 1 11m 24s

Github Test Reporter by CTRF 💚

🔄 This comment has been updated

@Citrea-Lingua

Copy link
Copy Markdown
Contributor Author

Woo, found the issue, will fix yml lint tomorrow

@Citrea-Lingua

Copy link
Copy Markdown
Contributor Author

Woo, all checks green! Now it should finally actually be ready for review xD

@Citrea-Lingua

Copy link
Copy Markdown
Contributor Author

Doooo I need to learn about partials straight away and re-rig all of this for the new system? 😅

@Conflee

Conflee commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Doooo I need to learn about partials straight away and re-rig all of this for the new system? 😅

This is all new content in _Starlight files so should be fine as is.

@walksanatora

Copy link
Copy Markdown
Collaborator

no you get grandfathered in

@Citrea-Lingua

Copy link
Copy Markdown
Contributor Author

Back in my day...!
Grandmother noises

:P

@Citrea-Lingua

Copy link
Copy Markdown
Contributor Author

Do I want to expand this with a crafting recipe for making an empty doll body from meat anom cores...

@starlightgithub starlightgithub Bot added S: Approved Status: Reviewed and approved by at least one maintainer or dev; a PR may require another approval. and removed S: Needs Review Status: Requires additional reviews before being fully accepted. Not to be replaced by S: Approved. labels Sep 3, 2026
@walksanatora
walksanatora added this pull request to the merge queue Sep 3, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Sep 3, 2026
walksanatora
walksanatora previously approved these changes Sep 3, 2026
Comment thread Resources/Prototypes/_Starlight/Entities/Mobs/Species/doll.yml Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Changes: C# Changes: Guidebook Changes: Prototypes Changes: Sprites S: Approved Status: Reviewed and approved by at least one maintainer or dev; a PR may require another approval. S: Untriaged Status: Indicates an item has not been triaged and doesn't have appropriate labels. size/M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants