feat(ui): port retail item interaction policy

This commit is contained in:
Erik 2026-07-11 01:23:31 +02:00
parent 0cf780478a
commit a8da4fd05a
20 changed files with 1110 additions and 104 deletions

View file

@ -343,13 +343,25 @@ passed, 5 skipped.
### 3.2 Port item-use/drop legality into Core
- [ ] Translate `ItemHolder::UseObject`, `DetermineUseResult`, and
- [x] Translate `ItemHolder::UseObject`, `DetermineUseResult`, and
`AttemptPlaceIn3D` to pure/testable Core policy records.
- [ ] Include ready/busy, ownership, vendor/trade, PK/rare confirmation, stack,
- [x] Include ready/busy, ownership, vendor/trade, PK/rare confirmation, stack,
ground/drop, and target-type gates.
- [ ] Keep App `ItemInteractionController` as orchestration: ask policy, show modal/
- [x] Keep App `ItemInteractionController` as orchestration: ask policy, show modal/
toast, send the selected wire action, and manage pending state.
**Implementation (2026-07-11):** Core `ItemInteractionPolicy` is the pure port
of all three named-retail decision trees and returns ordered typed actions (plus
the deliberately independent placement return value). Matching-executable x86
resolved the two damaged masks as `BF_REQUIRES_PACKSLOT (0x00800000)` and
`BF_VENDOR (0x00000200)`. `CreateObject` now retains PWD flags and `CombatUse`;
the App snapshot resolves component packs from portal.dat. The controller owns
the 200 ms pre-legality throttle, ready/busy lifecycle (released by `UseDone`),
target state, policy action dispatch, confirmation/auxiliary action seams, and
ground-drop optimistic state. Vendor/trade/salvage/confirmation retained panels
consume the typed action seam when those surfaces land; until then the policy
refuses unsafe wire sends rather than bypassing their gates.
### 3.3 Add one item primary-click chokepoint
- [ ] Define a controller-level activation router: target-mode acquisition first,