# Hunter, Period & Bureau Cell Systems

Most of V5's seventy-four engine modules are deliberately genre-agnostic: the
GAS spine, the perception model, netcode, traversal, and the Mind-Palace
deduction graph are shared by every cell so a Hong Kong triad goon and a
hunter-cell drowner read stimuli from the same state machine. The modules
covered on this page are the opposite — they are the **signature mechanics that
only one cell ever wants**. A meditation-pose brewing station that turns three
foraged ingredients into a toxicity-bearing decoction makes no sense outside the
monster-hunter cell; a World-Partition data-layer flip that retires every 1947
prop and swaps in a 1968 body-language library belongs only to the period-drama
cell; a quadratic star-cost "lawyer payoff" that reads your honor bounty is a
crime-cell verb. This page opens those three clusters in turn — the
**monster-hunter** cell's alchemy/signs/bestiary/hunting stack, the
**period-drama** cell's authenticity-and-progression stack, and the urban-crime
**"Bureau" spine** that fuses the wanted/honor reputation systems to the
cross-cell Cross-Continuum Bureau progression ledger. As with the rest of this
set, every claim is grounded in the on-disk C++ and labelled where it leans on
art that is described rather than baked. It is the signature-systems companion
to the catalogue index in [../V5_ARCHITECTURE.md](../V5_ARCHITECTURE.md).

## What ships, honestly

**The cell-mechanic modules are real, compiled, and tested.** Every module named
below exists under `V5/ue/Source/` with a `Public/`/`Private/` split, a
`*.Build.cs`, and a `Private/Tests/` automation spec, and the linker has been
through them on this box: `Binaries/Linux/libUnrealEditor-V5Alchemy.so`,
`-V5MonsterHunt.so`, `-V5Honor.so`, and `-V5Wanted.so` (among others) sit next
to their sources, built by the `ueagent` user. The signature math is real
domain-specific code, not renamed CRUD — a 70%-toxicity self-damage threshold, a
quadratic wanted payoff, a five-input cross-cell moral compass — and each is
pinned by UE `IMPLEMENT_*_AUTOMATION_TEST` assertions that check _values_, not
truthiness
(`TestEqual("Heat below visual threshold is zero stars", EvaluateStarLevel(9.0f), 0)`).
The nine modules profiled here carry ~1,540 lines of test across them.

**The data is JSON catalogs; the art is not in-tree.** Consistent with the
[topology page](./topology-layout-module-split.md)'s accounting of **0 binary
`.uasset`**, the catalogs that drive these systems ship as version-controlled
JSON: `Content/V5Alchemy/Data/alchemy_catalog.json` (84 KB),
`Content/V5MonsterHunt/Data/monster_hunt_catalog.json` (44 KB), and
`Content/V5PeriodAuth/Data/period_auth_bundles.json`. So the _logic and balance_
of every signature system is real, while the meditation-pose montages, MetaHuman
witnesses, Niagara sign FX, and era-correct meshes those catalogs reference are
described, not cooked. Where a claim depends on that art, this page says so.

**"Cell" means a mechanic stack composed by a thin variant module.** As the
topology page explains, V5 inverts V4: the mechanics live in shared modules, and
each playable mode-variant is a content-only GameFeature plugin plus a C++
_composition module_ whose `Build.cs` wires the shared mechanics it needs. The
honest consequence on display here is that the variant modules
(`V5HunterWitchersPath`, `V5PeriodMadeMan`, `V5UrbanHeistCity`, …) are lighter
on novel per-frame algorithms and heavier on **catalog assembly and validation**
than the mechanic cores they pull in; their depth is in `Require(...)` shape
gates over large authored datasets, while the frame-critical verbs live one
layer down. Both facts are true at once, and the sections below keep them
distinct.

## The monster-hunter cell — alchemy, signs, bestiary, hunting

