Files
coah80-LegacyVulkEdition/docs/wave1-main-menu.md

14 KiB

Wave 1: Main Menu - Original LCE Reference

Deep analysis of the original Minecraft: Legacy Console Edition main menu from the 4J Studios source code. This documents how every visual element works so we can recreate it faithfully.

Architecture Overview

The main menu is composed of three layered UI components rendered via Iggy (Scaleform/SWF) or XUI (Xbox UI):

  1. Panorama (background) - a static blurred world image, NOT a 3D rendered scene
  2. Logo (top center) - the Minecraft logo, loaded as a separate SWF component
  3. MainMenu (foreground) - the button list and splash text, the actual interactive scene

The C++ code loads these in UIScene_MainMenu constructor:

parentLayer->addComponent(iPad, eUIComponent_Panorama);
parentLayer->addComponent(iPad, eUIComponent_Logo);

The main menu scene itself is loaded via getMoviePath() returning L"MainMenu", which maps to SWF files like MainMenu720.swf (720p), MainMenu1080.swf (1080p), etc.


1. Panorama Background

Source: UIComponent_Panorama.cpp

The panorama is a static pre-rendered panoramic image, NOT a live 3D world. Two variants exist:

  • Day (Panorama_Background_S.jpg): A bright daytime scene showing a Minecraft world with trees, a watchtower, mountains, a pyramid, and blue sky
  • Night (Panorama_Background_N.jpg): The same scene at night with dark sky, moon visible, reddish horizon

Day/Night switching logic: When the player is in a game (level exists), the panorama switches based on time-of-day. If timeOfDay > 14000, it shows the night version. On the main menu with no active level, it always shows the day panorama.

The panorama is controlled via a Flash function showPanoramaDay(isDay) called from C++.

SWF files: Panorama720.swf, Panorama1080.swf, Panorama480.swf, PanoramaSplit720.swf, etc.

Texture assets (HD, Windows):

  • skinHDWin/205_Panorama_Background_S.jpg (day)
  • skinHDWin/206_Panorama_Background_N.jpg (night)

The panoramic images are wide aspect ratio JPEGs (~4:1) showing a 360-degree-ish view of the tutorial world.


2. Logo Component

Source: UIComponent_Logo.cpp

Extremely simple component - just loads an SWF:

  • Fullscreen: ComponentLogo720.swf / ComponentLogo1080.swf
  • Splitscreen: ComponentLogoSplit720.swf / ComponentLogoSplit1080.swf

The logo is the standard Minecraft block text logo. The logo images in the skin are:

  • skinHDGraphics/73_Logo_Iggy.png - the Iggy engine logo (NOT the Minecraft logo)
  • skinHDGraphics/74_Logo_Miles.png - Miles Sound System logo

The actual Minecraft logo is embedded in the SWF itself, not as a separate PNG in the skin graphics. It appears in the upper portion of the screen, horizontally centered.

Edition Subtitle

The "XBOX 360 EDITION" / "XBOX ONE EDITION" / "PLAYSTATION EDITION" / "WINDOWS EDITION" subtitle appears below the Minecraft logo. This text is platform-specific and built into the SWF/logo component, not set dynamically from C++ code. The XUI skin defines a SubTitle element within the TitleString / Pulser group, but this is used for the splash text, not the edition subtitle.

For the Windows 10 Edition variant, the subtitle reads "WINDOWS 10 EDITION" in white capital letters below the main Minecraft logo.


3. Splash Text ("Yellow Text")

Source: UIScene_MainMenu.cpp lines 78-99, 435-484

The splash text is the iconic yellow bouncing text from Java Edition. It loads from splashes.txt and picks a random entry on each menu visit.

Special Date Overrides

  • November 9: "Happy Birthday, Ez!" (index 0)
  • June 1: "Happy Birthday, Notch!" (index 1)
  • December 24: "Merry X-mas!" (index 2)
  • January 1: "Happy New Year!" (index 3)

Rendering (XUI path)

In the XUI code path, the splash text uses the visual TitleString (720p/1080p) or TitleStringSmall (480p).

XUI layout at 720p (xuiscene_main.xui):

  • Position: (605, 210) - right side of screen, below the logo area
  • Size: 500x50
  • Rotation: -20 degrees (tilted, same as Java Edition)
  • The text pulses via a SubTitle scale animation looping between 1.0 and 0.95

Text styling (from skin_Minecraft.xui):

  • Color: 0xffebeb0f (bright yellow)
  • Shadow color: 0xff50500f (dark yellow/olive)
  • Point size: 18.0 (720p), 10.0 (480p)
  • Has a 2px offset drop shadow

Rendering (Iggy/SWF path)

