-
Notifications
You must be signed in to change notification settings - Fork 0
Title Screen Animation
Navigation: Home - Title screen & UI - Title Screen Animation
Authoritative notes for how intro.32 and introclips.32 compose on the
pre-game title attract scene. Asset/boot tracing lives in
38-title-screen-and-intro-assets.md.
Remake: game/src/TitleScreen.cpp
Display: 320×200 NTSC (gfx::ScreenCompositor::kWidth × kHeight; 2× scale → 640×400 window).
Font: Mm2Font8x8.inc — menu strings are plain ASCII via drawText / drawTextShadow.
| Layer | File | Behavior |
|---|---|---|
| Background | intro.32 |
Single frame @ (3, 0) — 320×200 pegasus scene |
| Pegasus patches |
introclips.32 frames 0–4
|
One cel at a time, cycling mod 5 (kOverlayStepTicks = 20) |
| Peekers |
introclips.32 frames 6, 8, 9, 10 only |
One random slot visible; frame 7 is not used (letter-hole cel) |
| Logo | nwcp.32 |
Black field + alpha fade; X = 10, Y = (200 − height) / 2
|
| Menu |
book.32 + text |
Black background only — no intro.32 under the red boxes |
Do not use A4-$632E / A4-$6344 @ 0x27096 as pegasus sprite anchors. Those
tables drive a one-shot copy-protection / music-staff blit loop (many raw Y > 200).
Decoded from retail file (11 frames, standard .32 image chunk):
| Frame | Size | Role |
|---|---|---|
| 0 | 17×12 | Tail patch (cel A) |
| 1 | 17×12 | Tail patch (cel B) — subtle swap vs frame 0 |
| 2 | 40×48 | Leg / body fragment |
| 3 | 10×8 | Small accent near tail |
| 4 | 48×36 | Mouth / head patch |
| 5 | 48×36 | Mouth alt — not in ASM mod-5 loop @ 0x26A1E
|
| 6 | 26×25 | Peeker — tree hollow (right, upper) |
| 7 | 19×17 | Letter-hole cel — not a peeker (was wrongly placed on tree coords) |
| 8 | 27×24 | Peeker — tree hollow (right, mid) |
| 9 | 27×24 | Peeker — tree hollow (right, lower) |
| 10 | 45×22 | Peeker — gnome / wide peek (left, behind pegasus) |
Palette index 0 = transparent (mm2_image32_set_preview_opaque(0) on all title .32 loads).
One cel at a time during TitleAttract (kOverlayAnim[]):
| Phase | Frame | X | Y | Part |
|---|---|---|---|---|
| 0 | 0 | 169 | 164 | Tail |
| 1 | 1 | 169 | 164 | Tail (alt cel) |
| 2 | 2 | 35 | 124 | Leg |
| 3 | 3 | 170 | 155 | Accent |
| 4 | 4 | 265 | 73 | Mouth |
Background: intro.32 frame 0 @ (3, 0).
ASM @ 0x26A1E cycles the same frame index (A4-$647A, wrap @ 5) but blits to
corners (8, 8) and (8, 216) on the logo/copy-protection path — not these
per-part anchors. The remake uses the table above for attract animation.
Retail intro.32 bakes face-like pixels in all four hollows. Only one peeker
cel should be visible at a time:
- Re-blit
intro.32@ (3, 0) (restores baked faces everywhere). - Cover-fill each inactive peeker slot with its per-slot RGB (masks the baked face in that hollow without overwriting surrounding bark/grass/wing).
- Blit one active
introclipscel on top.
| Slot | Frame | X | Y | Location |
|---|---|---|---|---|
| 0 | 6 | 250 | 106 | Tree hollow (right, upper) |
| 1 | 8 | 246 | 128 | Tree hollow (right, mid) |
| 2 | 9 | 246 | 130 | Tree hollow (right, lower) |
| 3 | 10 | 95 | 96 | Gnome / left peek |
Frame 7 is excluded — it is the letter-hole cel, not a tree peeker.
| Constant | Ticks | ~Seconds | Effect |
|---|---|---|---|
kPeekerInitialGapTicks |
300 | ~5 s | Delay before first peeker |
kPeekerDelayMinTicks |
360 | ~6 s | Min visible duration |
kPeekerDelayMaxTicks |
600 | ~10 s | Max visible duration |
kPeekerGapTicks |
120 | ~2 s | Off gap between appearances |
kOverlayStepTicks |
20 | ~0.33 s | Pegasus phase step |
Random slot pick uses LCG peeker_rng_; never repeats the same slot twice in a row.
Peekers run only in TitleAttract. TitleMenu does not draw peekers or intro.32.
| State | Layers |
|---|---|
| LogoFadeIn / Hold / FadeOut | Black + nwcp.32 (alpha fade, Y centered on 200 px) |
| TitleAttract |
intro.32 + animated pegasus (one phase 0–4) + one peeker |
| TitleMenu |
Black + red-bordered boxes + book.32 flanking title + menu text |
| CharacterUi | Character sheet backend (AmigaCharacterUi) |
- Top box (304×98 @ 8,3): open-book art + centered MIGHT / and / MAGIC / Book Two + tagline.
- Bottom box (304×93 @ 8,104): C / V / G / M / O / Q menu lines (greyed when
roster.datmissing). -
book.32page-turn: one frame step everykBookStepTicks(8) ticks. - Escape returns to TitleAttract; any key from attract opens menu.
Push order confirmed @ 0x260B8: first pushed = x, second = y.
Logo / copy-protection hold only. Gate A4-$6478 ≥ 3; frame A4-$647A wraps @ 5.
Blits same frame to (8, 8) and (8, 216). 0x1062 menu does not call this.
Copy-protection / create-prompt one-shot; frames 0..10 @ x = 8, y = Ytable[i] − 1.
Not pegasus part placement — see doc 38.
On original hardware: menu text drawn on retained intro.32 framebuffer (last
0x26A1E corner pixels frozen). Remake uses explicit black fill instead.
-
Codec round-trip:
tools/test_image32_golden.py—introclips.32vsmm2_image32_codec.c. -
Overlay fit: RGB diff search vs
intro.32@ 320×200; refs undergame/build/. -
Run:
game/build/mm2.exe <datadir>— needsintro.32,introclips.32,nwcp.32,book.32.
-
38-title-screen-and-intro-assets.md— boot graph, logo0x26BC4, asset strings -
39-character-ui-view-create.md— P / C / character sheet -
26-audio-callpaths-title-death-shared.md— title music0x12D -
06-gfx-loading.md—.32codec -
game/README.md— build / run
| Page | Why |
|---|---|
| Title Screen Assets | Boot graph and ASM blit traces |
| Character UI View Create | P/C keys and character sheet |
| Game Remake | Build and run the C++ port |
| GFX Loading | .32 loader path |
- Docs Wiki Hub ← full doc index
- Getting Started ← read this first
- Overview
- Workspace Notes
- Open Questions
- Full Analysis
- Game Remake
- Startup and Init
- Runtime Memory Map
- Main Loop and Map
- Exploration Input and Options
- Party and Session
- Game State Struct
- Data Hunk mm2 data 00
- Time Era Calendar
- GFX Loading
- ANM TV Format
- PC DOS graphics
- SNES graphics
- 3D View and Game Screen
- Amiga 3D Render Process
- Scripted Scene Graphics
- Event Graphics Opcodes
- Title Screen Assets
- Title Screen Animation
- Format inventory
- items.dat
- monsters.dat
- roster.dat
- attrib.dat
- map.dat
- spells & item use
- event.dat
- Events by location ← 71 maps
- Events hub (numbered)
- Event Script Opcodes
-
Event Script DSL ←
.mm2evtauthoring - Event Text Rendering
- Event Graphics Opcodes
- Combat Overview
- Combat System
- Encounter Tables
- Spell Cast ASM
- monsters.dat abilities
- Spells and item use
- Town Services
- Spell Sources
- Character Mechanics
- Skills and Hirelings
- Commerce Formulas
- Commerce World Services
- Mount Farview Class Quest
- Class Quest HP Bug
- Event Runtime
- Event to String Path
- Embedded Exe Strings
- Copy Protection
- Time Era Calendar
- Game State Struct
- MM1 Overview ← hub + decode status
- MM1 MAZEDATA format
- MM1 to MM2 outdoor
- MM1 WALLPIX by sector
- MM1 art & graphics
- MM1 items / monsters (status)
- MM1 map walker ↗
- MM1 2D maps gallery
- MM1 WALLPIX gallery