# 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