diff --git a/.github/workflows/headless-portability.yml b/.github/workflows/headless-portability.yml index 7d498278..f1389c9f 100644 --- a/.github/workflows/headless-portability.yml +++ b/.github/workflows/headless-portability.yml @@ -211,8 +211,8 @@ jobs: test -f "$root/libglfw.so.3" test -f "$root/libopenal.so" test -f "$root/Rendering/Shaders/mesh_modern.vert" - test -f "$root/plugins/AcDream.Plugins.Smoke/AcDream.Plugins.Smoke.dll" - test -f "$root/plugins/AcDream.Plugins.Smoke/plugin.json" + test -f "$root/plugins/AcDream.Plugins.MossTank/AcDream.Plugins.MossTank.dll" + test -f "$root/plugins/AcDream.Plugins.MossTank/plugin.json" test "$(grep -RIl --include='*.cs' 'LibraryImport(\"kernel32.dll\"' \ src/AcDream.App | wc -l)" -eq 1 diff --git a/AcDream.slnx b/AcDream.slnx index 892b0ee3..2699c534 100644 --- a/AcDream.slnx +++ b/AcDream.slnx @@ -12,7 +12,6 @@ - diff --git a/README.md b/README.md index 616035ea..02bacc48 100644 --- a/README.md +++ b/README.md @@ -235,7 +235,7 @@ src/ AcDream.UI.Abstractions/ shared UI/input models and contracts AcDream.UI.ImGui/ developer-tool presentation AcDream.Plugin.Abstractions/ BCL-only plugin contracts - AcDream.Plugins.Smoke/ example plugin + AcDream.Plugins.MossTank/ example plugin tests/ AcDream.*.Tests/ layer-matched xUnit projects diff --git a/docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md b/docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md index a7076079..b83e748d 100644 --- a/docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md +++ b/docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md @@ -290,22 +290,16 @@ all four places, list icon column aligned with rows. now throws at `Build` instead of silently ignoring the attribute; stale `SampleData.cs:64` citations corrected to `:69` (Melee Defense's real line). -- **Before shipment:** the Smoke plugin's "Icon Smoke" panel - (`src/AcDream.Plugins.Smoke/SmokeIconPanel.cs`) keeps `StartVisible=true` - on purpose, for the owner's connected gate — flip it to - `StartVisible=false` (or drop `AcDream.Plugins.Smoke` from the release - payload entirely) once that gate is done. Checked whether the LAUNCHER - release payload actually ships it: `tools/publish-bin.ps1`'s - `New-PayloadZip` zips App's ENTIRE publish output directory - (`[IO.Compression.ZipFile]::CreateFromDirectory`, no file filtering - beyond checking `$RequiredFiles` exist) into `client-.zip`, and - `AcDream.App.csproj`'s `CopySmokePluginToPublishOutput` target - (`AfterTargets="Publish"`, gated only on `IsCrossTargetingBuild`, not on - `Configuration`) copies `plugins/AcDream.Plugins.Smoke/` straight into - that same publish directory during `dotnet publish`. **The Smoke plugin - — auto-open panel included — ships in today's release zip.** (The - MossTank plugin has the equivalent `CopyMossTankPluginToPublishOutput` - target and ships the same way; a quick grep shows several of its own - panels also set `StartVisible = true` — worth the same "before shipment" - look, but out of scope for this residual round, which only covers the - Smoke plugin per N9.) +- **Owner acceptance (2026-09-06):** the owner visually accepted all three + connected gates — the plugin shelf (Slice A), the DAT icon markup + (Slice B), and the retained-UI outline-order fix (`761a7519f`, landed + alongside this plan's residual round). With the visual gate passed, the + Smoke plugin's job as the gate artifact is done. Per owner direction, + `src/AcDream.Plugins.Smoke/` (including its "Icon Smoke" proof panel, + `SmokeIconPanel.cs`) was deleted outright rather than merely hidden — + the shipped-in-the-release-zip risk this ledger flagged above is now + moot because the plugin no longer exists to ship. Every build/CI/test/doc + reference to it was removed or repointed at the MossTank plugin in the + same commit; see `chore(plugins): remove the Smoke gate plugin; MossTank + shelf icon 0x06002C41`. MossTank's own panels defaulting to + `StartVisible = true` remains open — same look, still out of scope here. diff --git a/docs/plugin-ui-markup.md b/docs/plugin-ui-markup.md index 57fb5edb..055d048e 100644 --- a/docs/plugin-ui-markup.md +++ b/docs/plugin-ui-markup.md @@ -21,8 +21,8 @@ icon, and the parser that turns markup into a live `UiElement` tree host.Ui.AddPanel( new PluginPanelDescriptor("main", "MossTank") { - IconText = "MT", // fallback initials if IconSurfaceId is 0 - IconSurfaceId = 7735, // Decal-style bare index OR a full DID — both normalize + IconText = "MT", // fallback initials if IconSurfaceId is 0 + IconSurfaceId = 0x06002C41, // Decal-style bare index OR a full DID — both normalize StartVisible = true, ShowInSidePanel = true, }, @@ -32,9 +32,8 @@ host.Ui.AddPanel( `RegisterPanel` (same signature, returns `IDisposable`) removes the window independently of the plugin's own lifetime. `RegisterPanelContent` takes an -in-memory KSML string instead of a file path — the route `AcDream.Plugins.Smoke` -uses for its icon-surface proof panel (`SmokeIconPanel.cs`), when a panel is -small enough not to need its own shipped `.xml` asset. +in-memory KSML string instead of a file path — the route to reach for when a +panel is small enough not to need its own shipped `.xml` asset. Every registered window gets a stable persisted key (`plugin:{pluginId}:{windowId}`), drag, resize (where the markup opts in), @@ -263,9 +262,7 @@ There is no way to mix kinds within a single list. Two consequences: that wants the badge look has no `did`-space escape hatch. MosswartMassacre-style example — a list column composited from spell ids, -with the spell's own raw art DID printed alongside the name for comparison -(`AcDream.Plugins.Smoke`'s own proof panel, `SmokeIconPanel.cs`, is exactly -this pattern): +with the spell's own raw art DID printed alongside the name for comparison: ```csharp // iconkind="spell": the values MUST be spell ids (what ResolveSpell composites diff --git a/src/AcDream.App/AcDream.App.csproj b/src/AcDream.App/AcDream.App.csproj index 3ccc68c8..b4a7c436 100644 --- a/src/AcDream.App/AcDream.App.csproj +++ b/src/AcDream.App/AcDream.App.csproj @@ -100,62 +100,7 @@ - - - - false - true - - - - - <_SmokePluginDestDir>$(OutputPath)plugins/AcDream.Plugins.Smoke - - - - - - - - - - - - <_SmokePluginPublishDestDir>$(PublishDir)plugins/AcDream.Plugins.Smoke - - - - - - - - - - diff --git a/src/AcDream.Plugins.MossTank/MossTankPlugin.cs b/src/AcDream.Plugins.MossTank/MossTankPlugin.cs index dbcd3974..40f5fa46 100644 --- a/src/AcDream.Plugins.MossTank/MossTankPlugin.cs +++ b/src/AcDream.Plugins.MossTank/MossTankPlugin.cs @@ -41,6 +41,11 @@ public sealed class MossTankPlugin : IAcDreamPlugin new PluginPanelDescriptor("main", "MossTank") { IconText = "MT", + // A real installed portal.dat RenderSurface — see + // MossTankIconInstalledDatTests for the DAT-presence proof. + // IconText remains the fallback if this id is ever absent + // from an install. + IconSurfaceId = 0x06002C41u, StartVisible = true, ShowInSidePanel = true, }, diff --git a/src/AcDream.Plugins.Smoke/AcDream.Plugins.Smoke.csproj b/src/AcDream.Plugins.Smoke/AcDream.Plugins.Smoke.csproj deleted file mode 100644 index 0f5b0c92..00000000 --- a/src/AcDream.Plugins.Smoke/AcDream.Plugins.Smoke.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - net10.0 - enable - enable - latest - - - - - false - runtime - - - diff --git a/src/AcDream.Plugins.Smoke/SmokeIconPanel.cs b/src/AcDream.Plugins.Smoke/SmokeIconPanel.cs deleted file mode 100644 index 76d1dc46..00000000 --- a/src/AcDream.Plugins.Smoke/SmokeIconPanel.cs +++ /dev/null @@ -1,168 +0,0 @@ -using AcDream.Plugin.Abstractions; - -namespace AcDream.Plugins.Smoke; - -/// -/// Slice B proof panel (docs/plans/2026-09-06-plugin-shelf-and-dat-icons.md -/// item 9): exercises every new plugin-markup icon surface in one place — -/// registered from in-memory KSML via -/// (no plugin-side XML file), with the descriptor's own -/// also set to the bare -/// Decal-style index used below, so the shelf button and the panel's own -/// <icon did="0x165"> prove -/// the same way at both sinks. -/// -/// -/// Review fix round (2026-09-06): was -/// 7735 (an unverified literal) and is now retail's Melee Defense -/// skill icon index 0x165SampleData.cs:69 attests -/// 0x06000165 is a real installed-DAT RenderSurface, so the -/// descriptor and the bare-index <icon> both draw ART a tester -/// can actually verify against retail, not a guess. The list's -/// iconkind="spell" column also had a wiring bug: it fed -/// (a raw RenderSurface DID) to the -/// SPELL-id resolver, which composites a badge from a SpellTable entry -/// looked up by SPELL id — the two numbers are unrelated, so every row -/// silently resolved the wrong (or no) composited badge. See -/// . -/// -internal static class SmokeIconPanel -{ - /// - /// A Decal/VirindiViewService-style bare portal.dat index for retail's - /// Melee Defense skill icon (0x06000165 — attested in - /// src/AcDream.App/UI/Layout/SampleData.cs:69) rather than an - /// unverified literal. Deliberately used on BOTH the descriptor and the - /// first <icon> below to prove the host normalizes it - /// identically at each sink. - /// - public const uint BareIndexIconId = 0x165u; - - /// A literal, already-normalized RenderSurface DID (a portal icon). - private const uint LiteralDidIconId = 0x06002D14u; - - /// - /// Retail's Strength Other I — the plan's named fallback when the local - /// character has not learned any self-castable buff yet. - /// - private const uint FallbackSpellId = 1u; - - public static readonly PluginPanelDescriptor Descriptor = new("icons", "Icon Smoke") - { - IconSurfaceId = BareIndexIconId, - StartVisible = true, - ShowInSidePanel = true, - }; - - public const string Markup = """ - - - - -