If you are still using the old URL (datacrystal.romhacking.net), please update your bookmarks! The old URL may stop working soon.
The current URL is datacrystal.tcrf.net.
The current URL is datacrystal.tcrf.net.
EarthBound Zero/RAM map: Difference between revisions
Jump to navigation
Jump to search
MOTHERrocks (talk | contribs) (the checksum is figured out!) |
MOTHERrocks (talk | contribs) No edit summary |
||
Line 71: | Line 71: | ||
* 1984-16AF: '''Unknown''' | * 1984-16AF: '''Unknown''' | ||
* 16B0-16CF: Items in storage | * 16B0-16CF: Items in storage | ||
* 16D0-16FF: '''Unknown''' | |||
===Unknown=== | ===Unknown=== | ||
* | * 1700-1FF0: Other | ||
==Ally state== | ==Ally state== | ||
Each ally's state is stored at a place corresponding to the character, see the above section | Each ally's state is stored at a place corresponding to the character, see the above section |
Revision as of 18:38, 27 September 2023
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
- 16D0-16FF: Unknown
Unknown
- 1700-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?)
Internal Data for EarthBound Zero
| |
---|---|