If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Development:The Legend of Zelda: Ocarina of Time

From The Cutting Room Floor
Jump to navigation Jump to search

This page details development materials of The Legend of Zelda: Ocarina of Time.

How about a nice leek in this trying time?
This page or section details content from the July 2020 Nintendo Leak.
Check the July 2020 Nintendo Leak category for more pages also sourced from this material.
Hmmm...
To do:
Sort and move content into sub-pages for better readability.
A room from Fstdan, one of the early maps recovered from the leak.

On July 25, 2020, development resources for a number of first- and third-party Nintendo games, including Ocarina of Time, were leaked on 4chan. The files seem to have been resources sent by Nintendo to iQue in order to help them develop the iQue port of the game. Lucky us!

Sub-Pages

OoT-Desert 2 IGN.jpg
Player Abilities
Various references to removed abilities.
OoT compass 0.png
Compass Display
The remnants of an old patent still lurk in the source files...
OoTEventEditor.png
Early Flag List
Old plot progression and cut events ahoy!
TextIcon.png
Early Text Routine
A much more cumbersome way of handling dialogue.
OoT-Desert 2 IGN.jpg
Collision
Unused and removed collision-related stuff.
Items
Old items, new items, altered items.

Actors, Objects, and Animations

OoT-Iron Knuckle Eyes Jan 97.png
Unused Actors & Objects
Some of the earliest content ever made for the game.
OoT-Hyrule-OLD-Minimap.png
Unused Textures
Here lie the remnants of development past...
OoT-Epona.jpg
Removed Display Lists
Various references to removed parts of model files.
OoT-beam blade.jpg
Removed Link Animations
129 removed or duplicate animations.
MovieIcon.png
Unused Cutscenes
Grab some popcorn and watch!

Maps

OoT room 9 0.png
3D Maps
Unused and alternate 3D maps.
OoT Leak-Numbered Course Map.png
File Select Map
A very, very early Map Select.
OoT-Prerender Temple May 97.png
Prerenders
Unused and early versions of prerendered maps.
OoT bdan DD bak 0 0.png
Alternate Scene Setups
Lots of interesting actor and object setups.
AreasIcon.png
Removed Maps
Various references to removed maps.

Text

TextIcon.png
Text Comments
Comments from the developers shine light on unused text.
NotesIcon.png
Commit Logs
Take a deep dive into the development history.
OoT-Cucco Stable.png
Early File Lists
Early file lists containing references to removed assets.

Early Fishing Experiment

Hmmm...
To do:
Is it possible to get this working?

The file z_actor.h in the folder z_ocarina2 contains the following commit log note:

* Revision 1.204  1998-04-09 23:36:13+09  morita
*       For those who want to know the secrets of the secret project I'm
*       working on, put 1 in SEX(69) (using controller 2, hold R and press
*       L 6 times), then select "79: Water Temple Boss"....
*       When you do... there are details on the control scheme in 
*       /home/morita/JOY_FILES/secret.lst

The source code indicates that a memory register called SEX, known as "Rs" in the Debug ROM, was named by Kazuaki Morita. Morita is credited with programming the bosses in Ocarina of Time. Additionally, according to an Iwata Asks interview celebrating the release of Ocarina of Time 3D, the Fishing Pond was also his side project and brain child.

Morita: The Water Temple is in Lake Hylia. Aonuma-san designed that dungeon. The boss that appears there is Morpha. Just when I was making that, there was a landform like a pool.

Iwata: Morpha rises up out of the pool and fights Link.

Morita: Right. When I was making that boss, I casually…

Iwata: "Casually"? (laughs) I doubt you had that kind of time!

Morita: But for some reason I did. (laughs)

Morita: I just happened to have a model of a fish, so…

Iwata: You "just happened" to have it? (laughs)

Morita: Yes! (laughs) A model of a fish for putting in an empty bottle. I borrowed that and had it swim in the pool in the dungeon, and when I saw it swimming around, I thought, "Oh! I can go fishing!"

Iwata: What did you do for a fishing pole?

Morita: I took the model for something and made it a cylinder, and then… (gestures as if casting a fishing pole)

Haruhana: You used the motion for Link swinging his sword.

