claude-code-arcane 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +104 -55
  3. package/agents/career/career-strategist.md +88 -0
  4. package/agents/career/cv-reviewer.md +81 -0
  5. package/agents/career/hiring-manager.md +68 -0
  6. package/agents/career/mock-interviewer.md +76 -0
  7. package/agents/freelance/client-screener.md +84 -0
  8. package/agents/freelance/discovery-call.md +65 -0
  9. package/agents/freelance/pipeline-strategist.md +99 -0
  10. package/agents/freelance/proposal-reviewer.md +82 -0
  11. package/agents/game/ue-blueprint-specialist.md +125 -0
  12. package/agents/game/ue-gas-specialist.md +133 -0
  13. package/agents/game/ue-umg-specialist.md +131 -0
  14. package/dist/cli.js +57 -13
  15. package/docs/RELEASE-SETUP.md +1 -1
  16. package/docs/SKILLS-CATALOG.md +67 -4
  17. package/docs/USER-GUIDE.md +77 -72
  18. package/docs/agent-hierarchy.md +21 -1
  19. package/docs/presentations/build_arcane_deck.py +2 -2
  20. package/docs/presentations/build_arcane_deck_12.py +2 -2
  21. package/hooks/detect-unreal.sh +90 -0
  22. package/package.json +2 -2
  23. package/profiles/freelance.yaml +43 -0
  24. package/profiles/job-hunt.yaml +5 -2
  25. package/profiles/unreal-dev.yaml +97 -0
  26. package/rules/drafter-reviewer.md +16 -3
  27. package/rules/freelance-guardrails.md +53 -0
  28. package/rules/gamedev/unreal-code.md +125 -0
  29. package/skills/career-registry/SKILL.md +95 -0
  30. package/skills/career-registry/scripts/career_registry.py +488 -0
  31. package/skills/client-screen/SKILL.md +83 -0
  32. package/skills/client-screen/references/red-flags.md +95 -0
  33. package/skills/cover-letter/SKILL.md +4 -3
  34. package/skills/cv-tailor/SKILL.md +11 -2
  35. package/skills/freelance-deliver/SKILL.md +90 -0
  36. package/skills/freelance-hunt/SKILL.md +126 -0
  37. package/skills/freelance-hunt/references/templates/Connects.md +39 -0
  38. package/skills/freelance-hunt/references/templates/Contrato.md +60 -0
  39. package/skills/freelance-hunt/references/templates/Propuesta.md +66 -0
  40. package/skills/freelance-kickoff/SKILL.md +94 -0
  41. package/skills/freelance-pipeline/SKILL.md +109 -0
  42. package/skills/freelance-pipeline/scripts/import_history.py +425 -0
  43. package/skills/freelance-profile/SKILL.md +93 -0
  44. package/skills/freelance-proposal/SKILL.md +112 -0
  45. package/skills/freelance-scan/SKILL.md +196 -0
  46. package/skills/freelance-scan/references/dedup.md +35 -0
  47. package/skills/freelance-scan/references/platforms.md +167 -0
  48. package/skills/freelance-scan/scripts/freelance_search.py +1077 -0
  49. package/skills/install-mcp/SKILL.md +135 -46
  50. package/skills/install-mcp/references/unreal-operations.md +55 -0
  51. package/skills/interview-prep/SKILL.md +11 -3
  52. package/skills/job-aplicar/SKILL.md +5 -1
  53. package/skills/job-hunt/SKILL.md +17 -0
  54. package/skills/job-outcome/SKILL.md +15 -1
  55. package/skills/job-upskill/SKILL.md +10 -2
  56. package/skills/ue-actor-component-architecture/SKILL.md +509 -0
  57. package/skills/ue-actor-component-architecture/references/actor-lifecycle.md +301 -0
  58. package/skills/ue-actor-component-architecture/references/component-types.md +592 -0
  59. package/skills/ue-ai-navigation/SKILL.md +526 -0
  60. package/skills/ue-ai-navigation/references/behavior-tree-patterns.md +392 -0
  61. package/skills/ue-ai-navigation/references/behavior-tree-workflow.md +107 -0
  62. package/skills/ue-ai-navigation/references/custom-bttask.md +104 -0
  63. package/skills/ue-ai-navigation/references/eqs-reference.md +423 -0
  64. package/skills/ue-animation-system/SKILL.md +521 -0
  65. package/skills/ue-animation-system/references/anim-notify-reference.md +486 -0
  66. package/skills/ue-animation-system/references/locomotion-setup.md +550 -0
  67. package/skills/ue-async-threading/SKILL.md +433 -0
  68. package/skills/ue-async-threading/references/thread-safety-guide.md +213 -0
  69. package/skills/ue-async-threading/references/threading-patterns.md +345 -0
  70. package/skills/ue-audio-system/SKILL.md +527 -0
  71. package/skills/ue-audio-system/references/audio-setup-patterns.md +700 -0
  72. package/skills/ue-blueprints/SKILL.md +134 -0
  73. package/skills/ue-blueprints/references/communication.md +82 -0
  74. package/skills/ue-character-movement/SKILL.md +475 -0
  75. package/skills/ue-character-movement/references/cmc-extension-patterns.md +335 -0
  76. package/skills/ue-character-movement/references/movement-pipeline.md +189 -0
  77. package/skills/ue-cpp-foundations/SKILL.md +533 -0
  78. package/skills/ue-cpp-foundations/references/components-and-gc.md +107 -0
  79. package/skills/ue-cpp-foundations/references/container-patterns.md +544 -0
  80. package/skills/ue-cpp-foundations/references/delegate-patterns.md +497 -0
  81. package/skills/ue-cpp-foundations/references/gameplay-classes-cpp.md +136 -0
  82. package/skills/ue-cpp-foundations/references/property-specifiers.md +306 -0
  83. package/skills/ue-data-assets-tables/SKILL.md +527 -0
  84. package/skills/ue-data-assets-tables/references/asset-loading-patterns.md +306 -0
  85. package/skills/ue-data-assets-tables/references/data-driven-design.md +378 -0
  86. package/skills/ue-editor-tools/SKILL.md +523 -0
  87. package/skills/ue-editor-tools/references/detail-customization-patterns.md +395 -0
  88. package/skills/ue-editor-tools/references/editor-module-setup.md +480 -0
  89. package/skills/ue-game-features/SKILL.md +477 -0
  90. package/skills/ue-game-features/references/experience-system.md +222 -0
  91. package/skills/ue-game-features/references/game-feature-patterns.md +308 -0
  92. package/skills/ue-gameplay-abilities/SKILL.md +518 -0
  93. package/skills/ue-gameplay-abilities/references/ability-task-reference.md +391 -0
  94. package/skills/ue-gameplay-abilities/references/gameplay-effect-reference.md +397 -0
  95. package/skills/ue-gameplay-abilities/references/gas-setup-patterns.md +369 -0
  96. package/skills/ue-gameplay-framework/SKILL.md +466 -0
  97. package/skills/ue-gameplay-framework/references/framework-class-map.md +243 -0
  98. package/skills/ue-input-system/SKILL.md +394 -0
  99. package/skills/ue-input-system/references/cpp-setup.md +131 -0
  100. package/skills/ue-input-system/references/enhanced-input-workflow.md +117 -0
  101. package/skills/ue-input-system/references/input-action-reference.md +731 -0
  102. package/skills/ue-mass-entity/SKILL.md +476 -0
  103. package/skills/ue-mass-entity/references/mass-entity-patterns.md +319 -0
  104. package/skills/ue-mass-entity/references/mass-fragment-reference.md +119 -0
  105. package/skills/ue-materials-rendering/SKILL.md +526 -0
  106. package/skills/ue-materials-rendering/references/material-parameter-reference.md +216 -0
  107. package/skills/ue-materials-rendering/references/post-process-settings.md +383 -0
  108. package/skills/ue-module-build-system/SKILL.md +487 -0
  109. package/skills/ue-module-build-system/references/build-cs-reference.md +418 -0
  110. package/skills/ue-module-build-system/references/common-build-errors.md +381 -0
  111. package/skills/ue-naming-conventions/SKILL.md +142 -0
  112. package/skills/ue-naming-conventions/references/asset-name-modifiers.md +233 -0
  113. package/skills/ue-naming-conventions/references/content-structure.md +83 -0
  114. package/skills/ue-networking-replication/SKILL.md +452 -0
  115. package/skills/ue-networking-replication/references/replication-patterns.md +526 -0
  116. package/skills/ue-networking-replication/references/rpc-decision-guide.md +393 -0
  117. package/skills/ue-niagara-effects/SKILL.md +531 -0
  118. package/skills/ue-niagara-effects/references/niagara-data-interfaces.md +491 -0
  119. package/skills/ue-niagara-effects/references/niagara-parameter-types.md +153 -0
  120. package/skills/ue-niagara-effects/references/niagara-workflow.md +115 -0
  121. package/skills/ue-packaging/SKILL.md +116 -0
  122. package/skills/ue-physics-collision/SKILL.md +423 -0
  123. package/skills/ue-physics-collision/references/collision-channel-setup.md +218 -0
  124. package/skills/ue-physics-collision/references/trace-patterns.md +499 -0
  125. package/skills/ue-procedural-generation/SKILL.md +505 -0
  126. package/skills/ue-procedural-generation/references/pcg-node-reference.md +381 -0
  127. package/skills/ue-procedural-generation/references/procedural-mesh-patterns.md +940 -0
  128. package/skills/ue-project-context/SKILL.md +305 -0
  129. package/skills/ue-sequencer-cinematics/SKILL.md +506 -0
  130. package/skills/ue-sequencer-cinematics/references/sequencer-patterns.md +629 -0
  131. package/skills/ue-serialization-savegames/SKILL.md +524 -0
  132. package/skills/ue-serialization-savegames/references/save-system-architecture.md +705 -0
  133. package/skills/ue-state-trees/SKILL.md +489 -0
  134. package/skills/ue-state-trees/references/state-tree-mass-integration.md +184 -0
  135. package/skills/ue-state-trees/references/state-tree-patterns.md +321 -0
  136. package/skills/ue-testing-debugging/SKILL.md +520 -0
  137. package/skills/ue-testing-debugging/references/automation-test-patterns.md +387 -0
  138. package/skills/ue-testing-debugging/references/profiling-commands.md +357 -0
  139. package/skills/ue-ui-umg-slate/SKILL.md +431 -0
  140. package/skills/ue-ui-umg-slate/references/common-ui-setup.md +484 -0
  141. package/skills/ue-ui-umg-slate/references/widget-types.md +487 -0
  142. package/skills/ue-world-level-streaming/SKILL.md +518 -0
  143. package/skills/ue-world-level-streaming/references/streaming-patterns.md +414 -0
  144. package/templates/gamedev/unreal-project-context.md +107 -0
