The current URL is datacrystal.tcrf.net.
Donkey Kong Land III/RAM map: Difference between revisions
Blaziken257 (talk | contribs) No edit summary |
m (Xkeeper moved page Donkey Kong Land III:RAM map to Donkey Kong Land III/RAM map: normalize subpages and titles) |
||
(30 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{rammap|game=Donkey Kong Land III}} | |||
Some notes: | |||
* Most, if not all, of these addresses apply to both the English and Japanese versions. | * Most, if not all, of these addresses apply to both the English and Japanese versions. | ||
* Many (but not all) of these addresses may also | * Many (but not all) of these addresses may also apply to Donkey Kong Land 2, as they run off the same game engine. | ||
* <tt> | * <tt>C5EE</tt> = Bonus timer | ||
* <tt>DF00</tt> = Current character | |||
** 00 = Kiddy Kong | ** 00 = Kiddy Kong | ||
** 01 = Dixie Kong | ** 01 = Dixie Kong | ||
Line 12: | Line 15: | ||
** 06 = Rattly (glitched, simply leftover from DKL2) | ** 06 = Rattly (glitched, simply leftover from DKL2) | ||
** 07 = Toboggan | ** 07 = Toboggan | ||
* <tt>DF30</tt> = Invincibility timer | |||
* <tt>DAF7</tt> = Current music tempo | |||
* <tt>DE9E</tt> = Frame counter to determine Bear's and Wrinkly's random dialogues | |||
* <tt>DF05-DF06</tt> = Kong's X position (big endian) | |||
* <tt>DF07-DF08</tt> = Kong's Y position (big endian) | |||
* <tt>DEA1</tt> = Current buttons pressed (Down, Up, Left, Right, Start, Select, B, A) | |||
* <tt>DEA2</tt> = Most recent buttons pressed | |||
== Stage data == | |||
{| border="1" class="wikitable" | |||
|- | |||
! Data !! English !! Japanese | |||
|- | |||
| Current stage type | |||
* <tt>00</tt> = Find the Token! | |||
* <tt>01</tt> = Collect the Stars! | |||
* <tt>02</tt> = Bash the Baddies! | |||
* <tt>03</tt> = Warp | |||
* <tt>FE</tt> = Regular stage (after exiting bonus stage) | |||
* <tt>FF</tt> = Regular stage (from world map screen) | |||
| <tt>C5EC</tt> | |||
| <tt>C5ED</tt> | |||
|- | |||
| Bonus stage timer counter (remaining seconds) || <tt>C5ED</tt> || <tt>C5EE</tt> | |||
|- | |||
| Bonus stage counter (remaining stars/Kremlings) || <tt>C5EE</tt> || <tt>C5EF</tt> | |||
|} | |||
== HRAM == | |||
{| border="1" class="wikitable" | |||
|- | |||
! Data !! English !! Japanese | |||
|- | |||
| DMA transfer code (for sprites) || <tt>FF80-FF8D</tt> || <tt>FF80-FF8D</tt> | |||
|- | |||
| Super Game Boy flag || <tt>FFA1</tt> || <tt>---</tt> | |||
|- | |||
| Current level || <tt>FFA6</tt> || <tt>FFA5</tt> | |||
|- | |||
| Lives || <tt>FFAA</tt> || <tt>FFA9</tt> | |||
|- | |||
| Bananas || <tt>FFAB</tt> || <tt>FFAA</tt> | |||
|- | |||
| Current Kong<br />00 = Kiddy<br />01 = Dixie || <tt>FFAC</tt> || <tt>FFAB</tt> | |||
|- | |||
| Number of hits remaining || <tt>FFAD</tt> || <tt>FFAC</tt> | |||
|- | |||
| Current world in world map screen<br />00 = Cape Codswallop<br />01 = Primate Plains<br />02 = Blackforest Plateau<br />03 = Great Ape Lakes<br />04 = Tin Can Valley<br />05 = The Lost World<br />06 = Northern Kremisphere || <tt>FFAE</tt> || <tt>FFAD</tt> | |||
|- | |||
| Current level in world map screen || <tt>FFAF</tt> || <tt>FFAE</tt> | |||
|- | |||
| Total hours played || <tt>FFB0</tt> || <tt>FFAF</tt> | |||
|- | |||
| Total minutes played<br />(Total minutes in Time Attack mode) || <tt>FFB1</tt> || <tt>FFB0</tt> | |||
|- | |||
| Total seconds played<br />(Total seconds in Time Attack mode) || <tt>FFB2</tt> || <tt>FFB1</tt> | |||
|- | |||
| Bear Coins || <tt>FFB3</tt> || <tt>FFB2</tt> | |||
|- | |||
| Bonus Coins || <tt>FFB4</tt> || <tt>FFB3</tt> | |||
|- | |||
| DK Coins || <tt>FFB5</tt> || <tt>FFB4</tt> | |||
|- | |||
| Watches || <tt>FFB6</tt> || <tt>FFB5</tt> | |||
|- | |||
| Most recent sprite data || <tt>FFD7-FFDE</tt> || <tt>FFD6-FFDD</tt> | |||
|- | |||
| Boss stage flag<br />00 = Regular stage<br />01 = Boss stage || <tt>FFDF</tt> || <tt>FFDE</tt> | |||
|- | |||
| Big-endian pointer for next button to be used in demo<br />(Bank 0x14) || <tt>FFE2-FFE3</tt> || <tt>FFE1-FFE2</tt> | |||
|- | |||
| Frames remaining for current button in demo || <tt>FFE4</tt> || <tt>FFE3</tt> | |||
|- | |||
| Current button press in demo<br />This is a bitflag, where the buttons are arranged like this (from left to right):<br />Down, Up, Left, Right, Start, Select, B, A|| <tt>FFE5</tt> || <tt>FFE4</tt> | |||
|- | |||
| Current level bitflag<br />0x80 = Cleared with Dixie for the first time<br />0x40 = Both Bonus Coins have been found<br />0x10 = Bonus Coin #2 collected<br />0x08 = Bonus Coin #1 collected<br />0x02 = DK Coin collected<br />0x01 = Level cleared || <tt>FFE9</tt> || <tt>FFE8</tt> | |||
|- | |||
| Cheat code bitflag<br />0x01 = Play the card game after the title screen<br />0x02 = Start with 50 lives<br />0x04 = All levels unlocked|| <tt>FFF9</tt> || <tt>FFF8</tt> | |||
|- | |||
| On title screen: Demo to be played<br />Pressing Up, Left, Down, or Select increments this counter.<br />Only the rightmost three bits are used to determine the demo. | |||
On Time Attack screen: Current cursor position | |||
| <tt>FFFC</tt> || <tt>FFFB</tt> | |||
|} | |||
== Saved data == | |||
=== Miscellaneous data === | |||
* <tt>A000-A04F</tt> = File 1 | |||
* <tt>A050-A0BF</tt> = File 2 | |||
* <tt>A0A0-A0EF</tt> = File 3 | |||
{| class="wikitable" | |||
|- | |||
! File 1 !! File 2 !! File 3 !! Description | |||
|- | |||
| <tt>A000-A001</tt> | |||
| <tt>A050-A051</tt> | |||
| <tt>A0A0-A0A1</tt> | |||
| 16-bit big endian checksum of <tt>4E</tt> bytes afterwards (e.g. <tt>A002-A04F</tt> for File 1) | |||
|- | |||
| <tt>A002</tt> | |||
| <tt>A052</tt> | |||
| <tt>A0A2</tt> | |||
| Current Kong (00=Kiddy, 01=Dixie)<br /><small>(This data is apparently not used -- Dixie is always the active Kong when loading a save file. This is probably a bug, and this did not occur in DKL2.)</small> | |||
|- | |||
| <tt>A003</tt> | |||
| <tt>A053</tt> | |||
| <tt>A0A3</tt> | |||
| Number of hits remaining | |||
|- | |||
| <tt>A004</tt> | |||
| <tt>A054</tt> | |||
| <tt>A0A4</tt> | |||
| Last world visited | |||
|- | |||
| <tt>A005</tt> | |||
| <tt>A055</tt> | |||
| <tt>A0A5</tt> | |||
| Last submap location visited (typically Wrinkly Refuge)<br /><small>(Unused, because the game always starts you on the overworld map when loading a saved game.)</small> | |||
|- | |||
| <tt>A006-A008</tt> | |||
| <tt>A056-A058</tt> | |||
| <tt>A0A6-A0A8</tt> | |||
| Time played (hours, minutes, seconds) | |||
|- | |||
| <tt>A009</tt> | |||
| <tt>A059</tt> | |||
| <tt>A0A9</tt> | |||
| Bear Coins<br /><small>(Unlike in DKC3, this data is not used. Upon loading a save file, after the game reads the Bear Coin count and stores it into RAM, it is then reset to 0. It is unclear whether or not this is a bug.)</small> | |||
|- | |||
| <tt>A00A</tt> | |||
| <tt>A05A</tt> | |||
| <tt>A0AA</tt> | |||
| Bonus Coins collected | |||
|- | |||
| <tt>A00B</tt> | |||
| <tt>A05B</tt> | |||
| <tt>A0AB</tt> | |||
| DK Coins collected | |||
|- | |||
| <tt>A00C</tt> | |||
| <tt>A05C</tt> | |||
| <tt>A0AC</tt> | |||
| Watches collected | |||
|- | |||
| <tt>A00D-A014</tt> | |||
| <tt>A05D-A064</tt> | |||
| <tt>A0AD-A0B4</tt> | |||
| ???<br /><small>(Seems to be 42 for each completed world, but doesn't appear to have an effect. Possibly a leftover from DKL2, which used this space for world data.)</small> | |||
|- | |||
| <tt>A015</tt> | |||
| <tt>A065</tt> | |||
| <tt>A0B5</tt> | |||
| Card Game record (starts out at 31 seconds in a new file) | |||
|- | |||
| <tt>A016-A01B</tt> | |||
| <tt>A066-A06B</tt> | |||
| <tt>A0B6-A0BB</tt> | |||
| Bear data | |||
* Bit 6: 1 if DK Coin is collected, 0 if not | |||
* Bit 1: 1 if Watch is collected, 0 if not | |||
* Bit 0: 1 if attempted at least once, 0 if not | |||
|- | |||
| <tt>A01C-A03F</tt> | |||
| <tt>A06C-A08F</tt> | |||
| <tt>A0BC-A0DF</tt> | |||
| Level data | |||
* Bit 7: 0 if cleared with Kiddy the first time, 1 if cleared with Dixie for the first time | |||
* Bit 6: 0 if missing at least one Bonus Coin, 1 if both Bonus Coins have been found | |||
* Bit 5: Unused? | |||
* Bit 4: 0 if Bonus Coin #2 is missing, 1 if Bonus Coin #2 is collected | |||
* Bit 3: 0 if Bonus Coin #1 is missing, 1 if Bonus Coin #1 is collected | |||
* Bit 2: Unused? | |||
* Bit 1: 0 if DK Coin is not collected, 1 if DK Coin is collected | |||
* Bit 0: 0 if not cleared, 1 if cleared | |||
|- | |||
| <tt>A040-A045</tt> | |||
| <tt>A090-A095</tt> | |||
| <tt>A0E0-A0E5</tt> | |||
| Boss level data | |||
* Bit 7: ??? | |||
* Bit 6: 1 if Bonus Coin is collected | |||
* Bit 2: ??? | |||
* Bit 0: 1 if cleared | |||
|- | |||
| <tt>A100-A14F</tt><br /><tt>A200-A24F</tt> | |||
| <tt>A150-A19F</tt><br /><tt>A250-A29F</tt> | |||
| <tt>A1A0-A1EF</tt><br /><tt>A2A0-A2EF</tt> | |||
| Backup copies of given file, intended to be used if previous checksum fails, but bug makes this unused (see below) | |||
|} | |||
==== Checksum ==== | |||
For each <tt>50</tt>-byte block, a 16-bit, big endian checksum is stored in the first two bytes. This is a sum of each 8-bit value in the rest of the <tt>4E</tt> bytes. If the checksum fails, the checksum in the file's first backup copy is checked. If this also fails, the checksum in the file's second and final backup copy is checked. If they all fail, the file is erased. If any of them pass, the game always uses the data in the first block. This occurs even if the checksum failed in this block, but passed in either of the two backup blocks. This is a bug; the intended behavior is that the game would copy a valid backup block to the first block in this situation. Since the game always uses the data in the first block, this can cause glitches if the first block is corrupted, but the other two are intact. | |||
=== Time Attack data === | |||
* <tt>A350-A382</tt>: File 1 | |||
* <tt>A383-A3B5</tt>: File 2 | |||
* <tt>A3B6-A3E8</tt>: File 3 | |||
{| class="wikitable" | |||
|- | |||
! File 1 !! File 2 !! File 3 !! Description | |||
|- | |||
| <tt>A350-A373</tt> | |||
| <tt>A383-A3A6</tt> | |||
| <tt>A3B6-A3D9</tt> | |||
| Time Attack level records | |||
* Format: minutes, seconds, 1/100 seconds | |||
|- | |||
| <tt>A374-A37F</tt> | |||
| <tt>A3A7-A3B2</tt> | |||
| <tt>A3DA-A3E5</tt> | |||
| Time Attack clear flags | |||
* <tt>01</tt> = Cleared; <tt>00</tt> = Not cleared | |||
|- | |||
| <tt>A380</tt> | |||
| <tt>A3B3</tt> | |||
| <tt>A3E6</tt> | |||
| Seems to be number of Time Attack records completed | |||
|- | |||
| <tt>A381</tt> | |||
| <tt>A3B4</tt> | |||
| <tt>A3E7</tt> | |||
| Time Attack unlocked? | |||
* <tt>01</tt> = Unlocked; <tt>00</tt> = Not unlocked | |||
|- | |||
| <tt>A382</tt> | |||
| <tt>A3B5</tt> | |||
| <tt>A3E8</tt> | |||
| Time Attack checksum | |||
|} | |||
==== Time Attack checksum ==== | |||
* The Time Attack checksum works as follows: | |||
** Take the values from the following RAM offsets (depending on the file) and add them all up, one byte at a time. (These contain time records, flags to determine whether a level is passed, etc.) | |||
*** File 1: <tt>A350-A381</tt> | |||
*** File 2: <tt>A383-A3B4</tt> | |||
*** File 3: <tt>A3B6-A3E7</tt> | |||
** Next, take only the last 8 bits of the sum. | |||
** Flip all the bits of this sum (essentially, the sum is subtracted from <tt>FF</tt>; alternately, the sum is XORed with <tt>FF</tt>.) | |||
** Add <tt>58</tt> to this result (Note: in the prototype, add <tt>50</tt> instead), and store it in one of these offsets depending on the file: | |||
*** File 1: <tt>A382</tt> | |||
*** File 2: <tt>A3B5</tt> | |||
*** File 3: <tt>A3E8</tt> | |||
** If this checksum fails, all Time Attack data is erased. | |||
== Velocity == | == Velocity == | ||
* <tt> | * <tt>DF10</tt> = Horizontal velocity | ||
** Some common values: | ** Some common values: | ||
{| | {| class="wikitable" | ||
|- | |- | ||
! Action | ! Action | ||
! colspan="2" | Value(s) | ! colspan="2" | Value(s) | ||
Line 22: | Line 270: | ||
|- | |- | ||
| Walking | | Walking | ||
| <tt> | | <tt>19</tt> | ||
| <tt> | | <tt>E7</tt> | ||
|- | |- | ||
| Running | | Running | ||
| <tt> | | <tt>23</tt> | ||
| <tt> | | <tt>DD</tt> | ||
| This is also Squitter's walking speed. | | This is also Squitter's walking speed. | ||
|- | |- | ||
| Attacking (while standing still) | | Attacking (while standing still) | ||
| <tt> | | <tt>0F</tt> | ||
| <tt> | | <tt>F1</tt> | ||
|- | |- | ||
| Attacking (while walking or running) | | Attacking (while walking or running) | ||
| <tt> | | <tt>23</tt> | ||
| <tt> | | <tt>DD</tt> | ||
|- | |- | ||
| Jumping (while walking) | | Jumping (while walking) | ||
| <tt> | | <tt>23</tt> | ||
| <tt> | | <tt>DD</tt> | ||
|- | |- | ||
| Jumping (while running) | | Jumping (while running) | ||
| <tt> | | <tt>28</tt> | ||
| <tt> | | <tt>D8</tt> | ||
|- | |- | ||
| Dixie's helicopter spin | | Dixie's helicopter spin | ||
| <tt> | | <tt>23</tt> | ||
| <tt> | | <tt>DD</tt> | ||
|- | |- | ||
| Jumping on enemy | | Jumping on enemy | ||
| <tt> | | <tt>1E</tt> | ||
| <tt> | | <tt>E2</tt> | ||
| Holding B does not seem to affect speed. | | Holding B does not seem to affect speed. | ||
|- | |- | ||
| rowspan="2" | Attacking an enemy | | rowspan="2" | Attacking an enemy | ||
| <tt> | | <tt>2D</tt> | ||
| <tt> | | <tt>D3</tt> | ||
|- | |- | ||
| <tt> | | <tt>37</tt> | ||
| <tt> | | <tt>C9</tt> | ||
| If attacking two or more enemies in a row. | | If attacking two or more enemies in a row. | ||
|- | |- | ||
| Holding a barrel while moving | | Holding a barrel while moving | ||
| <tt> | | <tt>1E</tt> | ||
| <tt> | | <tt>E2</tt> | ||
|- | |- | ||
| rowspan="2" | Swimming (slow speed -- without holding B) | | rowspan="2" | Swimming (slow speed -- without holding B) | ||
| <tt> | | <tt>0F</tt> | ||
| <tt> | | <tt>F1</tt> | ||
|- | |- | ||
| <tt> | | <tt>15</tt> | ||
| <tt> | | <tt>EB</tt> | ||
| If pressing A to ascend. | | If pressing A to ascend. | ||
|- | |- | ||
| rowspan="2" | Swimming (fast speed -- while holding B) | | rowspan="2" | Swimming (fast speed -- while holding B) | ||
| <tt> | | <tt>14</tt> | ||
| <tt> | | <tt>EC</tt> | ||
|- | |- | ||
| <tt> | | <tt>1A</tt> | ||
| <tt> | | <tt>E6</tt> | ||
| If pressing A to ascend. | | If pressing A to ascend. | ||
|- | |- | ||
| Swimming (with Enguarde) | | Swimming (with Enguarde) | ||
| <tt> | | <tt>1E</tt> | ||
| <tt> | | <tt>E2</tt> | ||
|- | |- | ||
| Stabbing (with Enguarde) | | Stabbing (with Enguarde) | ||
| <tt> | | <tt>23</tt> | ||
| <tt> | | <tt>DD</tt> | ||
|- | |- | ||
| rowspan="2" | Climbing | | rowspan="2" | Climbing | ||
| <tt> | | <tt>0F</tt> | ||
| <tt> | | <tt>F1</tt> | ||
| When not holding B. | | When not holding B. | ||
|- | |- | ||
| <tt> | | <tt>1E</tt> | ||
| <tt> | | <tt>E2</tt> | ||
| When holding B. | | When holding B. | ||
|- | |- | ||
| Toboggan | | Toboggan | ||
| colspan="2" | <tt> | | colspan="2" | <tt>32</tt> | ||
|- | |- | ||
| Jumping on enemy in Toboggan | | Jumping on enemy in Toboggan | ||
| colspan="2" | <tt> | | colspan="2" | <tt>2B</tt> | ||
| Does not decrease to 2B right away; gradually decreases. Afterwards, gradually increases back to 32. | | Does not decrease to 2B right away; gradually decreases. Afterwards, gradually increases back to 32. | ||
|} | |} | ||
* <tt> | * <tt>DF11</tt> = Vertical velocity | ||
** Some common values: | ** Some common values: | ||
{| | {| class="wikitable" | ||
|- | |- | ||
! Action | ! Action | ||
! Value | ! Value | ||
Line 117: | Line 365: | ||
|- | |- | ||
| Gravity | | Gravity | ||
| <tt> | | <tt>46</tt> | ||
| This value remains at 46 even when standing on ground. | | This value remains at 46 even when standing on ground. | ||
|- | |- | ||
| Jumping | | Jumping | ||
| <tt> | | <tt>B3</tt> | ||
| After jumping, this value slowly increases (which causes downward acceleration) until it reaches the gravity value of 46. However, when this value reaches BB, it can remain at BB for up to 7 frames, depending on how long A is held down. | | After jumping, this value slowly increases (which causes downward acceleration) until it reaches the gravity value of 46. However, when this value reaches BB, it can remain at BB for up to 7 frames, depending on how long A is held down. | ||
|- | |- | ||
| Dixie's helicopter spin | | Dixie's helicopter spin | ||
| <tt> | | <tt>0A</tt> | ||
|- | |- | ||
| rowspan="2" | Jumping on enemy | | rowspan="2" | Jumping on enemy | ||
| <tt> | | <tt>9F</tt> | ||
| Like normal jumping, this value slowly increases (causing downward acceleration) until it reaches 46. | | Like normal jumping, this value slowly increases (causing downward acceleration) until it reaches 46. | ||
|- | |- | ||
| <tt> | | <tt>95</tt> | ||
| If A is held down while hitting the enemy. | | If A is held down while hitting the enemy. | ||
|- | |- | ||
| rowspan="2" | Descending while swimming | | rowspan="2" | Descending while swimming | ||
| <tt> | | <tt>0A</tt> | ||
|- | |- | ||
| <tt> | | <tt>14</tt> | ||
| If Down is pressed. | | If Down is pressed. | ||
|- | |- | ||
| rowspan="3" | Ascending while swimming | | rowspan="3" | Ascending while swimming | ||
| <tt> | | <tt>F1</tt> | ||
| Every time A is pressed, this slowly decreases to F1, then slowly increases back to normal swimming speed | | Every time A is pressed, this slowly decreases to F1, then slowly increases back to normal swimming speed | ||
|- | |- | ||
| <tt> | | <tt>F7</tt> | ||
| If Down is pressed. | | If Down is pressed. | ||
|- | |- | ||
| <tt> | | <tt>E8</tt> | ||
| If Up is pressed. | | If Up is pressed. | ||
|- | |- | ||
| rowspan="2" | Swimming with Enguarde | | rowspan="2" | Swimming with Enguarde | ||
| <tt> | | <tt>1E</tt> | ||
| While descending. | | While descending. | ||
|- | |- | ||
| <tt> | | <tt>E2</tt> | ||
| While ascending. | | While ascending. | ||
|- | |- | ||
| rowspan="2" | Climbing | | rowspan="2" | Climbing | ||
| <tt> | | <tt>0F/F1</tt> | ||
| When not holding B. | | When not holding B. | ||
|- | |- | ||
| <tt> | | <tt>19/E7</tt> | ||
| When holding B. | | When holding B. | ||
|- | |- | ||
| Toboggan | | Toboggan | ||
| <tt> | | <tt>6E</tt> | ||
|- | |- | ||
| Jumping in Toboggan | | Jumping in Toboggan | ||
| <tt> | | <tt>C3</tt> | ||
| As is always the case with jumping, this value increases until it reaches gravity speed. | | As is always the case with jumping, this value increases until it reaches gravity speed. | ||
|- | |- | ||
| Jumping on enemy in Toboggan | | Jumping on enemy in Toboggan | ||
| <tt> | | <tt>9F</tt> | ||
|} | |} | ||
Line 178: | Line 426: | ||
80 is the fastest speed for left or upward movement; 7F is the fastest speed for right or downward movement. | 80 is the fastest speed for left or upward movement; 7F is the fastest speed for right or downward movement. | ||
{{Internal Data|game=Donkey Kong Land III}} |
Latest revision as of 02:41, 24 January 2024
The following article is a RAM map for Donkey Kong Land III.
Some notes:
- Most, if not all, of these addresses apply to both the English and Japanese versions.
- Many (but not all) of these addresses may also apply to Donkey Kong Land 2, as they run off the same game engine.
- C5EE = Bonus timer
- DF00 = Current character
- 00 = Kiddy Kong
- 01 = Dixie Kong
- 02 = Ellie
- 03 = Squawks
- 04 = Enguarde
- 05 = Squitter
- 06 = Rattly (glitched, simply leftover from DKL2)
- 07 = Toboggan
- DF30 = Invincibility timer
- DAF7 = Current music tempo
- DE9E = Frame counter to determine Bear's and Wrinkly's random dialogues
- DF05-DF06 = Kong's X position (big endian)
- DF07-DF08 = Kong's Y position (big endian)
- DEA1 = Current buttons pressed (Down, Up, Left, Right, Start, Select, B, A)
- DEA2 = Most recent buttons pressed
Stage data
Data | English | Japanese |
---|---|---|
Current stage type
|
C5EC | C5ED |
Bonus stage timer counter (remaining seconds) | C5ED | C5EE |
Bonus stage counter (remaining stars/Kremlings) | C5EE | C5EF |
HRAM
Data | English | Japanese |
---|---|---|
DMA transfer code (for sprites) | FF80-FF8D | FF80-FF8D |
Super Game Boy flag | FFA1 | --- |
Current level | FFA6 | FFA5 |
Lives | FFAA | FFA9 |
Bananas | FFAB | FFAA |
Current Kong 00 = Kiddy 01 = Dixie |
FFAC | FFAB |
Number of hits remaining | FFAD | FFAC |
Current world in world map screen 00 = Cape Codswallop 01 = Primate Plains 02 = Blackforest Plateau 03 = Great Ape Lakes 04 = Tin Can Valley 05 = The Lost World 06 = Northern Kremisphere |
FFAE | FFAD |
Current level in world map screen | FFAF | FFAE |
Total hours played | FFB0 | FFAF |
Total minutes played (Total minutes in Time Attack mode) |
FFB1 | FFB0 |
Total seconds played (Total seconds in Time Attack mode) |
FFB2 | FFB1 |
Bear Coins | FFB3 | FFB2 |
Bonus Coins | FFB4 | FFB3 |
DK Coins | FFB5 | FFB4 |
Watches | FFB6 | FFB5 |
Most recent sprite data | FFD7-FFDE | FFD6-FFDD |
Boss stage flag 00 = Regular stage 01 = Boss stage |
FFDF | FFDE |
Big-endian pointer for next button to be used in demo (Bank 0x14) |
FFE2-FFE3 | FFE1-FFE2 |
Frames remaining for current button in demo | FFE4 | FFE3 |
Current button press in demo This is a bitflag, where the buttons are arranged like this (from left to right): Down, Up, Left, Right, Start, Select, B, A |
FFE5 | FFE4 |
Current level bitflag 0x80 = Cleared with Dixie for the first time 0x40 = Both Bonus Coins have been found 0x10 = Bonus Coin #2 collected 0x08 = Bonus Coin #1 collected 0x02 = DK Coin collected 0x01 = Level cleared |
FFE9 | FFE8 |
Cheat code bitflag 0x01 = Play the card game after the title screen 0x02 = Start with 50 lives 0x04 = All levels unlocked |
FFF9 | FFF8 |
On title screen: Demo to be played Pressing Up, Left, Down, or Select increments this counter. Only the rightmost three bits are used to determine the demo. On Time Attack screen: Current cursor position |
FFFC | FFFB |
Saved data
Miscellaneous data
- A000-A04F = File 1
- A050-A0BF = File 2
- A0A0-A0EF = File 3
File 1 | File 2 | File 3 | Description |
---|---|---|---|
A000-A001 | A050-A051 | A0A0-A0A1 | 16-bit big endian checksum of 4E bytes afterwards (e.g. A002-A04F for File 1) |
A002 | A052 | A0A2 | Current Kong (00=Kiddy, 01=Dixie) (This data is apparently not used -- Dixie is always the active Kong when loading a save file. This is probably a bug, and this did not occur in DKL2.) |
A003 | A053 | A0A3 | Number of hits remaining |
A004 | A054 | A0A4 | Last world visited |
A005 | A055 | A0A5 | Last submap location visited (typically Wrinkly Refuge) (Unused, because the game always starts you on the overworld map when loading a saved game.) |
A006-A008 | A056-A058 | A0A6-A0A8 | Time played (hours, minutes, seconds) |
A009 | A059 | A0A9 | Bear Coins (Unlike in DKC3, this data is not used. Upon loading a save file, after the game reads the Bear Coin count and stores it into RAM, it is then reset to 0. It is unclear whether or not this is a bug.) |
A00A | A05A | A0AA | Bonus Coins collected |
A00B | A05B | A0AB | DK Coins collected |
A00C | A05C | A0AC | Watches collected |
A00D-A014 | A05D-A064 | A0AD-A0B4 | ??? (Seems to be 42 for each completed world, but doesn't appear to have an effect. Possibly a leftover from DKL2, which used this space for world data.) |
A015 | A065 | A0B5 | Card Game record (starts out at 31 seconds in a new file) |
A016-A01B | A066-A06B | A0B6-A0BB | Bear data
|
A01C-A03F | A06C-A08F | A0BC-A0DF | Level data
|
A040-A045 | A090-A095 | A0E0-A0E5 | Boss level data
|
A100-A14F A200-A24F |
A150-A19F A250-A29F |
A1A0-A1EF A2A0-A2EF |
Backup copies of given file, intended to be used if previous checksum fails, but bug makes this unused (see below) |
Checksum
For each 50-byte block, a 16-bit, big endian checksum is stored in the first two bytes. This is a sum of each 8-bit value in the rest of the 4E bytes. If the checksum fails, the checksum in the file's first backup copy is checked. If this also fails, the checksum in the file's second and final backup copy is checked. If they all fail, the file is erased. If any of them pass, the game always uses the data in the first block. This occurs even if the checksum failed in this block, but passed in either of the two backup blocks. This is a bug; the intended behavior is that the game would copy a valid backup block to the first block in this situation. Since the game always uses the data in the first block, this can cause glitches if the first block is corrupted, but the other two are intact.
Time Attack data
- A350-A382: File 1
- A383-A3B5: File 2
- A3B6-A3E8: File 3
File 1 | File 2 | File 3 | Description |
---|---|---|---|
A350-A373 | A383-A3A6 | A3B6-A3D9 | Time Attack level records
|
A374-A37F | A3A7-A3B2 | A3DA-A3E5 | Time Attack clear flags
|
A380 | A3B3 | A3E6 | Seems to be number of Time Attack records completed |
A381 | A3B4 | A3E7 | Time Attack unlocked?
|
A382 | A3B5 | A3E8 | Time Attack checksum |
Time Attack checksum
- The Time Attack checksum works as follows:
- Take the values from the following RAM offsets (depending on the file) and add them all up, one byte at a time. (These contain time records, flags to determine whether a level is passed, etc.)
- File 1: A350-A381
- File 2: A383-A3B4
- File 3: A3B6-A3E7
- Next, take only the last 8 bits of the sum.
- Flip all the bits of this sum (essentially, the sum is subtracted from FF; alternately, the sum is XORed with FF.)
- Add 58 to this result (Note: in the prototype, add 50 instead), and store it in one of these offsets depending on the file:
- File 1: A382
- File 2: A3B5
- File 3: A3E8
- If this checksum fails, all Time Attack data is erased.
- Take the values from the following RAM offsets (depending on the file) and add them all up, one byte at a time. (These contain time records, flags to determine whether a level is passed, etc.)
Velocity
- DF10 = Horizontal velocity
- Some common values:
Action | Value(s) | Notes | |
---|---|---|---|
Walking | 19 | E7 | |
Running | 23 | DD | This is also Squitter's walking speed. |
Attacking (while standing still) | 0F | F1 | |
Attacking (while walking or running) | 23 | DD | |
Jumping (while walking) | 23 | DD | |
Jumping (while running) | 28 | D8 | |
Dixie's helicopter spin | 23 | DD | |
Jumping on enemy | 1E | E2 | Holding B does not seem to affect speed. |
Attacking an enemy | 2D | D3 | |
37 | C9 | If attacking two or more enemies in a row. | |
Holding a barrel while moving | 1E | E2 | |
Swimming (slow speed -- without holding B) | 0F | F1 | |
15 | EB | If pressing A to ascend. | |
Swimming (fast speed -- while holding B) | 14 | EC | |
1A | E6 | If pressing A to ascend. | |
Swimming (with Enguarde) | 1E | E2 | |
Stabbing (with Enguarde) | 23 | DD | |
Climbing | 0F | F1 | When not holding B. |
1E | E2 | When holding B. | |
Toboggan | 32 | ||
Jumping on enemy in Toboggan | 2B | Does not decrease to 2B right away; gradually decreases. Afterwards, gradually increases back to 32. |
- DF11 = Vertical velocity
- Some common values:
Action | Value | Notes |
---|---|---|
Gravity | 46 | This value remains at 46 even when standing on ground. |
Jumping | B3 | After jumping, this value slowly increases (which causes downward acceleration) until it reaches the gravity value of 46. However, when this value reaches BB, it can remain at BB for up to 7 frames, depending on how long A is held down. |
Dixie's helicopter spin | 0A | |
Jumping on enemy | 9F | Like normal jumping, this value slowly increases (causing downward acceleration) until it reaches 46. |
95 | If A is held down while hitting the enemy. | |
Descending while swimming | 0A | |
14 | If Down is pressed. | |
Ascending while swimming | F1 | Every time A is pressed, this slowly decreases to F1, then slowly increases back to normal swimming speed |
F7 | If Down is pressed. | |
E8 | If Up is pressed. | |
Swimming with Enguarde | 1E | While descending. |
E2 | While ascending. | |
Climbing | 0F/F1 | When not holding B. |
19/E7 | When holding B. | |
Toboggan | 6E | |
Jumping in Toboggan | C3 | As is always the case with jumping, this value increases until it reaches gravity speed. |
Jumping on enemy in Toboggan | 9F |
Note: For both vertical and horizontal velocity, both of these bytes are signed integers. Anything less than 00 (i.e. 80-FF) will be negative; for horizontal velocity, this will be to the left, and for vertical velocity, this will be up. Anything more than 00 (i.e. 01-7F) will be positive; for horizontal velocity, this will be to the right, and for vertical velocity, this will be down. 00 is stationary.
80 is the fastest speed for left or upward movement; 7F is the fastest speed for right or downward movement.
Internal Data for Donkey Kong Land III
| |
---|---|