Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 18 additions & 112 deletions src/mars_patcher/constants/game_data.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from mars_patcher.rom import Game, Region, Rom
from mars_patcher.zm.constants.reserved_space import ReservedPointersZM


def area_room_entry_ptrs(rom: Rom) -> int:
Expand All @@ -13,14 +14,7 @@ def area_room_entry_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77D5C0
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x75FAC4
elif rom.region == Region.E:
return 0x773964
elif rom.region == Region.J:
return 0x75FBD4
elif rom.region == Region.C:
return 0x79ECBC
return rom.read_ptr(ReservedPointersZM.ROOM_AREA_ENTRIES_PTR)

raise ValueError("Rom has unknown game loaded.")

Expand All @@ -37,14 +31,7 @@ def tileset_entries(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x3C1E94
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x33DFDC
elif rom.region == Region.E:
return 0x33EC68
elif rom.region == Region.J:
return 0x33E038
elif rom.region == Region.C:
return 0x3577C8
return rom.read_ptr(ReservedPointersZM.TILESET_ENTRIES_PTR)

raise ValueError("Rom has unknown game loaded.")

Expand All @@ -70,14 +57,7 @@ def area_doors_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77D598
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x75FAA8
elif rom.region == Region.E:
return 0x773948
elif rom.region == Region.J:
return 0x75FBB8
elif rom.region == Region.C:
return 0x79ECA0
return rom.read_ptr(ReservedPointersZM.AREA_DOORS_PTR)

raise ValueError("Rom has unknown game loaded.")

Expand All @@ -94,14 +74,7 @@ def area_connections(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x3CB19C
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x360274
elif rom.region == Region.E:
return 0x360F00
elif rom.region == Region.J:
return 0x3602D0
elif rom.region == Region.C:
return 0x379A60
return rom.read_ptr(ReservedPointersZM.AREA_CONNECTIONS_PTR)

raise ValueError("Rom has unknown game loaded.")

Expand All @@ -128,14 +101,7 @@ def anim_palette_entries(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x3E5D7C
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x35FBFC
elif rom.region == Region.E:
return 0x360888
elif rom.region == Region.J:
return 0x35FC58
elif rom.region == Region.C:
return 0x3793E8
return rom.read_ptr(ReservedPointersZM.ANIM_PALETTE_ENTRIES_PTR)

raise ValueError("Rom has unknown game loaded.")

Expand Down Expand Up @@ -164,14 +130,7 @@ def sprite_graphics_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77C2DC
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x75EBF8
elif rom.region == Region.E:
return 0x772A98
elif rom.region == Region.J:
return 0x75ED08
elif rom.region == Region.C:
return 0x79DDF0
return rom.read_ptr(ReservedPointersZM.SPRITE_GRAPHICS_PTR)
raise ValueError(rom.game, rom.region)


Expand All @@ -187,14 +146,7 @@ def sprite_palette_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77C5D8
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x75EEF0
elif rom.region == Region.E:
return 0x772D90
elif rom.region == Region.J:
return 0x75F000
elif rom.region == Region.C:
return 0x79E0E8
return rom.read_ptr(ReservedPointersZM.SPRITE_PALETTES_PTR)
raise ValueError(rom.game, rom.region)


Expand All @@ -219,14 +171,7 @@ def spriteset_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77CADC
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x75F31C
elif rom.region == Region.E:
return 0x7731BC
elif rom.region == Region.J:
return 0x75F42C
elif rom.region == Region.C:
return 0x79E514
return rom.read_ptr(ReservedPointersZM.SPRITESET_PTR)
raise ValueError(rom.game, rom.region)


Expand All @@ -251,14 +196,8 @@ def samus_palettes(rom: Rom) -> list[tuple[int, int]]:
elif rom.region == Region.C:
return [(0x2900C8, 0x5E), (0x290E48, 0x70), (0x56CC68, 3)]
elif rom.game == Game.ZM:
if rom.region == Region.U:
return [(0x2376A8, 0xA3)]
elif rom.region == Region.E:
return [(0x238334, 0xA3)]
elif rom.region == Region.J:
return [(0x237704, 0xA3)]
elif rom.region == Region.C:
return [(0x250E94, 0xA3)]
addr = rom.read_ptr(ReservedPointersZM.AREA_DOORS_PTR)
return [(addr, 0xA3)]
raise ValueError(rom.game, rom.region)


Expand All @@ -277,14 +216,8 @@ def helmet_cursor_palettes(rom: Rom) -> list[tuple[int, int]]:
elif rom.region == Region.C:
return [(0x6CE360, 1), (0x6CE400, 2), (0x6CA8F8, 1), (0x6CA938, 2)]
elif rom.game == Game.ZM:
if rom.region == Region.U:
return [(0x454938, 1), (0x4549B8, 1)]
elif rom.region == Region.E:
return [(0x4603F8, 1), (0x460478, 1)]
elif rom.region == Region.J:
return [(0x454994, 1), (0x454A14, 1)]
elif rom.region == Region.C:
return [(0x4768FC, 1), (0x47697C, 1)]
addr = rom.read_ptr(ReservedPointersZM.HELMET_CURSOR_PALETTES_PTR)
return [(addr, 1), (addr + 0x80, 1)]
raise ValueError(rom.game, rom.region)


Expand All @@ -300,14 +233,8 @@ def beam_palettes(rom: Rom) -> list[tuple[int, int]]:
elif rom.region == Region.C:
return [(0x592578, 6)]
elif rom.game == Game.ZM:
if rom.region == Region.U:
return [(0x3270E8, 6)]
elif rom.region == Region.E:
return [(0x327D74, 6)]
elif rom.region == Region.J:
return [(0x327144, 6)]
elif rom.region == Region.C:
return [(0x3408D4, 6)]
addr = rom.read_ptr(ReservedPointersZM.BEAM_PALETTES_PTR)
return [(addr, 6)]
raise ValueError(rom.game, rom.region)


Expand All @@ -323,14 +250,7 @@ def character_widths(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x57D21C
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x40D7B0
elif rom.region == Region.E:
return 0x40E5E4
elif rom.region == Region.J:
return 0x40D80C
elif rom.region == Region.C:
return 0x42F34C
return rom.read_ptr(ReservedPointersZM.CHARACTER_WIDTHS_PTR)
raise ValueError(rom.game, rom.region)


Expand All @@ -346,14 +266,7 @@ def sound_data_entries(rom: Rom) -> int:
elif rom.region == Region.C:
return 0xAB0E4
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x8F2C0
elif rom.region == Region.E:
return 0x8FF4C
elif rom.region == Region.J:
return 0x8F31C
elif rom.region == Region.C:
return 0xA8AAC
return rom.read_ptr(ReservedPointersZM.SOUND_DATA_PTR)
raise ValueError(rom.game, rom.region)


Expand All @@ -378,14 +291,7 @@ def minimap_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77DB60
elif rom.game == Game.ZM:
if rom.region == Region.U:
return 0x7601EC
elif rom.region == Region.E:
return 0x77408C
elif rom.region == Region.J:
return 0x7602FC
elif rom.region == Region.C:
return 0x79F3EC
return rom.read_ptr(ReservedPointersZM.MINIMAPS_PTR)
raise ValueError(rom.game, rom.region)


Expand Down
2 changes: 1 addition & 1 deletion src/mars_patcher/mf/constants/reserved_space.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
class ReservedConstants:
class ReservedConstantsMF:
"""
These are constants that are in the patches 'Reserved Space';
things that are intended to be modified by this patcher.
Expand Down
18 changes: 9 additions & 9 deletions src/mars_patcher/mf/item_patcher.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from mars_patcher.mf.auto_generated_types import MarsschemamfTankincrements
from mars_patcher.mf.constants.reserved_space import ReservedConstants
from mars_patcher.mf.constants.reserved_space import ReservedConstantsMF
from mars_patcher.mf.locations import (
ItemMessages,
ItemMessagesKind,
Expand All @@ -12,16 +12,16 @@
from mars_patcher.text import Language, MessageType, encode_text
from mars_patcher.tileset import Tileset

MINOR_LOCS_TABLE_ADDR = ReservedConstants.MINOR_LOCS_TABLE_ADDR
MINOR_LOCS_ARRAY_ADDR = ReservedConstants.MINOR_LOCS_ARRAY_ADDR
MINOR_LOCS_TABLE_ADDR = ReservedConstantsMF.MINOR_LOCS_TABLE_ADDR
MINOR_LOCS_ARRAY_ADDR = ReservedConstantsMF.MINOR_LOCS_ARRAY_ADDR
MINOR_LOC_SIZE = 0x10
MAJOR_LOCS_POINTER_ADDR = ReservedConstants.MAJOR_LOCS_POINTER_ADDR
MAJOR_LOCS_POINTER_ADDR = ReservedConstantsMF.MAJOR_LOCS_POINTER_ADDR
MAJOR_LOC_SIZE = 0x4
TANK_INC_ADDR = ReservedConstants.TANK_INC_ADDR
REQUIRED_METROID_COUNT_ADDR = ReservedConstants.REQUIRED_METROID_COUNT_ADDR
TOTAL_METROID_COUNT_ADDR = ReservedConstants.TOTAL_METROID_COUNT_ADDR
MESSAGE_TABLE_LOOKUP_ADDR = ReservedConstants.MESSAGE_TABLE_LOOKUP_ADDR
FIRST_CUSTOM_MESSAGE_ID = ReservedConstants.FIRST_CUSTOM_MESSAGE_ID
TANK_INC_ADDR = ReservedConstantsMF.TANK_INC_ADDR
REQUIRED_METROID_COUNT_ADDR = ReservedConstantsMF.REQUIRED_METROID_COUNT_ADDR
TOTAL_METROID_COUNT_ADDR = ReservedConstantsMF.TOTAL_METROID_COUNT_ADDR
MESSAGE_TABLE_LOOKUP_ADDR = ReservedConstantsMF.MESSAGE_TABLE_LOOKUP_ADDR
FIRST_CUSTOM_MESSAGE_ID = ReservedConstantsMF.FIRST_CUSTOM_MESSAGE_ID
AUTO_MESSAGE_ID = 0xFF

TANK_CLIP = (0x62, 0x63, 0x68)
Expand Down
6 changes: 3 additions & 3 deletions src/mars_patcher/mf/misc_patches.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import mars_patcher.constants.game_data as gd
from mars_patcher.mf.constants.reserved_space import ReservedConstants
from mars_patcher.mf.constants.reserved_space import ReservedConstantsMF
from mars_patcher.mf.data import get_data_path
from mars_patcher.patching import BpsDecoder, IpsDecoder
from mars_patcher.rom import Rom
Expand Down Expand Up @@ -70,7 +70,7 @@ def disable_sound_effects(rom: Rom) -> None:


def change_missile_limit(rom: Rom, limit: int) -> None:
rom.write_8(rom.read_ptr(ReservedConstants.MISSILE_LIMIT_ADDR), limit)
rom.write_8(rom.read_ptr(ReservedConstantsMF.MISSILE_LIMIT_ADDR), limit)


def apply_unexplored_map(rom: Rom) -> None:
Expand All @@ -82,7 +82,7 @@ def apply_pbs_without_bombs(rom: Rom) -> None:


def apply_reveal_hidden_tiles(rom: Rom) -> None:
rom.write_8(rom.read_ptr(ReservedConstants.REVEAL_HIDDEN_TILES_ADDR), 1)
rom.write_8(rom.read_ptr(ReservedConstantsMF.REVEAL_HIDDEN_TILES_ADDR), 1)


def apply_reveal_unexplored_doors(rom: Rom) -> None:
Expand Down
4 changes: 2 additions & 2 deletions src/mars_patcher/mf/navigation_text.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from typing import TYPE_CHECKING

from mars_patcher.mf.constants.game_data import navigation_text_ptrs
from mars_patcher.mf.constants.reserved_space import ReservedConstants
from mars_patcher.mf.constants.reserved_space import ReservedConstantsMF
from mars_patcher.rom import Rom
from mars_patcher.text import Language, MessageType, encode_text

Expand Down Expand Up @@ -132,6 +132,6 @@ def apply_hint_security(
default_lock_name = "OPEN"
for location, offset in NavigationText.NAV_ROOM_ENUMS.items():
rom.write_8(
rom.read_ptr(ReservedConstants.HINT_SECURITY_LEVELS_ADDR) + offset.value,
rom.read_ptr(ReservedConstantsMF.HINT_SECURITY_LEVELS_ADDR) + offset.value,
NavStationLockType[locks.get(location, default_lock_name)].value,
)
4 changes: 2 additions & 2 deletions src/mars_patcher/mf/room_names.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from mars_patcher.mf.auto_generated_types import Areaid, MarsschemamfRoomnamesItem, Typeu8
from mars_patcher.mf.constants.reserved_space import ReservedConstants
from mars_patcher.mf.constants.reserved_space import ReservedConstantsMF
from mars_patcher.rom import Rom
from mars_patcher.text import MessageType, encode_text

ROOM_NAMES_TABLE_ADDR = ReservedConstants.ROOM_NAMES_TABLE_ADDR
ROOM_NAMES_TABLE_ADDR = ReservedConstantsMF.ROOM_NAMES_TABLE_ADDR


# Write Room Names to ROM
Expand Down
4 changes: 2 additions & 2 deletions src/mars_patcher/mf/starting.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
)
from mars_patcher.mf.constants.game_data import starting_equipment
from mars_patcher.mf.constants.items import BEAM_FLAGS, MISSILE_BOMB_FLAGS, SUIT_MISC_FLAGS
from mars_patcher.mf.constants.reserved_space import ReservedConstants
from mars_patcher.mf.constants.reserved_space import ReservedConstantsMF
from mars_patcher.rom import Rom
from mars_patcher.room_entry import RoomEntry

# Keep in sync with base patch
STARTING_LOC_ADDR = ReservedConstants.STARTING_LOCATION_ADDR
STARTING_LOC_ADDR = ReservedConstantsMF.STARTING_LOCATION_ADDR


def set_starting_location(rom: Rom, data: MarsschemamfStartinglocation) -> None:
Expand Down
16 changes: 12 additions & 4 deletions src/mars_patcher/rom.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from enum import Enum
from os import PathLike

from mars_patcher.mf.constants.reserved_space import ReservedConstants
from mars_patcher.mf.constants.reserved_space import ReservedConstantsMF
from mars_patcher.zm.constants.reserved_space import ReservedConstantsZM

BytesLike = bytes | bytearray

Expand Down Expand Up @@ -107,9 +108,9 @@ def __init__(self, path: str | PathLike[str]):
raise ValueError("Only compatible with the North American (U) version")
# Set free space address
if self.is_mf():
self.free_space_addr = ReservedConstants.PATCHER_FREE_SPACE_ADDR
self.free_space_addr = ReservedConstantsMF.PATCHER_FREE_SPACE_ADDR
elif self.is_zm():
raise NotImplementedError()
self.free_space_addr = ReservedConstantsZM.PATCHER_FREE_SPACE_ADDR

def is_mf(self) -> bool:
"""Returns true when the currently loaded game is Metroid Fusion."""
Expand Down Expand Up @@ -233,7 +234,14 @@ def reserve_free_space(self, size: int) -> int:
self.free_space_addr += 4 - remain
addr = self.free_space_addr
self.free_space_addr += size
if self.free_space_addr > ReservedConstants.PATCHER_FREE_SPACE_END:
# Check if past end of reserved space
if self.is_mf():
free_space_end = ReservedConstantsMF.PATCHER_FREE_SPACE_END
elif self.is_zm():
free_space_end = ReservedConstantsZM.PATCHER_FREE_SPACE_END
else:
raise ValueError(self.game)
if self.free_space_addr > free_space_end:
raise RuntimeError("Ran out of reserved free space")
return addr

Expand Down
6 changes: 3 additions & 3 deletions src/mars_patcher/titlescreen_text.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from mars_patcher.mf.auto_generated_types import MarsschemamfTitletextItem
from mars_patcher.mf.constants.reserved_space import ReservedConstants
from mars_patcher.mf.constants.reserved_space import ReservedConstantsMF
from mars_patcher.rom import Rom

TITLE_TEXT_POINTER_ADDR = ReservedConstants.TITLESCREEN_TEXT_POINTERS_POINTER_ADDR
TITLE_TEXT_POINTER_ADDR = ReservedConstantsMF.TITLESCREEN_TEXT_POINTERS_POINTER_ADDR
MAX_LENGTH = 30
MAX_LINES = 14

Expand Down Expand Up @@ -30,6 +30,6 @@ def write_title_text(rom: Rom, lines: list[MarsschemamfTitletextItem]) -> None:
def write_title_text_line(rom: Rom, line: MarsschemamfTitletextItem) -> None:
if len(line["Text"]) > 30:
raise ValueError(f'String for title-screen text exceeds 30 characters.\n"{line["Text"]}"')
text_pointers = rom.read_ptr(ReservedConstants.TITLESCREEN_TEXT_POINTERS_POINTER_ADDR)
text_pointers = rom.read_ptr(ReservedConstantsMF.TITLESCREEN_TEXT_POINTERS_POINTER_ADDR)
addr = rom.read_ptr(text_pointers + (line["LineNum"] * 4))
rom.write_bytes(addr, line["Text"].encode("ascii"))
Loading