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
2 changes: 2 additions & 0 deletions src/mars_patcher/common_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,5 @@
AreaRoomPair = tuple[AreaId, RoomId]

MinimapId: TypeAlias = Annotated[int, "0 <= value < 10"]

MusicMapping: TypeAlias = types_mf.Musicmapping | types_zm.Musicmapping
65 changes: 65 additions & 0 deletions src/mars_patcher/mf/auto_generated_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,68 @@
'Italian',
'Spanish'
]
Validmusictracks = typ.Literal[
'UNUSED_1',
'AFTER_EVENT',
'SECTOR_1',
'SECTOR_2',
'SECTOR_3',
'SECTOR_5',
'SECTOR_4',
'SECTOR_6',
'NAVIGATION_ROOM',
'SECURITY_DATA_ROOM',
'ITEM_JINGLE',
'LOADING_SAVE',
'MESSAGE_POPUP',
'SA_X_APPEARANCE',
'SA_X_CHASE',
'BOSS_TENSION',
'ARACHNUS_BATTLE',
'ZAZABI_BATTLE',
'BOX_BATTLE',
'MAIN_DECK_AMBIENCE',
'UNUSED_1F',
'UNUSED_20',
'SILENCE_1_SHIP',
'TENSION',
'MAIN_DECK_LIVELY',
'OMEGA_METROID_DEFEATED',
'OPERATIONS_DECK',
'OPERATIONS_DECK_ELEVATOR_OFFLINE_SOUND_AND_AMBIENCE',
'X_INVASION_DETECTION',
'SA_X_ELEVATOR',
'HEADING_TO_NIGHTMARE_RIDLEY',
'OPERATIONS_DECK_ELEVATOR_OFFLINE_SOUND',
'OPERATIONS_DECK_ELEVATOR_OFFLINE_AMBIENCE',
'MAIN_BOILER_COOLDOWN_MISSION',
'STATION_ESCAPE',
'OBJECTIVE_COMPLETE',
'SECTOR_4_UNDERWATER',
'SECTOR_4_UNDERWATER_UNUSED',
'SERRIS_YAKUZA_BATTLE',
'VARIA_CORE_X_BATTLE',
'NIGHTMARE_BATTLE',
'NEO_RIDLEY_BATTLE',
'CHOZO_STATUE_CORE_X_BATTLE',
'NETTORI_BATTLE',
'PRE_TITLE_END',
'TITLE',
'SA_X_BATTLE',
'EPILOGUE_END',
'ENDING',
'EPILOGUE',
'DISQUIETING',
'SHOCK',
'SILENCE_1',
'MAIN_BOILER_OVERHEATING',
'FINAL_ORDER',
'SILENCE_2',
'INTRIGUE',
'UNUSED_5E',
'UNEASE'
]
Musicmapping: typ.TypeAlias = dict[Validmusictracks, Validmusictracks]
Messagelanguages: typ.TypeAlias = dict[Validlanguages, str]

class Itemmessages(typ.TypedDict, total=False):
Expand Down Expand Up @@ -572,6 +634,9 @@ class Marsschemamf(typ.TypedDict, total=False):
SeedHash: typ.Required[typ.Annotated[str, '/^[0-9A-Z]{8}$/']]
"""A seed hash that will be displayed on the file select screen."""

MusicReplacement: Musicmapping
"""Shuffles the in-game music."""

Locations: typ.Required[MarsschemamfLocations]
"""Specifies how the item locations in the game should be changed."""

Expand Down
78 changes: 78 additions & 0 deletions src/mars_patcher/mf/constants/music_library.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
from enum import IntEnum


# In-between spaces are null values
class MusicLibrary(IntEnum):
UNUSED_1 = 0x1 # Short track with mainly percussion

AFTER_EVENT = 0x3
SECTOR_1 = 0x4

SECTOR_2 = 0x6
SECTOR_3 = 0x7
SECTOR_5 = 0x8
SECTOR_4 = 0x9
SECTOR_6 = 0xA
NAVIGATION_ROOM = 0xB

SECURITY_DATA_ROOM = 0xF
ITEM_JINGLE = 0x10
LOADING_SAVE = 0x11

MESSAGE_POPUP = 0x14
SA_X_APPEARANCE = 0x15

