Star Fox

This page is rather empty. More notes can be found at Data Crystal and the source for StelVulpo (a translation of the game into Esperanto).

Hacks

Star Fox: New Trainees (very WIP)

Miyu says 'Follow me, Fay!'

IPS for unheadered USA release, revision 0

A very simple hack that replaces Fox and Falco with Fay and Miyu from Star Fox 2. Right now it's just dialog and character portrait edits, nothing too fancy. In the future I'd like to update the title screen graphics and the sound effects, as well as make a variant where you play as Miyu instead of Fay.

Utilities

ROM Editor

Currently edits text used in the in-game dialog windows and the character portraits. Support for other graphics, text, level data, sound effects, etc. may or may not be implemented in the future.

Misc. Notes

Function locations

Graphics

Most, if not all, graphics are loaded via DMA. The RAM buffer used by DMA is located at $70/2800 (in low WRAM).

Some of the graphics data (pretty much everything not used in-game as a texture) is compressed. The compression format is a unique one that runs on the SuperFX chip. Lunar Compress can decompress this data using mode 14 (LC_LZ15).

Incomplete list of known graphics locations (taken in part from the source for StelVulpo)

ROM Offset Compressed? Format Description
00D996 No 2BPP GB, VERTICAL font for in-game text
0A3EDA No 2BPP NGP, FC/NES x 16 font for credits
0A45A6 (or so?) Yes 8BPP Linear? Various in-game textures
0A60FE Yes 4BPP SNES HUD, “STAGE” letters
0A6272 Yes 4BPP SNES font for enemy details
0A728E Yes 4BPP SNES continue? yes/no
0A7456 Yes -- continue tilemap
0AD8C0 Yes 4BPP SNES level map
0B3334 Yes -- level map tilemap
0B8260 Yes -- start screen tilemap
0B93FC Yes 4BPP SNES controller settings
0B96A8 Yes -- controller settings tilemap
0B9AD8 Yes 4BPP SNES star fox logo
0B9C38 Yes -- star fox logo tilemap
0BB7A4 Yes 4BPP SNES start screen
0BC640 No 4BPP SNES In-game character portraits
0FB999 Yes 4BPP SNES select training/game

The Sound Queue

Located at $1F55 is a 16-byte sound queue. When a sound effect is played (voice chatter, Arwing collision, etc.) the sound ID is added to this. The easiest place to play around with this is on the control select screen, where pressing Select will play a sound. The function $03/B7E5, after checking the mute flag at $1FD1 and some other flags, fetches the last position used in the queue (X) from $1F4F, places the new SFX id in $1F55+X, and then increments the queue position. If the queue position is ever greater than $F, it wraps back around to 0. The sound driver compares this queue to a copy of the queue stored elsewhere. If the queue positions differ, it pulls the sound effect from the queue and plays it.

Text Rendering

A text pointer is loaded from ROM location $01FBB8+X, where X is the argument given to the function at $03/E993. The pointer points to text located at $010000+X. Text is word-wrapped at spaces. The longest a line can be before wrapping is 15 characters. There is technically no limit to how many lines a piece of text can be, but only 3 can be displayed. 3-line text is displayed a line higher than two-line text. This distinction is dictated by the first nybble of the first byte. Text is rendered twice, once in black and once in white, to give a drop-shadow effect. When text is displayed, a portrait of the speaker appears and their sound effect plays. This is dependent on the value of the second nybble of the first byte of the text data. For some period of time, the character's mouth will animate. After this, the mouth will remain closed. If the animation function call is removed, their mouth will remain open while they're speaking and then close afterwards. The sound effect to be played is stored at $03/EB32 + X. (I'm not sure offhand what valid values for X are.)