@@ -0,0 +1,731 @@
1
+ # Enhanced Input: Trigger and Modifier Reference
2
+
3
+ Complete reference for built-in `UInputTrigger` and `UInputModifier` classes.
4
+ All classes are in the `EnhancedInput` plugin module.
5
+ Source headers: `InputTriggers.h`, `InputModifiers.h`.
6
+
7
+ ---
8
+
9
+ ## UInputAction Properties
10
+
11
+ ```cpp
12
+ class UInputAction : public UDataAsset
13
+ ```
14
+
15
+ | Property | Type | Default | Description |
16
+ |---|---|---|---|
17
+ | `ValueType` | `EInputActionValueType` | `Boolean` | Shape of the value: `Boolean`, `Axis1D` (float), `Axis2D` (FVector2D), `Axis3D` (FVector) |
18
+ | `AccumulationBehavior` | `EInputActionAccumulationBehavior` | `TakeHighestAbsoluteValue` | How multiple mappings to the same action are combined |
19
+ | `bConsumeInput` | `bool` | `true` | If true, lower-priority Enhanced Input mappings to the same keys are blocked |
20
+ | `bConsumesActionAndAxisMappings` | `bool` | `false` | If true, legacy Action/Axis mappings to the same key are also blocked |
21
+ | `bReserveAllMappings` | `bool` | `false` | Mappings are not automatically overridden by higher-priority contexts |
22
+ | `bTriggerWhenPaused` | `bool` | `false` | Action fires even while game is paused |
23
+ | `Triggers` | `TArray<UInputTrigger*>` | empty | Action-level triggers; applied after per-mapping triggers |
24
+ | `Modifiers` | `TArray<UInputModifier*>` | empty | Action-level modifiers; applied after per-mapping modifiers |
25
+
26
+ ### EInputActionAccumulationBehavior
27
+
28
+ | Value | Behavior |
29
+ |---|---|
30
+ | `TakeHighestAbsoluteValue` | The mapping with the highest absolute value wins. Pressing W (-0.3) and D (0.5) gives 0.5. |
31
+ | `Cumulative` | All mapping values are added. Pressing W (1.0) and S (-1.0) cancels to 0.0. Useful for WASD pairs. |
32
+
33
+ ---
34
+
35
+ ## FInputActionInstance (Runtime)
36
+
37
+ Available inside `FInputActionInstance` callbacks:
38
+
39
+ | Method | Returns | Description |
40
+ |---|---|---|
41
+ | `GetValue()` | `FInputActionValue` | Current value; zero when event is not `Triggered` |
42
+ | `GetTriggerEvent()` | `ETriggerEvent` | Current event state |
43
+ | `GetElapsedTime()` | `float` | Seconds since action began evaluating (Started + Ongoing + Triggered) |
44
+ | `GetTriggeredTime()` | `float` | Seconds the action has been in `Triggered` state only |
45
+ | `GetLastTriggeredWorldTime()` | `float` | World time of last trigger |
46
+ | `GetSourceAction()` | `const UInputAction*` | The originating action asset |
47
+
48
+ ---
49
+
50
+ ## ETriggerEvent
51
+
52
+ Bitmask enum. Represents state transitions observed in a single tick.
53
+
54
+ | Value | Bit | State Transition | Fires when |
55
+ |---|---|---|---|
56
+ | `None` | 0x00 | — | No significant transition, no active inputs |
57
+ | `Triggered` | 0x01 | None->Triggered, Ongoing->Triggered, Triggered->Triggered | Action is actively firing; also fires on the first triggered frame |
58
+ | `Started` | 0x02 | None->Ongoing, None->Triggered | First frame any input begins evaluation |
59
+ | `Ongoing` | 0x04 | Ongoing->Ongoing | Input is held and processing but trigger condition not yet met |
60
+ | `Canceled` | 0x08 | Ongoing->None | Evaluation began but was abandoned before triggering (e.g., held key released early) |
61
+ | `Completed` | 0x10 | Triggered->None | Trigger was active and has now ended |
62
+
63
+ `Completed` will not fire if any trigger on the same action reports `Ongoing` that frame.
64
+
65
+ ---
66
+
67
+ ## Trigger Classes
68
+
69
+ ### ETriggerState (Internal)
70
+
71
+ Triggers return one of three states:
72
+
73
+ | State | Meaning |
74
+ |---|---|
75
+ | `None` | No conditions met |
76
+ | `Ongoing` | Conditions partially met; continue evaluating |
77
+ | `Triggered` | All conditions met; fire the action |
78
+
79
+ ### ETriggerType (Multi-Trigger Evaluation)
80
+
81
+ | Type | Rule |
82
+ |---|---|
83
+ | `Explicit` | At least one Explicit trigger must be in Triggered state |
84
+ | `Implicit` | All Implicit triggers must be in Triggered state |
85
+ | `Blocker` | If blocking, prevents all other triggers from firing |
86
+
87
+ ---
88
+
89
+ ### UInputTriggerDown
90
+
91
+ ```
92
+ DisplayName: "Down"
93
+ Class: UInputTriggerDown : public UInputTrigger
94
+ TriggerType: Explicit
95
+ SupportedEvents: Instant
96
+ ```
97
+
98
+ **Behavior:** Fires `Triggered` every frame input magnitude exceeds `ActuationThreshold`.
99
+ This is the implicit default when an action has no triggers assigned.
100
+
101
+ **Properties:**
102
+
103
+ | Property | Type | Default | Description |
104
+ |---|---|---|---|
105
+ | `ActuationThreshold` | `float` | `0.5` | Minimum magnitude to consider the input actuated |
106
+
107
+ **Use for:** Continuous actions where you want firing as long as a key is held (before adding a proper trigger).
108
+
109
+ ---
110
+
111
+ ### UInputTriggerPressed
112
+
113
+ ```
114
+ DisplayName: "Pressed"
115
+ Class: UInputTriggerPressed : public UInputTrigger
116
+ TriggerType: Explicit
117
+ SupportedEvents: Instant
118
+ ```
119
+
120
+ **Behavior:** Fires `Triggered` exactly once on the first frame input exceeds `ActuationThreshold`.
121
+ Holding the input does not fire again. Re-press is required for another trigger.
122
+
123
+ **Properties:**
124
+
125
+ | Property | Type | Default | Description |
126
+ |---|---|---|---|
127
+ | `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
128
+
129
+ **Use for:** Discrete press-once actions: jump initiation, weapon fire on semi-auto, menu confirm.
130
+
131
+ ---
132
+
133
+ ### UInputTriggerReleased
134
+
135
+ ```
136
+ DisplayName: "Released"
137
+ Class: UInputTriggerReleased : public UInputTrigger
138
+ TriggerType: Explicit
139
+ SupportedEvents: Instant
140
+ ```
141
+
142
+ **Behavior:** Returns `Ongoing` while input exceeds `ActuationThreshold`. Fires `Triggered`
143
+ once when input drops back below the threshold after having been actuated.
144
+
145
+ **Properties:**
146
+
147
+ | Property | Type | Default | Description |
148
+ |---|---|---|---|
149
+ | `ActuationThreshold` | `float` | `0.5` | Threshold |
150
+
151
+ **Use for:** Release-on-let-go: throwing after wind-up on a dedicated action, "lift to release" grenades.
152
+
153
+ ---
154
+
155
+ ### UInputTriggerHold
156
+
157
+ ```
158
+ DisplayName: "Hold"
159
+ Class: UInputTriggerHold : public UInputTriggerTimedBase
160
+ TriggerType: Explicit
161
+ SupportedEvents: Ongoing (Started, Ongoing, Triggered, Canceled)
162
+ ```
163
+
164
+ **Behavior:** Returns `Ongoing` while input is held. After `HoldTimeThreshold` seconds,
165
+ fires `Triggered`. If `bIsOneShot=false`, continues firing `Triggered` every frame.
166
+ If input is released before the threshold, fires `Canceled`.
167
+
168
+ **Properties:**
169
+
170
+ | Property | Type | Default | Description |
171
+ |---|---|---|---|
172
+ | `HoldTimeThreshold` | `float` | `1.0` | Seconds of continuous hold required |
173
+ | `bIsOneShot` | `bool` | `false` | If true, fires `Triggered` only once then stops; if false, fires every frame after threshold |
174
+ | `bAffectedByTimeDilation` | `bool` | `false` | Use actor time dilation when accumulating hold duration |
175
+ | `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
176
+
177
+ **Use for:** Hold-to-interact prompts, charged attacks where you need the `Ongoing` callback
178
+ to show a progress bar. Combine with `GetElapsedTime()` in the `Ongoing` handler.
179
+
180
+ **Example — charge bar:**
181
+ ```cpp
182
+ void AMyCharacter::UpdateChargeBar(const FInputActionInstance& Instance)
183
+ {
184
+ // Instance.GetElapsedTime() grows while key is held
185
+ const float Progress = FMath::Clamp(
186
+ Instance.GetElapsedTime() / HoldTrigger->HoldTimeThreshold, 0.f, 1.f);
187
+ ChargeBarWidget->SetPercent(Progress);
188
+ }
189
+ ```
190
+
191
+ ---
192
+
193
+ ### UInputTriggerHoldAndRelease
194
+
195
+ ```
196
+ DisplayName: "Hold And Release"
197
+ Class: UInputTriggerHoldAndRelease : public UInputTriggerTimedBase
198
+ TriggerType: Explicit
199
+ SupportedEvents: Ongoing
200
+ ```
201
+
202
+ **Behavior:** Returns `Ongoing` while input is held. Fires `Triggered` only when input
203
+ is released after having been held for at least `HoldTimeThreshold` seconds.
204
+ If released before the threshold, does not trigger.
205
+
206
+ **Properties:**
207
+
208
+ | Property | Type | Default | Description |
209
+ |---|---|---|---|
210
+ | `HoldTimeThreshold` | `float` | `0.5` | Minimum hold duration before release triggers |
211
+ | `bAffectedByTimeDilation` | `bool` | `false` | Use actor time dilation |
212
+ | `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
213
+
214
+ **Use for:** "Pull back and release" bows, charged throws where the shot fires on release.
215
+ Different from `UInputTriggerHold` in that the payload fires on release, not during hold.
216
+
217
+ ---
218
+
219
+ ### UInputTriggerTap
220
+
221
+ ```
222
+ DisplayName: "Tap"
223
+ Class: UInputTriggerTap : public UInputTriggerTimedBase
224
+ TriggerType: Explicit
225
+ SupportedEvents: Instant
226
+ ```
227
+
228
+ **Behavior:** Fires `Triggered` if input is actuated then released within
229
+ `TapReleaseTimeThreshold` seconds. Returns `Ongoing` while held within the window.
230
+ If held past the threshold without release, the trigger does not fire.
231
+
232
+ **Properties:**
233
+
234
+ | Property | Type | Default | Description |
235
+ |---|---|---|---|
236
+ | `TapReleaseTimeThreshold` | `float` | `0.2` | Max seconds between press and release to count as a tap |
237
+ | `bAffectedByTimeDilation` | `bool` | `false` | Use actor time dilation |
238
+ | `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
239
+
240
+ **Use for:** Quick-dash on tap (vs hold for a sustained dash). Combine with a separate
241
+ `UInputTriggerHold` on a second binding of the same key to distinguish tap vs hold.
242
+
243
+ ---
244
+
245
+ ### UInputTriggerRepeatedTap
246
+
247
+ ```
248
+ DisplayName: "Repeated Tap"
249
+ Class: UInputTriggerRepeatedTap : public UInputTriggerTimedBase
250
+ TriggerType: Explicit
251
+ SupportedEvents: Instant
252
+ ```
253
+
254
+ **Behavior:** Fires `Triggered` when the input is tapped `NumberOfTapsWhichTriggerRepeat`
255
+ times in succession, with each individual tap completing within `TapReleaseTimeThreshold`
256
+ and each gap between taps within `RepeatDelay` seconds.
257
+
258
+ **Properties:**
259
+
260
+ | Property | Type | Default | Description |
261
+ |---|---|---|---|
262
+ | `NumberOfTapsWhichTriggerRepeat` | `int32` | `2` | Number of rapid taps required to trigger |
263
+ | `RepeatDelay` | `double` | `0.5` | Max seconds allowed between consecutive taps |
264
+ | `TapReleaseTimeThreshold` | `float` | `0.2` | Max hold duration per tap |
265
+ | `bAffectedByTimeDilation` | `bool` | `false` | Use actor time dilation |
266
+
267
+ **Use for:** Double-tap dodge roll (`NumberOfTapsWhichTriggerRepeat=2`), triple-tap finisher.
268
+
269
+ ---
270
+
271
+ ### UInputTriggerPulse
272
+
273
+ ```
274
+ DisplayName: "Pulse"
275
+ Class: UInputTriggerPulse : public UInputTriggerTimedBase
276
+ TriggerType: Explicit
277
+ SupportedEvents: Ongoing
278
+ ```
279
+
280
+ **Behavior:** While input is held, fires `Triggered` at regular `Interval` second intervals.
281
+ If `bTriggerOnStart=true`, also fires immediately on the first actuation frame.
282
+ Stops after `TriggerLimit` fires if `TriggerLimit > 0`.
283
+
284
+ **Properties:**
285
+
286
+ | Property | Type | Default | Description |
287
+ |---|---|---|---|
288
+ | `bTriggerOnStart` | `bool` | `true` | Fire on the first frame of actuation before the first interval elapses |
289
+ | `Interval` | `float` | `1.0` | Seconds between successive triggers |
290
+ | `TriggerLimit` | `int32` | `0` | Maximum number of fires; 0 = unlimited |
291
+ | `bAffectedByTimeDilation` | `bool` | `false` | Use actor time dilation |
292
+ | `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
293
+
294
+ **Use for:** Automatic weapon fire rate, repeated ability pulses while holding a key,
295
+ tick-based resource drain.
296
+
297
+ ---
298
+
299
+ ### UInputTriggerChordAction
300
+
301
+ ```
302
+ DisplayName: "Chorded Action"
303
+ Class: UInputTriggerChordAction : public UInputTrigger
304
+ TriggerType: Implicit
305
+ SupportedEvents: Instant
306
+ NotInputConfigurable: true (not exposed in per-mapping settings)
307
+ ```
308
+
309
+ **Behavior:** This action only fires when `ChordAction` is simultaneously in `Triggered`
310
+ state. Automatically creates a `UInputTriggerChordBlocker` on `ChordAction` to prevent
311
+ the chord key from also firing solo actions while the chord is active.
312
+
313
+ **Properties:**
314
+
315
+ | Property | Type | Default | Description |
316
+ |---|---|---|---|
317
+ | `ChordAction` | `const UInputAction*` | `nullptr` | The action that must be active at the same time |
318
+ | `ActuationThreshold` | `float` | `0.5` | Minimum magnitude |
319
+
320
+ **Setup pattern — Shift+E for special interact:**
321
+
322
+ 1. Create `IA_Sprint` (Bool) bound to Shift in the IMC
323
+ 2. Create `IA_SpecialInteract` (Bool) bound to E in the IMC
324
+ 3. On `IA_SpecialInteract`, add a `UInputTriggerChordAction` with `ChordAction = IA_Sprint`
325
+ 4. Result: E fires `IA_Interact`; Shift+E fires `IA_SpecialInteract`; E while Shift is held does NOT fire `IA_Interact`
326
+
327
+ ---
328
+
329
+ ### UInputTriggerCombo (Beta)
330
+
331
+ ```
332
+ DisplayName: "Combo (Beta)"
333
+ Class: UInputTriggerCombo : public UInputTrigger
334
+ TriggerType: Implicit
335
+ SupportedEvents: All
336
+ NotInputConfigurable: true
337
+ ```
338
+
339
+ **Behavior:** Fires when all `ComboActions` are completed in order. Each step must be
340
+ completed within its `TimeToPressKey` window after the previous step. The trigger fires
341
+ for one frame then resets. Actions in `InputCancelActions` abort the combo if triggered.
342
+
343
+ **Properties:**
344
+
345
+ | Property | Type | Default | Description |
346
+ |---|---|---|---|
347
+ | `ComboActions` | `TArray<FInputComboStepData>` | empty | Ordered sequence of steps |
348
+ | `InputCancelActions` | `TArray<FInputCancelAction>` | empty | Actions that abort the combo |
349
+
350
+ **FInputComboStepData fields:**
351
+
352
+ | Field | Type | Default | Description |
353
+ |---|---|---|---|
354
+ | `ComboStepAction` | `const UInputAction*` | `nullptr` | The action for this step |
355
+ | `ComboStepCompletionStates` | `uint8` (bitmask of `ETriggerEvent`) | `Triggered` | Which events count as completing this step |
356
+ | `TimeToPressKey` | `float` | `0.5` | Seconds after previous step within which this step must complete |
357
+
358
+ **Use for:** Fighting game input sequences (Down, Down-Right, Right + Attack = Hadouken),
359
+ multi-step ability combos.
360
+
361
+ ---
362
+
363
+ ## Modifier Classes
364
+
365
+ ### UInputModifierDeadZone
366
+
367
+ ```
368
+ DisplayName: "Dead Zone"
369
+ Class: UInputModifierDeadZone : public UInputModifier
370
+ ```
371
+
372
+ **Behavior:** Input values with magnitude below `LowerThreshold` are zeroed out.
373
+ Values are remapped from `[LowerThreshold, UpperThreshold]` to `[0, 1]`.
374
+ Values above `UpperThreshold` are clamped to 1.
375
+
376
+ **Properties:**
377
+
378
+ | Property | Type | Default | Description |
379
+ |---|---|---|---|
380
+ | `LowerThreshold` | `float` | `0.2` | Below this, input is zero |
381
+ | `UpperThreshold` | `float` | `1.0` | Above this, input is clamped to 1 |
382
+ | `Type` | `EDeadZoneType` | `Radial` | `Axial`: per-axis (chamfered corners); `Radial`: circular smooth; `UnscaledRadial`: circular, no smoothing |
383
+
384
+ **EDeadZoneType:**
385
+
386
+ | Value | Description |
387
+ |---|---|
388
+ | `Axial` | Dead zone applied independently per axis. Matches UE4 legacy behavior. Results in chamfered corners on 2D sticks. |
389
+ | `Radial` | Dead zone applied to the combined magnitude. Gives smooth circular coverage. Recommended for most sticks. |
390
+ | `UnscaledRadial` | Radial dead zone without the value smoothing. Can feel "jumpy" at the threshold boundary. |
391
+
392
+ **Use for:** All gamepad analog stick mappings. Add per-stick-mapping in the IMC, not on the action asset.
393
+
394
+ ---
395
+
396
+ ### UInputModifierScalar
397
+
398
+ ```
399
+ DisplayName: "Scalar"
400
+ Class: UInputModifierScalar : public UInputModifier
401
+ ```
402
+
403
+ **Behavior:** Multiplies each axis component of the input by the corresponding component
404
+ of `Scalar`. Has no effect on Boolean value types.
405
+
406
+ **Properties:**
407
+
408
+ | Property | Type | Default | Description |
409
+ |---|---|---|---|
410
+ | `Scalar` | `FVector` | `(1, 1, 1)` | Per-axis multiplier |
411
+
412
+ **Use for:** Mouse sensitivity scaling (`Scalar=(0.4, 0.4, 1.0)`), axis inversion without
413
+ using `Negate` (set component to -1.0), adjusting controller stick sensitivity.
414
+
415
+ ---
416
+
417
+ ### UInputModifierScaleByDeltaTime
418
+
419
+ ```
420
+ DisplayName: "Scale By Delta Time"
421
+ Class: UInputModifierScaleByDeltaTime : public UInputModifier
422
+ ```
423
+
424
+ **Behavior:** Multiplies the input value by the current frame's DeltaTime.
425
+ No configurable properties.
426
+
427
+ **Use for:** Making input frame-rate independent when feeding raw values into physics
428
+ or math that expects a per-second rate. Not typically needed for movement (AddMovementInput
429
+ already accounts for DeltaTime internally).
430
+
431
+ ---
432
+
433
+ ### UInputModifierNegate
434
+
435
+ ```
436
+ DisplayName: "Negate"
437
+ Class: UInputModifierNegate : public UInputModifier
438
+ ```
439
+
440
+ **Behavior:** Inverts selected axes by multiplying by -1.
441
+
442
+ **Properties:**
443
+
444
+ | Property | Type | Default | Description |
445
+ |---|---|---|---|
446
+ | `bX` | `bool` | `true` | Invert X axis |
447
+ | `bY` | `bool` | `true` | Invert Y axis |
448
+ | `bZ` | `bool` | `true` | Invert Z axis |
449
+
450
+ **Use for:** Y-axis inversion for "inverted look" options, negating the S and A keys in
451
+ WASD-to-2D composition.
452
+
453
+ **Common setup — invert Y only:**
454
+ Set `bX=false`, `bY=true`, `bZ=false`.
455
+
456
+ ---
457
+
458
+ ### UInputModifierSwizzleAxis
459
+
460
+ ```
461
+ DisplayName: "Swizzle Input Axis Values"
462
+ Class: UInputModifierSwizzleAxis : public UInputModifier
463
+ ```
464
+
465
+ **Behavior:** Reorders the X, Y, Z components of the input value according to `Order`.
466
+
467
+ **Properties:**
468
+
469
+ | Property | Type | Default | Description |
470
+ |---|---|---|---|
471
+ | `Order` | `EInputAxisSwizzle` | `YXZ` | How to reorder axes |
472
+
473
+ **EInputAxisSwizzle:**
474
+
475
+ | Value | Result | Description |
476
+ |---|---|---|
477
+ | `YXZ` | Output=(Y,X,Z) | Swap X and Y. Maps a 1D W/S key into the Y component of an Axis2D action. |
478
+ | `ZYX` | Output=(Z,Y,X) | Swap X and Z |
479
+ | `XZY` | Output=(X,Z,Y) | Swap Y and Z |
480
+ | `YZX` | Output=(Y,Z,X) | Rotate all axes Y-first |
481
+ | `ZXY` | Output=(Z,X,Y) | Rotate all axes Z-first |
482
+
483
+ **Use for:** The canonical WASD-to-Axis2D mapping. W produces a 1D value of 1.0 on X.
484
+ Adding `SwizzleAxis(YXZ)` converts it to Y=1.0, which is forward in the Axis2D Move action.
485
+
486
+ ---
487
+
488
+ ### UInputModifierSmooth
489
+
490
+ ```
491
+ DisplayName: "Smooth"
492
+ Class: UInputModifierSmooth : public UInputModifier
493
+ ```
494
+
495
+ **Behavior:** Averages the input value over recent samples to reduce per-frame jitter.
496
+ Uses a rolling average with `TotalSampleTime` as the accumulation window
497
+ (default ~8.3ms, i.e., roughly one frame at 120fps). Resets when input returns to zero.
498
+
499
+ No configurable public properties (sample window is a compile-time constant).
500
+
501
+ **Use for:** Smoothing raw mouse delta input for look controls. Add alongside `Scalar`
502
+ on mouse look mappings.
503
+
504
+ ---
505
+
506
+ ### UInputModifierSmoothDelta
507
+
508
+ ```
509
+ DisplayName: "Smooth Delta"
510
+ Class: UInputModifierSmoothDelta : public UInputModifier
511
+ ```
512
+
513
+ **Behavior:** Produces a smoothed normalized delta between the current and previous frame's
514
+ input value, using one of many configurable interpolation methods.
515
+
516
+ **Properties:**
517
+
518
+ | Property | Type | Default | Description |
519
+ |---|---|---|---|
520
+ | `SmoothingMethod` | `ENormalizeInputSmoothingType` | `Lerp` | Interpolation algorithm |
521
+ | `Speed` | `float` | `0.5` | Speed or alpha for the interpolation. If 0, jumps immediately to target. |
522
+ | `EasingExponent` | `float` | `2.0` | Degree of the ease curve; only for `Interp_Ease_*` methods |
523
+
524
+ **ENormalizeInputSmoothingType options:**
525
+ `Lerp`, `Interp_To`, `Interp_Constant_To`, `Interp_Circular_In/Out/In_Out`,
526
+ `Interp_Ease_In/Out/In_Out`, `Interp_Expo_In/Out/In_Out`, `Interp_Sin_In/Out/In_Out`
527
+
528
+ **Use for:** Smooth acceleration/deceleration on stick or mouse input where you want
529
+ to author the feel curve precisely.
530
+
531
+ ---
532
+
533
+ ### UInputModifierResponseCurveExponential
534
+
535
+ ```
536
+ DisplayName: "Response Curve - Exponential"
537
+ Class: UInputModifierResponseCurveExponential : public UInputModifier
538
+ ```
539
+
540
+ **Behavior:** Applies `sign(x) * |x|^CurveExponent` per axis, creating a non-linear
541
+ response. Values below 1 create a "softer" near-center feel; values above 1 create a
542
+ "harder" aggressive feel.
543
+
544
+ **Properties:**
545
+
546
+ | Property | Type | Default | Description |
547
+ |---|---|---|---|
548
+ | `CurveExponent` | `FVector` | `(1, 1, 1)` | Exponent per axis. 1.0 = linear. 2.0 = squared. |
549
+
550
+ **Use for:** Analog stick look sensitivity curves — a squared or cubed response gives
551
+ fine control near center with fast movement at the edges.
552
+
553
+ ---
554
+
555
+ ### UInputModifierResponseCurveUser
556
+
557
+ ```
558
+ DisplayName: "Response Curve - User Defined"
559
+ Class: UInputModifierResponseCurveUser : public UInputModifier
560
+ ```
561
+
562
+ **Behavior:** Applies separate `UCurveFloat` assets per axis, evaluating each curve with
563
+ the current axis value as input. Gives full artist control over the response shape.
564
+
565
+ **Properties:**
566
+
567
+ | Property | Type | Default | Description |
568
+ |---|---|---|---|
569
+ | `ResponseX` | `UCurveFloat*` | `nullptr` | Curve for the X axis |
570
+ | `ResponseY` | `UCurveFloat*` | `nullptr` | Curve for the Y axis |
571
+ | `ResponseZ` | `UCurveFloat*` | `nullptr` | Curve for the Z axis |
572
+
573
+ **Use for:** Precise feel tuning with a visible curve asset. Preferred over
574
+ `ResponseCurveExponential` when the exact shape matters and needs iteration in the
575
+ Curve Editor.
576
+
577
+ ---
578
+
579
+ ### UInputModifierFOVScaling
580
+
581
+ ```
582
+ DisplayName: "FOV Scaling"
583
+ Class: UInputModifierFOVScaling : public UInputModifier
584
+ ```
585
+
586
+ **Behavior:** Scales the mouse look input value by the current camera FOV, maintaining
587
+ a consistent angular displacement per mouse unit regardless of zoom level.
588
+
589
+ **Properties:**
590
+
591
+ | Property | Type | Default | Description |
592
+ |---|---|---|---|
593
+ | `FOVScale` | `float` | `1.0` | Additional scalar applied on top of the FOV calculation |
594
+ | `FOVScalingType` | `EFOVScalingType` | `Standard` | `Standard` = correct; `UE4_BackCompat` = legacy incorrect calculation for migration |
595
+
596
+ **Use for:** Mouse look on any character with a zoom/aim-down-sights mechanic.
597
+ Without this, zoomed-in aim feels faster than unzoomed aim in terms of screen pixels.
598
+
599
+ ---
600
+
601
+ ### UInputModifierToWorldSpace
602
+
603
+ ```
604
+ DisplayName: "To World Space"
605
+ Class: UInputModifierToWorldSpace : public UInputModifier
606
+ ```
607
+
608
+ **Behavior:** Converts a 2D axis input into world space. The up/down axis maps to world
609
+ forward (X), and left/right maps to world right (Y). Allows the value to be passed
610
+ directly to `AddMovementInput` or similar world-space functions without manual conversion.
611
+
612
+ No configurable properties.
613
+
614
+ **Use for:** Simplifying movement handler code when you want to receive a world-space
615
+ direction directly from the callback rather than rotating by the actor's facing.
616
+
617
+ ---
618
+
619
+ ## Modifier Execution Order
620
+
621
+ Modifiers are applied in this sequence:
622
+
623
+ 1. Per-mapping modifiers (defined on each `FEnhancedActionKeyMapping` in the IMC)
624
+ 2. Action-level modifiers (defined on the `UInputAction` asset `Modifiers` array)
625
+
626
+ Within each group, modifiers execute in array order. The output of modifier N is the
627
+ input to modifier N+1.
628
+
629
+ **Typical keyboard+mouse stack for a look action:**
630
+ ```
631
+ Mapping modifiers: [Scalar(0.4, 0.4, 1.0), Smooth, FOVScaling]
632
+ Action modifiers: [] (none needed at action level)
633
+ ```
634
+
635
+ **Typical gamepad stick move action:**
636
+ ```
637
+ Mapping modifiers: [DeadZone(Radial, 0.2, 1.0), SwizzleAxis(YXZ)] // for W/S keys
638
+ Mapping modifiers: [DeadZone(Radial, 0.2, 1.0)] // for D/A keys
639
+ Action modifiers: []
640
+ ```
641
+
642
+ ---
643
+
644
+ ## Custom Trigger Interface
645
+
646
+ Override in a `UInputTrigger` subclass:
647
+
648
+ | Virtual Method | Signature | Description |
649
+ |---|---|---|
650
+ | `UpdateState_Implementation` | `ETriggerState(const UEnhancedPlayerInput*, FInputActionValue, float DeltaTime)` | Core per-tick evaluation; return None/Ongoing/Triggered |
651
+ | `GetTriggerType_Implementation` | `ETriggerType()` | Return Explicit, Implicit, or Blocker |
652
+ | `GetSupportedTriggerEvents` | `ETriggerEventsSupported()` | Declare which ETriggerEvent types this trigger can produce |
653
+ | `IsBlocking` | `bool(ETriggerState)` | Return true to block all other triggers (used by ChordBlocker) |
654
+ | `GetDebugState` | `FString()` | Text shown in `ShowDebug EnhancedInput` HUD |
655
+
656
+ `UInputTrigger::IsActuated(const FInputActionValue&)` helper:
657
+ Returns `true` if `Value.GetMagnitudeSq() >= ActuationThreshold * ActuationThreshold`.
658
+
659
+ `UInputTriggerTimedBase` base class provides:
660
+ - `HeldDuration` — accumulated time while actuated
661
+ - `CalculateHeldDuration(PlayerInput, DeltaTime)` — increments with optional time dilation
662
+ - Automatically transitions to `Ongoing` on first actuation
663
+
664
+ ---
665
+
666
+ ## Custom Modifier Interface
667
+
668
+ Override in a `UInputModifier` subclass:
669
+
670
+ | Virtual Method | Signature | Description |
671
+ |---|---|---|
672
+ | `ModifyRaw_Implementation` | `FInputActionValue(const UEnhancedPlayerInput*, FInputActionValue CurrentValue, float DeltaTime)` | Transform and return the modified value |
673
+ | `GetVisualizationColor_Implementation` | `FLinearColor(FInputActionValue Sample, FInputActionValue Final)` | Color used in debug visualization overlays |
674
+
675
+ The returned `FInputActionValue` will be cast back to the action's `ValueType` before
676
+ further processing, so you can return any type internally.
677
+
678
+ ---
679
+
680
+ ## UInputMappingContext Properties
681
+
682
+ ```cpp
683
+ class UInputMappingContext : public UDataAsset
684
+ ```
685
+
686
+ | Property / Method | Type | Description |
687
+ |---|---|---|
688
+ | `DefaultKeyMappings.Mappings` | `TArray<FEnhancedActionKeyMapping>` | Default key-to-action bindings (deprecated in 5.7 — use `GetMappings()` accessor) |
689
+ | `MappingProfileOverrides` | `TMap<FString, FInputMappingContextMappingData>` | Per-profile key overrides (for rebinding profiles) |
690
+ | `RegistrationTrackingMode` | `EMappingContextRegistrationTrackingMode` | `Untracked` or `CountRegistrations` |
691
+ | `InputModeFilterOptions` | `EMappingContextInputModeFilterOptions` | `UseProjectDefaultQuery`, `UseCustomQuery`, `DoNotFilter` |
692
+ | `GetMappings()` | `const TArray<FEnhancedActionKeyMapping>&` | Accessor for default mappings |
693
+ | `MapKey(Action, Key)` | `FEnhancedActionKeyMapping&` | Editor-time: add a key binding |
694
+ | `UnmapKey(Action, Key)` | `void` | Editor-time: remove a key binding |
695
+ | `HasMappingForInputAction(Action)` | `bool` | Returns true if action appears in this IMC |
696
+
697
+ ### EMappingContextRegistrationTrackingMode
698
+
699
+ | Value | Behavior |
700
+ |---|---|
701
+ | `Untracked` | First `RemoveMappingContext` call removes the IMC regardless of how many times it was added |
702
+ | `CountRegistrations` | IMC stays active until `RemoveMappingContext` is called the same number of times as `AddMappingContext`. Useful when multiple subsystems share an IMC. |
703
+
704
+ ---
705
+
706
+ ## UEnhancedInputLocalPlayerSubsystem API
707
+
708
+ ```cpp
709
+ // Add a context (BeginPlay or on mode change)
710
+ Subsystem->AddMappingContext(IMC, Priority, Options);
711
+
712
+ // Remove a context (on mode change, unpossess)
713
+ Subsystem->RemoveMappingContext(IMC, Options);
714
+
715
+ // Remove all contexts
716
+ Subsystem->ClearAllMappings();
717
+
718
+ // Check if a context is currently active
719
+ Subsystem->HasMappingContext(IMC);
720
+
721
+ // Query current value of an action without a binding
722
+ Subsystem->GetPlayerInput()->GetActionValue(InputAction);
723
+ ```
724
+
725
+ **FModifyContextOptions:**
726
+
727
+ | Field | Type | Default | Description |
728
+ |---|---|---|---|
729
+ | `bIgnoreAllPressedKeysUntilRelease` | `bool` | `true` | Prevents "stuck key" ghost inputs when switching contexts while a key is held |
730
+ | `bForceImmediately` | `bool` | `false` | Rebuild mapping caches immediately rather than deferring to end of frame |
731
+ | `bNotifyUserSettings` | `bool` | `false` | Notify `UEnhancedInputUserSettings` of the change (for rebinding UI) |