Feature Specification

Blood Visual (Stains, World Feedback, HUD)

Visual blood only. It does not change combat, survival, stealth, or other gameplay in this spec. Any future gameplay use of blood is TBD.

Status: draftOwner: UnassignedUpdated: 2026-09-14

Production context

Deprecated source referenceGDD/01-Gameplay/10-Blood-Visual.md
Decision markers13 confirmed · 0 recommendations · 9 TBD
Browser document roleThis standalone HTML file is authoritative; edit this file directly through the project workflow.

Verified implementation evidence

  • Not verified for this documentation pass.

Relationships

Document contract coverage

Use these required Feature Specification areas during review. The HTML content below is authoritative; items not stated explicitly remain unresolved.

  • ReviewPurpose & Player Value
  • ReviewScope
  • ReviewOut of Scope
  • ReviewTerminology
  • ReviewFunctional Behavior
  • ReviewStates & Flows
  • ReviewRules & Edge Cases
  • ReviewDependencies
  • ReviewAcceptance Criteria
  • ReviewOpen Questions

Authoritative project content

Blood is both visual state and an infection-risk input[CONFIRMED]. Every 10 real-time minutes, the server evaluates infection probability from immunity and blood on the character and worn equipment.

Related: 03-Combat-System.md, 06-Inventory-and-Items.md, 08-Character-Creation.md, 09-Weapon-Customization.md, 11-Wetness-and-Rain.md, ../03-Enemies/01-Zombie-Design.md, ../03-Enemies/02-Boss-Zombies.md, ../06-Art-Audio/01-Art-Direction-and-MetaHuman.md.

Dirt / fouling is cancelled (no dirt meter, no workbench cleaning, no jam/spread-from-dirt). Use still reduces durability. See 09-Weapon-Customization.md.

Layers — [CONFIRMED]

Both exist (they are not alternatives):

Layer What it is Persistence
World hit feedback Splatter / decals / particles in the scene when a living target is damaged Ephemeral (combat readability)
Mesh stain BloodAmount 0–1 on a Dynamic Material Instance (MID), driven by a per-mesh blood mask Item and character state; see below
Local HUD overlay Blood on the local player's screen, not on the eye mesh Fades over time; not shown to other players

Blood color is one palette for all living targets (player, zombie, boss, animal). Do not author separate human vs zombie blood colors unless that decision is reopened.

Mesh stain — material contract — [CONFIRMED]

  • Approach: mask on the existing material, not a Material Layer Blend stack.
  • Control: a single scalar BloodAmount in 0–1 per stained object (one value for the whole item/mesh, including multi-slot materials).
  • Mask: authored per mesh. Shared/procedural masks are not the v1 contract.
  • MID applies that scalar to the mask. Exact parameter names are [TBD] (technical art).
  • If a mesh has no blood mask (or materials do not expose the stain path), it shows no blood. Missing mask is not a ship blocker for that asset, but the pipeline applies to all future content in this system.
  • New melee / clothing / body content is expected to follow this pipeline; unmasked pieces simply stay clean-looking.

What can stain (attacker) — [CONFIRMED]

Stains the thing that scored a melee hit, when that hit connects and deals damage to a living target.

Counts:

  • Any equipped item that can perform a melee hit (melee weapons, tools, building hammer, etc.).
  • A firearm used as a melee strike (butt / bayonet / similar) — the gun mesh stains.
  • Unarmed punch: skin of the hands if no gloves are worn; gloves only (not hand skin) if gloves are worn.
  • Kick: shoes.

Does not count:

  • Thrown melee / thrown items.
  • Hits on structures, walls, doors, or other non-living props (nothing to bleed).
  • Block / parry — the attacker's weapon does not stain from being blocked.

Ranged gunfire does not stain the firearm. It can still stain the victim (see below).

What can stain (victim and bystanders-on-body) — [CONFIRMED]

When a living target takes damaging hits (melee, firearms, explosives, or any other damage that actually deals damage):

  • Their outer worn clothing can stain. Which slot is “outer” is [TBD] until clothing layers are designed; do not implement a layer-priority table yet.
  • Items in inventory that are not worn do not stain.
  • Hair and skin stain. That BloodAmount lives on the character/pawn, not on an item. Changing clothes does not clear body/hair blood.
  • Eyes do not receive a mesh stain.
  • Zombies and bosses use the same mesh-stain contract on their bodies (per-mesh mask + BloodAmount).
  • Animals use the same living-target rules.

