Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
1de81f1
fix(arachnid): suffocate 50% faster to match guidebook
rebaserHEAD May 22, 2026
469e3cc
fix(avali): match guidebook hunger rate and meat-only diet
rebaserHEAD May 22, 2026
f3054d7
fix(protogen): cold damage +30% to match guidebook
rebaserHEAD May 22, 2026
6444940
fix(reptilian): heat boost threshold at 47C to match guidebook
rebaserHEAD May 22, 2026
9838055
fix(resomi): add heat-side slowdown to match guidebook
rebaserHEAD May 22, 2026
a0015a5
fix(feroxi): match guidebook thirst rate and meat-only diet
rebaserHEAD May 22, 2026
3e93849
fix(oni): match guidebook melee bonuses and prying speed
rebaserHEAD May 22, 2026
6e2e056
fix(hydrakin): stop oxygenating from CO2 to match guidebook
rebaserHEAD May 22, 2026
19bb226
fix(felinid): reduce stamina to match guidebook
rebaserHEAD May 22, 2026
b69b22f
doc(human): unify guidebook formatting
rebaserHEAD May 22, 2026
ac12d6b
doc(moth): unify guidebook formatting
rebaserHEAD May 22, 2026
a76ad1a
doc(vox): unify guidebook formatting
rebaserHEAD May 22, 2026
78db1ea
doc(protogen): unify guidebook formatting and reflect step 1 cold change
rebaserHEAD May 22, 2026
3a8a152
doc(arachnid): unify guidebook formatting
rebaserHEAD May 22, 2026
5859aae
doc(slime): unify guidebook formatting; drop 9% baro claim
rebaserHEAD May 22, 2026
18576a2
doc(resomi): unify guidebook formatting; document heat slowdown
rebaserHEAD May 22, 2026
1f65ba2
doc(avali): unify guidebook formatting; tighten hunger wording
rebaserHEAD May 22, 2026
cb32a77
doc(tajaran): unify guidebook formatting; fold in undocumented mechanics
rebaserHEAD May 22, 2026
5e78a04
doc(hydrakin): unify guidebook formatting; fold in undocumented mecha…
rebaserHEAD May 22, 2026
379bf97
doc(ipc): unify guidebook formatting; add resistances section
rebaserHEAD May 22, 2026
4941c69
doc(dwarf): unify guidebook formatting; document suffocation drawback
rebaserHEAD May 22, 2026
2082e22
doc(diona): unify guidebook formatting; document step-trigger immunity
rebaserHEAD May 22, 2026
29c014d
doc(reptilian): unify guidebook formatting; document Cold +30%
rebaserHEAD May 22, 2026
a10d6e0
doc(goblin): unify guidebook formatting; document hidden benefits
rebaserHEAD May 22, 2026
cb9bb25
doc(oni): align with Step 1 prototype changes
rebaserHEAD May 22, 2026
be1a090
doc(felinid): drop OwOnavirus immunity; document fall/slow benefits a…
rebaserHEAD May 22, 2026
d808e16
doc(feroxi): align with Step 1 + footnote water-vapor deferral
rebaserHEAD May 22, 2026
2a169fb
doc(chitinid): unify guidebook formatting
rebaserHEAD May 22, 2026
eab1a84
doc(harpy): unify guidebook formatting
rebaserHEAD May 22, 2026
9a5d72c
doc(rodentia): unify guidebook formatting
rebaserHEAD May 22, 2026
9c4308a
doc(vulpkanin): unify guidebook formatting
rebaserHEAD May 22, 2026
9ba7bd4
doc(species): replace implementation jargon with natural prose
rebaserHEAD May 22, 2026
933be93
doc(species): align guidebook pages with house-style guide
rebaserHEAD May 22, 2026
f7a3254
doc(ipc): roll mechanical sections under ## Special; rename Resistanc…
rebaserHEAD May 22, 2026
e8a0903
doc(species): reframe 22 guidebook pages as TDF HR Personnel Dossiers
rebaserHEAD May 22, 2026
0a26132
doc(species): rebrand as Bureau of Personnel + layer lore-doc flavor
rebaserHEAD May 23, 2026
170949a
feat(dossier): paper-doll exemplars with random gender-aware undergar…
rebaserHEAD May 23, 2026
0595860
doc(species): situational Janssen quotes, 54-char banners, dossier em…
rebaserHEAD May 23, 2026
3267769
Merge branch 'main' into fix/species-guidebook-audit
rebaserHEAD Jun 18, 2026
bc34486
fix(guidebook): sync Rodentia and Slime dossiers to merged species ch…
rebaserHEAD Jun 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions Content.Client/Guidebook/Controls/GuidebookWindow.xaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
<!-- Triad: MinSize bumped from "100 200" so the 54-mono-char dossier banners don't wrap when the user narrows the window. Paired with the content split MinSize below as belt-and-suspenders. End Triad -->
<controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:cc="clr-namespace:Content.Client.Administration.UI.CustomControls"
xmlns:fancyTree="clr-namespace:Content.Client.UserInterface.Controls.FancyTree"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
SetSize="900 700"
MinSize="100 200"
MinSize="800 500"
Resizable="True"
Title="{Loc 'guidebook-window-title'}">
<SplitContainer Orientation="Horizontal" HorizontalExpand="True" Name="Split">
Expand All @@ -12,7 +13,8 @@
<fancyTree:FancyTree Name="Tree" VerticalExpand="True" HorizontalExpand="True" Access="Public"/>
<cc:VSeparator StyleClasses="LowDivider" Margin="0 -2"/>
</BoxContainer>
<BoxContainer Orientation="Vertical" HorizontalExpand="True" VerticalExpand="True">
<!-- Triad: MinSize="600 0" so the splitter can't compress the content side below the dossier-banner width. End Triad -->
<BoxContainer Orientation="Vertical" HorizontalExpand="True" VerticalExpand="True" MinSize="600 0">
<BoxContainer Name="SearchContainer" Visible="False" HorizontalExpand="True">
<LineEdit
Name="SearchBar"
Expand Down
19 changes: 19 additions & 0 deletions Content.Shared/_Triad/Dossier/DossierExemplarComponent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Robust.Shared.GameStates;

namespace Content.Shared._Triad.Dossier;

/// <summary>
/// Marks an entity as a TDF BuPers dossier paper-doll exemplar.
/// On MapInit (which the guidebook fires when embedding the entity via GuideEntityEmbed),
/// the system randomizes the entity's HumanoidAppearance (skin tone, hair, markings) and
/// applies random species-appropriate gender-aware undergarment markings. Pure marker
/// component — no per-species knobs.
/// </summary>
/// <remarks>
/// Sits in Shared (not Server) because the guidebook spawns its embedded entities
/// client-side; a server-only randomizer would never fire.
/// </remarks>
[RegisterComponent, NetworkedComponent]
public sealed partial class DossierExemplarComponent : Component
{
}
67 changes: 67 additions & 0 deletions Content.Shared/_Triad/Dossier/DossierExemplarSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using System.Linq;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
using Content.Shared.Preferences;
using Robust.Shared.Random;

namespace Content.Shared._Triad.Dossier;

/// <summary>
/// Handles paper-doll exemplars used in BuPers species guidebook dossiers.
/// On MapInit, randomizes HumanoidAppearance with random species-appropriate
/// gender-aware undergarment markings baked in — no jumpsuit, no shoes. Keeps the
/// dossier paper doll uniform: every species shows their natural body shape with
/// basic personnel coverage, decoupled from clothing displacement quirks per species.
/// </summary>
/// <remarks>
/// Sits in Shared (not Server) because the guidebook spawns its embedded entities
/// client-side; a server-only randomizer would never fire. Undergarments are baked
/// into the profile *before* LoadProfile runs because on a client-side entity there
/// is no subsequent state sync to re-trigger sprite layer rebuild — anything added
/// to the MarkingSet after LoadProfile would never render.
/// </remarks>
public sealed class DossierExemplarSystem : EntitySystem
{
[Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!;
[Dependency] private readonly MarkingManager _markingManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;

public override void Initialize()
{
base.Initialize();

SubscribeLocalEvent<DossierExemplarComponent, MapInitEvent>(OnMapInit);
}

private void OnMapInit(Entity<DossierExemplarComponent> ent, ref MapInitEvent args)
{
if (!TryComp<HumanoidAppearanceComponent>(ent, out var humanoid))
return;

var profile = HumanoidCharacterProfile.RandomWithSpecies(humanoid.Species);

var markings = new List<Marking>(profile.Appearance.Markings);
AddRandomUndergarments(markings, profile.Species, profile.Sex);
profile = profile.WithCharacterAppearance(profile.Appearance.WithMarkings(markings));

_humanoid.LoadProfile(ent, profile, humanoid);
}

private void AddRandomUndergarments(List<Marking> markings, string species, Sex sex)
{
// Top: only female base models get a top. Bras/sportsbras/binders only make sense on
// bodies where the anatomical difference between sexes lives; male and unsexed go
// bare-chested in the dossier.
if (sex == Sex.Female)
{
var tops = _markingManager.MarkingsByCategoryAndSpecies(MarkingCategories.UndergarmentTop, species);
if (tops.Count > 0)
markings.Add(new Marking(_random.Pick(tops.Keys.ToList()), new List<Color> { Color.White }));
}

// Bottom: gender-neutral, pick freely from the species pool.
var bottoms = _markingManager.MarkingsByCategoryAndSpecies(MarkingCategories.UndergarmentBottom, species);
if (bottoms.Count > 0)
markings.Add(new Marking(_random.Pick(bottoms.Keys.ToList()), new List<Color> { Color.White }));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
id: UndergarmentBottomBoxers
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Protogen] # Triad - Underwear.
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Hydrakin, Resomi, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Protogen] # Triad - Underwear.
coloring:
default:
type: null
Expand All @@ -18,7 +18,7 @@
id: UndergarmentBottomBriefs
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Protogen] # Triad - Underwear.
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Hydrakin, Resomi, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Protogen] # Triad - Underwear.
coloring:
default:
type: null
Expand All @@ -31,7 +31,7 @@
id: UndergarmentBottomSatin
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Protogen] # Triad - Underwear.
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Hydrakin, Resomi, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Protogen] # Triad - Underwear.
coloring:
default:
type: null
Expand All @@ -44,7 +44,7 @@
id: UndergarmentTopBra
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Asakim, Protogen] # Triad - Underwear.
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Hydrakin, Resomi, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Asakim, Protogen] # Triad - Underwear.
coloring:
default:
type: null
Expand All @@ -57,7 +57,7 @@
id: UndergarmentTopSportsbra
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Asakim, Protogen] # Triad - Underwear.
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Hydrakin, Resomi, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Asakim, Protogen] # Triad - Underwear.
coloring:
default:
type: null
Expand All @@ -70,7 +70,7 @@
id: UndergarmentTopBinder
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Asakim, Protogen] # Triad - Underwear.
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Hydrakin, Resomi, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Asakim, Protogen] # Triad - Underwear.
coloring:
default:
type: null
Expand All @@ -83,7 +83,7 @@
id: UndergarmentTopTanktop
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Asakim, Protogen] # Triad - Underwear.
speciesRestriction: [Arachnid, Diona, Human, Dwarf, Moth, Reptilian, SlimePerson, IPC, Felinid, Oni, Avali, Chitinid, Harpy, Hydrakin, Resomi, Rodentia, Vulpkanin, Feroxi, Goblin, Tajaran, Yowie, Asakim, Protogen] # Triad - Underwear.
coloring:
default:
type: null
Expand Down
6 changes: 6 additions & 0 deletions Resources/Prototypes/Entities/Mobs/Species/arachnid.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@
# Damage (Self)
- type: Bloodstream
bloodReagent: CopperBlood
# Triad: match guidebook "suffocate 50% faster"
- type: Respirator
damage:
types:
Asphyxiation: 1.5
# End Triad
# Damage (Others)
- type: MeleeWeapon
animation: WeaponArcBite
Expand Down
2 changes: 1 addition & 1 deletion Resources/Prototypes/Entities/Mobs/Species/reptilian.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@
time: 2
type: Add
refresh: true
- minimumTemperature: 322
- minimumTemperature: 320.15 # Triad: match guidebook "above 47C" claim
effects:
- !type:MovespeedModifier
walkSpeedModifier: 1.10
Expand Down
26 changes: 13 additions & 13 deletions Resources/Prototypes/Guidebook/species.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,27 @@
text: "/ServerInfo/Guidebook/Mobs/Species.xml"
children:
- Arachnid
- Avali # Starlight
- Chitinid # DeltaV
- Diona # Note: Frontier changes inside
- Dwarf # Note: Frontier changes inside
- Human
- Moth
- Reptilian # Monolith changes inside
- SlimePerson
- Vox
- Felinid # DeltaV
- Feroxi # Delta V
- Goblin # Frontier
- Vulpkanin # DeltaV
- Harpy # DeltaV
- Felinid # DeltaV
- Human
- Hydrakin # Monolith/Obelisk
- IPC # EE
- Moth
- Oni # DeltaV
- Chitinid # DeltaV
- Resomi # Floof
- Protogen # Mono
- IPC # EE
- Reptilian # Monolith changes inside
- Resomi # Floof
- Rodentia # DeltaV
- SlimePerson
- Tajaran # Goobstation
- Hydrakin # Monolith/Obelisk
- Avali # Starlight
- Feroxi # Delta V
- Vox
- Vulpkanin # DeltaV