The aforementioned note seems to be instructions from Morita to the other staff for checking out the in-progress version of the fishing functionality he was working on. Following the instructions in the note verbatim produces no noticeable results upon entering Morpha's boss room from the Map Select screen, regardless of Link's age. Even with SEX69 (Rs69) [no comment...] set to 1, the Morpha battle starts as normal. This may indicate that the "secret" that was accessible via this method may have been removed sometime in the 7 months between the commit log note and the game's release.

However, one additional point to keep in mind is that the Water Temple boss is now number 80 in the Map Select options, while the Water Temple is number 79. This may indicate that Morita's fishing preview was created at a time before the boss rooms were split off from their Temples into separate map files, as they are in the final game. As such, perhaps if one were to attempt to enter Room 0x16 of the Water Temple (the boss transition room) without automatically being loaded into the map file for Morpha's boss room in the final game, one could still see the intended effect.

In the final game, Morpha's actor, En_Mo, contains the following strings:

fishing_line_MODE
fishing_line_model

Conversely, the strings that can be found in the actor for the fishing pond, En_Fish, are below:

fs_line_MODE
fs_line_model

Spawn An Arwing

Hmmm...
To do:
Add the chest spawn stuff from Link's actor, too.

The source code indicates that a memory register called KAZ, known as "RK" in the Debug ROM, was named after Kazuaki Morita. Morita is credited with programming the bosses in Ocarina of Time.

A file called z_actor.c in the folder z_ocarina2 contains the following code used for spawning the Arwing.

#ifndef DEBUG_MODE_NOINPUT    
    if(KAZ(0) == -100) { /* Treasure Chest Fail Test */
    Player_actor    *pla = (Player_actor *)get_player_actor(game_play);
    
    KAZ(0) = 0;
    /* Secret Set */
    Actor_info_make_actor(&game_play->actor_info,
                  (Game *)game_play,
                  En_Clear_Tag,
                  pla->actor.world.position.x,
                  pla->actor.world.position.y + 100.0f,
                  pla->actor.world.position.z,
                  0,
                  0,
                  0,
                  1);
    }
#endif    

As it suggests, setting KAZ00 (RK00) to -100 spawns an Arwing above the player, then rolls the value back around to 0.

Removed Map Events

Ocarina of Time has a complex story and a big map to traverse. As such, the game contains a map pointer system to help guide players to their next objective and mark where they've already been. After achieving certain objectives, a flashing dot appears on the world map to show where one should go. A static dot appears on the map once a location has been visited. The code in z_kaleido_scope.c that handles these functions contains several areas with commented-out cases that preserve old story events.

Events in red were removed during development.

Lake Hylia

  • A static dot appears at Lake Hylia after you enter it for the first time.
  • A static dot appears at Lake Hylia after you obtain the Scale.
  • A flashing dot appears at Lake Hylia after you obtain the Iron Boots.
  • A static dot appears at Lake Hylia after you clear the Water Temple (Adult) and obtain Ruto's seal.

Lon Lon Ranch

  • A static dot appears at Lon Lon Ranch after you clear the Deku Tree.
  • A flashing dot appears at Lon Lon Ranch after you speak with Kaepora Gaebora upon leaving Kokiri Forest.
  • A static dot appears at Lon Lon Ranch after you obtain the Weird Egg ("Egg of Awakening") from Malon.
  • A flashing dot appears at Lon Lon Ranch after you obtain the Fairy Ocarina from Saria.
  • A static dot appears at Lon Lon Ranch after you obtain Epona's Song.
  • A flashing dot appears at Lon Lon Ranch after you wake Talon at Kakariko Village.
  • A static dot appears at Lon Lon Ranch after you escape from it and obtain Epona.

Hyrule Castle Town

  • A flashing dot appears at Hyrule Castle Town after you clear the Deku Tree.
  • A static dot appears at Hyrule Castle Town after you obtain Zelda's Letter.
  • A flashing dot appears at Hyrule Castle Town after you clear Dodongo's Cavern.
  • A static dot appears at Hyrule Castle Town after you obtain Zelda's Lullaby.
  • A flashing dot appears at Hyrule Castle Town after you clear Jabu Jabu's Belly.
  • A flashing dot appears at Hyrule Castle Town after you obtain the Ocarina of Time.
  • A static dot appears at Hyrule Castle Town after you obtain the Master Sword.
  • A flashing dot appears at Hyrule Castle Town after you clear the Forest, Fire, and Water Temples.
  • A static dot appears at Hyrule Castle Town after you first return from the Adult Era to the Child Era.
  • A flashing dot appears at Hyrule Castle Town after you obtain the Light Arrows.