Dual state: item vs character — [CONFIRMED]

Surface Where BloodAmount lives Unequip / swap
Weapon, tool, firearm (if melee-stained), worn clothing, gloves, shoes Item instance Stays on that item (drop, loot, inspect, re-equip)
Hair, skin (not eyes) Character Stays on the character when outfits change

Both can be stained at once (e.g. bloody shirt item + bloody skin/hair on the pawn).

Accumulation — [CONFIRMED] rules, numbers [TBD]

  • Amount added scales with damage dealt (attacker gear) or damage taken (victim clothes/body). Do not invent a formula, coefficient, or curve in code or docs.
  • There is a ceiling (visual saturates; treat the scalar cap as 1.0 unless a different cap is decided later).
  • Stains ease in (not a binary first-hit full coat).
  • Stains do not decay until a wash system exists.

Wash — [CONFIRMED] intent, not this slice

Workbench cleaning of dirt/blood is cut.

Future wash sources (not built in the visual-pipeline slice):

  • Faucet
  • Water source
  • Rain — [CONFIRMED] to reduce blood over time while exposed

Rain exposure reduces BloodAmount. The exact wash rate, faucet/water-source interaction, and whether manual washing is channeled remain [TBD]. WetAmount remains an independent scalar.

Networking, inspect, save — [CONFIRMED]

  • Other players must see mesh stains (weapons, worn clothes, hair/skin, zombies/bosses).
  • Mesh BloodAmount on items is instance state: world drops, loot, and workbench 3D inspect show the stain.
  • Item and player character body/hair blood persist in the save record.
  • Whether AI blood (zombie/boss/animal) is written into world persistence or only lives on the actor until despawn is [TBD]. [CONFIRMED 2026-09-14] P07 does not persist AI blood.

HUD overlay is local-only and is not replicated.

Local HUD overlay — [CONFIRMED] existence, tuning [TBD]

  • Blood marks on the local player's screen, then fade over time.
  • Replaces staining the eye mesh.
  • Duration, intensity vs damage, and exactly which events spawn it (incoming damage, camera-facing splatter, melee swing, combinations) are [TBD]. Do not copy a third-party vignette curve.

Gameplay — [CONFIRMED] infection risk

Low immunity and higher BloodAmount on the character or worn equipment increase infection probability. The server rolls once every 10 real-time minutes. The probability curve, thresholds, contribution of each stained item, and treatment rules remain [TBD]. Blood does not affect stealth or AI senses unless separately approved.

Pipeline ownership — [CONFIRMED]

  • Spec first; mesh masks and material wiring follow the contract above.
  • This is a game-wide pipeline, not a one-weapon prototype. Content without a mask simply does not show the stain.

Open questions still [TBD]

Do not implement as if decided:

  • Clothing outer-layer resolution.
  • BloodAmount gain formula and easing.
  • Blood-mask authoring details beyond the confirmed BloodAmount scalar and BloodMask texture name.
  • HUD overlay triggers, duration, and intensity.
  • Rain wash rate plus faucet/water-source implementation.
  • AI blood persistence across server restart. P07 does not persist it.
  • World splatter/decal art direction (materials, lifetime, pooling) beyond “this layer exists.”
  • Infection probability curve, thresholds, item contribution, and treatment.

Local camera overlay — [CONFIRMED]

FEAT-HUD-UI owns presentation. Owner confirmed 2026-09-09: The blood-producing impact must be within 2 metres of the local camera and must not reach it through an intervening obstruction. Blood that reaches the local player/camera from the player's attack, including nearby gunshot or explosion impact, holds for 2 seconds and then fades out over 5 seconds. The effect and low-health red edge treatment cannot be reduced or disabled in Settings.

G3 source, 2026-09-10: ULambeerAbilitySystemLibrary::ApplyDamage always starts the local overlay when the damaged actor is that client’s pawn. Nearby hits still require 2 m to the pawn view and a clear visibility trace. Distance for those nearby hits uses GetPawnViewLocation(), not the 360 cm spring-arm camera. The HUD BloodOverlay paints the confirmed red tint (Engine white square fill) above ScreenEffects. Dedicated-server clients create ULambeerCheatManager via EnableCheats on ReceivedPlayer. Owner reported 2026-09-10: Lambeer.Damage 10 passed on a client Preview window. Nearby non-self 2 m / LOS hits were not part of that pass.