Re-package with the enforcement layer; refresh the stale ROADMAP; sync wiki

This commit is contained in:
flan
2026-07-15 21:40:35 +00:00
parent 7d8c376047
commit 26205b9206
11 changed files with 148 additions and 22 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+29
View File
@@ -33,4 +33,33 @@
</stages> </stages>
</HediffDef> </HediffDef>
<!--
The solitary status: a marker that the prisoner is serving a discipline term. It gates the warden
from re-disciplining while it lasts (roughly two days, decaying), carries the on-edge cost of
isolation, and shows on the inspect pane. The mood hit itself is the Institution_Disciplined memory.
-->
<HediffDef>
<defName>Institution_InSolitary</defName>
<label>in solitary</label>
<description>Held in solitary confinement, privileges revoked, as discipline. Isolation grates: they are closer to the edge, and they will not forget it.</description>
<hediffClass>HediffWithComps</hediffClass>
<defaultLabelColor>(0.7, 0.5, 0.5)</defaultLabelColor>
<scenarioCanAdd>false</scenarioCanAdd>
<maxSeverity>1.0</maxSeverity>
<isBad>true</isBad>
<comps>
<li Class="HediffCompProperties_SeverityPerDay">
<severityPerDay>-0.5</severityPerDay>
</li>
</comps>
<stages>
<li>
<minSeverity>0</minSeverity>
<statOffsets>
<MentalBreakThreshold>0.05</MentalBreakThreshold>
</statOffsets>
</li>
</stages>
</HediffDef>
</Defs> </Defs>
+7
View File
@@ -17,4 +17,11 @@
<casualInterruptible>false</casualInterruptible> <casualInterruptible>false</casualInterruptible>
</JobDef> </JobDef>
<JobDef>
<defName>Institution_DisciplineJob</defName>
<driverClass>Contraband.JobDriver_Discipline</driverClass>
<reportString>disciplining TargetA.</reportString>
<casualInterruptible>false</casualInterruptible>
</JobDef>
</Defs> </Defs>
@@ -27,4 +27,16 @@
<allowInClassicIdeoMode>true</allowInClassicIdeoMode> <allowInClassicIdeoMode>true</allowInClassicIdeoMode>
</PrisonerInteractionModeDef> </PrisonerInteractionModeDef>
<!-- Punishment-as-order: solitary / privilege revocation. Harsh, so it holds order but hardens the
punished (reform falls). Non-exclusive, and it fires at most once per term (see the workgiver). -->
<PrisonerInteractionModeDef>
<defName>Institution_Discipline</defName>
<label>discipline</label>
<listOrder>130</listOrder>
<isNonExclusiveInteraction>true</isNonExclusiveInteraction>
<mustBeAwake>false</mustBeAwake>
<allowOnWildMan>false</allowOnWildMan>
<allowInClassicIdeoMode>true</allowInClassicIdeoMode>
</PrisonerInteractionModeDef>
</Defs> </Defs>
+30
View File
@@ -43,4 +43,34 @@
</stages> </stages>
</ThoughtDef> </ThoughtDef>
<ThoughtDef>
<defName>Institution_Disciplined</defName>
<thoughtClass>Thought_Memory</thoughtClass>
<durationDays>3</durationDays>
<stackLimit>3</stackLimit>
<stages>
<li>
<label>disciplined</label>
<description>They threw me in solitary. I will not forget it.</description>
<baseMoodEffect>-8</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
<!-- Regime: caged with a dangerous cellmate. A short memory refreshed while the danger persists
and fading once segregated, so it tracks housing rather than piling up. -->
<ThoughtDef>
<defName>Institution_Unsafe</defName>
<thoughtClass>Thought_Memory</thoughtClass>
<durationDays>0.5</durationDays>
<stackLimit>2</stackLimit>
<stages>
<li>
<label>unsafe cellmate</label>
<description>There's a dangerous one caged in here with me. I sleep with one eye open.</description>
<baseMoodEffect>-5</baseMoodEffect>
</li>
</stages>
</ThoughtDef>
</Defs> </Defs>
@@ -33,4 +33,17 @@
</requiredCapacities> </requiredCapacities>
</WorkGiverDef> </WorkGiverDef>
<WorkGiverDef>
<defName>Institution_WardenDiscipline</defName>
<label>discipline prisoner</label>
<giverClass>Contraband.WorkGiver_Warden_Discipline</giverClass>
<workType>Warden</workType>
<verb>discipline</verb>
<gerund>disciplining</gerund>
<priorityInType>75</priorityInType>
<requiredCapacities>
<li>Moving</li>
</requiredCapacities>
</WorkGiverDef>
</Defs> </Defs>
+26 -17
View File
@@ -4,14 +4,20 @@ A set of RimWorld mods about **what an institution does to the people inside it*
policing, and justice that put them there. Each mod is a separate install on a shared **Core**; policing, and justice that put them there. Each mod is a separate install on a shared **Core**;
together they form one system. together they form one system.
> **Status (2026-07-15): shipped as a four-mod split.** The monolith split along its seams — the > **Status (2026-07-15): shipped as a five-layer suite behind one install.** The monolith split into
> substrate became **Institution: Core** (propensity, criminal record, secured context), the > **Core** (propensity, criminal record, secured context, the shared treatment engine), **Contraband**
> corrections systems became **Institution: Justice** (classification, deterrence, discipline, > (the physical smuggling loop), **Justice** (classification, deterrence, discipline, parole, regime,
> parole, regime), the gang layer became **Institution: Gangs**, and **Institution: Contraband** is > and **policing** — colony crime → a weighed arrest), **Gangs** (contraband economies), and **Ward**
> now the physical smuggling loop. **Foul Play** stands alone and bridges in. See the > (psychiatric care), folded in from a former standalone sister mod. All five bundle into the single
> [README](README.md) for the current mod table and dependencies. The design sections further down > **Institution** mod with a toggle each while staying separate repos; **Foul Play** stands alone and
> predate the split in how they *group* modules, but the mechanics and the north star are unchanged; > bridges in. See the [README](README.md) for the current mod table.
> a policing/cops layer (pre-arrest) is where **Justice** grows next. >
> The pre-arrest loop (crime → witnesses → investigate → weighed arrest) and the post-arrest
> corrections arc (rehabilitate → parole, discipline-as-order, classification enforcement, on the
> shared treatment engine) are **wired and harness-verified**. What remains is **Regime depth**
> (schedule / needs / visitation), **ideology-flavoured** release, and — above all — real
> **playtesting** to tune the numbers, none of which are play-tested yet. The design sections below
> predate the split in how they *group* modules, but the mechanics and north star are unchanged.
## North star ## North star
@@ -100,17 +106,20 @@ which PR then *enriches* when present. The test of a healthy deferral: with PR a
## Suite modules ## Suite modules
| Mod | Scope | Status | | Layer (repo) | Scope | Status |
|---|---|---| |---|---|---|
| **Foul Play** | throw a container of something off a body; vessels + substances + Piss Nuke flagship | built | | **Core** | propensity, criminal record, secured context, the shared treatment engine, the deterrence seam | **shipped** |
| **Institution: Contraband** | conceal / improvise / search / confiscate / intake / escape / secure-areas | building | | **Contraband** | conceal / improvise / search / confiscate / intake / escape / secure-areas / corruption | **shipped** |
| **Institution: Ward** | involuntary psychiatric commitment — the third pawn state | built | | **Justice** | policing (crime → witnesses → investigate → weighed arrest), classification, deterrence feedback, discipline, parole, rehabilitation, regime | **shipped** |
| **Institution: Regime** | daily schedule (vanilla Restrict) + modest needs + visitation, for every secured context | planned | | **Gangs** | prisoner & colony gangs, rivalries, contraband networks | **shipped** |
| **Institution: Justice** | the crime loop (commit → discover → investigate → attribute → arrest), policing officer, parole/discharge/manumission | planned | | **Ward** | involuntary psychiatric care — the third pawn state, on Core's treatment engine | **shipped** (folded in) |
| **Institution: Discipline** | security classification / segregation, punishment-as-order, corruption | planned | | **Foul Play** | throw a container of something off a body; vessels + substances + Piss Nuke flagship | **shipped** (standalone, bridges in) |
| **Institution: Gangs** | prisoner & colony gangs, rivalries, contraband networks | planned |
Seven mods is the ceiling. Prefer folding a slot into an existing module over minting a new one. The seven-mod plan became **five layers over Core**: **Regime** and **Discipline** folded into
**Justice** rather than minting separate mods. Sub-features still open inside Justice/Regime:
classification **wing-routing** (the grade and a misplacement alert ship, but there is no graded-wing
assignment UI), **Regime depth** (Yard/Lockup schedule blocks, a Safety need, Visitation), and
**ideology-flavoured** parole — none of it playtested.
--- ---
+31 -5
View File
@@ -87,16 +87,42 @@ them again — recidivism, closing back onto the start.
--- ---
## Discipline — the other lever
Rehabilitation is the carrot; **discipline** is the stick, and its opposite. Set a prisoner to
**Discipline** and a warden puts them in **solitary**: harsh discipline (`Discipline.Punish`) *hardens*
them — reform falls — yet raises the colony's order (visible harsh justice deters the rest), and it
stings: a mood hit and an on-edge *in solitary* status. It fires at most once per term (the status
gates re-discipline for about two days), so it holds order without cratering reform in a single day.
The tension is the point: lean on discipline to keep order and you make the punished harder to reform.
## Classification enforcement
Classification always computed a **security grade** (`Minimum`..`Supermax`); now it is actionable:
- **The grade shows** on every prisoner's inspect pane — the game tells you who is dangerous instead of
leaving you to guess.
- A **"Dangerous prisoner unsecured" alert** fires when a Maximum/Supermax pawn is held in the open or
sharing a cell — the misplacement flag, without a wing-grading UI. It clears once they have a secure,
solo cell.
- **Cell safety:** a prisoner caged with a dangerous one suffers a mood penalty. Segregate your
dangerous prisoners, or their cellmates pay for it — the grade made to matter on the *housing* side,
not only at parole.
---
## Seeing it ## Seeing it
A rehabilitated prisoner's inspect pane shows the state directly (a Harmony postfix on Every colony prisoner's inspect pane now carries the corrections readout (a Harmony postfix on
`Pawn.GetInspectString`, via Justice's existing Regime patch — not a contested method): `Pawn.GetInspectString`, via Justice's existing Regime patch — not a contested method):
> *Rehabilitation: reforming (40%)* · *reformed — ready for parole* · *— neglected (3d)* > *Security grade: Maximum* · *In solitary* · *Rehabilitation: reforming (40%) — neglected (3d)* ·
> *reformed — ready for parole*
And because the colony's **order climate** otherwise has no readout at all, the same line surfaces it The **grade** shows for every held pawn (classification's information pillar); *in solitary* while a
when it is far enough from ordinary to matter — *Colony order: low (28%) — crime pays here* / *high discipline term runs; the **rehabilitation** line for a pawn set to reform. And because the colony's
(71%) — order holds*. **order climate** otherwise has no readout at all, the same pane surfaces it when it is far enough from
ordinary to matter — *Colony order: low (28%) — crime pays here* / *high (71%) — order holds*.
--- ---