SA_X_CHASE = 0x17
BOSS_TENSION = 0x18
ARACHNUS_BATTLE = 0x19
ZAZABI_BATTLE = 0x1A
BOX_BATTLE = 0x1B

MAIN_DECK_AMBIENCE = 0x1E
UNUSED_1F = 0x1F # Combination of MAIN_DECK_AMBIENCE and TENSION
UNUSED_20 = 0x20 # Dramatic track combined with MAIN_DECK_AMBIENCE

SILENCE_1_SHIP = 0x2A
TENSION = 0x2B
MAIN_DECK_LIVELY = 0x2C
OMEGA_METROID_DEFEATED = 0x2D
OPERATIONS_DECK = 0x2E
OPERATIONS_DECK_ELEVATOR_OFFLINE_SOUND_AND_AMBIENCE = 0x2F
X_INVASION_DETECTION = 0x30
SA_X_ELEVATOR = 0x31
HEADING_TO_NIGHTMARE_RIDLEY = 0x32
OPERATIONS_DECK_ELEVATOR_OFFLINE_SOUND = 0x33
OPERATIONS_DECK_ELEVATOR_OFFLINE_AMBIENCE = 0x34
MAIN_BOILER_COOLDOWN_MISSION = 0x35

STATION_ESCAPE = 0x38

OBJECTIVE_COMPLETE = 0x3B
SECTOR_4_UNDERWATER = 0x3C

SECTOR_4_UNDERWATER_UNUSED = 0x3E
SERRIS_YAKUZA_BATTLE = 0x3F
VARIA_CORE_X_BATTLE = 0x40
NIGHTMARE_BATTLE = 0x41
NEO_RIDLEY_BATTLE = 0x42
CHOZO_STATUE_CORE_X_BATTLE = 0x43
NETTORI_BATTLE = 0x44

PRE_TITLE_END = 0x49
TITLE = 0x4A

SA_X_BATTLE = 0x51

EPILOGUE_END = 0x53

