feat(a2a): CJK font for the message window; mark A2a done in the slice plan
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -169,6 +169,18 @@ on-disk `AGF2BMP2AGF.exe`. Resolve just-enough `call-script`/state so the scene'
|
|||||||
hand-set the preconditions). Deliverable: **the chosen scene playable in Godot** — bg + dialogue +
|
hand-set the preconditions). Deliverable: **the chosen scene playable in Godot** — bg + dialogue +
|
||||||
a choice + voice — matching A0's text.
|
a choice + voice — matching A0's text.
|
||||||
|
|
||||||
|
### A2a — Interactive dialogue loop ✅ DONE (2026-07-06)
|
||||||
|
Godot 4.7 (.NET, `S:/Godot/Godot_v4.7-stable_mono_win64`) project in `godot/` referencing `Age.Engine`
|
||||||
|
in-process. VM gained one hook (`IHost.WaitForInput`, opcode 0x72); suspend/resume via a worker thread +
|
||||||
|
blocking `SemaphoreSlim` in `GodotAdvHost`, UI marshalled with `CallDeferred`. Plays SC0000 page-by-page,
|
||||||
|
pauses at wait-for-input, resumes on click/Enter. **Headless self-test** (`--headless -- --selftest`)
|
||||||
|
asserts the emitted 186-line offset sequence == `build/vm0-trace.json`; A1 engine tests stay 7/7.
|
||||||
|
Toolchain: `godot --headless --path godot --import` → `dotnet build godot/Himegari.csproj` →
|
||||||
|
`godot --headless --path godot [-- --selftest]`. Spec/plan:
|
||||||
|
`docs/superpowers/{specs,plans}/2026-07-06-a2a-godot-dialogue*.md`.
|
||||||
|
**Next = A2b:** background via `AGF2BMP2AGF.exe`, `play-voice`/`play-bgm`, choices → VM globals,
|
||||||
|
just-enough `call-script`/state (unlocks richer scenes).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Risks / open questions for A0
|
## Risks / open questions for A0
|
||||||
|
|||||||
@@ -26,6 +26,22 @@ public partial class Main : Godot.Control
|
|||||||
_status.OffsetLeft = 40; _status.OffsetTop = -60;
|
_status.OffsetLeft = 40; _status.OffsetTop = -60;
|
||||||
AddChild(_status);
|
AddChild(_status);
|
||||||
|
|
||||||
|
// Best-effort CJK font so the visual isn't tofu (headless self-test doesn't depend on it).
|
||||||
|
foreach (var fp in new[] { "C:/Windows/Fonts/YuGothM.ttc", "C:/Windows/Fonts/YuGothR.ttc",
|
||||||
|
"C:/Windows/Fonts/msgothic.ttc", "C:/Windows/Fonts/meiryo.ttc" })
|
||||||
|
{
|
||||||
|
if (!System.IO.File.Exists(fp)) continue;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var ff = new FontFile { Data = System.IO.File.ReadAllBytes(fp) };
|
||||||
|
_text.AddThemeFontOverride("font", ff);
|
||||||
|
_status.AddThemeFontOverride("font", ff);
|
||||||
|
_text.AddThemeFontSizeOverride("font_size", 22);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
catch { /* fall back to the default font */ }
|
||||||
|
}
|
||||||
|
|
||||||
_selftest = System.Array.IndexOf(OS.GetCmdlineUserArgs(), "--selftest") >= 0;
|
_selftest = System.Array.IndexOf(OS.GetCmdlineUserArgs(), "--selftest") >= 0;
|
||||||
|
|
||||||
var table = OpcodeTableJson.Load(Paths.OpcodesJson);
|
var table = OpcodeTableJson.Load(Paths.OpcodesJson);
|
||||||
|
|||||||
Reference in New Issue
Block a user