Separate native text effect modes

This commit is contained in:
gamer147
2026-07-28 14:24:58 -04:00
parent f885ac4189
commit 8b01559cc6
5 changed files with 133 additions and 13 deletions

View File

@@ -2507,12 +2507,20 @@ face so a runtime face switch cannot reuse the preceding family's synthetic-bold
important Mincho/Gothic distinction on a normal Windows installation without treating the proprietary
fonts as game assets.
Godot presentation now distinguishes the two shipped effect profiles. Mode 1 uses the Label shadow
layer as one effect-color glyph at the configured `(x,y)` displacement behind the primary glyph; this
also preserves Himegari's zero-offset double-composite profile instead of inventing an outline. Mode 3
uses a symmetric outline whose size is the maximum absolute configured radius. That is a good
backend-native approximation for every shipped mode-3 call because Himegari always requests equal
`(1,1)` radii. The same style applicator covers live ADV, retained History, and surface text. Mode 2
remains unimplemented and is unused by this game.
The remaining raster behavior is still an approximation: weight 700 uses Godot
`VariationEmbolden=1.2`, and every nonzero render mode becomes a symmetric Godot outline. Mode 1 is
therefore modeled as an outline rather than its native displaced-copy operation. Exact GDI-compatible
advances, grayscale coverage, and mode-3 edge pixels require a dedicated glyph backend (or a deliberately
calibrated approximation) behind the existing engine-owned layout/style contract. Portable configurable
face substitutions/defaults are intentionally deferred to the broader runtime configuration design.
`VariationEmbolden=1.2`, and mode 3 does not reproduce AGE's exact sampled coverage at each ellipse
angle. Exact GDI-compatible advances, grayscale coverage, and edge pixels require a dedicated glyph
backend (or a deliberately calibrated approximation) behind the existing engine-owned layout/style
contract. Portable configurable face substitutions/defaults are intentionally deferred to the broader
runtime configuration design.
#### ADV wait indicator -- ops `0x73` / `0x72` (2026-07-11)

View File

@@ -3343,6 +3343,20 @@ design, especially for Linux/macOS where the proprietary Microsoft faces are not
Focused regressions cover face changes flowing into both live and retained styles; the engine tests and
Godot C# build pass. User visual acceptance passed on 2026-07-28.
## ADV text effect modes separated (2026-07-28)
The shared Godot text-style applicator no longer treats every nonzero render mode as an outline. Mode 1
uses the Label shadow layer to draw one effect-color glyph at the configured displacement before the
primary glyph; this includes Himegari's 43 zero-offset uses. Mode 3 uses a symmetric outline sized from
the configured radii, matching the shape of all 164 paired Himegari sites because they uniformly request
`(1,1)`. Mode 0 clears both layers, while native mode 2 remains unused and unimplemented.
The mapping applies uniformly to live ADV runs, retained History batches, and text drawn onto retained
surfaces. A focused VM regression protects mode/color/offset propagation through live and retained style
records, and the Godot self-test applies both modes to a real Label and checks its shadow/outline theme
state. Validation: engine **431/431**, zero-warning Godot build, and threaded `SELFTEST OK` with
`text-effect-modes=ok`. User visual acceptance passed on 2026-07-28.
## Persistence native-format reconnaissance complete (2026-07-24)
The deferred save/profile ownership question now has a compatibility-mode answer. The remaining native

View File

@@ -31,7 +31,7 @@ or replaced before claiming portable exports.
| AGE movie decode (`0x236` scene movies; `0x20f` modal LOGO/OP/ED) | `FfmpegMovieDecoder` is the sole factory over the project-owned `native/age_movie_ffmpeg` ABI | Windows-x64 passes the complete 213-payload installed video/audio corpus gate plus audible LOGO/OP/CHAPTER playback | Add target-specific native builds and export packaging |
| Movie integration | Each surface owns a unique playback-instance id; `MovieRuntime` owns `IMovieDecoder` from an injected factory; video-only streams use monotonic pacing while audio-bearing streams use the Godot output clock | Concurrent/restarted uses of one asset have independent frame/audio/completion/teardown state; managed code is no longer Windows-annotated, while only the win-x64 native bundle exists today | Add Linux/macOS native builds and smoke gates |
| Movie audio | ABI v2 returns timestamped stereo float PCM; bounded managed buffering feeds a per-playback Godot `AudioStreamGenerator` and routes native movie flags to engine buses | All 29 installed audio-bearing streams decode with signal; synchronized LOGO/OP/CHAPTER playback is audibly accepted | Treat absent, distorted, or unsynchronized audio from an audio-bearing movie as a runtime bug |
| ADV font discovery/raster fidelity | Opcode `0x1a5` now reaches presentation; `godot/Main.cs` loads Windows ` 明朝`/` ゴシック` from their known TTC files when available, otherwise uses the existing Japanese-font/default fallback; Godot still supplies shaping and outline synthesis | A normal Windows install now preserves Himegari's Mincho/Gothic distinction and face-specific bold caches; Linux/macOS normally lack these proprietary fonts, while advances, wrapping, boldness, and outline coverage still depend on the substitute/backend | Add configurable default and requested-face substitutions as part of the broader runtime configuration design; for portable distribution bundle licensed metric-compatible faces or define profile substitutions, then decide whether exact AGE grayscale/effect rasterization warrants a custom glyph backend |
| ADV font discovery/raster fidelity | Opcode `0x1a5` reaches presentation; `godot/Main.cs` loads Windows ` 明朝`/` ゴシック` from their known TTC files when available, otherwise uses the existing Japanese-font/default fallback; native mode 1 maps to one Godot shadow glyph and shipped `(1,1)` mode 3 maps to a one-pixel outline | A normal Windows install preserves Himegari's face distinction and separate displaced-effect/outline profiles; Linux/macOS normally lack the proprietary fonts, while advances, wrapping, boldness, and exact grayscale coverage still depend on the substitute/backend | Add configurable default and requested-face substitutions as part of the broader runtime configuration design; for portable distribution bundle licensed metric-compatible faces or define profile substitutions, then decide whether exact AGE grayscale rasterization warrants a custom glyph backend |
| Filesystem semantics | Several filename and containment comparisons use `OrdinalIgnoreCase`; installed assets are conventionally uppercase | Needs validation on case-sensitive filesystems; may hide casing or containment mistakes | Add Linux/macOS tests with mixed-case synthetic roots and use filesystem-appropriate containment rules |
| Save/profile storage | Managed `DirectoryNativeDatStore` under Godot `user://SAVE`; native S3SD/S4SD/S3RT files and 24-bit BMP thumbnails | No Win32 path API at runtime; port saves remain isolated from the original installation | Validate replace/flush, case, permissions, and interrupted-write behavior on each export target |
| Install/repository discovery | `engine/Age.Engine/Sys4/Paths.cs` finds `age-reimpl` above `AppContext.BaseDirectory` and assumes the current workspace sibling layout | Suitable for development, not packaged exports on any OS | Replace runtime discovery with a user-selected game root/profile; retain repository paths only for developer tools/tests |