Kakariko Village

  • A static dot appears at Kakariko Village after you enter it for the first time.
  • A flashing dot appears at Kakariko Village after you obtain Zelda's Lullaby.
  • A static dot appears at Kakariko Village after you obtain the Sun's Song.
  • A flashing dot appears at Kakariko Village after you obtain the Master Sword.
  • A static dot appears at Kakariko Village after you obtain the Hookshot.
  • A flashing dot appears at Kakariko Village after you obtain the Song of Storms.
  • A static dot appears at Kakariko Village after you clear the Bottom of the Well ("Shadow Temple (Child)") and obtain the Lens of Truth ("Looking Glass of Truth").
  • A static dot appears at Kakariko Village after the well water has disappeared.
  • A flashing dot appears at Kakariko Village after you view the Bongo Bongo ("Shade Stalker") cutscene.
  • A static dot appears at Kakariko Village after you clear the Shadow Temple (Adult) and obtain Impa's Seal.

Lost Woods

  • A static dot appears at the Lost Woods after you enter it for the first time.
  • A flashing dot appears at the Lost Woods after you speak with Mido after obtaining Zelda's Letter.
  • A static dot appears at the Lost Woods after you obtain the Fairy Ocarina from Saria.
  • A static dot appears at the Lost Woods after you obtain Saria's Song.
  • A flashing dot appears at the Lost Woods after you obtain the Hookshot.
  • A static dot appears at the Lost Woods after you clear the Forest Temple.


(Source: GlitterBerri)

Camera Modes

The file data/camera.zdb has an early list of cameras at the top of it. It's missing some entries compared to the presumably final list found in the camera_mode enum in src/camera_param_data.h.

As the order of the early list doesn't perfectly match the final list, it has been adjusted to better compare the two, with its original order indicated in the # column.

camera.zdb camera_param_data.h
# Mode Description Translation Mode Description Translation Notes
01 NORMAL 何も起こってない状態 State: Nothing Happening CAM_MODE_NORMAL 通常 Normal
02 PARALLEL 注目するIBER対象なくZボタンを押された状態 State: Z Pressed w/o IBER Subject to Target CAM_MODE_PARALLEL 平行 Parallel
03 KEEPON 非戦闘オブジェクトに注目してZボタンを押された状態 State: Z Button Pressed to Target Non-Battle Objects CAM_MODE_KEEPON 注目 Targeting
CAM_MODE_TALK 会話 Conversation
04 BATTLE 戦闘オブジェクトに注目してZボタンを押された状態 State: Z Button Pressed to Target Battle Objects CAM_MODE_BATTLE 戦闘 Battle
CAM_MODE_CLIMB よじ登り Climb
05 SUBJECT C上ボタン(トグル)により主観モードに入った状態 State: Subjective Mode Entered Via C-Up Button (Toggle) CAM_MODE_SUBJECT 主観 Subjective
06 BOWARROW 武器が弓矢でAボタンを押された状態 State: A Button Pressed w/ Bow and Arrow as Weapon CAM_MODE_BOWARROW 弓矢 Bow & Arrow This appears to refer back to a time when weapons could be equipped to the A button, which was then used as a weapon button and not as an action button.
07 BOWARROWZ 武器が弓矢でAボタンとZボタンを押された状態 State: A Button & Z Button Pressed to Target w/ Bow and Arrow as Weapon CAM_MODE_BOWARROWZ 弓矢注目 Bow & Arrow Targeting
CAM_MODE_FOOKSHOT フックショット Hookshot
13 BOOMERANG 武器がブーメランでAボタンを押された状態 State: A Button Pressed w/ Boomerang as Weapon CAM_MODE_BOOMERANG ブーメラン Boomerang
CAM_MODE_PACHINCO パチンコ Slingshot
CAM_MODE_CLIMBZ よじ登り注目 Targeting While Climbing
08 JUMP アイテムがジャンプの時にBボタンを押された状態 State: B Button Pressed When Item Is Jump CAM_MODE_JUMP ジャンプ Jumping
11 HANG ぶら下がっている状態 State: Hanging CAM_MODE_HANG ぶら下り Dangling
12 HANGZ ぶら下がっている状態でZボタンを押された状態 State: Z Button Pressed in Hanging State CAM_MODE_HANGZ ぶら下り注目 Targeting While Hanging
09 FREEFALL 落下状態 State: Falling CAM_MODE_FREEFALL 落下 Falling
10 CHARGE ため切り(武器が剣でAボタンを押し続けた状態) Charge Slash (State: A Button Held w/ Sword as Weapon) CAM_MODE_CHARGE ため切り Charge Slash
CAM_MODE_STILL 一時停止 Temporarily Frozen
CAM_MODE_PUSHPULL 押引 Pushing & Pulling
CAM_MODE_BOOKEEPON ブメラン注目 Targeting w/ Boomerang