The hunter cell is V5's Witcher surface, and it is the most mechanically dense
of the three clusters: four mechanic modules (`V5Alchemy`, `V5Signs`,
`V5MonsterHunt`, `V5Hunting`) that the `V5HunterWitchersPath` composition module
fuses with `V5Melee` and `V5Squad`.

### Alchemy — a real consumable economy with a toxicity ceiling

`V5Alchemy` models the full brew loop, not a crafting menu. The catalog is **120
recipes** (30 each of `Potion`/`Oil`/`Bomb`/`Decoction`, the
`EV5AlchemyRecipeType` enum) drawing on **180 ingredients** (60 herbs, 60
mushrooms, 60 monster parts), each recipe consuming _exactly three_ — verified
by `V5AlchemyTests`. The load-bearing system is `UV5_Alchemy_ToxicitySystem`:
`ApplyConsumableToxicity()` scales a recipe's `ToxicityPercent` by a resistance
scalar (clamped so resistance can never exceed 90%), accumulates it toward a
`MaxToxicityPercent`, and once the bar crosses the
`ToxicityDamageThresholdPercent = 70.0f` constant, it _starts hurting you_ —
`SelfDamage = (Current − 70) × 0.5`, accumulated across doses. That single
threshold is the Witcher "don't chug five decoctions" rule expressed as
interpolation math, and the spec proves it: a first decoction stays under the
line, a second stacks past 70 and trips `bSelfDamageTriggered`. Around it sit
`UV5_Alchemy_Inventory` (typed slot caps — 5 potions, 2 oils, 2 bombs, 1
decoction — via `GetSlotCapacity`), `AV5_Alchemy_BrewingStation::BrewRecipe()`
(real ingredient-count validation and consumption against a `BrewRequest`), and
`UV5_Alchemy_RespawnSchedule`, which gates foraged nodes behind a
`RespawnCadenceDays = 4.0f` cooldown so over-harvesting a biome actually
depletes it.

### Signs — five GAS verbs gated on a shared stamina pool

`V5Signs` carries the five elemental casts (`EV5SignType`:
`FireCone`/`ForceWave`/`Shield`/`TrapGlyph`/`MindSuggest` — the renamed
Igni/Aard/Quen/Yrden/Axii), each with a `Base` and `Charged` variant and a
**five-tier upgrade tree** (25 nodes total; the spec checks 5 families → 10
variants → 25 nodes). The interesting code is `UV5_Sign_StaminaGate`, which is
explicitly wired to the shared combat attribute set:
`EvaluateSignCastFromCombatAttributes()` reads `GetStamina()`/`GetMaxStamina()`
off `UV5_AttributeSet_Combat` rather than carrying its own pool, so signs draw
from the _same_ stamina that dodge and parry regenerate. The gate applies the
upgrade node's `CostReductionPercent` (clamped to 80%), scales `EffectMagnitude`
by the node's `DamageMultiplier`, and enforces that a `bRequiresFullStamina`
charged cast needs ≥95% of max — failing loud with a typed `FailureReason`
rather than silently succeeding. `V5Signs.Build.cs` links `GameplayAbilities`
directly, so each sign is a real `UV5_Ability_Sign_*` over the GAS spine.

### Bestiary & Witcher-Sense — the investigate-then-fight loop

`V5MonsterHunt` is where the cell's hunting fantasy lives. The bestiary is **80
entries across 12 categories** (`EV5MonsterCategory`:
Specter/Vampire/Drowner/Necrophage/Hybrid/Ogre/Dragon/Golem/Undead/CursedOne/Doppler/Elemental),
each carrying `WeakVsOil`/`WeakVsSign`/`WeakVsBomb` tags that close the loop
back to alchemy and signs. `UV5_MonsterHunt_WitcherSense::SetSenseEnabled()`
drops camera saturation to `0.45` and lights up six `EV5MonsterHuntClueType`
colours (amber scent, crimson blood, ochre track, …); `BuildHighlightedClues()`
filters to clues within a 40 m range and **sorts them by proximity**, and
`UV5_MonsterHunt_TrailFollowing::BuildTrailFromClues()` turns the sorted clues
into nav markers weighted `1 / distance`. Bestiary completion is a real state
machine: `ApplyUnlock()` advances a monster from `Tome` (25%) → `Encounter`
(40%) → `CombatStudy` (70%) → `Defeat` (100%), and at 100%
`GetDamageMultiplier()` returns a `1.2×` bonus — knowledge becomes damage.
Contracts post on a 36-hour cadence and expire after `168.0f` hours (seven
in-game days), verified by a spec that posts at hour 72 and asserts expiry
at 240.