ENDING = 0x55
EPILOGUE = 0x56
DISQUIETING = 0x57
SHOCK = 0x58
SILENCE_1 = 0x59
MAIN_BOILER_OVERHEATING = 0x5A
FINAL_ORDER = 0x5B
SILENCE_2 = 0x5C
INTRIGUE = 0x5D
UNUSED_5E = 0x5E # Suspenseful track
UNEASE = 0x5F
124 changes: 111 additions & 13 deletions src/mars_patcher/mf/data/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@
"type": "string",
"pattern": "^[0-9A-Z]{8}$"
},
"MusicReplacement": {
"description": "Shuffles the in-game music.",
"$ref": "#/$defs/MusicMapping"
},
"Locations": {
"type": "object",
"description": "Specifies how the item locations in the game should be changed.",
Expand Down Expand Up @@ -465,7 +469,7 @@
"default": null
},
"TitleText": {
"type":"array",
"type": "array",
"description": "Lines of ascii text to write to the title screen.",
"items": {
"type": "object",
Expand Down Expand Up @@ -701,7 +705,11 @@
"maxLength": 112
}
},
"required": ["Area", "Room", "Name"]
"required": [
"Area",
"Room",
"Name"
]
}
},
"RevealHiddenTiles": {
Expand Down Expand Up @@ -899,7 +907,6 @@
"Randovania",
"ArchipelagoColor",
"ArchipelagoMonochrome"

]
},
"ValidAbilities": {
Expand Down Expand Up @@ -971,12 +978,89 @@
"Spanish"
]
},
"ValidMusicTracks": {
"type": "string",
"description": "Valid music tracks supported by the game.",
"enum": [
"UNUSED_1",
"AFTER_EVENT",
"SECTOR_1",
"SECTOR_2",
"SECTOR_3",
"SECTOR_5",
"SECTOR_4",
"SECTOR_6",
"NAVIGATION_ROOM",
"SECURITY_DATA_ROOM",
"ITEM_JINGLE",
"LOADING_SAVE",
"MESSAGE_POPUP",
"SA_X_APPEARANCE",
"SA_X_CHASE",
"BOSS_TENSION",
"ARACHNUS_BATTLE",
"ZAZABI_BATTLE",
"BOX_BATTLE",
"MAIN_DECK_AMBIENCE",
"UNUSED_1F",
"UNUSED_20",
"SILENCE_1_SHIP",
"TENSION",
"MAIN_DECK_LIVELY",
"OMEGA_METROID_DEFEATED",
"OPERATIONS_DECK",
"OPERATIONS_DECK_ELEVATOR_OFFLINE_SOUND_AND_AMBIENCE",
"X_INVASION_DETECTION",
"SA_X_ELEVATOR",
"HEADING_TO_NIGHTMARE_RIDLEY",
"OPERATIONS_DECK_ELEVATOR_OFFLINE_SOUND",
"OPERATIONS_DECK_ELEVATOR_OFFLINE_AMBIENCE",
"MAIN_BOILER_COOLDOWN_MISSION",
"STATION_ESCAPE",
"OBJECTIVE_COMPLETE",
"SECTOR_4_UNDERWATER",
"SECTOR_4_UNDERWATER_UNUSED",
"SERRIS_YAKUZA_BATTLE",
"VARIA_CORE_X_BATTLE",
"NIGHTMARE_BATTLE",
"NEO_RIDLEY_BATTLE",
"CHOZO_STATUE_CORE_X_BATTLE",
"NETTORI_BATTLE",
"PRE_TITLE_END",
"TITLE",
"SA_X_BATTLE",
"EPILOGUE_END",
"ENDING",
"EPILOGUE",
"DISQUIETING",
"SHOCK",
"SILENCE_1",
"MAIN_BOILER_OVERHEATING",
"FINAL_ORDER",
"SILENCE_2",
"INTRIGUE",
"UNUSED_5E",
"UNEASE"
]
},
"MusicMapping": {
"description": "Maps music tracks to each other",
"type": "object",
"propertyNames": {
"$ref": "#/$defs/ValidMusicTracks"
},
"additionalProperties": {
"$ref": "#/$defs/ValidMusicTracks"
}
},
"MessageLanguages": {
"type": "object",
"propertyNames": {
"$ref": "#/$defs/ValidLanguages"
},
"required": ["English"],
"required": [
"English"
],
"additionalProperties": {
"type": "string",
"description": "Specifies what text should appear for a 2 line message. Text will auto-wrap if the next word doesn't fit on the line. If the text is too long, it will be truncated. Use \n to force a line break. If not provided, a message based on the Item will be shown. If a language is not provided, it will use the provided English message."
Expand All @@ -989,10 +1073,14 @@
"$ref": "#/$defs/ItemMessagesKind"
}
},
"required": ["Kind"],
"required": [
"Kind"
],
"if": {
"properties": {
"Kind": {"const": "CustomMessage" }
"Kind": {
"const": "CustomMessage"
}
}
},
"then": {
Expand All @@ -1008,7 +1096,9 @@
"default": true
}
},
"required": ["Languages"],
"required": [
"Languages"
],
"additionalProperties": false
},
"else": {
Expand All @@ -1023,17 +1113,25 @@
"description": "The Message ID, will display one of the predefined messages in the ROM"
}
},
"required": ["MessageID"],
"required": [
"MessageID"
],
"additionalProperties": false
}
},
"ItemMessagesKind":{
"ItemMessagesKind": {
"type": "string",
"enum": ["CustomMessage", "MessageID"]
"enum": [
"CustomMessage",
"MessageID"
]
},
"Jingle":{
"Jingle": {
"type": "string",
"enum": ["Minor", "Major"]
"enum": [
"Minor",
"Major"
]
},
"BlockLayer": {
"type": "array",
Expand Down Expand Up @@ -1070,4 +1168,4 @@
"default": "OPEN"
}
}
}
}
6 changes: 6 additions & 0 deletions src/mars_patcher/mf/patcher.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
from mars_patcher.minimap import apply_minimap_edits
from mars_patcher.random_palettes import PaletteRandomizer, PaletteSettings
from mars_patcher.rom import Rom
from mars_patcher.sounds import set_sounds
from mars_patcher.text import write_seed_hash
from mars_patcher.titlescreen_text import write_title_text

Expand Down Expand Up @@ -80,6 +81,11 @@ def patch_mf(
# Required metroid count
set_required_metroid_count(rom, patch_data["RequiredMetroidCount"])

# Music
if "MusicReplacement" in patch_data:
status_update("Writing music...", -1)
set_sounds(rom, patch_data["MusicReplacement"])

# Starting location
if "StartingLocation" in patch_data:
status_update("Writing starting location...", -1)
Expand Down
Loading