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
28 changes: 14 additions & 14 deletions src/mars_patcher/constants/game_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def area_room_entry_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77D5C0
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.ROOM_AREA_ENTRIES_PTR)
return rom.read_ptr(ReservedPointersZM.ROOM_AREA_ENTRIES_PTR.value)

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

Expand All @@ -31,7 +31,7 @@ def tileset_entries(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x3C1E94
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.TILESET_ENTRIES_PTR)
return rom.read_ptr(ReservedPointersZM.TILESET_ENTRIES_PTR.value)

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

Expand All @@ -57,7 +57,7 @@ def area_doors_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77D598
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.AREA_DOORS_PTR)
return rom.read_ptr(ReservedPointersZM.AREA_DOORS_PTR.value)

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

Expand All @@ -74,7 +74,7 @@ def area_connections(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x3CB19C
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.AREA_CONNECTIONS_PTR)
return rom.read_ptr(ReservedPointersZM.AREA_CONNECTIONS_PTR.value)

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

Expand All @@ -101,7 +101,7 @@ def anim_palette_entries(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x3E5D7C
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.ANIM_PALETTE_ENTRIES_PTR)
return rom.read_ptr(ReservedPointersZM.ANIM_PALETTE_ENTRIES_PTR.value)

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

Expand Down Expand Up @@ -130,7 +130,7 @@ def sprite_graphics_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77C2DC
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.SPRITE_GRAPHICS_PTR)
return rom.read_ptr(ReservedPointersZM.SPRITE_GRAPHICS_PTR.value)
raise ValueError(rom.game, rom.region)


Expand All @@ -146,7 +146,7 @@ def sprite_palette_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77C5D8
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.SPRITE_PALETTES_PTR)
return rom.read_ptr(ReservedPointersZM.SPRITE_PALETTES_PTR.value)
raise ValueError(rom.game, rom.region)


Expand All @@ -171,7 +171,7 @@ def spriteset_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77CADC
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.SPRITESET_PTR)
return rom.read_ptr(ReservedPointersZM.SPRITESET_PTR.value)
raise ValueError(rom.game, rom.region)


Expand All @@ -196,7 +196,7 @@ 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:
addr = rom.read_ptr(ReservedPointersZM.AREA_DOORS_PTR)
addr = rom.read_ptr(ReservedPointersZM.AREA_DOORS_PTR.value)
return [(addr, 0xA3)]
raise ValueError(rom.game, rom.region)

Expand All @@ -216,7 +216,7 @@ 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:
addr = rom.read_ptr(ReservedPointersZM.HELMET_CURSOR_PALETTES_PTR)
addr = rom.read_ptr(ReservedPointersZM.HELMET_CURSOR_PALETTES_PTR.value)
return [(addr, 1), (addr + 0x80, 1)]
raise ValueError(rom.game, rom.region)

Expand All @@ -233,7 +233,7 @@ def beam_palettes(rom: Rom) -> list[tuple[int, int]]:
elif rom.region == Region.C:
return [(0x592578, 6)]
elif rom.game == Game.ZM:
addr = rom.read_ptr(ReservedPointersZM.BEAM_PALETTES_PTR)
addr = rom.read_ptr(ReservedPointersZM.BEAM_PALETTES_PTR.value)
return [(addr, 6)]
raise ValueError(rom.game, rom.region)

Expand All @@ -250,7 +250,7 @@ def character_widths(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x57D21C
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.CHARACTER_WIDTHS_PTR)
return rom.read_ptr(ReservedPointersZM.CHARACTER_WIDTHS_PTR.value)
raise ValueError(rom.game, rom.region)


Expand All @@ -266,7 +266,7 @@ def sound_data_entries(rom: Rom) -> int:
elif rom.region == Region.C:
return 0xAB0E4
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.SOUND_DATA_PTR)
return rom.read_ptr(ReservedPointersZM.SOUND_DATA_PTR.value)
raise ValueError(rom.game, rom.region)


Expand All @@ -291,7 +291,7 @@ def minimap_ptrs(rom: Rom) -> int:
elif rom.region == Region.C:
return 0x77DB60
elif rom.game == Game.ZM:
return rom.read_ptr(ReservedPointersZM.MINIMAPS_PTR)
return rom.read_ptr(ReservedPointersZM.MINIMAPS_PTR.value)
raise ValueError(rom.game, rom.region)