### Hunting — perfect-pelt scoring and prey AI

`V5Hunting` is the frontier/hunter foraging economy (**65 species, 60 trapper
recipes**, all three pelt grades authored).
`UV5_Hunting_PerfectPeltScoring::ScorePelt()` encodes the RDR2-style cleanliness
rule precisely: a `Perfect` pelt requires the _correct caliber for the species_
**and** a clean kill (one shot to head or vital) **and** field-dressing within
`PerfectFieldDressMinutes = 15.0f`; miss any and you drop to `Good` or `Poor`
with a typed reason. `UV5_Hunting_AnimalAI` resolves prey behaviour by priority
— a nearby predator forces `Fleeing` at 1.2× flee speed, then line-of-sight
inside `SightRangeMeters` flees, then sound inside `HearingRangeMeters` only
`Alert`s — and `UV5_Hunting_TrackingMode` is the frontier "Eagle Eye" cousin of
Witcher-Sense (saturation `0.52`, amber accent, proximity-sorted signs).
`CarcassTransport` enforces the one-rear-slot horse constraint and refuses
`CatchOnly` species; `TrapperProgression` unlocks outfits only when enough
_matching_ perfect pelts and dollars are delivered.

```mermaid
flowchart TB
    subgraph HUNT["Monster-hunter cell mechanic modules"]
        Alch["V5Alchemy<br/><sub>120 recipes · toxicity ≥70% → self-dmg · 4-day respawn</sub>"]
        Signs["V5Signs<br/><sub>5 signs × 5-tier tree · stamina gate</sub>"]
        Mon["V5MonsterHunt<br/><sub>80 bestiary · sense 0.45 sat · trail 1/d · 100% → 1.2× dmg</sub>"]
        Hunt["V5Hunting<br/><sub>perfect pelt = caliber+clean+15min</sub>"]
    end
    GAS["V5Gameplay · GAS<br/><sub>UV5_AttributeSet_Combat stamina</sub>"]
    Signs --> GAS
    Alch --> GAS
    Mon -->|weak-vs oil/sign/bomb| Alch
    Mon --> Signs
    WP["V5HunterWitchersPath<br/><sub>composition module</sub>"] --> Alch & Signs & Mon
    WP --> Melee["V5Melee"] & Squad["V5Squad"]
```

**Maturity: high.** Real formulas, compiled modules, value-checking specs, and
JSON catalogs. The brewing-pose animation, monster meshes, and sign Niagara
systems are referenced by `FSoftObjectPath` but not baked.

## The period-drama cell — authenticity and progression

The period cell is V5's Mafia/L.A.-Noire surface. Its signature is not a combat
verb but **time itself**: one shared open world that re-skins across three eras,
plus two progression-driven campaign modules over it.

### Period-Authenticity — a data-layer era machine with a linter

