2.8 KiB
2.8 KiB
Message System Architecture
Status: Draft
Last Updated: 2025-11-21
Related Code: src/app/editor/message/, src/cli/handlers/game/message.cc
This document outlines the architecture of the Message (Text) System in YAZE.
Overview
The Message System manages the in-game dialogue and narration. ALttP uses a custom text engine with:
- Proportional Font: Variable width characters.
- Dictionary Compression: Common words/phrases are stored in a dictionary and referenced by single bytes to save space.
- Command Codes: Byte sequences control window layout, scrolling, text speed, and player interaction.
Data Structures
1. MessageData
Represents a single dialogue entry.
- ID: Message index (0-396 in vanilla).
- Address: ROM offset.
- RawString: Human-readable text with dictionary tokens (e.g.,
[D:01]). - ContentsParsed: Fully expanded text (e.g.,
Link). - Data: Raw ROM bytes.
2. DictionaryEntry
A phrase used for compression.
- ID: Index (0x00 - 0x60).
- Contents: The text (e.g., " the ").
- Token: Representation in
RawString(e.g.,[D:00]).
3. TextElement
Represents special control codes or characters.
- Commands:
[W:02](Window Border),[SPD:01](Scroll Speed). - Special Chars:
[UP](Arrow),[A](Button),...(Ellipsis).
ROM Layout (Vanilla)
- Bank 0E (0xE0000): Primary text data block (32KB).
- Bank 0E (0x75F40): Secondary text data block (5.3KB).
- Dictionary: Pointers at
0x74703. - Font Graphics: 2BPP tiles at
0x70000. - Character Widths: Table at
0x74ADF.
Pipeline
Loading
- Read:
ReadAllTextDatascans the ROM text blocks. - Parse: Bytes are mapped to characters using
CharEncoder. - Expand: Dictionary references (
0x88+) are looked up and replaced with[D:XX]tokens. - Preview:
MessagePreviewrenders the text to a bitmap using the font graphics and width table.
Saving
- Parse: User text is converted to bytes.
- Optimize:
OptimizeMessageForDictionaryscans the text for dictionary phrases and replaces them with single-byte references. - Write: Data is written sequentially to the ROM text blocks. If the first block overflows, it spills into the second block.
Editor UI
- Message List: Displays all messages with ID and preview.
- Editor: Multiline text input. Buttons to insert commands/special chars.
- Preview: Live rendering of the message box as it would appear in-game.
- Dictionary: Read-only view of dictionary entries.
Limitations
- Hardcoded Limits: The text block sizes are fixed for vanilla.
- Translation: No specific tooling for side-by-side translation.
- Export: Limited to binary "Expanded Messages" format; no JSON/YAML support.