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.

The Legend of Zelda: Oracle of Seasons/RAM map: Difference between revisions

From Data Crystal
Jump to navigation Jump to search
m (Testing gale seeds)
(Fully described $C6BB)
 
(4 intermediate revisions by the same user not shown)
Line 12: Line 12:
! '''Note'''
! '''Note'''
|-
|-
|'''$C5C0''' - '''$C5FF''' || || Unappraised rings carried ||
|'''$C5C0''' - '''$C5FF''' || 64 Bytes || Unappraised rings carried ||
|-
|-
|'''$C602''' - '''$C606''' || 5 Bytes || Player name ||
|'''$C602''' - '''$C606''' || 5 Bytes || Player name ||
Line 93: Line 93:
! '''Note'''
! '''Note'''
|-
|-
|Slay an Enemy || <code>0x03</code> ||
|Dig a Hole || <code>0x01</code> ||
|-
|Slay an Enemy || <code>0x03</code> || This excludes using gale seeds on enemies, and knocking them into water/holes.
|-
|-
|Collect a Heart || <code>0x04</code> ||
|Collect a Heart || <code>0x04</code> ||
Line 119: Line 121:
! '''Note'''
! '''Note'''
|-
|-
|'''$C662''' || 1 Byte || Has entered Hero's Cave || rowspan="9" | Exiting a sublevel or using a mini-boss warp in the corresponding level will also set these flags (though redundant).
|'''$C662''' || 1 Byte || Has entered Hero's Cave || rowspan="9" | Exiting a sublevel or using a mini-boss warp in the corresponding level will also set these flags (though redundant).<br /><br /><sub>[There's more to these addresses than originally thought. More exploration needed.]</sub>
|-
|-
|'''$C663''' || 1 Byte || Has entered Level 1: Gnarled Root Dungeon
|'''$C663''' || 1 Byte || Has entered Level 1: Gnarled Root Dungeon
Line 260: Line 262:
|-
|-
|'''$C6BB''' || 1 Byte || Essences ||
|'''$C6BB''' || 1 Byte || Essences ||
* <big>'''<code>0x01</code>'''</big>: <u>Fertile Soil</u>
* <big>'''<code>0x02</code>'''</big>: <u>Gift of Time</u>
* <big>'''<code>0x04</code>'''</big>: <u>Bright Sun</u>
* <big>'''<code>0x08</code>'''</big>: <u>Soothing Rain</u>
* <big>'''<code>0x10</code>'''</big>: <u>Nurturing Warmth</u>
* <big>'''<code>0x20</code>'''</big>: <u>Blowing Wind</u>
* <big>'''<code>0x40</code>'''</big>: <u>Seed of Life</u>
* <big>'''<code>0x80</code>'''</big>: <u>Changing Seasons</u><br /><br />
Each essence has a corresponding value associated with it, each value being double the value of the previous one, and the value of this address will be the sum of all the essences collected up to <code>0xFF</code>.
'''Example''': If the value of this address is <code>0x1F</code>, the collected essences will be <u>Fertile Soil</u>, <u>Gift of Time</u>, <u>Bright Sun</u>, <u>Soothing Rain</u>, and <u>Nurturing Warmth</u> (5/8 essences in sequence).
Any value in this address is valid, but many of them will not normally be used unless essences are collected out of sequence. Assuming all essences are collected in sequence, the value will progress as follows:
<center><big>'''<code>0x00</code>'''</big> -> <big>'''<code>0x01</code>'''</big> -> <big>'''<code>0x03</code>'''</big> -> <big>'''<code>0x07</code>'''</big> -> <big>'''<code>0x0F</code>'''</big> -> <big>'''<code>0x1F</code>'''</big> -> <big>'''<code>0x3F</code>'''</big> -> <big>'''<code>0x7F</code>'''</big> -> <big>'''<code>0xFF</code>'''</big></center>
|-
|-
|'''$C6CA''' || 1 Byte || Vasu Ring Flags || <big>'''<code>0x01</code>'''</big>: Slayed 1,000 Monsters — <u>Slayer's Ring</u><br /><big>'''<code>0x02</code>'''</big>: Collected 10,000 Rupees — <u>Rupee Ring</u><br /><big>'''<code>0x04</code>'''</big>: Saved the World — <u>Victory Ring</u><br /><br />
|'''$C6CA''' || 1 Byte || Vasu Ring Flags ||
Based on what events have occurred, the above values get added to this address. Collecting each corresponding ring then adds the corresponding value multiplied by 0x10 to this address.
* <big>'''<code>0x01</code>'''</big>: Slayed 1,000 Monsters — <u>Slayer's Ring</u>
* <big>'''<code>0x02</code>'''</big>: Collected 10,000 Rupees — <u>Rupee Ring</u>
* <big>'''<code>0x04</code>'''</big>: Saved the World — <u>Victory Ring</u><br /><br />
 
Based on what events have occurred, the above values get added to this address. Obtaining each corresponding ring from Vasu then adds the corresponding value multiplied by 0x10 to this address.





Latest revision as of 20:12, 4 July 2024

NOTE: All values in Tables are Hexadecimal unless noted otherwise.

Chip tiny.png The following article is a RAM map for The Legend of Zelda: Oracle of Seasons.

Bank 0 ($C000 - $CFFF)


TBD

RAM Length Purpose Note
$C5C0 - $C5FF 64 Bytes Unappraised rings carried
$C602 - $C606 5 Bytes Player name
$C616 - $C61D 8 Bytes Rings owned
$C61E - $C61F 2 Bytes Deaths
$C620 - $C621 2 Bytes Enemies killed since file creation When total killed enemies reaches 0x3E8, 0x01 is added to $C6CA to set a flag for Vasu to give the Slayer's Ring, and this no longer increments when killing enemies.
$C622 - $C625 4 Bytes Time passed since power-on
$C627 - $C628 2 Bytes Rupees earned since file creation Value is represented in decimal.

Example: If the total earned rupee count is 8,473, the hexadecimal representation will be 0x8473.

When a rupee gain pushes the value over 0x9999, the value is then set to 0x6363, the value will no longer change, and $C6CA is then incremented by 0x02 so that Vasu will give the Rupee Ring the next time he is spoken with.
$C629 1 Byte Message Speed 0x00 - 0x04

Some higher values yield hilarious results such as a letter appearing once per few seconds.
$C63A 1 Byte Current level bank
$C63B 1 Byte Current Absolute Overworld Screen

OR

Current Relative Dungeon Screen
On the overworld, all 256 map tiles are represented in order; left to right, top to bottom, 0x00 - 0xFF.


Inside a dungeon, only map tiles that are valid rooms are represented while empty map tiles are not counted; the only empty map tiles that are counted are the ones leading up to the first valid room in order, then from there, the value only increases with each valid room. Zelda OoS RAM C63B 01.png
$C63C 1 Byte Current Absolute Dungeon Screen Unlike with $C63B, all tiles on the dungeon map, including ones that do not represent a valid room, are counted in order; left to right, top to bottom, 0x00 - 0xFF.Zelda OoS RAM C63C 01.png



Enemies killed since...

RAM Length Purpose Note
$C63E 1 Byte Last Maple encounter
$C64C 1 Byte Gasha Seed planted at ??
$C64D 1 Byte Gasha Seed planted at ??
$C64E 1 Byte Gasha Seed planted at ??
$C64F 1 Byte Gasha Seed planted at ??
$C650 1 Byte Gasha Seed planted at ??
$C651 1 Byte Gasha Seed planted at ??
$C652 1 Byte Gasha Seed planted at ??
$C653 1 Byte Gasha Seed planted at ??
$C654 1 Byte Gasha Seed planted at ??
$C655 1 Byte Gasha Seed planted at ??
$C656 1 Byte Gasha Seed planted at K7
$C657 1 Byte Gasha Seed planted at ??
$C658 1 Byte Gasha Seed planted at ??
$C659 1 Byte Gasha Seed planted at ??
$C65A 1 Byte Gasha Seed planted at ??
$C65B 1 Byte Gasha Seed planted at M9



Mysterious Counter

$C65C - $C65D A counter for ??? for which various actions increment
Action Incrementation Note
Dig a Hole 0x01
Slay an Enemy 0x03 This excludes using gale seeds on enemies, and knocking them into water/holes.
Collect a Heart 0x04
Screen Transition 0x05 This excludes entering/exiting structures, or taking mini-boss warps in dungeons.
Collect a Fairy 0x18
Bomb a Wall 0x32
Great Fairy Heal 0x40
Collect a Heart Piece 0x64



Dungeon Things

RAM Length Purpose Note
$C662 1 Byte Has entered Hero's Cave Exiting a sublevel or using a mini-boss warp in the corresponding level will also set these flags (though redundant).

[There's more to these addresses than originally thought. More exploration needed.]
$C663 1 Byte Has entered Level 1: Gnarled Root Dungeon
$C664 1 Byte Has entered Level 2: Snake's Remains
$C665 1 Byte Has entered Level 3: Poison Moth's Lair (?)
$C666 1 Byte Has entered Level 4: Dancing Dragon Dungeon (?)
$C667 1 Byte Has entered Level 5: Unicorn's Cave (?)
$C668 1 Byte Has entered Level 6: Ancient Ruins (?)
$C669 1 Byte Has entered Level 7: Explorer's Crypt (?)
$C66A 1 Byte Has entered Level 8: Sword & Shield Maze (?)
$C66E 1 Byte Small Keys — Hero's Cave
$C66F 1 Byte Small Keys — Level 1: Gnarled Root Dungeon
$C670 1 Byte Small Keys — Level 2: Snake's Remains
$C671 1 Byte Small Keys — Level 3: Poison Moth's Lair
$C672 1 Byte Small Keys — Level 4: Dancing Dragon Dungeon
$C673 1 Byte Small Keys — Level 5: Unicorn's Cave
$C674 1 Byte Small Keys — Level 6: Ancient Ruins
$C675 1 Byte Small Keys — Level 7: Explorer's Crypt
$C676 1 Byte Small Keys — Level 8: Sword & Shield Maze
$C67A 1 Byte Has Big Key(s)
$C67C 1 Byte Has Compass(s)
$C67E 1 Byte Has Dungeon Map(s)



Items

RAM Length Purpose Note
$C680 1 Byte Item on B Button
$C681 1 Byte Item on A Button
$C682 1 Byte Inventory Slot 1
$C683 1 Byte Inventory Slot 2
$C684 1 Byte Inventory Slot 3
$C685 1 Byte Inventory Slot 4
$C686 1 Byte Inventory Slot 5
$C687 1 Byte Inventory Slot 6
$C688 1 Byte Inventory Slot 7
$C689 1 Byte Inventory Slot 8
$C68A 1 Byte Inventory Slot 9
$C68B 1 Byte Inventory Slot 10
$C68C 1 Byte Inventory Slot 11
$C68D 1 Byte Inventory Slot 12
$C68E 1 Byte Inventory Slot 13
$C68F 1 Byte Inventory Slot 14
$C690 1 Byte Inventory Slot 15
$C691 1 Byte Inventory Slot 16



RAM Length Purpose Note
$C6A2 1 Byte Current Hearts
$C6A3 1 Byte Max Hearts
$C6A5 - $C6A6 2 Bytes Rupees Value is represented in decimal.

Example: If the total rupee count is 639, the hexadecimal representation will be 0x0639.
$C6A7 - $C6A8 2 Bytes Ore Chunks
$C6A9 1 Byte Shield level
$C6AA 1 Byte Current Bombs
$C6AC 1 Byte Sword level
$C6B1 1 Byte Boomerang level
$C6B3 1 Byte Slingshot level
$C6B4 1 Byte Roc's feather level
$C6B5 1 Byte Ember Seeds
$C6B6 1 Byte Scent Seeds
$C6B7 1 Byte Pegasus Seeds
$C6B8 1 Byte Gale Seeds
$C6B9 1 Byte Mystery Seeds
$C6BA 1 Byte Gasha Seeds
$C6BB 1 Byte Essences
  • 0x01: Fertile Soil
  • 0x02: Gift of Time
  • 0x04: Bright Sun
  • 0x08: Soothing Rain
  • 0x10: Nurturing Warmth
  • 0x20: Blowing Wind
  • 0x40: Seed of Life
  • 0x80: Changing Seasons

Each essence has a corresponding value associated with it, each value being double the value of the previous one, and the value of this address will be the sum of all the essences collected up to 0xFF.


Example: If the value of this address is 0x1F, the collected essences will be Fertile Soil, Gift of Time, Bright Sun, Soothing Rain, and Nurturing Warmth (5/8 essences in sequence).


Any value in this address is valid, but many of them will not normally be used unless essences are collected out of sequence. Assuming all essences are collected in sequence, the value will progress as follows:


0x00 -> 0x01 -> 0x03 -> 0x07 -> 0x0F -> 0x1F -> 0x3F -> 0x7F -> 0xFF


$C6CA 1 Byte Vasu Ring Flags
  • 0x01: Slayed 1,000 Monsters — Slayer's Ring
  • 0x02: Collected 10,000 Rupees — Rupee Ring
  • 0x04: Saved the World — Victory Ring

Based on what events have occurred, the above values get added to this address. Obtaining each corresponding ring from Vasu then adds the corresponding value multiplied by 0x10 to this address.


Example: If the value is 0x03, the player has collected 10,000 rupees and slayed 1,000 Monsters [0x02 + 0x01]. In this scenario, after the Rupee Ring is received, the value would then be 0x23 [0x03 + (0x02 * 0x10)], and then when the Slayers Ring is received, the value is 0x33 [0x23 + (0x01 * 0x10)].

Possible Values
# 1,000
Monsters
Slain
10,000
Rupees
Collected
Saved
the
World
Slayer's
Ring
Obtained
Rupee
Ring
Obtained
Victory
Ring
Obtained
VALUE
1 FALSE FALSE FALSE FALSE FALSE FALSE 0x00
2 TRUE FALSE FALSE FALSE FALSE FALSE 0x01
3 FALSE TRUE FALSE FALSE FALSE FALSE 0x02
4 TRUE TRUE FALSE FALSE FALSE FALSE 0x03
5 FALSE FALSE TRUE FALSE FALSE FALSE 0x04
6 TRUE FALSE TRUE FALSE FALSE FALSE 0x05
7 FALSE TRUE TRUE FALSE FALSE FALSE 0x06
8 TRUE TRUE TRUE FALSE FALSE FALSE 0x07
9 TRUE FALSE FALSE TRUE FALSE FALSE 0x11
10 TRUE TRUE FALSE TRUE FALSE FALSE 0x13
11 TRUE FALSE TRUE TRUE FALSE FALSE 0x15
12 TRUE TRUE TRUE TRUE FALSE FALSE 0x17
13 FALSE TRUE FALSE FALSE TRUE FALSE 0x22
14 TRUE TRUE FALSE FALSE TRUE FALSE 0x23
15 FALSE TRUE TRUE FALSE TRUE FALSE 0x26
16 TRUE TRUE TRUE FALSE TRUE FALSE 0x27
17 TRUE TRUE FALSE TRUE TRUE FALSE 0x33
18 TRUE TRUE TRUE TRUE TRUE FALSE 0x37
19 FALSE FALSE TRUE FALSE FALSE TRUE 0x44
20 TRUE FALSE TRUE FALSE FALSE TRUE 0x45
21 FALSE TRUE TRUE FALSE FALSE TRUE 0x46
22 TRUE TRUE TRUE FALSE FALSE TRUE 0x47
23 TRUE FALSE TRUE TRUE FALSE TRUE 0x55
24 TRUE TRUE TRUE TRUE FALSE TRUE 0x57
25 FALSE TRUE TRUE FALSE TRUE TRUE 0x66
26 TRUE TRUE TRUE FALSE TRUE TRUE 0x67
27 TRUE TRUE TRUE TRUE TRUE TRUE 0x77


$C6C6 1 Byte Ring Box level




TBD

RAM Length Purpose Note
$C700 - $C7FF 256 Bytes Overworld Screen Flags (used to track events and map exploration) To do: Specify which each address tracks.
$CC30 1 Byte Enemies left on screen
$CE00 - $CEAF Current Screen Collision Data Dynamically generated from the screen tile data. This space is also used as a temporary store for compressed level data read from ROM.
$CF00 - $CFAF Current Screen Tile Data



Unmapped

RAM Note
$C000 - $C5BF
$C600 - $C601
$C607 - $C615
$C620 - $C621
$C626
$C628 - $C639
$C63D
$C63F - $C64B
$C65E - $C661
$C66B - $C66C
$C677 - $C679
$C67B
$C67D
$C67F
$C692 - $C6A1
$C6A4
$C6AB
$C6AD - $C6B0
$C6B2
$C6BC - $C6C5
$C6C7 - $C6FF
$C800 - $CC2F
$CC31 - $CDFF
$CEB0 - $CEFF
$CFB0 - $CFFF