Files
Lefteris Notas 040db37720 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.
2026-05-21 22:27:57 +03:00

361 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.*