Lifemeter Environmental Behavior

Commented out code inside the file z_parameter.c utilizes three unused leftover functions of z_lifemeter.c, which would change the behavior of the lifemeter according to Link's environmental conditions, like being in hot rooms or underwater.

////////extern int initial_LifeRestChange_Damage( Game_play * );
////////extern void initial_LifeRestChange( Game_play * );
////////extern int  LifeRestChange( Game_play * );
////////    if ( count >= 0 ) {
////////	initial_LifeRestChange( game_play );
////////    } else {
////////	if ( player_condition == 1 || player_condition == 2 ) {
////////	    initial_LifeRestChange_Damage( game_play );
////////	}
////////    }
////////    if ( player_condition == 1 || player_condition == 2 ) {
	if ( EVENT_FG >= Event_MD3 ) {
	    if ( !(KALEIDO_SCOPE_Pause_on_off( game_play )) &&
		 !message->msg_mode &&
		 !bitcheck( player->action2, P_ACTION2_OKARINA_REQUEST_OK ) &&
		 !game_play->fade_direction &&
		 !game_play->fbdemo_wipe_mode &&
		 !Game_play_demo_mode_check( game_play ) ) {
////////		LifeRestChange( game_play );
	    }
	}
////////    } else {
////////	initial_LifeRestChange( game_play );
////////    }

The unused lifemeter functions inside z_parameter.c temporarily deplete Link's hearts while he is exposed to these conditions. In the case of taking damage or if the temporary heart count reaches zero, the hearts would be permanently depleted, otherwise the original heart count is completely restored.

The lifemeter was also meant to change its visual appearance according to these conditions with different color values still being left unused in the final game. This visual change can be observed in pre-release footage.

Hot Room Underwater
OoT burn hearts.png OoT drown hearts.png

Curiously, the commented out code doesn't account for the case of Link floating underwater yet, so it only engages when Link is touching the ground with the Iron Boots equipped. The count used to decrease a single heart indicates that the environmental hazard timer was originally double the length compared to the final version.

(Source: GlitterBerri, CDi-Fails & ZeeRoX)

Drained Spiritual Stones

OoT spiritual stones drained.png

Commented out code inside z_kaleido_scope.c would render the individual Spiritual Stones colorless inside the Quest Status screen when Link is adult and the related event flags for clearing the first three adult dungeons haven't been set yet.

# if 0
	SetSegmentK0( ICON_ITEM_24_SEGMENT, kscope->icon_item24Segment );
	for ( i = 0; i < 3; i++ ) {	/* 精霊石輝きチェック */
	    if ( ZCommon_LinkAgeIsAdult() ) {
		if ( !Get_Event_Chk_Inf( 4, check_bit[8+i] ) ) {
		    black_white_data( (unsigned int *)SEGMENT_TO_KSEG0(item_data[H_holystone_1+i]), (24*24) );
		}
	    }
	}
# endif

"精霊石輝きチェック" translates to "Spiritual Stone Sparkle Check".

This removed detail refers to cut events where Adult Link would have to restore the Spiritual Stones before the Door of Time would open again. View the unused Temple of Time cutscenes for more details.

Empty Chest Markers

OoT empty chest mark.png

The file z_map_mark.h includes an commented out #define and enum constant for "KARABAKO":

enum {
    NON_MARK = -1,
    MK_TAKARABAKO = 0,
    MK_BOSS = 1,
    MK_KARABAKO = 2,
    MAX_MARKKIND
};
#define	MARK_Takarabako	{ h_dm_box_txt, G_IM_FMT_RGBA, CUSTOM_G_IM_SIZ_16b, 8, 8, 32, 32, 1024, 1024 }
#define	MARK_Boss	{ h_dm_boss_txt, G_IM_FMT_IA, CUSTOM_G_IM_SIZ_8b, 8, 8, 32, 32, 1024, 1024 }
/*#define	MARK_Karabako	{ h_dm_empty_txt, G_IM_FMT_IA, CUSTOM_G_IM_SIZ_8b, 8, 8, 32, 32, 1024, 1024 }*/

