feat(ui): port retail creature appraisal presentation

Render assessed creatures through the shared private viewport with retail heading, bounding-box camera, and light. Build the exact authored nine-row stat list and resolve creature names from the retail EnumMapper while keeping remaining font/sequencer adaptations explicit.

Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
Erik 2026-07-23 12:55:24 +02:00
parent f1a7912160
commit 7eaa68a5f4
26 changed files with 2780 additions and 237 deletions

View file

@ -52,7 +52,7 @@ public sealed class PrivatePresentationRendererTests
var presentation = new PrivatePresentationRenderer(
new Portal(calls),
new FoundationSource(portalVisible: true),
paperdoll: null,
entityViewports: null,
gameplayUi: null,
devTools: null,
screenshots: null);
@ -64,6 +64,20 @@ public sealed class PrivatePresentationRendererTests
Assert.False(outcome.ScreenshotCaptured);
}
[Fact]
public void PrivateEntityViewportGroup_RendersEveryViewportInOrder()
{
List<string> calls = [];
var group = new PrivateEntityViewportFrameGroup(
new NamedViewport(calls, "paperdoll"),
null,
new NamedViewport(calls, "examination"));
group.Render();
Assert.Equal(["paperdoll", "examination"], calls);
}
[Fact]
public void Render_ReportsThePreparedPortalSnapshotWhenDrawMutatesTheSource()
{
@ -72,7 +86,7 @@ public sealed class PrivatePresentationRendererTests
var presentation = new PrivatePresentationRenderer(
new MutatingPortal(calls, () => foundation.PortalVisible = false),
foundation,
paperdoll: null,
entityViewports: null,
gameplayUi: null,
devTools: null,
screenshots: null);
@ -209,11 +223,17 @@ public sealed class PrivatePresentationRendererTests
}
}
private sealed class Paperdoll(List<string> calls) : IPrivatePaperdollFrame
private sealed class Paperdoll(List<string> calls) : IPrivateEntityViewportFrame
{
public void Render() => calls.Add("paperdoll");
}
private sealed class NamedViewport(List<string> calls, string name) :
IPrivateEntityViewportFrame
{
public void Render() => calls.Add(name);
}
private sealed class GameplayUi(List<string> calls) : IRetainedGameplayUiFrame
{
public RenderFrameInput Input { get; private set; }