merge: bring main (UN-7, #140 filing, D.2b UI rows) into A7 Fix D round-2 branch

Resolves the divergence-register conflict: kept the accurate per-VERTEX AP-35
(Fix A shipped per-vertex; main's row was the stale pre-Fix-A per-pixel text),
kept main's UI rows AP-37..AP-42, and renumbered this branch's torch-gate row
AP-37 -> AP-43 (AP-37 was taken by main's LayoutDesc row). AP count 41 -> 42.
Retargeted the AP-37 references in WbDrawDispatcher + the CHECKPOINT to AP-43.
Marked ISSUES #140 RESOLVED (b7d655b) with the corrected root cause.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Erik 2026-06-20 09:29:53 +02:00
commit c83fd02642
94 changed files with 16216 additions and 199 deletions

View file

@ -30,6 +30,12 @@ public class PluginLoaderTests
public IPluginLogger Log { get; } = new StubLogger();
public IGameState State { get; } = new StubState();
public IEvents Events { get; } = new StubEvents();
public IUiRegistry Ui { get; } = new StubUiRegistry();
}
private sealed class StubUiRegistry : IUiRegistry
{
public void AddMarkupPanel(string markupPath, object binding) { }
}
private sealed class StubLogger : IPluginLogger

View file

@ -0,0 +1,17 @@
using AcDream.Core.Textures;
using Xunit;
namespace AcDream.Core.Tests.Textures;
public class SurfaceDecoderSolidColorTests
{
[Fact]
public void DecodeSolidColor_NullColor_ReturnsMagenta_DoesNotThrow()
{
// A malformed Base1Solid surface can carry a null ColorValue. DecodeSolidColor
// is called outside DecodeRenderSurface's try/catch (from TextureCache), so it
// must be null-safe itself — return the undecodable sentinel, never NRE.
var result = SurfaceDecoder.DecodeSolidColor(null!, 0f);
Assert.Equal(DecodedTexture.Magenta, result);
}
}