"TAKARABAKO" means "treasure chest" and "KARABAKO" translates to "empty chest", which indicates that already opened chests would have been drawn to the dungeon minimaps with their own texture called h_dm_empty_txt, a feature that can be seen in pre-release footage.


(Source: GlitterBerri)

Pause Dungeon Map Colors

The file z_map_exp.h includes commented out color values for the dungeon map display, which would render visited rooms in a slightly different shade of blue and highlight the current room in red instead of cyan. The red color can barely be spotted in footage of the E3 1998 demo.

////////#define MAP_COLOR	0x52bf
////////#define LINK_MAP	0xf801
#define MAP_COLOR	0x02bf
#define LINK_MAP	0x0663
Early Colors E3 1998 Demo Final
OoT dmap color 0.png OoT-Pause Menu Dungeon Map Page May98.jpg OoT dmap color 1.png

Early Sign Text Box Color

/* 立て札カラー [Signboard Color] */
        message->fc_r = 70; /*150;*/
        message->fc_g = 50; /*80;*/
        message->fc_b = 30; /*0;*/
August 1998 Pre-release Screenshot Final
OoT-Kokiri Forest 3 Aug98.jpg
OoT-Kokiri Forest 3 Aug98 Comp.png

The early color values for the sign text boxes are commented out next to the used values in z_message.c.

(Source: CDi-Fails, ZeeRoX, tyler herr, Xiartic)

Early Bombchu Bowling/Shooting Gallery Interface

//		if ( !(game_play->bow_game_flag >= 2 || game_play->bomchu_game_flag > 0) ) {
		    count_display_rectangle( game_play, 0, parameter->b_alpha );
//		}
	    }
OoT-Shooting Gallery Oct98.png

The code to draw the separate counter for Bombchu Bowling and Shooting Gallery seen in pre-release screenshots for the game is commented out in the code of z_parameter.c.

File Select

Skybox & Color Change

The file z_file_choose.c from the attic folder includes a commented out function called frame_color_change and a removed part inside the function cursor_color_change:

# if 0
/*===============================================================
  =	   Frame PRIM Colour Calculation				=
 ===============================================================*/
static void
frame_color_change( Game *thisx )
{
    Game_file_choose	*this = (Game_file_choose *)thisx;

    short	rc, gc, bc, k;


    /* Frame PRIM Colour Calculation */
    if ( this->kankyo.vr_box_scale ) {
	k = 256 - this->kankyo.vr_box_scale;
	rc = (ABS(this->frame_rgb[0] - XREG(84+this->kankyo.vrbox_tenso_1) )) / k;
	gc = (ABS(this->frame_rgb[1] - XREG(88+this->kankyo.vrbox_tenso_1) )) / k;
	bc = (ABS(this->frame_rgb[2] - XREG(92+this->kankyo.vrbox_tenso_1) )) / k;
	
	if ( this->frame_rgb[0] >= XREG(84+this->kankyo.vrbox_tenso_1) ) this->frame_rgb[0] -= rc;
	else                                                             this->frame_rgb[0] += rc;
	if ( this->frame_rgb[1] >= XREG(88+this->kankyo.vrbox_tenso_1) ) this->frame_rgb[1] -= gc;
	else                                                             this->frame_rgb[1] += gc;
	if ( this->frame_rgb[2] >= XREG(92+this->kankyo.vrbox_tenso_1) ) this->frame_rgb[2] -= bc;
	else                                                             this->frame_rgb[2] += bc;
    } else {
	this->frame_rgb[0] = XREG(84+this->kankyo.vrbox_tenso_0);
	this->frame_rgb[1] = XREG(88+this->kankyo.vrbox_tenso_0);
	this->frame_rgb[2] = XREG(92+this->kankyo.vrbox_tenso_0);
    }
}
# endif
# if 0
    static short cursor_color[][3] = {
    	{ 255, 200, 200, },	// Morning
    	{ 220, 220, 255, },	// Noon
    	{ 255, 200,  70, },	// Evening
    	{ 155, 255, 255, },	// Night
    };
