Add UI Overrides and Weapons Index documentation for Project Void
- Created ui-overrides.md detailing game-specific Widget Blueprint overrides, including purpose, widget index, visual styling, and accessibility requirements. - Established weapons-index.md outlining all held weapon actors, including their components, logic, and comparisons for gameplay mechanics.
This commit is contained in:
360
docs/game/items-index.md
Normal file
360
docs/game/items-index.md
Normal file
@@ -0,0 +1,360 @@
|
||||
# Items Index — All Game Items & Pickups
|
||||
|
||||
**Game:** Project Void | **Build Phases:** 5, 6
|
||||
**Framework Systems:** 07_DA_ItemData, 25_BP_ItemPickup, 31_BPC_InventorySystem
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
Master index of all game items, their Data Assets, and pickup actors. The first 4 items (flashlight, pistol, medkit, keycard) have full build walkthroughs in their own docs. This document covers the remaining 9 items and provides quick-reference for all 13 + their 18 pickups.
|
||||
|
||||
---
|
||||
|
||||
## Complete Item Catalog
|
||||
|
||||
| # | Item | Type | Stack | Weight | Found In | Has Full Build Doc |
|
||||
|---|------|------|:---:|:---:|----------|:---:|
|
||||
| 1 | Flashlight | Tool | 1 | 1.5 | Entry, WardA | [item-flashlight.md](item-flashlight.md) |
|
||||
| 2 | Pistol (9mm) | Weapon | 1 | 3.0 | WardA (Security Office) | [item-pistol.md](item-pistol.md) |
|
||||
| 3 | MedKit | Consumable | 5 | 1.0 | All levels | [item-medkit.md](item-medkit.md) |
|
||||
| 4 | Keycard Omega | KeyItem | 1 | 0.1 | WardA (Nurses Station) | [item-keycard.md](item-keycard.md) |
|
||||
| 5 | 9mm Ammo | Ammo | 999 | 0.05 | WardA, WardB, Basement | *(below)* |
|
||||
| 6 | Shotgun | Weapon | 1 | 6.0 | WardB (Morgue) | *(below)* |
|
||||
| 7 | Shotgun Shells | Ammo | 999 | 0.03 | WardB, Basement | *(below)* |
|
||||
| 8 | Battery | Consumable | 10 | 0.3 | All dark areas | *(below)* |
|
||||
| 9 | Adrenaline Syringe | Consumable | 3 | 0.5 | WardB, Basement | *(below)* |
|
||||
| 10 | Sanity Pill | Consumable | 5 | 0.2 | WardB, Basement, WardensOffice | *(below)* |
|
||||
| 11 | Crowbar | Tool | 1 | 4.0 | Basement (Boiler Room) | *(below)* |
|
||||
| 12 | Keycard Alpha | KeyItem | 1 | 0.1 | WardA (Nurses Station) | (same pattern as #4) |
|
||||
| 13 | Keycard Beta | KeyItem | 1 | 0.1 | WardB (Chapel — behind organ puzzle) | (same pattern as #4) |
|
||||
| 14 | Warden's Key | KeyItem | 1 | 0.1 | Basement (Morgue Drawer #4) | (same pattern as #4) |
|
||||
| 15 | Journal Page | Document | 1 | 0.05 | All levels | *(below)* |
|
||||
| 16 | Patient File | Document | 1 | 0.1 | WardA, WardB, Basement | *(below)* |
|
||||
| 17 | Old Photo | Collectible | 1 | 0.05 | WardA, WardB, Basement | *(below)* |
|
||||
| 18 | Void Shard | Collectible | 1 | 0.8 | WardB (1), Basement (1), WardensOffice (1) | *(below)* |
|
||||
|
||||
---
|
||||
|
||||
## Items with Quick Build Notes
|
||||
|
||||
### 5. DA_Item_Ammo_9mm / BP_Pickup_Ammo_9mm
|
||||
|
||||
**Item Type:** `Ammo` | **Ammo Type Tag:** `Framework.Item.Ammo.Pistol9mm`
|
||||
|
||||
| Field | Value |
|
||||
|-------|-------|
|
||||
| `Display Name` | "9mm Rounds" |
|
||||
| `World Mesh` | `SM_AmmoBox_9mm` (small cardboard box) |
|
||||
| `AmmoData.PerPickupCount` | `15` (15 rounds per pickup) |
|
||||
|
||||
**Pickup Wiring (differs from standard pickups):**
|
||||
```
|
||||
Event Interact → Interactor → BPC_AmmoComponent.AddAmmo(AmmoTypeTag, PerPickupCount)
|
||||
└─ (Does NOT use BPC_InventorySystem — ammo goes to ammo pool, not inventory grid)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 6. DA_Item_Shotgun / BP_Pickup_Shotgun / BP_Shotgun_Held
|
||||
|
||||
**Item Type:** `Weapon` | **Slot:** `Framework.Equipment.Slot.PrimaryWeapon`
|
||||
|
||||
| Field | Value |
|
||||
|-------|-------|
|
||||
| `Display Name` | "Double-Barrel Shotgun" |
|
||||
| `Weight` | `6.0` |
|
||||
| `Equipment.Damage` | `45.0` (total if both barrels hit) |
|
||||
| `Equipment.FireRate` | `1.0` (slow — break-action reload) |
|
||||
| `Equipment.MagazineSize` | `2` |
|
||||
| `Equipment.ReloadTime` | `3.0` (shell-by-shell) |
|
||||
|
||||
**Difference from Pistol:**
|
||||
- **Pellet Spread:** Fire trace replaced with multi-trace (6 pellets in cone)
|
||||
- **Reload:** Shell-by-shell reload (player can fire mid-reload if 1 shell loaded)
|
||||
- **Damage Falloff:** Heavy dropoff past 2000 units (close-range weapon)
|
||||
- **Recoil:** Much heavier — BPC_RecoilSystem.ApplyRecoil with ×3 multiplier
|
||||
|
||||
**Held Actor Components:**
|
||||
```
|
||||
BP_Shotgun_Held
|
||||
├── SkeletalMeshComponent "WeaponMesh" (break-action animation)
|
||||
├── SceneComponent "MuzzleSocket" (barrel end)
|
||||
├── AudioComponent "FireSound" (loud BOOM)
|
||||
├── AudioComponent "ReloadSound" (shell click)
|
||||
└── ParticleSystemComponent "MuzzleFlash" (large flash)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 7. DA_Item_Ammo_Shells / BP_Pickup_Ammo_Shells
|
||||
|
||||
**Item Type:** `Ammo` | **Ammo Type Tag:** `Framework.Item.Ammo.ShotgunShells`
|
||||
|
||||
| Field | Value |
|
||||
|-------|-------|
|
||||
| `Display Name` | "12-Gauge Shells" |
|
||||
| `AmmoData.PerPickupCount` | `6` |
|
||||
|
||||
Same pickup pattern as 9mm ammo — routes to `BPC_AmmoComponent.AddAmmo()`.
|
||||
|
||||
---
|
||||
|
||||
### 8. DA_Item_Battery / BP_Pickup_Battery
|
||||
|
||||
**Item Type:** `Consumable` | **Stack Limit:** `10`
|
||||
|
||||
| Field | Value |
|
||||
|-------|-------|
|
||||
| `Display Name` | "Flashlight Battery" |
|
||||
| `Consumable.RestoreValue` | `50.0` (flashlight charge percentage) |
|
||||
| `Consumable.UseDuration` | `1.0` |
|
||||
|
||||
**Usage (in BPC_ConsumableSystem):**
|
||||
```
|
||||
Use Battery → Get equipped flashlight → I_Toggleable.GetCurrentState()
|
||||
├─ If ON: FlashlightCharge += 50.0 (clamped to 100)
|
||||
└─ If OFF: FlashlightCharge += 50.0 + auto-toggle ON
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 9. DA_Item_AdrenalineSyringe / BP_Pickup_AdrenalineSyringe
|
||||
|
||||
**Item Type:** `Consumable` | **Stack Limit:** `3`
|
||||
|
||||
| Field | Value |
|
||||
|-------|-------|
|
||||
| `Display Name` | "Adrenaline Syringe" |
|
||||
| `Description` | "A military-grade stimulant. Restores stamina and suppresses exhaustion." |
|
||||
| `Consumable.StaminaRestore` | `50.0` |
|
||||
| `Consumable.ExhaustionBlockDuration` | `10.0` (seconds — prevents exhaustion state) |
|
||||
| `Consumable.UseDuration` | `1.5` (injection animation) |
|
||||
| `Consumable.StressIncrease` | `10.0` (side effect — jittery) |
|
||||
|
||||
**Usage:**
|
||||
```
|
||||
BPC_ConsumableSystem.UseItem(DA_Item_AdrenalineSyringe)
|
||||
├─ BPC_StaminaSystem.RestoreStamina(50.0)
|
||||
├─ BPC_StaminaSystem.SetExhaustionBlocked(true, 10.0s)
|
||||
├─ BPC_StressSystem.AddStress(10.0) // side effect
|
||||
├─ WBP_ScreenEffectController.Flash(amber, 0.5s)
|
||||
└─ BPC_CameraStateLayer.AddTemporaryLayer("Adrenaline", 10s)
|
||||
└─ FOV +5, slight chromatic aberration
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 10. DA_Item_SanityPill / BP_Pickup_SanityPill
|
||||
|
||||
**Item Type:** `Consumable` | **Stack Limit:** `5`
|
||||
|
||||
| Field | Value |
|
||||
|-------|-------|
|
||||
| `Display Name` | "Sanity Pill (Diazepam)" |
|
||||
| `Description` | "Prescribed to asylum patients. Reduces psychological stress." |
|
||||
| `Consumable.StressReduce` | `30.0` |
|
||||
| `Consumable.UseDuration` | `2.0` |
|
||||
| `Consumable.StaminaReduce` | `10.0` (side effect — drowsiness) |
|
||||
|
||||
**Usage:**
|
||||
```
|
||||
BPC_ConsumableSystem.UseItem(DA_Item_SanityPill)
|
||||
├─ BPC_StressSystem.RemoveStress(30.0)
|
||||
├─ BPC_StaminaSystem.DrainStamina(10.0) // side effect
|
||||
├─ WBP_ScreenEffectController.Flash(blue-white, 1.0s)
|
||||
├─ BPC_MemoryDriftSystem.SetIntensity(0.0) // clears hallucinations
|
||||
└─ SS_AudioManager.SetFloatParameter("StressTier", newTier)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 11. DA_Item_Crowbar / BP_Pickup_Crowbar / BP_Crowbar_Held
|
||||
|
||||
**Item Type:** `Tool` | **Slot:** `Framework.Equipment.Slot.Tool` (shares with flashlight)
|
||||
|
||||
| Field | Value |
|
||||
|-------|-------|
|
||||
| `Display Name` | "Rusted Crowbar" |
|
||||
| `Weight` | `4.0` |
|
||||
| `Equipment.Damage` | `20.0` (melee damage) |
|
||||
|
||||
**Dual functions:**
|
||||
1. **Pry open barricaded doors** — `BP_Door_Barricaded` checks for crowbar in equipment
|
||||
2. **Melee weapon** — `BPC_MeleeSystem` handles swing hit detection
|
||||
|
||||
```
|
||||
BP_Crowbar_Held implements:
|
||||
├─ I_UsableItem → UseItem() → BPC_MeleeSystem.Swing()
|
||||
├─ I_MeleeWeapon → GetDamage() → 20.0
|
||||
└─ I_Tool → CanPryOpen(DoorActor) → true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 12-14. Key Items (Alpha, Beta, Warden's Key)
|
||||
|
||||
All follow the **exact same pattern** as [item-keycard.md](item-keycard.md):
|
||||
- `DA_ItemData` with `ItemType = KeyItem`, `bIsKeyItem = true`
|
||||
- `BP_Pickup_*` with standard Construction Script + `I_Interactable`
|
||||
- `BP_Door_*` with `RequiredKeyTag` matching the key
|
||||
- `BPC_KeyItemSystem` handles consumption on use
|
||||
|
||||
| Key | Unlocks | Location |
|
||||
|-----|---------|----------|
|
||||
| Keycard Alpha | WardA → WardB transition door | Nurses Station (WardA) |
|
||||
| Keycard Beta | WardB → Basement transition door | Chapel (behind organ puzzle) |
|
||||
| Warden's Key | Basement → WardensOffice (elevator) | Morgue Drawer #4 (puzzle reward) |
|
||||
|
||||
---
|
||||
|
||||
### 15. DA_Item_JournalPage / BP_Pickup_JournalPage
|
||||
|
||||
**Item Type:** `Document`
|
||||
|
||||
| Field | Value |
|
||||
|-------|-------|
|
||||
| `Display Name` | "Journal Page" (varies per instance — set via Instance Data) |
|
||||
| `DocumentData.PageCount` | `1` |
|
||||
| `DocumentData.bIsLoreEntry` | `true` |
|
||||
|
||||
**Variants (set via Instance Editable on pickup):**
|
||||
|
||||
| Instance | Display Name | Content |
|
||||
|----------|-------------|---------|
|
||||
| `JournalPage_WakeUp` | "A Note to Myself" | Player's own handwriting — "Find out what happened here" |
|
||||
| `JournalPage_WardensConfession` | "Warden's Confession" | Final journal of Dr. Blackwood — reveals entity origin |
|
||||
| `JournalPage_PatientLetter` | "Letter to Mother" | Patient's unsent letter — personal horror story |
|
||||
| `JournalPage_OrderlyReport` | "Incident Report #77" | Orderly's report of first void manifestation |
|
||||
|
||||
---
|
||||
|
||||
### 16. DA_Item_PatientFile / BP_Pickup_PatientFile
|
||||
|
||||
**Item Type:** `Document` | **DocumentData.PageCount:** `2-3`
|
||||
|
||||
Patient files are world-building collectibles. Each file has: patient name, admission date, diagnosis, doctor's notes, treatment log. Reading all files unlocks lore entries via `BPC_LoreUnlockSystem`.
|
||||
|
||||
**6 Files scattered across WardA, WardB, Basement:**
|
||||
1. Patient #47 — "Claims to hear voices from walls"
|
||||
2. Patient #12 — "Exhibits void-touched scarring"
|
||||
3. Patient #88 — "Disappeared from locked cell — no explanation"
|
||||
4. Patient #03 — "First patient — died during initial void breach (1923)"
|
||||
5. Patient #55 — "Catatonic — responds only to old asylum music"
|
||||
6. Patient #101 — "No records prior to admission. Identity unknown."
|
||||
|
||||
---
|
||||
|
||||
### 17. DA_Item_OldPhoto / BP_Pickup_OldPhoto
|
||||
|
||||
**Item Type:** `Collectible` | **bIsCollectible:** `true`
|
||||
|
||||
4 photos hidden across levels. Each shows a piece of the asylum's history. Tracked by `BPC_CollectibleTracker`. Finding all 4 unlocks "Photographer" achievement.
|
||||
|
||||
| Photo | Location | Content |
|
||||
|-------|----------|---------|
|
||||
| Photo 1 | WardA — Treatment Room bed | Asylum staff photo, 1920 — faces scratched out |
|
||||
| Photo 2 | WardB — Morgue desk | Patient group photo — one figure is missing from print |
|
||||
| Photo 3 | Basement — Crematorium | Dr. Blackwood standing before the void portal |
|
||||
| Photo 4 | WardensOffice — Bookshelf | Player's own reflection — dated 1923 |
|
||||
|
||||
---
|
||||
|
||||
### 18. DA_Item_VoidShard / BP_Pickup_VoidShard
|
||||
|
||||
**Item Type:** `Collectible` | **bIsCollectible:** `true`
|
||||
|
||||
3 shards hidden throughout the game. Critical for ending determination. Each shard glows with void energy. Tracked by `BPC_CollectibleTracker`.
|
||||
|
||||
| Shard | Location | Acquired |
|
||||
|-------|----------|----------|
|
||||
| Shard 1 | WardB — Courtyard statue (behind) | Mid-game |
|
||||
| Shard 2 | Basement — Crematorium (on altar) | Late-game |
|
||||
| Shard 3 | WardensOffice — Bookshelf (hidden slot) | End-game |
|
||||
|
||||
**Ending Impact:**
|
||||
- 0 shards → Ending A (Resist / Escape) — default
|
||||
- 1-2 shards → Ending B (Merge / Become) — possible
|
||||
- 3 shards → Ending C (Sacrifice / Seal) — unlocked + alternate dialogue
|
||||
|
||||
---
|
||||
|
||||
## Pickup Actor Template (for all 18 pickups)
|
||||
|
||||
Every pickup in the game follows this exact Component + Wiring template:
|
||||
|
||||
```
|
||||
BP_Pickup_[ItemName]
|
||||
Components:
|
||||
├── StaticMeshComponent "Mesh" (collision disabled)
|
||||
└── SphereComponent "PickupTrigger" (radius 200, OverlapOnlyPawn)
|
||||
|
||||
Variables:
|
||||
└── ItemData (DA_ItemData*, Instance Editable)
|
||||
|
||||
Construction Script:
|
||||
├── ItemData.IsValid?
|
||||
│ ├─ True:
|
||||
│ │ ├─ ItemData → GetWorldMesh → LoadSynchronous → SetStaticMesh(Mesh)
|
||||
│ │ └─ ItemData → GetDisplayName → SetActorLabel
|
||||
│ └─ False: Print "No ItemData configured"
|
||||
|
||||
Interfaces:
|
||||
└── I_Interactable
|
||||
|
||||
Event Interact:
|
||||
├─ [GET INVENTORY] Interactor → BPC_InventorySystem
|
||||
├─ [CHECK CAPACITY] CanAddItem(ItemData, 1)
|
||||
│ ├─ True:
|
||||
│ │ ├─ AddItem(ItemData, 1)
|
||||
│ │ ├─ [IF WEAPON/TOOL] Auto-equip to slot
|
||||
│ │ ├─ DestroyActor()
|
||||
│ │ └─ Return True
|
||||
│ └─ False:
|
||||
│ ├─ Print "Inventory full"
|
||||
│ └─ Return False
|
||||
|
||||
Event CanInteract:
|
||||
└─ Return (ItemData.IsValid?)
|
||||
|
||||
Event GetInteractionPrompt:
|
||||
└─ Return Format("Pick up {0}", ItemData.DisplayName)
|
||||
|
||||
Event BeginPlay (optional):
|
||||
└─ Start float/bob Timeline
|
||||
|
||||
SPECIAL HANDLERS (per item type):
|
||||
├─ Ammo: Interactor → BPC_AmmoComponent.AddAmmo() (NOT inventory)
|
||||
├─ Weapon: After AddItem → BPC_EquipmentSlotSystem.EquipToSlot()
|
||||
└─ Key Item: After AddItem → BPC_KeyItemSystem.RegisterKey()
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Item Type Comparison
|
||||
|
||||
| Aspect | Weapon | Tool | Consumable | Ammo | KeyItem | Document | Collectible |
|
||||
|--------|--------|------|-----------|------|---------|----------|-------------|
|
||||
| Inventory Slot | Yes | Yes | Yes | No (pool) | Yes | Yes | Yes |
|
||||
| Stack Limit | 1 | 1 | 3-10 | 999 | 1 | 1 | 1 |
|
||||
| Can Drop? | Yes | Yes | Yes | N/A | NO | Yes | Yes |
|
||||
| Equips? | Yes (Primary/Tool) | Yes (Tool) | No | No | No | No | No |
|
||||
| Consumed? | No (ammo) | No (battery) | Yes | Yes | Yes | No | No |
|
||||
| Saves? | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
|
||||
| Interfaces | I_UsableItem | I_UsableItem, I_Toggleable | I_UsableItem | — | — | — | — |
|
||||
|
||||
---
|
||||
|
||||
## Notes for Expansion
|
||||
|
||||
- Add **upgradable flashlight**: find "High-Power Bulb" → increases light radius/cone
|
||||
- Add **silencer attachment** for pistol (consumable, degrades over 10 shots)
|
||||
- Add **crafting recipes**: combine items via `BPC_ItemCombineSystem` (e.g., Rag + Alcohol = Molotov)
|
||||
- Add **randomized item placement** per run via `BPC_ProceduralEncounter` loot tables
|
||||
- Add **inspect mode**: hold item in hand, rotate to find hidden details (some documents have invisible ink)
|
||||
- Void Shards could have **puzzle interactions** — place all 3 in a pedestal to unlock secret area
|
||||
- Patient Files could have **audio logs** attached — play via `BPC_DialoguePlaybackSystem`
|
||||
|
||||
---
|
||||
|
||||
*Items Index for Project Void. See [GAMEINDEX.md](GAMEINDEX.md) for full game structure. See individual item docs for detailed build walkthroughs.*
|
||||
Reference in New Issue
Block a user