`V5PeriodAuth` is the abstraction that makes "the same city, three decades"
cheap. An `FV5PeriodAuthBundle` for each of the three eras (`EV5PeriodAuthEra`:
`Era1930s`/`Era1947`/`Era1968`) bundles vehicles, fashion, signage, fonts,
slang, music, food, a radio-station set, lighting overrides, a `DataLayerName`,
a body-language library id, and a UI font/palette. `BuildDataLayerFlip()`
computes the World-Partition transition: it enables the target era's layer,
disables every _other_ era's layer, and only reports `bContinuitySafe` when at
least two other layers are being torn down (a real guard against a half-swapped
world). The loader is genuinely defensive — `ValidatePeriodAuthJson()` requires
`schemaVersion == 1`, _exactly three_ era bundles, and a passing asset linter.
That linter, `UV5_PeriodAuth_AssetLinter::LintPeriodTaggedAssets()`, is the
piece that keeps a 1968 muscle car out of a 1947 street: it flags any tagged
asset whose `DeclaredEra != BundleEra` or that isn't actually a member of its
bundle's category array. On-disk evidence backs the breadth — dozens of
`Content/V5Vehicles/Tuning/Period/period_{30s,47,68}_*.vehicle-tuning.json`
descriptors already carry era-correct rows.

### Made Man — rank ladder and a two-axis loyalty model

`V5PeriodMadeMan` (which composes `V5PeriodAuth`, `V5Vehicles`, and `V5Audio`)
is the Mafia-style family arc: **78 missions, 26 per era**, six chapter endings,
and a four-rung hierarchy (`Soldier` → `Caporegime` → `Underboss` → `Boss`)
gated by mission number and family standing. The signature runtime is
`UV5_MadeMan_Loyalty::ApplyEvent()`, a two-axis model where each story beat
moves `FamilyStanding` and `BetrayalRisk` in opposition — `ProtectFamily` is
+18/−6, `SpareCivilian` +8/−10, but `BetrayCapo` is −30 standing/+35 risk and
`CauseCollateral` −16/+18. Both clamp to `[0,100]`, and the resulting
`EV5MMLoyaltyStage` is resolved by threshold: `BetrayalRisk ≥ 70` overrides
everything to `Betrayed`, else `FamilyStanding ≥ 75` is `Loyal`, ≥50 `Tested`,
≥25 `Trusted`, else `Outsider`. It is a small, legible reputation engine that
the campaign's branching endings read directly.

### Vice Squad — desk progression and period-correct evidence

`V5PeriodViceSquad` is the detective face, and its `Build.cs` is a who's-who of
the shared narrative spine: `V5FaceCapture`, `V5Interrogation`,
`V5Investigation`, `V5PeriodAuth`. Cases roll up across five desks
(`Patrol`→`Traffic`→`Homicide`→`Vice`→`Arson`) scored on a four-grade scale
(`Brilliant`/`Good`/`Average`/`Poor` = 4/3/2/1); `RollUpDeskRating()` averages a
desk's case scores and `RatingFromAverage()` maps ≥3.5→Brilliant, ≥2.75→Good,
≥2.0→Average. The period flavour is in the **evidence-retrieval methods** —
`EvidenceLocker`, `CoronerLedger`, `SwitchboardLog`, `NewspaperMorgue`,
`RadioDispatchTape` — there are no databases in 1947, and the catalog validator
enforces exactly that, alongside requirements that every case pushes Mind-Palace
evidence, the interrogation kit carries 12 tells over 50+ scenes, and the shared
1947 city spans ≥8 districts. The module also hosts a self-contained "Egyptian
Detective" cold-case sub-campaign (14 cases, 5 districts, 12 museum-cataloged
artifacts scored for authenticity ≥75, an 840-minute / 18.5 km² validation). The
interrogation, dialogue, and face-capture machinery these cases ride on is
detailed in
[interrogation, dialogue & heist](./interrogation-dialogue-and-heist.md).

```mermaid
flowchart LR
    PA["V5PeriodAuth<br/><sub>3 era bundles · data-layer flip · asset linter</sub>"]
    MM["V5PeriodMadeMan<br/><sub>78 missions · loyalty FamilyStanding/BetrayalRisk</sub>"]
    VS["V5PeriodViceSquad<br/><sub>5 desks · 4-grade rollup · period evidence</sub>"]
    PA --> MM & VS
    VS --> Interro["V5Interrogation · V5Investigation · V5FaceCapture"]
    VS -->|every case| MP["V5MindPalace<br/><sub>shared deduction graph</sub>"]
```