# endif
    static short cursor_alpha[] = {
	70, 200,
    };
////////    short	rc, gc, bc, ac;
    short	ac;


# if 0
    if ( this->kankyo.vr_box_scale ) {
	ac = 256 - this->kankyo.vr_box_scale;
	rc = (ABS(this->cursor_rgba[0] - cursor_color[this->kankyo.vrbox_tenso_1][0])) / ac;
	gc = (ABS(this->cursor_rgba[1] - cursor_color[this->kankyo.vrbox_tenso_1][1])) / ac;
	bc = (ABS(this->cursor_rgba[2] - cursor_color[this->kankyo.vrbox_tenso_1][2])) / ac;
	
	if ( this->cursor_rgba[0] >= cursor_color[this->kankyo.vrbox_tenso_1][0] ) this->cursor_rgba[0] -= rc;
	else                                                                       this->cursor_rgba[0] += rc;
	if ( this->cursor_rgba[1] >= cursor_color[this->kankyo.vrbox_tenso_1][1] ) this->cursor_rgba[1] -= gc;
	else                                                                       this->cursor_rgba[1] += gc;
	if ( this->cursor_rgba[2] >= cursor_color[this->kankyo.vrbox_tenso_1][2] ) this->cursor_rgba[2] -= bc;
	else                                                                       this->cursor_rgba[2] += bc;
    } else {
	this->cursor_rgba[0] = cursor_color[this->kankyo.vrbox_tenso_0][0];
	this->cursor_rgba[1] = cursor_color[this->kankyo.vrbox_tenso_0][1];
	this->cursor_rgba[2] = cursor_color[this->kankyo.vrbox_tenso_0][2];
    }
# endif

There is a commented out line of code on two occasions, which would move on time:

/////////    ZCommonSet(zelda_time, ZCommonGet(zelda_time) + TIME_SPEED );

Other commented out color values for the window colors:

# if 0    
    XREG(84) = 255;		// Frame PRIM─R(Morning)
    XREG(85) = 150;		//                        (Afternoon)
    XREG(86) = 200;		//                        (Evening)
    XREG(87) = 100;		//                        (Night)
    XREG(88) = 215;		// Frame PRIM─G(Morning)
    XREG(89) = 150;		//                        (Afternoon)
    XREG(90) = 150;		//                        (Evening)
    XREG(91) = 150;		//                        (Night)
    XREG(92) = 225;		// Frame PRIM─B(Morning)
    XREG(93) = 255;		//                        (Afternoon)
    XREG(94) = 100;		//                        (Evening)
    XREG(95) = 255;		//                        (Night)
# endif

These differences would change the skybox and the color values of the visual elements as time moves on, the developers later made the decision to only use the night settings:

Demo Leftovers

Hmmm...
To do:
There are several commented out demo related parts, add more info about it.

Hmmm...
To do:
Originally the title logo would have appeared in file select, add more info about it.
(Source: GlitterBerri, CDi-Fails & Zel)

Ganon's Boss Title Card

Ganon's Boss Title Card has commented out drawing code for a fiery scrolling effect. It's found in z_actor.c from z_ocarina2.

Commit log:

okajima	1998-09-24T23:16:49+09:00	燃える”ガノン”の字、ボツになる。	fiery ”Ganon” writing discarded.

Commented out code:

#if 0
/*-----------------------------------------------------------------------
 *
 *	名前表示
 *
 *----------------------------------------------------------------------*/
extern unsigned char g_mable_s1_txt[];