Expand Down
53 changes: 53 additions & 0 deletions src/mars_patcher/item_messages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
from dataclasses import dataclass
from enum import Enum, auto
from typing import ClassVar

from frozendict import frozendict
from typing_extensions import Self

from mars_patcher.mf.auto_generated_types import Itemmessages
from mars_patcher.text import Language


class ItemMessagesKind(Enum):
CUSTOM_MESSAGE = auto()
MESSAGE_ID = auto()


@dataclass(frozen=True)
class ItemMessages:
kind: ItemMessagesKind
item_messages: frozendict[Language, str]
centered: bool
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

now that i see this: i suppose it doesnt make much sense to e.g. have english centered, but not german? (or in other words, have the centered variable be per lang)

message_id: int

LANG_ENUMS: ClassVar[dict[str, Language]] = {
"JapaneseKanji": Language.JAPANESE_KANJI,
"JapaneseHiragana": Language.JAPANESE_HIRAGANA,
"English": Language.ENGLISH,
"German": Language.GERMAN,
"French": Language.FRENCH,
"Italian": Language.ITALIAN,
"Spanish": Language.SPANISH,
}

KIND_ENUMS: ClassVar[dict[str, ItemMessagesKind]] = {
"CustomMessage": ItemMessagesKind.CUSTOM_MESSAGE,
"MessageID": ItemMessagesKind.MESSAGE_ID,
}

@classmethod
def from_json(cls, data: Itemmessages) -> Self:
item_messages: dict[Language, str] = {}
centered = True
kind: ItemMessagesKind = cls.KIND_ENUMS[data["Kind"]]
message_id = 0
if kind == ItemMessagesKind.CUSTOM_MESSAGE:
for lang_name, message in data["Languages"].items():
lang = cls.LANG_ENUMS[lang_name]
item_messages[lang] = message
centered = data.get("Centered", True)
else:
message_id = data["MessageID"]

return cls(kind, frozendict(item_messages), centered, message_id)
9 changes: 0 additions & 9 deletions src/mars_patcher/mf/constants/items.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,18 +114,9 @@ class ItemSprite(Enum):
KEY_ITEM: Final = "Item"
KEY_ITEM_SPRITE: Final = "ItemSprite"
KEY_ITEM_MESSAGES: Final = "ItemMessages"
KEY_ITEM_MESSAGES_KIND: Final = "Kind"
KEY_LANGUAGES: Final = "Languages"
KEY_CENTERED: Final = "Centered"
KEY_MESSAGE_ID: Final = "MessageID"
KEY_ITEM_JINGLE: Final = "Jingle"


class ItemMessagesKind(Enum):
CUSTOM_MESSAGE = 0
MESSAGE_ID = 1


class ItemJingle(Enum):
MINOR = 0
MAJOR = 1
Expand Down
2 changes: 1 addition & 1 deletion src/mars_patcher/mf/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@


def get_data_path(*path: str | os.PathLike) -> str:
return os.fspath(Path(__file__).parent.joinpath("mf", "data", *path))
return os.fspath(Path(__file__).parent.joinpath("data", *path))
6 changes: 1 addition & 5 deletions src/mars_patcher/mf/door_locks.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,11 +188,7 @@ def factory() -> dict:

# Map tiles
if lock is not None:
screen_offset_x = (hatch_x - 2) // 15
screen_offset_y = (hatch_y - 2) // 10

minimap_x = room_entry.map_x + screen_offset_x
minimap_y = room_entry.map_y + screen_offset_y
minimap_x, minimap_y = room_entry.map_coords_at_block(hatch_x, hatch_y)