**Maturity: high for the period-auth machine and the two campaign
progressions;** the vice-squad and made-man modules are catalog-and-validation
heavy, with the frame-critical interrogation/investigation verbs living in the
shared modules they compose. Era meshes, MetaHuman witnesses, and VO are
JSON-described.

## The Bureau spine — urban crime and the Cross-Continuum Bureau

The "Bureau" is two things wearing one name, and both are real code. At the cell
level it is the urban-crime trio. Underneath every cell it is the
**Cross-Continuum Bureau** — the shared reputation and progression spine that
turns five disparate games into one account.

### Wanted — a heat/stars model with era-scaled response

`V5Wanted` is the shared law-response engine (its `Build.cs` depends only on
`V5Honor`, and it is reused by urban, period, frontier, hunter, and sci-fi).
`EvaluateStarLevel()` maps a clamped `Heat` (0–125) onto 0–5 stars at fixed
thresholds (10/25/45/70/100); crimes add heat (violent ×1.35, vehicle escape
+6), and sustained police contact escalates via a per-star rate. The
genre-defining detail is that the _response_ is era-scaled:
`EV5WantedResponseEra` routes a `SpawnPlan` through frontier (marshals, posse
riders), hunter (village watch, lord's guard), or sci-fi (faction troopers,
patrol cruisers) variants, while modern/1968 unlock military escalation.
Clearing is real, too — off-radar for 90 seconds, or a safehouse garage that
ticks the timer at 3× — and the payoff verb is a genuine formula:
`CostPaid = BaseCostPerStar(150) × Stars²` plus your outstanding honor bounty,
with a 900-second cooldown. The quadratic makes a five-star payoff punishing on
purpose.

### Honor — a moral meter that bridges every cell

`V5Honor` (links `GameplayAbilities`) is the reputation substrate. The local
model is straightforward — `HonorScore` clamped `[−100,100]`, five bands, action
deltas (`StoryMercy` +12, `StoryCruelty` −12, `AssaultCivilian` −8), bounty by
crime type, and witness-reporting state. The cross-cell piece is the one that
makes the Bureau cohere: `UV5_Honor_KarmaParagonBridge::ComputeMoralCompass()`
takes per-cell reputation inputs — urban `CopRep`/`TriadRep`, period
`FamilyRep`/`OutsiderRep` plus case rating, frontier `HonorScore`, hunter
`WitcherHumanity`, sci-fi `ParagonScore`/`RenegadeScore` — and folds them into a
single `LightScore`/`DarkScore` pair, returning a `MoralCompass` clamped
`[−1,1]` (period double-weighted in the normalizer). That compass then feeds
`UV5_Honor_BureauXPMod::GetBureauXPMultiplier()`: a strong moral identity
(|compass| ≥ 0.7) earns a **1.5× Bureau-XP multiplier**, ≥0.4 earns 1.25×. Being
_someone_ across cells is mechanically rewarded.

### The urban-crime trio

Three variant modules compose the crime cell over `V5Wanted`, `V5Melee`,
`V5Parkour`, `V5Netcode`, and `V5OnlineServices`. `V5UrbanHeistCity` is the
GTA-V surface: a validator-enforced catalog of 3 protagonists, 32 main missions,
12 heists (each 4–6 setups, smooth/hard/catastrophic endings), 90 side missions,
16 districts totalling exactly 140 km², a 1.5-second right-D-pad character
switch with simulated downtime, plus a self-contained Cyberpunk-2087 sub-cell.
`V5UrbanStreetTriad` is Sleeping Dogs: a two-axis `Face`/`Triad` reputation
whose ending branches resolve `Balanced` only when both ≥65 and within 10 of
each other, over 85 base melee moves and 7 parkour actions. `V5UrbanOnline` is
the GTA-Online surface — a 2–30-player dedicated-server freeroam on the shared
300 m Urban AOI profile, 2–4-player role-based heist co-op with AI backfill, 4v4
rollback deathmatch across 16 maps, and a 60-route speedrun league on the 90-day
season cadence, all routed through the shared matchmaking and balance-ledger
service contracts described in
[persistence, online & crossplay](./persistence-online-and-crossplay.md).