extern void Actor_Name_Disp_Draw(
    Game_play	    *game_play,
    Actor_Name_Disp *this
)
{
    if ( this->alpha ) {

	int	w  = this->w;
	int	h  = this->h;
	int	w2 = w << 1;
	int	x1 = (this->x << 2) - w2;
	int	x2 = x1 + (w2 << 1) - 4;
	int	y1 = (this->y << 2) - (h << 1);
	int	y2;
	int	txt_offset;
	int     wk,wkh;
	int     size;

	OPEN_DISP(game_play->g.graph);

	wk = game_play->game_frame_counter;

	if ( (padmgr_GetPadPattern(&padmgr) & 0x4) ) {
	    /* 日本語 */
	    txt_offset = 0;
	} else {
	    /* 英語 */
	    txt_offset = w*h;
	}
	
	size = (4*1024);
	if( game_play->scene_data_ID == GANON_DEMO ) {
	    /** 2タイル用に1024使うので **/
	    size = (3*1024);
	}
	if ( (w * h) > size ) h = size / w;	/* テクスチャーメモリオーバー? */
	wkh = h;
	y2 = y1 + (h << 2);
	
	SET_NOW_OVERLAY_DISP(gfx_texture_cullback_xlu(NOW_OVERLAY_DISP));

	if( game_play->scene_data_ID == GANON_DEMO ) {
#define G_CC_INT550	TEXEL1, PRIMITIVE, ENV_ALPHA, TEXEL0, TEXEL1, 1, ENVIRONMENT, TEXEL0
#define G_CC_INT551	PRIMITIVE, ENVIRONMENT, COMBINED, ENVIRONMENT, COMBINED, 0, PRIMITIVE, 0
	    gDPPipeSync( NEXT_OVERLAY_DISP );
	    gDPSetCycleType( NEXT_OVERLAY_DISP, G_CYC_2CYCLE );
	    gDPSetAlphaCompare( NEXT_OVERLAY_DISP, G_AC_THRESHOLD );
	    gDPSetRenderMode( NEXT_OVERLAY_DISP, G_RM_PASS, G_RM_CLD_SURF2 );
	    gDPSetCombineMode( NEXT_OVERLAY_DISP, G_CC_INT550, G_CC_INT551 );
	    
	    gDPSetPrimColor( NEXT_OVERLAY_DISP, 0, 0, 255, 255, 170, (unsigned char)this->alpha );
	    gDPSetEnvColor( NEXT_OVERLAY_DISP, 170, 100, 0, 128 );

	    gDPLoadMultiBlock( NEXT_OVERLAY_DISP,
			       g_mable_s1_txt, 256+128, G_TX_RENDERTILE+1, G_IM_FMT_I, G_IM_SIZ_8b, 32, 32, 0,
			       G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR,
			       5, 5, 1, 1 );
	} else {
	    gDPSetPrimColor(NEXT_OVERLAY_DISP, 0,0,
			    (unsigned char)this->color,
			    (unsigned char)this->color,
			    (unsigned char)this->color,
			    (unsigned char)this->alpha);
	}
	
	gDPLoadMultiBlock(NEXT_OVERLAY_DISP, this->texture + txt_offset, 0, G_TX_RENDERTILE, G_IM_FMT_IA, G_IM_SIZ_8b, w, h, 0,
			    G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR,
			    G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
	if( game_play->scene_data_ID == GANON_DEMO ) {
	    gDPSetTileSize( NEXT_OVERLAY_DISP, G_TX_RENDERTILE+1,
			    0,
			    0x7f - ((wk<<1) & 0x7f),
			    0, 0 );
	}
	gSPTextureRectangle(NEXT_OVERLAY_DISP, x1, y1, x2, (y2 - 1),
			    G_TX_RENDERTILE,
			    0<<5, 0<<5,
			    1<<10,  1<<10);


	if ( (h = this->h - h) > 0 ) {
	    gDPLoadMultiBlock(NEXT_OVERLAY_DISP, this->texture + size + txt_offset,
			      0, G_TX_RENDERTILE, G_IM_FMT_IA, G_IM_SIZ_8b, w, h, 0,
			      G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR,
			      G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
	    
	    if( game_play->scene_data_ID == GANON_DEMO ) {
		gDPSetTileSize( NEXT_OVERLAY_DISP, G_TX_RENDERTILE+1,
				0,
				(0x7f - ((wk<<1) & 0x7f)) - ((wkh>>1) << 2),
				0, 0 );
	    }
	    
	    gSPTextureRectangle(NEXT_OVERLAY_DISP, x1, y2, x2, (y2 + (h << 2) - 1),
				G_TX_RENDERTILE,
				0<<5, 0<<5,
				1<<10,  1<<10);
	}
    
    
#if 0	
    gDPLoadTextureBlock(NEXT_OVERLAY_DISP, this->texture, G_IM_FMT_IA, G_IM_SIZ_8b, this->w, this->h, 0,
			    G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR,
			    G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
	gSPTextureRectangle(NEXT_OVERLAY_DISP, (x4 - w2), (y4 - h2), (x4 + w2 - 4), (y4 + h2 - 4),
			    G_TX_RENDERTILE,
			    0<<5, 0<<5,
			    1<<10, 1<<10);
#endif
	
	CLOSE_DISP(game_play->g.graph);
    }
}
#endif
(Source: CDi-Fails & Xiartic)

Music

Hmmm...
To do:
Volunteers with keen ears can help determine what is causing the byte differences in particular tracks.

They're not new masterpieces from Koji Kondo, but near-final music sequences exist in z_ocarina/data/ZeldaAudio_music.o. Rather than having new melodies, small differences can be heard in the notes of a few tracks. These are very close to the final sequences used in z_ocarina/data/lib/ZeldaAudio_music.o.

Water Temple

Around 0:39 in the track, the dulcimer seems to be louder and more staccato.

Insights from Mdebug Text

Object files contain names of particular functions in the ".mdebug" portion of the ".o" file. These names originate from the original ".c" scripts that aren't included in the z_ocarina source, but can still yield insight.

Hmmm...
To do:
For those inclined, there are likely many insights derived from these mdebug files.

Princess Ruto's Kiss

The cutscene that follows Link completing Jabu Jabu's Belly is known as "CRYST". In the final game, once Link and Ruto teleport back outside, Link is startled when seeing Ruto staring into him. The mdebug file labels this scene action for Ruto leaning as "CRYST_MAIN_KISS". It's not clear from the cutscene that Ruto is trying to kiss him, but this action may have once been more evident. Located in "z_ocarina/src/rom_f/z_en_ru1.o".

Ura Zelda Leftovers

xxx

Lodgenet Gateway Build Info

Hmmm...
To do:
Thoroughly research all references to GATEWAY_VERSION.

Lodgenet was a service predominately used in North America that allowed hotel guests to play Nintendo 64 games from their rooms. Each game featured on Lodgenet had to follow a list of guidelines to be published to the service, namely remove the ability to save and remove multiplayer features (as can be seen in this Star Fox 64 video). The Ocarina of Time Gateway version is technically the only released version of OoT that has yet to be documented and analyzed. Thanks to build information found in the source listed as GATEWAY_VERSION, it offers insight of what was included in this undocumented build.

Here is a function to clear the saves for Lodgenet usersː

# endif    /* GATEWAY_VERSION /
    / ゲーム前CLEAR─RAM /
    ZCommonSet(game_info.restart_flag, 0);
    ZCommonSet(game_info.restart_data[0].scene, -1);
    ZCommonSet(old_bgm, 255);
    ZCommonSet(old_env, 255);
    ZCommonSet(game_info.name_display, ON);
    ZCommonSet(game_info.dog_flag, 0);
    ZCommonSet( event_fg, Event_MD0 );
    ZCommonSet( total_event_fg, TEvent_MD0 );
    ZCommonSet(event_inf[0], 0);
    ZCommonSet(event_inf[1], 0);
    ZCommonSet(event_inf[2], 0);
    ZCommonSet(event_inf[3], 0);
    ZCommonSet(last_time_type, 50);
    ZCommonSet(game_info.shield_magic_timer, 0);
    ZCommonSet(life_mode, 0);
    ZCommonSet(magic_flag, 0);
    ZCommonSet(keep_magic_flag, 0);
    /[ファイル選択時 に お願いしたい物]*/
    ZCommonSet( NottoriBgm,   0 );
    ZCommonSet( kankyo_time,  0 );
    ZCommonSet( next_wipe,    0xff );
    ZCommonSet( next_daytime, 0xffef );
    ZCommonSet( doukidemo,    0 );
    ZCommonSet( Kenjya_no,    0 );
    ZCommonSet( next_zelda_time, 0xffff );
    ZCommonSet( game_info.next_walk, 0 );

According to the section "ロムヘッダ定義(仮)" (ROM Header Definition (Temporary)) in GNUmakefile,v the initialization for the PAL Gateway version is NZLL, while the default Gateway version is CZLG. In comparison, the codes for the other versions of the final game are CZLJ (Japan), CZLE (North America), and NZLP (PAL).

ROM Versions

  • ROM_C: C++ ROM.
  • ROM_D: Debug ROM for use on an emulator board.
  • ROM_F: Final ROM.
  • ROM_S: Show ROM.
  • ROM_X: Debug ROM for use on real hardware.