Open-World Narrative · Architecture

Hunter, Period & Bureau Cell Systems

A focused page within the Open-World Narrative Architecture documentation. The full map and every sibling page live in the Architecture hub.

5sections12 minread3diagrams

On this page

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.

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'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 youSelfDamage = (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 Alerts — 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.

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 (SoldierCaporegimeUnderbossBoss) 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 (PatrolTrafficHomicideViceArson) 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 methodsEvidenceLocker, 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.

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.

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.

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 .sos). 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: