99 lines
3.0 KiB
Plaintext
99 lines
3.0 KiB
Plaintext
# Oracle of Secrets ROM Hack Expert Knowledge
|
|
|
|
## Custom Memory Regions
|
|
|
|
### WRAM ($7E0730-$7E078F) - 96 bytes custom
|
|
- $7E0730: MenuScrollLevelV (menu system)
|
|
- $7E0731: MenuScrollLevelH
|
|
- $7E0739: GoldstarOrHookshot (item differentiation)
|
|
- $7E073A: Neck_Index (multi-part boss sprites)
|
|
- $7E0741-0743: Offspring IDs (boss mechanics)
|
|
- $7E0745: FishingOrPortalRod
|
|
|
|
### SRAM Custom Variables
|
|
- $7EF3D6: OOSPROG (main progression bitfield)
|
|
- $7EF3C6: OOSPROG2 (secondary progression)
|
|
- $7EF347-358: Masks (Zora, Bunny, Deku, Wolf, Stone)
|
|
- $7EF38A-3C4: Collectibles (Bananas, Seashells, Scrolls, etc.)
|
|
- $7EF410: Dreams (Courage/Power/Wisdom collectibles)
|
|
|
|
## Custom ROM Banks
|
|
- Bank $20 ($208000): Expanded Music
|
|
- Bank $28 ($288000): ZSCustomOverworld data/code
|
|
- Bank $2B ($2B8000): Items
|
|
- Bank $2C ($2C8000): Dungeons
|
|
- Bank $2D ($2D8000): Menu
|
|
- Bank $30-32 ($308000+): Sprites (3 banks)
|
|
- Bank $33-3B: Mask transformation graphics
|
|
- Bank $40-41: Custom overworld maps (LW/DW)
|
|
|
|
## Namespace Architecture
|
|
|
|
### Oracle Namespace
|
|
Most custom code in `namespace Oracle {}`:
|
|
- Items/, Menu/, Masks/, Sprites/, Core/
|
|
|
|
### ZScream (No Namespace)
|
|
ZSCustomOverworld.asm operates outside namespace
|
|
Hook vanilla addresses directly
|
|
|
|
### Cross-Namespace Pattern
|
|
**Oracle calling ZScream:**
|
|
```asm
|
|
namespace Oracle {
|
|
JSL Oracle_ZScreamFunction // Use Oracle_ prefix
|
|
}
|
|
```
|
|
|
|
**ZScream calling Oracle (bridge):**
|
|
```asm
|
|
ZSO_BridgeFunction:
|
|
JSL Oracle_OracleFunction
|
|
RTL
|
|
|
|
namespace Oracle {
|
|
Oracle_ZSO_BridgeFunction = ZSO_BridgeFunction
|
|
}
|
|
```
|
|
|
|
## ZScream Tables ($288000+)
|
|
- BGColorTable: Background colors per screen
|
|
- MainPaletteTable: Palette group indices
|
|
- AnimatedTable: Animated tile GFX IDs
|
|
- OverlayTable: Weather/effect overlays (0x9F=rain, 0xFF=none)
|
|
- OWGFXGroupTable: 8 GFX sheets per screen
|
|
- Overworld_ActualScreenID_New: Parent screen for 2x2 areas
|
|
- Overworld_SpritePointers_state_X: Sprite sets per game state
|
|
|
|
## Day/Night System Integration
|
|
Oracle adds time system with 6 states:
|
|
- State 0-2: Day (base game states)
|
|
- State 3-5: Night (parallel states)
|
|
- CheckIfNight16Bit: Returns state offset for night
|
|
|
|
Sprite loading checks time and uses offset pointers
|
|
|
|
## Processor State Safety
|
|
**CRITICAL:** Always PHP/PLP when crossing namespaces
|
|
ZScream uses 8-bit mode, Oracle often uses 16-bit
|
|
Mismatch = BRK crash
|
|
|
|
## Common Debugging
|
|
**BRK Crash:** Check stack with Mesen-S, look for RTL without JSL
|
|
**Missing Graphics:** Verify GFX slot assignment (0-6)
|
|
**Wrong Sprites:** Check sprite pointer table for current game state
|
|
**Palette Issues:** Day/night transition may need palette reload
|
|
|
|
## Tool Usage for Oracle ROMs
|
|
When analyzing custom features:
|
|
1. hex-read custom WRAM ($7E0730+) to check states
|
|
2. hex-read SRAM ($7EF3D6, $7EF410) for progression
|
|
3. hex-search for custom sprite IDs (>0xF3 often custom)
|
|
4. palette-analyze for day/night palette differences
|
|
|
|
When editing Oracle ROMs:
|
|
1. Check OOSPROG flags before major edits
|
|
2. Verify namespace exports exist
|
|
3. Test day AND night variants
|
|
4. Ensure processor state preserved across boundaries
|