154 lines
6.9 KiB
Markdown
154 lines
6.9 KiB
Markdown
# Parole
|
||
|
||
*Release, driven by what the pawn has become.*
|
||
|
||
> This page is the release **decision** (`CanRelease`). The warden work that acts on it — the
|
||
> "Ready for parole" alert and the release job that frees a parolee back into the colony — is
|
||
> [Rehabilitation](Rehabilitation.md).
|
||
|
||
Parole is the end of the arc, and it is deliberately a *decision*, not a mechanic that rebuilds the
|
||
game's release flow. It asks one question — **is this pawn ready?** — and answers it from two things
|
||
already on the record: the reform the sentence earned (or failed to earn), and the grade the record
|
||
warrants. Both are self-complete reads; nothing here re-simulates a pawn's future.
|
||
|
||
> The *return* outcome — a grateful ally, a vengeful raider — is Prisoner Realism's Recidivism, a good
|
||
> sim Justice does not rebuild. Justice's mirror is the parolee who **stays** and may reoffend,
|
||
> carrying their record into the colony (a Justice follow-up).
|
||
|
||
---
|
||
|
||
## The gate
|
||
|
||
```
|
||
CanRelease(pawn):
|
||
rec = record for pawn (peek, no create)
|
||
if rec == null: return true // nothing on record to hold them
|
||
if rec.pardoned: return false // already released
|
||
return rec.reform >= 0.30
|
||
&& Classification.Grade(pawn) <= SecurityGrade.Medium
|
||
```
|
||
|
||
Three conditions, all of which must hold:
|
||
|
||
| Condition | Threshold | Why |
|
||
|---|---|---|
|
||
| Not already pardoned | `pardoned == false` | Release is a one-way flag; you can't re-parole. |
|
||
| Genuinely reformed | `reform ≥ 0.30` | Proof the sentence *healed* rather than hardened. Three corrective acts minimum. |
|
||
| Low enough grade | `Grade ≤ Medium` (risk `< 0.8`) | Reform of attitude is not enough — the *record* must have cooled to something you'd let out. |
|
||
|
||
A pawn with **no record at all** is releasable trivially (there is nothing to hold them). Everyone
|
||
else has to earn all three.
|
||
|
||
The grade gate and the reform gate interact in a way worth internalizing. Because reform subtracts at
|
||
most `0.4` from risk ([Classification](Classification.md)), a pawn whose reform-*less* risk is `≥ 1.2`
|
||
can never reach Medium — so **no amount of reform will ever parole a prolific offender.** Parole is for
|
||
pawns whose record stayed shallow enough that treatment can pull them back under the ceiling. Let a
|
||
pawn rack up escapes and catches and you have quietly converted them into a lifer, whatever their
|
||
attitude.
|
||
|
||
---
|
||
|
||
## Release
|
||
|
||
```
|
||
Release(pawn):
|
||
record.pardoned = true
|
||
```
|
||
|
||
`Release` sets one flag: `pardoned`. Vanilla does the actual freeing; the flag is Justice's memory
|
||
that this pawn was let out after genuine reform, so reintegration can grant a clean slate and
|
||
`CanRelease` won't offer them twice. A modest faction-goodwill / relationship nudge for a well-handled
|
||
release is the immediate payoff, wired when the release job lands.
|
||
|
||
---
|
||
|
||
## The whole arc
|
||
|
||
The pawn moves through every Justice module in turn, and each one writes the record the next one reads:
|
||
|
||
| Stage | Module | What moves | Record touched |
|
||
|---|---|---|---|
|
||
| 1. Crime | [Deterrence](Deterrence.md) | Climate `−0.08`; the colony runs hot | `crimesCommitted++`, `lastCrimeTick` |
|
||
| 2. Caught & held | [Classification](Classification.md) | A grade is assigned from the record | reads all counters |
|
||
| 3. Discipline | [Discipline](Discipline-and-Reform.md) | `reform` moves ±; climate `+0.12` | `reform` |
|
||
| 4. Reform | [Discipline](Discipline-and-Reform.md) → Core | Disposition cools as reform rises | `reform` (read by Nurture) |
|
||
| 5. Regrade | [Classification](Classification.md) | Reform subtracts risk; grade falls | reads `reform` |
|
||
| 6. **Parole** | this page | Gate opens when reform ≥ 0.30 **and** grade ≤ Medium | reads `reform`, `pardoned`; sets `pardoned` |
|
||
|
||
It is a loop, not a line: the crime that opens stage 1 also cools the colony's climate, which the *next*
|
||
pawn's disposition reads — so one pawn's whole sentence is faintly present in every other pawn's odds.
|
||
|
||
---
|
||
|
||
## Worked example — a sentence that ends in release
|
||
|
||
**Cass**, a Kind pickpocket. Nature `= clamp01(0.05 − 0.30) = 0`. She arrives with one crime, caught
|
||
once, no escapes, no contraband, `reform = 0`.
|
||
|
||
```
|
||
Grade at intake:
|
||
risk = 0 + 0 + (1*0.20) + (1*0.15) + 0 - 0 = 0.35 → MEDIUM
|
||
CanRelease? reform 0 < 0.30 → NO
|
||
```
|
||
|
||
She is already Medium-or-below, so the *grade* gate is met — but her `reform` is `0`. You give her the
|
||
corrective hand three times (structure, rewarded conduct), and fix her cell so she isn't stewing:
|
||
|
||
```
|
||
reform: 0 → +0.10 → +0.20 → +0.30
|
||
Grade now: risk = 0.35 - (0.30 * 0.4) = 0.23 → MINIMUM
|
||
CanRelease? reform 0.30 ≥ 0.30 AND Minimum ≤ Medium AND not pardoned → YES
|
||
```
|
||
|
||
`Release(Cass)` sets `pardoned = true`. She walks. Contrast **Bram** from the Classification page,
|
||
whose reform-less risk of `1.55` keeps him at Maximum even at `reform = 1.0` — `CanRelease` returns
|
||
`false` for Bram forever, because the grade gate never opens. Two prisoners, the same treatment, and
|
||
the record decides which one you can ever let go.
|
||
|
||
---
|
||
|
||
## A note on record cleanup
|
||
|
||
A pawn whose record is `IsBlank` — no crimes, no escapes, no contraband, no catches, `reform == 0`,
|
||
not pardoned — is dropped on save/load (Core prunes blank and dead-pawn records). A *pardoned* pawn is
|
||
therefore **not** blank and their record persists: the pardon is remembered. This is why a released
|
||
parolee who stays and reoffends still carries their history — Justice does not forget that they were
|
||
once let out.
|
||
|
||
---
|
||
|
||
## Ideology-flavoured thresholds
|
||
|
||
Precepts layer on top of this baseline, not under it: an execution-favouring ideoligion paroles
|
||
rarely, a lenient one readily. `CanRelease` is the substrate-native baseline those precepts modulate —
|
||
the floor beneath the flavour, so the decision is coherent whether or not Ideology is installed.
|
||
|
||
---
|
||
|
||
## How to play with parole
|
||
|
||
- **Parole is earned, not granted.** You cannot release your way out of a deep record. Decide early
|
||
whether a pawn is a keep-or-release case and treat (gently) the ones you mean to free.
|
||
- **`reform ≥ 0.30` is three gentle acts, minimum.** Nothing faster reaches it. Start early.
|
||
- **Keep the record shallow if you want the option.** Every escape (`+0.35`) and catch (`+0.15`) you
|
||
let accumulate pushes a pawn toward the unparoleable side of the `1.2` line.
|
||
- **A parolee who stays is a Justice case, not a farewell.** They carry their record; if conditions
|
||
sour, their disposition (still reading their history) can put them back on it.
|
||
|
||
---
|
||
|
||
## For modders
|
||
|
||
```csharp
|
||
if (Parole.CanRelease(pawn)) // pure read: reform, grade, pardon
|
||
Parole.Release(pawn); // sets pardoned = true
|
||
```
|
||
|
||
`CanRelease` peeks (never creates a record) and treats a missing record as releasable. `Release` uses
|
||
`For` (creates if absent) and is idempotent — a second call is a no-op once `pardoned` is set. Both
|
||
live in the `Contraband` namespace (shared since Justice's extraction from Contraband).
|
||
|
||
---
|
||
|
||
*Part of the **Institution** suite for RimWorld 1.6: Core · Contraband · Policing · Corrections · Gangs · Ward.*
|