minimap_areas = [area]
if area == 0:
Expand Down
3 changes: 1 addition & 2 deletions src/mars_patcher/mf/item_patcher.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
from mars_patcher.item_messages import ItemMessages, ItemMessagesKind
from mars_patcher.mf.auto_generated_types import MarsschemamfTankincrements
from mars_patcher.mf.constants.reserved_space import ReservedConstantsMF
from mars_patcher.mf.locations import (
ItemMessages,
ItemMessagesKind,
ItemSprite,
ItemType,
LocationSettings,
Expand Down
60 changes: 5 additions & 55 deletions src/mars_patcher/mf/locations.py
Original file line number Diff line number Diff line change
@@ -1,44 +1,33 @@
from __future__ import annotations

import json
from dataclasses import dataclass
from typing import TYPE_CHECKING, ClassVar

from frozendict import frozendict
from typing_extensions import Self

from mars_patcher.item_messages import ItemMessages
from mars_patcher.mf.auto_generated_types import MarsschemamfLocations
from mars_patcher.mf.constants.items import (
ITEM_ENUMS,
ITEM_SPRITE_ENUMS,
JINGLE_ENUMS,
KEY_AREA,
KEY_BLOCK_X,
KEY_BLOCK_Y,
KEY_CENTERED,
KEY_HIDDEN,
KEY_ITEM,
KEY_ITEM_JINGLE,
KEY_ITEM_MESSAGES,
KEY_ITEM_MESSAGES_KIND,
KEY_ITEM_SPRITE,
KEY_LANGUAGES,
KEY_MAJOR_LOCS,
KEY_MESSAGE_ID,
KEY_MINOR_LOCS,
KEY_ORIGINAL,
KEY_ROOM,
KEY_SOURCE,
SOURCE_ENUMS,
ItemJingle,
ItemMessagesKind,
ItemSprite,
ItemType,
MajorSource,
)
from mars_patcher.mf.data import get_data_path
from mars_patcher.text import Language

if TYPE_CHECKING:
from mars_patcher.mf.auto_generated_types import Itemmessages, MarsschemamfLocations


class Location:
Expand Down Expand Up @@ -99,52 +88,13 @@ def __init__(
self.item_jingle = item_jingle


@dataclass(frozen=True)
class ItemMessages:
kind: ItemMessagesKind
item_messages: frozendict[Language, str]
centered: bool
message_id: int

LANG_ENUMS: ClassVar[dict[str, Language]] = {
"JapaneseKanji": Language.JAPANESE_KANJI,
"JapaneseHiragana": Language.JAPANESE_HIRAGANA,
"English": Language.ENGLISH,
"German": Language.GERMAN,
"French": Language.FRENCH,
"Italian": Language.ITALIAN,
"Spanish": Language.SPANISH,
}

KIND_ENUMS: ClassVar[dict[str, ItemMessagesKind]] = {
"CustomMessage": ItemMessagesKind.CUSTOM_MESSAGE,
"MessageID": ItemMessagesKind.MESSAGE_ID,
}

@classmethod
def from_json(cls, data: Itemmessages) -> ItemMessages:
item_messages: dict[Language, str] = {}
centered = True
kind: ItemMessagesKind = cls.KIND_ENUMS[data[KEY_ITEM_MESSAGES_KIND]]
message_id = 0
if kind == ItemMessagesKind.CUSTOM_MESSAGE:
for lang_name, message in data[KEY_LANGUAGES].items():
lang = cls.LANG_ENUMS[lang_name]
item_messages[lang] = message
centered = data.get(KEY_CENTERED, True)
else:
message_id = data[KEY_MESSAGE_ID]

return cls(kind, frozendict(item_messages), centered, message_id)


class LocationSettings:
def __init__(self, major_locs: list[MajorLocation], minor_locs: list[MinorLocation]):
self.major_locs = major_locs
self.minor_locs = minor_locs

@classmethod
def initialize(cls) -> LocationSettings:
def initialize(cls) -> Self:
with open(get_data_path("locations.json")) as f:
data = json.load(f)

Expand All @@ -170,7 +120,7 @@ def initialize(cls) -> LocationSettings:
)
minor_locs.append(minor_loc)

return LocationSettings(major_locs, minor_locs)
return cls(major_locs, minor_locs)

def set_assignments(self, data: MarsschemamfLocations) -> None:
for maj_loc_entry in data[KEY_MAJOR_LOCS]:
Expand Down
4 changes: 1 addition & 3 deletions src/mars_patcher/rom.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,7 @@ def __init__(self, path: str | PathLike[str]):
self.game = game
self.region = region

# For now we only allow MF U
if self.game == Game.ZM:
raise ValueError("Not compatible with Metroid Zero Mission")
# For now we only allow (U) version
if self.region != Region.U:
raise ValueError("Only compatible with the North American (U) version")
# Set free space address
Expand Down
5 changes: 5 additions & 0 deletions src/mars_patcher/room_entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ def map_x(self) -> int:
def map_y(self) -> int:
return self.rom.read_8(self.addr + 0x36)

def map_coords_at_block(self, block_x: int, block_y: int) -> tuple[int, int]:
x = self.map_x + ((block_x - 2) // 15)
y = self.map_y + ((block_y - 2) // 10)
return x, y


class BlockLayer:
def __enter__(self) -> BlockLayer:
Expand Down
Loading