feat(ui): port retail appraisal panel

Preserve retail's one-pending-appraisal busy lifetime, parse the complete gated response, and mount the authored examination layout in the shared main-panel host. Keep known 3D preview and inscription-write gaps explicit in AP-110.
This commit is contained in:
Erik 2026-07-23 11:34:08 +02:00
parent 6b1ae4fb76
commit 643cdfe66e
24 changed files with 17132 additions and 40 deletions

View file

@ -301,15 +301,54 @@ public sealed class ItemInteractionControllerTests
Assert.True(h.Controller.ExamineSelectedOrEnterMode(Player));
Assert.Equal(new[] { Player }, h.Examines);
Assert.Equal(1, h.Controller.BusyCount);
Assert.True(h.Controller.ExamineSelectedOrEnterMode(0u));
Assert.Equal(InteractionModeKind.Examine, h.Controller.InteractionState.Current.Kind);
Assert.Equal(ItemPrimaryClickResult.ConsumedSuccess,
h.Controller.OfferPrimaryClick(Pack));
Assert.Equal(new[] { Player, Pack }, h.Examines);
Assert.Equal(1, h.Controller.BusyCount);
Assert.False(h.Controller.IsAnyTargetModeActive);
}
[Fact]
public void AppraisalResponse_releasesOneBusyReferenceAndAcceptsCurrentRefresh()
{
var h = new Harness();
Assert.True(h.Controller.ExamineSelectedOrEnterMode(Player));
Assert.True(h.Controller.ExamineSelectedOrEnterMode(Pack));
Assert.Equal(1, h.Controller.BusyCount);
Assert.False(h.Controller.AcceptAppraisalResponse(Player).Accepted);
Assert.Equal(1, h.Controller.BusyCount);
var first = h.Controller.AcceptAppraisalResponse(Pack);
Assert.True(first.Accepted);
Assert.True(first.FirstResponse);
Assert.Equal(0, h.Controller.BusyCount);
Assert.Equal(Pack, h.Controller.CurrentAppraisalId);
var refresh = h.Controller.AcceptAppraisalResponse(Pack);
Assert.True(refresh.Accepted);
Assert.False(refresh.FirstResponse);
Assert.Equal(0, h.Controller.BusyCount);
}
[Fact]
public void RefreshCurrentAppraisal_sendsWithoutAcquiringBusyReference()
{
var h = new Harness();
Assert.True(h.Controller.ExamineSelectedOrEnterMode(Pack));
Assert.True(h.Controller.AcceptAppraisalResponse(Pack).Accepted);
Assert.True(h.Controller.RefreshCurrentAppraisal());
Assert.Equal(new[] { Pack, Pack }, h.Examines);
Assert.Equal(0, h.Controller.BusyCount);
}
[Fact]
public void SelfTarget_sendsUseWithTargetAndClearsTargetMode()
{