- type: guideEntry
id: Arachnid
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@
types:
Blunt: 1
- type: Stamina
critThreshold: 85 # slightly less stamina than humans (default 100), per guidebook
decay: 2.55 # recovers slower than humans (default 5)
- type: TypingIndicator
proto: felinid
- type: PseudoItem
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,17 @@
- type: Sprite
scale: 1.2, 1.2
- type: PlayerToolModifier
pryTimeMultiplier: 0.6
pryTimeMultiplier: 0.5
- type: PlayerAccuracyModifier
spreadMultiplier: 15
maxSpreadAngle: 180
- type: BonusMeleeDamage
damageModifierSet:
coefficients:
Blunt: 1.2
Blunt: 1.35
Slash: 1.2
Piercing: 1.2
Asphyxiation: 1.2
Asphyxiation: 1.35
- type: Damageable
damageModifierSet: Oni
- type: Body
Expand Down
10 changes: 6 additions & 4 deletions Resources/Prototypes/Reagents/gases.yml
Original file line number Diff line number Diff line change
Expand Up @@ -221,10 +221,12 @@
conditions:
- !type:OrganType
type: Plant
- !type:Oxygenate # Mono - Hydrakin
conditions:
- !type:OrganType
type: Hydrakin
# Triad: hydrakin do not breathe CO2 per guidebook ("all gases except CO2/water vapor")
# - !type:Oxygenate # Mono - Hydrakin
# conditions:
# - !type:OrganType
# type: Hydrakin
# End Triad
- !type:HealthChange
conditions:
- !type:OrganType
Expand Down
3 changes: 0 additions & 3 deletions Resources/Prototypes/_DV/Body/Organs/feroxi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,8 @@
- type: Stomach
specialDigestible:
tags:
- ReptilianFood
- Meat
- Pill
- Crayon
- Paper
- type: Metabolizer
maxReagents: 2
metabolizerTypes: [ Feroxi, Animal ]
Expand Down
2 changes: 1 addition & 1 deletion Resources/Prototypes/_DV/Entities/Mobs/Species/feroxi.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
- type: Inventory
speciesId: feroxi
- type: Thirst
baseDecayRate: 0.2
baseDecayRate: 0.15
- type: Icon
sprite: _DV/Mobs/Species/Feroxi/parts.rsi
state: full
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@
272: 0.8
242: 0.6
196: 0.4
303: 0.8 # ~30C, heat-side slowdown (matches guidebook "suffering at 30C")
310: 0.6 # ~37C, deeper heat slowdown before damage threshold at 320.15
- type: MovementSpeedModifier
weightlessAcceleration: 2.5 # Birb move fast in zero-g
- type: PseudoItem # Baggable; certified smol ops
Expand Down
2 changes: 0 additions & 2 deletions Resources/Prototypes/_Mono/Body/Organs/avali.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
tags:
- Meat
- Pill
- Crayon
- Paper
- AvianFood
- type: SolutionContainerManager
solutions:
Expand Down
2 changes: 1 addition & 1 deletion Resources/Prototypes/_Mono/Damage/modifier_sets.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
id: Protogen
coefficients:
Heat: 1.3
Cold: 1.15
Cold: 1.3
Radiation: 1.55
Shock: 1.5
Blunt: 0.8
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
Peckish: 150
Starving: 100
Dead: 0
baseDecayRate: 0.03
baseDecayRate: 0.036
- type: Thirst
- type: PseudoItem
storedOffset: 0,17
Expand Down
Loading
Loading