In the SWF code path, the splash is drawn via a custom draw callback named "Splash". The C++ code uses OpenGL to render it with the Minecraft bitmap font:

  • Positioned at center-right of a custom draw region
  • Rotated -17 degrees
  • Scale pulses sinusoidally: 1.8 - abs(sin(time * 2*PI) * 0.1)
  • Scale is adjusted to fit text width: scale * 100 / (textWidth + 32)
  • Rendered in yellow (0xffff00) with font shadow

4. Menu Buttons

Button List (Full Version)

From the source code enum and string table:

# ID English Label
1 eControl_PlayGame "Play Game"
2 eControl_Leaderboards "Leaderboards"
3 eControl_Achievements "Achievements"
4 eControl_HelpAndOptions "Help & Options"
5 eControl_UnlockOrDLC "Minecraft Store" (full) / "Unlock Full Game" (trial)
6 eControl_Exit "Exit Game"

Platform-specific removals:

  • PS3/PS4/Vita: Exit button removed (must use PS button), Achievements button removed (no way to display trophies)
  • Xbox One (Durango): Achievements button removed, Exit button replaced with Xbox Help button

Button Visual: XuiMainMenuButton_L

Source: skin_Minecraft.xui lines 38460-38610

Each button uses the visual style XuiMainMenuButton_L and consists of three layers:

  1. highlight_graphic - Shown ONLY when focused/selected (hidden by default via Show: false)

    • Texture: Graphics\MainMenuButton_Over.png
    • This is the blue/periwinkle tinted version of the button
  2. button_graphic - The normal/unfocused state

    • Texture: Graphics\MainMenuButton_Norm.png
    • This is the gray/stone colored button
  3. text_Label - The button text

    • Color: 0xffebebeb (near-white, #EBEBEB)
    • Shadow: 0xff0f0f0f (near-black, #0F0F0F)
    • Point size: 16.0
    • Inset 10px from left, 6px from top
    • Width: button width minus 20px padding

Button Textures (Actual Images)

HD skin (skinHDGraphics):

File Description Size
191_FJ_MainMenuButton_Norm.png Normal state - gray stone texture with dark border/outline 600x60 px
189_MainMenuButton_Over.png Focused/hover state - blue/periwinkle stone texture with slight glow 600x60 px
190_MainMenuButton_Outline.png Outline frame (yellow, used for 9-grid border) 606x66 px

SD skin (skinGraphics):

File Description Size
197_FJ_MainMenuButton_Norm.png Normal state - gray stone texture 400x40 px
195_MainMenuButton_Over.png Focused state - blue stone texture 400x40 px
196_MainMenuButton_Outline.png Outline frame (yellow) 404x44 px

Visual Description of Actual Textures:

  • Normal (_Norm): A medium-dark gray stone/cobblestone texture. It looks like Minecraft's stone block texture stretched into a wide rectangle. The edges have a subtle darker border baked into the texture (1-2px dark outline). The overall color is approximately #505050 to #707070 gray.
  • Focused/Over (_Over): The same stone texture but tinted blue/periwinkle (approximately #6666AA to #7777BB). This is the "selected" highlight when the controller cursor is on this button.
  • Outline (_Outline): A solid yellow rectangle that is 6px larger than the button on each side (3px border). This appears to be used as a 9-grid selection indicator but the solid yellow image suggests it's used as a masking or color multiply layer.

Button Layout at 720p

From xuiscene_main.xui:

  • Canvas: 1280x720
  • All buttons: 450px wide, 40px tall
  • X position: 415px (centered: 415 + 450/2 = 640 = center of 1280)
  • Y positions (50px spacing):
    • Button 1 (Play Game): Y=250
    • Button 2 (Leaderboards): Y=300
    • Button 3 (Achievements): Y=350
    • Button 4 (Help & Options): Y=400
    • Button 5 (DLC/Unlock): Y=450
    • Button 6 (Exit): Y=500
  • Navigation wraps: Button 6 NavDown -> Button 1, Button 1 NavUp -> Button 6

At 480p (xuiscene_main_480.xui):

  • Canvas: 640x480
  • Buttons: 300px wide, 36px tall (uses XuiMainMenuButton_L_Thin)
  • X position: 170px (centered: 170 + 300/2 = 320 = center of 640)
  • Y positions (40px spacing): 140, 180, 220, 260, 300, 340

Button Skin Visual Width (from the visual definition)

The XuiMainMenuButton_L visual definition uses 400px width, 40px height as the base visual size. The XUI scene then scales/stretches these to 450px at 720p.

Dynamic Button Resizing

The code in XUI_MainMenu.cpp (lines 393-426) measures all button text lengths and, if any text overflows the label area, it resizes ALL buttons wider to accommodate the longest label. This ensures translations like Brazilian Portuguese "Desbloquear Jogo Completo" don't get clipped.

Button Animation States

The button visual has extensive timeline animation states:

  • Normal (frame 0): highlight_graphic hidden, button at rest
  • Focus (frame 2-12): highlight_graphic shown at full opacity, looping
  • NormalDisable (frame 13): Disabled appearance
  • FocusDisable (frame 15-91): Disabled but focused, highlight at 0 opacity fading to 0.5 (dimmed)
  • Press (frame 92-100): Button press feedback
  • NormalSel (frame 101): Selected but not focused
  • InitFocus (frame 127-205): Initial focus animation (transition)

5. Controller Tooltips

Source: UIScene_MainMenu.cpp line 139, UIComponent_Tooltips.cpp

The main menu sets tooltips via:

ui.SetTooltips(DEFAULT_XUI_MENU_USER, iA, -1, iX);

Where:

  • A button: IDS_TOOLTIPS_SELECT = "Select"
  • B button: -1 (hidden, no back action on main menu)
  • X button: Platform-specific:
    • Xbox One: IDS_TOOLTIPS_CHOOSE_USER = "Choose User"
    • PS Vita: IDS_TOOLTIP_CHANGE_NETWORK_MODE (only if full version)
    • All others: -1 (hidden)

Tooltip Rendering

The tooltips component loads as ToolTips720.swf (or resolution variant). It renders at the bottom of the screen with safe zone padding:

  • HD mode: 90% safe zone (5% inset from each edge)
  • SD mode: 85% safe zone (7.5% inset from each edge)

Tooltips display as: [Button Icon] Action Text pairs arranged horizontally at the bottom-left of the screen.

Controller Button Icons (Windows/Xbox)

The skin contains controller button icons as PNGs:

  • skinHDWin/204_ButtonA.png - Green "A" button icon (Xbox style)
  • skinHDWin/203_ButtonB.png - Red "B" button icon (Xbox style)
  • skinHDWin/186_ButtonX.png - Blue "X" button icon
  • skinHDWin/185_ButtonY.png - Yellow "Y" button icon

So on the main menu with an Xbox controller you see:

  • Bottom-left: [A] Select
  • On Xbox One additionally: [X] Choose User

6. Iggy/SWF vs XUI Architecture

The codebase has two UI systems:

  1. XUI (Xbox UI) - Used on Xbox 360, defined in .xui XML files. The XUI_MainMenu.cpp class CScene_Main handles the older XUI path.

  2. Iggy (Scaleform SWF) - Used on PS3, PS4, Vita, Xbox One, and Windows. The UIScene_MainMenu.cpp class handles this path. SWF movies are loaded per-resolution.

Both systems use the same skin graphics (PNGs), just at different resolutions:

  • skinGraphics/ = SD (720p base size for textures)
  • skinHDGraphics/ = HD (1080p base size for textures)
  • Platform-specific skins (skinWin/, skinDurango/, etc.) for platform button icons and panorama images

The SWF skin is loaded as a separate .swf file (skinHDWin.swf or skinWin.swf on Windows) that contains all the texture assets referenced by the UI movies.


7. Summary of Key Measurements (720p Reference)

Element Value
Canvas size 1280x720
Button width 450px
Button height 40px
Button X offset 415px (centered)
First button Y 250px
Button spacing 50px vertical
Button count 6 (platform-dependent, some removed)
Button normal color Gray stone texture (~#606060)
Button focus color Blue/periwinkle stone texture (~#6666AA)
Button text color #EBEBEB (near-white)
Button text shadow #0F0F0F (near-black)
Button text size 16pt
Splash text position (605, 210), rotated -20 deg
Splash text color #EBEB0F (yellow)
Splash text size 18pt
Tooltip safe zone 90% (HD), 85% (SD)

At 480p

Element Value
Canvas size 640x480
Button width 300px
Button height 36px
Button X offset 170px (centered)
First button Y 140px
Button spacing 40px vertical

8. What This Means for Recreation

To faithfully recreate the LCE main menu:

  1. Background: Use a static panoramic image (the tutorial world, pre-rendered). Day version by default.

  2. Logo: Minecraft block-text logo centered at the top. The edition subtitle ("WINDOWS EDITION" or similar) in white caps below it.

  3. Buttons: Six gray stone-textured rectangles, vertically stacked and centered. The focused button swaps to the blue/periwinkle variant. Text is near-white with a dark shadow. The buttons use a 9-grid/nine-slice stretch so the stone texture tiles correctly at different widths.

  4. Splash text: Yellow pulsing text at -20 degrees rotation, positioned to the upper-right of the button column. Uses the Minecraft bitmap font in the SWF path, or an XUI text presenter in the XUI path.

  5. Tooltips: "[A] Select" at the bottom-left corner, with safe-zone padding. Additional platform buttons as needed.

  6. No MenuBackground component on main menu: The main menu does NOT add eUIComponent_MenuBackground. That component is used by other scenes (pause menu, settings, etc.) for a darker overlay. The main menu only has Panorama + Logo + MainMenu scene.