Table of Contents

Resource Table

The resource table is still being researched, so the information here is incomplete. The table is located at 0xE473F0 to 0xE4C078 in the ROM, and contains data that references blocks of data following the table. It appears that different types of data are contained in this table, since the level data only inhabits the data between 0xE473F0 and 0xE493A8.

Each entry in the table is defined by the same 8-byte struct:

table_entry {
  uint dataLength;
  uint dataOffset;
}

Note: The data offset is the offset in the ROM minus the offset of the table (0xE473F0).

Level Data

Level data is found between 0xE473F0 and 0xE493A8 in the ROM. There are a total of 145 levels (8 full courses of 18 holes and an extra one for the driving range). Each level has 7 different entries in the table:

0x00: Level height data (1 / 2)
0x08: Level height data (2 / 2)
0x10: Object list (i.e. tree locations, among other things)
0x18: ? (is always 0x34 bytes long)
0x20: ?
0x28: ?
0x30: Surface mapping (whether ground is rough, fair, green, etc)

For more information, see:

====== Temporary Notes

Here's some notes about the level data that aren't 100% verified or tested, but should be fairly close to the truth.

Player Data

These are the addresses that hold the current shot data of the player. Updates in real time. It is assumed that these values are added/subtracted to the values of the club data stored on the ROM.

80227150 - Shot Angle
800FBE57 - Current Shot Type (2 = Blue, 1 = Yellow, 0 = Red)
80227163 - Current SpinY
80227167 - Current SpinX

Object List

The object list contains information about objects placed in a level. This would include any sort of tree or tree-like object. The format is as follows:

First byte of the object list details the number of entries in the list. Immediately following is a series of 0xC blocks which contain information about the object. Here's a WIP of the contents of each entry:

0x0: X (ushort or short?)
0x2: Y
0x4: Z
0x6: Type (list of values below)
0x7: Empty, 0x00
0x8: Width factor (ushort)
0xA: Height factor (half-resolution, 0x2 here matches with 0x1 in width)

At the end the list is filled with 0xFF to the closest 16-byte address.

Object Type List

Level Conjecture

It is easily seen by looking at the decompressed surface map that the level is comprised of a 2d array of tiles. Looking at how the level is laid out, I believe that each tile is 0x0010 long when using X/Z coordinates (such as the object list above). The first level is 100 tiles by 200 tiles large, and the X/Z coordinates for the objects in it varied from 0x0000-0x0FFF and 0x0000-0x1FFF.