Development:The Legend of Zelda: Ocarina of Time
This page details development materials of The Legend of Zelda: Ocarina of 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. |
To do: Sort and move content into sub-pages for better readability. |
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!
Contents
- 1 Sub-Pages
- 2 Early Fishing Experiment
- 3 Spawn An Arwing
- 4 Removed Map Events
- 5 Camera Modes
- 6 Lifemeter Environmental Behavior
- 7 Drained Spiritual Stones
- 8 Empty Chest Markers
- 9 Pause Dungeon Map Colors
- 10 Early Sign Text Box Color
- 11 Early Bombchu Bowling/Shooting Gallery Interface
- 12 File Select
- 13 Ganon's Boss Title Card
- 14 Music
- 15 Insights from Mdebug Text
- 16 Ura Zelda Leftovers
- 17 Lodgenet Gateway Build Info
- 18 ROM Versions
Sub-Pages
Player Abilities Various references to removed abilities. |
Compass Display The remnants of an old patent still lurk in the source files... |
Early Flag List Old plot progression and cut events ahoy! |
Early Text Routine A much more cumbersome way of handling dialogue. |
Collision Unused and removed collision-related stuff. |
Items Old items, new items, altered items. |
Actors, Objects, and Animations
Unused Actors & Objects Some of the earliest content ever made for the game. |
Unused Textures Here lie the remnants of development past... |
Removed Display Lists Various references to removed parts of model files. |
Removed Link Animations 129 removed or duplicate animations. |
Unused Cutscenes Grab some popcorn and watch! |
Maps
3D Maps Unused and alternate 3D maps. |
File Select Map A very, very early Map Select. |
Prerenders Unused and early versions of prerendered maps. |
Alternate Scene Setups Lots of interesting actor and object setups. |
Removed Maps Various references to removed maps. |
Text
Text Comments Comments from the developers shine light on unused text. |
Commit Logs Take a deep dive into the development history. |
Early File Lists Early file lists containing references to removed assets. |
Early Fishing Experiment
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
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.
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 |
---|---|
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.
Drained Spiritual Stones
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
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.
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 |
---|---|---|
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 |
---|---|
The early color values for the sign text boxes are commented out next to the used values in z_message.c.
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 ); // } }
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
To do: There are several commented out demo related parts, add more info about it. |
Title Logo
To do: Originally the title logo would have appeared in file select, add more info about it. |
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.
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
Music
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.
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
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.