### The Cross-Continuum Bureau XP ledger

The progression spine lives in the foundation module: `FV5BureauXPLedger` in
`V5/ue/Source/V5Core/Public/V5Types.h`. `AddXP(EV5Cell, DeltaXP)` accumulates
into a per-cell `TMap` _and_ a `TotalXP`, then `RecalculateTier()` derives
`CurrentTier = max(1, TotalXP/2500 + 1)` and idempotently grants the cross-cell
unlocks the monolith promises — Tier 1 `PhotoMode.AllCells`, Tier 5
`MindPalace.CrossEraPairs`, Tier 10 `CompanionApp.FullSync`, Tier 20
`NewGamePlus`, Tier 30 `Cosmetic.BureauGear.AllCells`.
`UV5_GameInstance::AddBureauXP()` is the live entry point that writes through
the active profile. One honest drift worth flagging: the social-hub side,
`UV5_Online_CrossCellPersistentWorld::BuildCrossCellWorldState()`, recomputes a
`BureauTier` as `BureauXP/1000 + 1` — a _different divisor_ from the core
ledger's `/2500`, so the persistent-world hub and the save-game ledger don't
agree on tier spacing. The Bureau-HQ hub itself is real plumbing
(`UV5_Mode_OnlineLobby_BureauHQ`, a 32-player social lobby routed to the
`WBP_HUD_BureauHQ` surface), but its maps are descriptor paths, not cooked
levels.

```mermaid
flowchart TB
    subgraph CELLS["Per-cell reputation"]
        Cop["urban CopRep/TriadRep"]
        Fam["period FamilyRep + case rating"]
        Hon["frontier HonorScore"]
        Hum["hunter WitcherHumanity"]
        Par["sci-fi Paragon/Renegade"]
    end
    Wanted["V5Wanted<br/><sub>heat→stars · era response · 150×stars² payoff</sub>"]
    Honor["V5Honor<br/><sub>MoralCompass [-1,1]</sub>"]
    Cop & Fam & Hon & Hum & Par --> Honor
    Honor -->|moral identity 0.7+ → 1.5x XP| Ledger["FV5BureauXPLedger<br/><sub>tier = TotalXP/2500 + 1</sub>"]
    Wanted -->|reads bounty| Honor
    Ledger --> Unlocks["cross-cell unlocks<br/><sub>PhotoMode · NG+ · Bureau gear</sub>"]
    Ledger -. divisor drift /1000 .-> HQ["Bureau HQ persistent world"]
```

**Maturity: high for `V5Wanted`, `V5Honor`, and the `FV5BureauXPLedger` spine**
(real formulas, value-checking specs, compiled `.so`s). The urban variant trio
is validator-heavy over large authored catalogs, deferring its heavy mechanics
to the shared modules it composes; the tier-divisor drift is a real,
unreconciled inconsistency.

## Where to go next

These signature systems only make sense against the layers they ride on:

- [Creator suite & Mind Palace](./creator-suite-and-mind-palace.md) — the
  authoring tools (Bestiary Author, Heist Author, Contract Author) that produce
  the catalogs above, and the deduction graph every period case pushes into.
- [Interrogation, dialogue & heist](./interrogation-dialogue-and-heist.md) — the
  shared narrative verbs the Vice Squad and Heist City cells compose.
- [Spaceship, vehicles & mounts](./spaceship-vehicles-and-mounts.md) — the
  period autos, hunter horses, and getaway cars these cells drive.
- [Perception, crowd & morality](./perception-crowd-and-morality.md) — the
  shared suspicion model every guard, witness, and prey animal reads.
- The full catalogue: [../V5_ARCHITECTURE.md](../V5_ARCHITECTURE.md).
