170 lines
9.4 KiB
Markdown
170 lines
9.4 KiB
Markdown
# Enhanced Input System — Implementation Checklist
|
|
|
|
## Phase 1: Asset Creation (Game Dev / Code Agent)
|
|
|
|
- [ ] **1.1** Create directory `Content/Framework/Input/Actions/`
|
|
- [ ] **1.2** Create directory `Content/Framework/Input/Contexts/`
|
|
- [ ] **1.3** Create all 30+ Input Action assets (`IA_*`) with correct Value Types:
|
|
- [ ] `IA_Move` (Axis2D)
|
|
- [ ] `IA_Look` (Axis2D)
|
|
- [ ] `IA_Inspect_Rotate` (Axis2D)
|
|
- [ ] `IA_UI_Navigate` (Axis2D)
|
|
- [ ] `IA_Hide_Look` (Axis2D)
|
|
- [ ] `IA_Inspect_Zoom` (Axis1D)
|
|
- [ ] `IA_Hide_Peek` (Axis1D)
|
|
- [ ] `IA_QuickSlotScroll` (Axis1D)
|
|
- [ ] `IA_Interact` (Digital/Bool)
|
|
- [ ] `IA_PrimaryAction` (Digital/Bool)
|
|
- [ ] `IA_SecondaryAction` (Digital/Bool)
|
|
- [ ] `IA_Sprint` (Digital/Bool)
|
|
- [ ] `IA_Crouch` (Digital/Bool)
|
|
- [ ] `IA_Vault_Climb` (Digital/Bool)
|
|
- [ ] `IA_Jump` (Digital/Bool)
|
|
- [ ] `IA_Flashlight` (Digital/Bool)
|
|
- [ ] `IA_QuickHeal` (Digital/Bool)
|
|
- [ ] `IA_Reload` (Digital/Bool)
|
|
- [ ] `IA_OpenWatch` (Digital/Bool)
|
|
- [ ] `IA_PauseMenu` (Digital/Bool)
|
|
- [ ] `IA_QuickSlot1` through `IA_QuickSlot8` (Digital/Bool)
|
|
- [ ] `IA_Inspect_Flip` (Digital/Bool)
|
|
- [ ] `IA_Cancel_Drop` (Digital/Bool)
|
|
- [ ] `IA_UI_Select` (Digital/Bool)
|
|
- [ ] `IA_UI_Combine` (Digital/Bool)
|
|
- [ ] `IA_UI_DropItem` (Digital/Bool)
|
|
- [ ] `IA_CloseWatch` (Digital/Bool)
|
|
- [ ] `IA_UI_Back` (Digital/Bool)
|
|
- [ ] `IA_Hide_HoldBreath` (Digital/Bool)
|
|
- [ ] `IA_Exit_Hide` (Digital/Bool)
|
|
- [ ] `IA_ToggleAccessibility` (Digital/Bool)
|
|
- [ ] `IA_SkipCutscene` (Digital/Bool)
|
|
- [ ] **1.4** Create all 5 Input Mapping Context assets (`IMC_*`):
|
|
- [ ] `IMC_Default`
|
|
- [ ] `IMC_Hiding`
|
|
- [ ] `IMC_WristwatchUI`
|
|
- [ ] `IMC_Inspection`
|
|
- [ ] `IMC_UI`
|
|
- [ ] **1.5** Create `DA_InputMappingProfile` Data Asset at `Content/Framework/DataAssets/`
|
|
- [ ] **1.6** Populate `DA_InputMappingProfile` with all 3 platform profiles per the spec
|
|
|
|
---
|
|
|
|
## Phase 2: IMC Binding Setup
|
|
|
|
- [ ] **2.1** `IMC_Default` — Map all 28 actions to PC, Xbox, and PS5 bindings
|
|
- [ ] **2.2** `IMC_Default` — Apply W/A/S/D modifiers (S=Negate, D=Swizzle, A=Swizzle+Negate)
|
|
- [ ] **2.3** `IMC_Default` — Set analog stick dead zones (0.15)
|
|
- [ ] **2.4** `IMC_Default` — Configure hold triggers (Interact 0.3s, Sprint 0s, SkipCutscene 2.0s)
|
|
- [ ] **2.5** `IMC_Hiding` — Map 4 actions with clamped look angles
|
|
- [ ] **2.6** `IMC_WristwatchUI` — Map 5 UI navigation actions
|
|
- [ ] **2.7** `IMC_Inspection` — Map 4 inspection actions
|
|
- [ ] **2.8** `IMC_UI` — Map 5 full-screen UI actions
|
|
- [ ] **2.9** Configure chord actions (HoldBreath = LT+RT, ToggleAccessibility = View+Menu)
|
|
|
|
---
|
|
|
|
## Phase 3: Subsystem Implementation (Code Agent)
|
|
|
|
- [ ] **3.1** Create `SS_EnhancedInputManager` Game Instance Subsystem
|
|
- [ ] **3.2** Implement `Initialize(Profile)` — load DA, cache EnhancedInputLocalPlayerSubsystem
|
|
- [ ] **3.3** Implement `PushContext(ContextType, PriorityOverride)` — AddMappingContext with priority
|
|
- [ ] **3.4** Implement `PopContext(ContextType)` — RemoveMappingContext
|
|
- [ ] **3.5** Implement `SetContextPriority(ContextType, NewPriority)` — remove + re-add
|
|
- [ ] **3.6** Implement `IsActionPressed(ActionName)` → Bool
|
|
- [ ] **3.7** Implement `GetActionValue1D(ActionName)` → Float
|
|
- [ ] **3.8** Implement `GetActionValue2D(ActionName)` → FVector2D
|
|
- [ ] **3.9** Implement `RebindKey(ActionName, NewKey, Platform)` → Bool
|
|
- [ ] **3.10** Implement `ResetToDefaultBindings(Platform)`
|
|
- [ ] **3.11** Implement `GetCurrentBindings(Platform)` → TMap
|
|
- [ ] **3.12** Implement `GetActiveContexts()` → TArray
|
|
- [ ] **3.13** Implement `IsContextActive(ContextType)` → Bool
|
|
- [ ] **3.14** Implement `SetInputModeUIOnly()` / `SetInputModeGameOnly()` / `SetInputModeGameAndUI()`
|
|
- [ ] **3.15** Wire up Event Dispatchers: OnContextPushed, OnContextPopped, OnInputModeChanged, OnKeyRebound, OnPlatformChanged
|
|
- [ ] **3.16** Register self with `GI_GameFramework` for static access via `FL_GameUtilities::GetInputManager()`
|
|
|
|
---
|
|
|
|
## Phase 4: Integration — Init Sequence (Code Agent)
|
|
|
|
- [ ] **4.1** In `GI_GameFramework::Startup`, call `SS_EnhancedInputManager::Initialize(DA_InputMappingProfile)`
|
|
- [ ] **4.2** In `GM_CoreGameMode::OnPlayerPossess`, call `PushContext(Default)` with Priority 0
|
|
- [ ] **4.3** In `GM_CoreGameMode::OnPlayerUnPossess`, call `PopContext(Default)`
|
|
|
|
---
|
|
|
|
## Phase 5: Integration — Context Switches (Code Agent)
|
|
|
|
- [ ] **5.1** `BPC_HidingSystem::EnterHiding` → `PushContext(Hiding, 5)`
|
|
- [ ] **5.2** `BPC_HidingSystem::ExitHiding` → `PopContext(Hiding)`
|
|
- [ ] **5.3** `IA_OpenWatch` triggered → `PushContext(WristwatchUI, 10)`
|
|
- [ ] **5.4** `IA_CloseWatch` triggered → `PopContext(WristwatchUI)`
|
|
- [ ] **5.5** `BP_PuzzleDeviceActor / BPC_InteractionDetector` pickup 3D item → `PushContext(Inspection, 20)`
|
|
- [ ] **5.6** `IA_Cancel_Drop` → `PopContext(Inspection)`
|
|
- [ ] **5.7** `WBP_PauseMenu / SS_UIManager::ShowMenu` → `PushContext(UI, 100)` + `SetInputModeUIOnly()`
|
|
- [ ] **5.8** `WBP_PauseMenu::Close` → `PopContext(UI)` + `SetInputModeGameOnly()`
|
|
- [ ] **5.9** `BPC_CutsceneBridge::OnCutsceneStarted` → `PushContext(UI, 100)` + `SetInputModeUIOnly()`
|
|
- [ ] **5.10** `BPC_CutsceneBridge::RestoreGameplayState` → `PopContext(UI)` + restore
|
|
|
|
---
|
|
|
|
## Phase 6: Integration — Gameplay Systems Read Input (Code Agent)
|
|
|
|
- [ ] **6.1** `BPC_MovementStateSystem` → read `IA_Move` (Axis2D) and `IA_Sprint` (Bool) via `SS_EnhancedInputManager`
|
|
- [ ] **6.2** `BPC_CameraStateLayer` → read `IA_Look` (Axis2D) via `SS_EnhancedInputManager`
|
|
- [ ] **6.3** `BPC_InteractionDetector` → bind to `IA_Interact` press/release/hold events via `SS_EnhancedInputManager`
|
|
- [ ] **6.4** `BPC_FirearmSystem` → read `IA_PrimaryAction` (Bool) and `IA_Reload` (Bool)
|
|
- [ ] **6.5** `BPC_MeleeSystem` → read `IA_PrimaryAction` (Bool) for melee attacks
|
|
- [ ] **6.6** `BPC_ShieldDefenseSystem` → read `IA_SecondaryAction` (Bool)
|
|
- [ ] **6.7** `BPC_StaminaSystem` → listen to `IA_Sprint` state for continuous drain
|
|
- [ ] **6.8** `BPC_StressSystem` → listen to `IA_Sprint` for breathing/stress effects
|
|
- [ ] **6.9** `BPC_ActiveItemSystem` → read `IA_QuickSlot1-8` and `IA_QuickSlotScroll`
|
|
- [ ] **6.10** `BPC_ConsumableSystem` → listen to `IA_QuickHeal`
|
|
- [ ] **6.11** `BPC_Flashlight` (light system) → listen to `IA_Flashlight` toggle
|
|
- [ ] **6.12** `BPC_ContextualTraversalSystem` → listen to `IA_Vault_Climb` and `IA_Jump`
|
|
|
|
---
|
|
|
|
## Phase 7: Settings & Rebind Integration
|
|
|
|
- [ ] **7.1** `SS_SettingsSystem::ApplyControlSettings` → calls `SS_EnhancedInputManager::RebindKey`
|
|
- [ ] **7.2** `WBP_SettingsMenu` Controls tab → reads `GetCurrentBindings()` to populate rebind UI
|
|
- [ ] **7.3** Settings save/load → persist CurrentBindings in save file (controls section)
|
|
- [ ] **7.4** `BPC_AccessibilitySettings` → reads `AxisInvertSettings` from `DA_InputMappingProfile`
|
|
- [ ] **7.5** `WBP_InteractionPromptDisplay` → listens to `OnKeyRebound` to update displayed key icons
|
|
- [ ] **7.6** Controller glyph switching → on `OnPlatformChanged`, update all `WBP_InteractionPromptDisplay` icons
|
|
|
|
---
|
|
|
|
## Phase 8: Existing Docs Update (Cross-Reference Pass)
|
|
|
|
All existing specs that reference `BPC_InputManager` must be updated to reference `SS_EnhancedInputManager`:
|
|
|
|
- [ ] **8.1** `docs/blueprints/13-polish/114_WBP_SplashScreen.md` — change `BPC_InputManager` references
|
|
- [ ] **8.2** `docs/blueprints/13-polish/112_WBP_CreditsScreen.md` — change `BPC_InputManager` references
|
|
- [ ] **8.3** `docs/blueprints/13-polish/111_BPC_TutorialSystem.md` — change `InputActionShown` to reference IA_ names
|
|
- [ ] **8.4** `docs/blueprints/07-narrative/64_BPC_CutsceneBridge.md` — change input suppression references
|
|
- [ ] **8.5** `docs/blueprints/02-player/11_BPC_MovementStateSystem.md` — change input note
|
|
- [ ] **8.6** `docs/blueprints/02-player/09_BPC_StaminaSystem.md` — change input note
|
|
- [ ] **8.7** `docs/blueprints/02-player/12_BPC_HidingSystem.md` — change input binding references
|
|
- [ ] **8.8** `docs/blueprints/03-interaction/16_BPC_InteractionDetector.md` — change input event references
|
|
- [ ] **8.9** `docs/blueprints/06-ui/44_SS_UIManager.md` — add `SS_EnhancedInputManager` coordination note
|
|
- [ ] **8.10** `docs/blueprints/12-settings/105_SS_SettingsSystem.md` — change `UPlayerInput` references
|
|
|
|
---
|
|
|
|
## Phase 9: Testing (QA Engineer)
|
|
|
|
- [ ] **9.1** Context priority: verify `IMC_WristwatchUI` (Priority 10) overrides `IMC_Default` WASD movement
|
|
- [ ] **9.2** Context pop: verify exiting wristwatch restores WASD movement
|
|
- [ ] **9.3** Hold vs Tap: verify `IA_Interact` tap = pickup, hold = physics drag
|
|
- [ ] **9.4** Modifiers: verify A/D produce correct ±X axis values
|
|
- [ ] **9.5** Dead zone: verify analog stick drift does not trigger movement
|
|
- [ ] **9.6** Key rebind: rebind `IA_Reload` from R to T, verify T now reloads
|
|
- [ ] **9.7** Reset defaults: reset bindings, verify R reloads again
|
|
- [ ] **9.8** Platform hot-swap: unplug controller, verify KB+M profile loads
|
|
- [ ] **9.9** Input mode: pause game, verify cursor visible and movement blocked
|
|
- [ ] **9.10** Quick slots: verify 1-8 on keyboard selects items, scroll wheel cycles
|
|
- [ ] **9.11** Cutscene skip: hold Spacebar 2.0s, verify skip triggers
|
|
- [ ] **9.12** Hiding hold breath: hold Spacebar (PC) / LT+RT (controller), verify breath suppressed
|
|
- [ ] **9.13** Edge case: spam-context-switch (open/close inventory rapidly) doesn't crash
|
|
- [ ] **9.14** Edge case: disconnect controller mid-combat, auto-switches to KB+M
|
|
- [ ] **9.15** Edge case: rebind to already-bound key, system rejects with warning |