Welcome to Data Crystal's new home! Data Crystal is now part of the TCRF family (sort of).
The wiki has recently moved; please report any issues in Discord. Pardon the dust.

EarthBound Zero/RAM map: Difference between revisions

From Data Crystal
Jump to navigation Jump to search
(I now know where the checksum is (but not what it is))
(the checksum is figured out!)
Line 30: Line 30:


=SRAM (save data)=
=SRAM (save data)=
The checksum is not figured out yet, so you can only edit things by using a save RAM editor on a live game, otherwise it will erase your save data.
===Unknown===
===Unknown===
* 0000-13FF: '''Unknown'''
* 0000-13FF: '''Unknown'''
===Checksum===
The 2-byte checksum is calculated by subtracting each byte after it (0x300 for each save, so 0x29E bytes to subtract), then running it through mod 0x10000.
Here is an example Python program that calculates it:
<pre>
def calculate_checksum(handle, base = 0x1700):
    handle.seek(base)
    checksum = int.from_bytes(handle.read(2), "little")
    calculated_checksum = 0x0
    for number in range(0x300 - 0x2):
        calculated_checksum = (calculated_checksum - int.from_bytes(handle.read(2), "little")) % 0x100 ** 2
    return calculated_checksum
calculate_checksum(open("file.sav", "rb"))
</pre>
* 1400-1401: Checksum
===Main data===
===Main data===
* 1400-1401: Checksum
*:The algorithm is unknown.
* 1402-1403: '''Unknown'''
* 1402-1403: '''Unknown'''
* 1404-1407: Position
* 1404-1407: Position

Revision as of 18:36, 27 September 2023

Chip tiny.png The following article is a RAM map for EarthBound Zero.

RAM

RAM Purpose
0x0006 Part of an instruction for "copy protection". $E5 on checksum failure. $00 to bypass. "Correct"/non-hack value unknown.
0x0015 Used for assigning area to objects?
0x0060 HP target value for stat increase during level up
0x0611 Looks like the first EXP byte, but changing it even mid-battle will result in insta-death. Anti-cheat?
0x0818-B The X and Y coordinates, stored strangely; see below

Coordinates

The coordinates in RAM to not correspond to coordinates in the rest of the game. To convert it, run this Python code (in this example, bytes $818-B are `80 19 C0 2D`):

# replace with the values from the RAM
ram_x = 0x1980
ram_y = 0x2dc0

real_x = ((byte1 << 8) | (byte0 & 0xC0)) >> 2
real_y = ((byte3 << 8) | (byte2 & 0xC0) - 0x2000) >> 2

SRAM (save data)

Unknown

  • 0000-13FF: Unknown

Checksum

The 2-byte checksum is calculated by subtracting each byte after it (0x300 for each save, so 0x29E bytes to subtract), then running it through mod 0x10000. Here is an example Python program that calculates it:

def calculate_checksum(handle, base = 0x1700):
    handle.seek(base)
    checksum = int.from_bytes(handle.read(2), "little")
    calculated_checksum = 0x0
    for number in range(0x300 - 0x2):
        calculated_checksum = (calculated_checksum - int.from_bytes(handle.read(2), "little")) % 0x100 ** 2
    return calculated_checksum
calculate_checksum(open("file.sav", "rb"))
  • 1400-1401: Checksum

Main data

  • 1402-1403: Unknown
  • 1404-1407: Position
  • 1408-140B: Current party members
    Each number corresponds to an ally in Ally data, 0 means empty and skips to the next value.
  • 140C-140F: Unknown
  • 1410-1411: Current money
  • 1412-1414: Money in bank
  • 1415-141F: Unknown
  • 1420-1430: Your name (the player name, not Ninten's name)
  • 1431-143F: Unknown

Ally status

This is documented below.

  • 1440-147F: Ninten
  • 1480-14BF: Ana
  • 14C0-14FF: Lloyd
  • 1500-153F: Teddy
  • 1540-157F: Pippi
  • 1580-15BF: EVE
  • 15C0-15FF: Flying Man

Other

  • 1600-1688: Unknown
  • 1689-1983: Favorite food name
  • 1984-16AF: Unknown
  • 16B0-16CF: Items in storage

Unknown

  • 16D0-1FF0: Other

Ally state

Each ally's state is stored at a place corresponding to the character, see the above section

  • 00: Unknown (unused?)
  • 01: Status condition
    • Bit 0: Cold
    • Bit 1: Poisoned
    • Bit 2: Puzzled
    • Bit 3: Confused
    • Bit 4: Sleeping
    • Bit 5: Paralyzed
    • Bit 6: Stone
    • Bit 7: Unconscious (can be applied even when HP isn't at 0)
  • 02: Unknown
  • 03-04: Max HP
  • 05-06: Max PP
  • 07-08: Offense
  • 09-0A: Defense
  • 0B: Fight
  • 0C: Speed
  • 0D: Wisdom
  • 0E: Strength
  • 0F: Force
  • 10: Level
  • 11-13: Experience
  • 14-15: Current HP
  • 16-17: Current PP
  • 18-19: Unknown
  • 20-27: Items
  • 28: Weapon
  • 29: Coin
  • 2A: Ring
  • 2B: Pendant
  • 30-37: Learned PSI
  • 38-3E: Name
  • 3F: Unknown (unused?)