2024-03-12 21:00:13 +00:00
|
|
|
import json
|
|
|
|
import pkgutil
|
|
|
|
|
|
|
|
from worlds.AutoWorld import World
|
|
|
|
|
|
|
|
tileset_names = [
|
|
|
|
"grass_hills",
|
|
|
|
"grass_forest",
|
|
|
|
"grass_rocks",
|
|
|
|
"grass_clouds",
|
|
|
|
"grass_mountains",
|
|
|
|
"cave",
|
|
|
|
"cave_rocks",
|
|
|
|
"water",
|
|
|
|
"mushroom_rocks",
|
|
|
|
"mushroom_clouds",
|
|
|
|
"mushroom_forest",
|
|
|
|
"mushroom_hills",
|
|
|
|
"mushroom_stars",
|
|
|
|
"mushroom_cave",
|
|
|
|
"forest",
|
|
|
|
"logs",
|
|
|
|
"clouds",
|
|
|
|
"castle_pillars",
|
|
|
|
"castle_windows",
|
|
|
|
"castle_wall",
|
|
|
|
"castle_small_windows",
|
|
|
|
"ghost_house",
|
|
|
|
"ghost_house_exit",
|
|
|
|
"ship_exterior",
|
|
|
|
"ship_interior",
|
|
|
|
"switch_palace",
|
|
|
|
"yoshi_house"
|
|
|
|
]
|
|
|
|
|
|
|
|
map_names = [
|
|
|
|
"main",
|
|
|
|
"yoshi",
|
|
|
|
"vanilla",
|
|
|
|
"forest",
|
|
|
|
"valley",
|
|
|
|
"special",
|
|
|
|
"star"
|
|
|
|
]
|
|
|
|
|
|
|
|
level_palette_index = [
|
|
|
|
0xFF,0x03,0x09,0x01,0x15,0x0A,0x04,0x12,0x19,0x06,0x07,0x12,0x09,0x0F,0x13,0x09, # Levels 000-00F
|
|
|
|
0x03,0x07,0xFF,0x15,0x19,0x04,0x04,0xFF,0x17,0xFF,0x14,0x12,0x02,0x05,0xFF,0x11, # Levels 010-01F
|
|
|
|
0x12,0x15,0x04,0x02,0x02,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 020-02F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 030-03F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 040-04F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 050-05F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 060-06F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 070-07F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 080-08F
|
|
|
|
0xFF,0xFF,0xFF,0x12,0x12,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 090-09F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 0A0-0AF
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x19,0x08,0x09, # Levels 0B0-0BF
|
|
|
|
0x02,0x08,0x05,0x04,0x16,0x1A,0x04,0x02,0x0C,0x19,0x19,0x09,0xFF,0x02,0x02,0x02, # Levels 0C0-0CF
|
|
|
|
0x04,0x04,0x05,0x12,0x14,0xFF,0x12,0x10,0x05,0xFF,0x19,0x12,0x14,0x0F,0x15,0xFF, # Levels 0D0-0DF
|
|
|
|
0x12,0x12,0xFF,0x04,0x15,0xFF,0x19,0x14,0x12,0x05,0x05,0x16,0x15,0x15,0x15,0x12, # Levels 0E0-0EF
|
|
|
|
0x16,0x15,0x15,0x09,0x19,0x04,0x04,0x13,0x18,0x15,0x15,0x16,0x15,0x19,0x15,0x04, # Levels 0F0-0FF
|
|
|
|
0xFF,0x11,0x08,0x02,0x1A,0x00,0x01,0x15,0xFF,0x05,0x05,0x05,0xFF,0x11,0x12,0x05, # Levels 100-10F
|
|
|
|
0x12,0x14,0xFF,0x0D,0x15,0x06,0x05,0x05,0x05,0x0C,0x05,0x19,0x12,0x15,0x0E,0x01, # Levels 110-11F
|
|
|
|
0x07,0x19,0x0E,0x0E,0xFF,0x04,0x0E,0x02,0x02,0xFF,0x09,0x04,0x0B,0x02,0xFF,0xFF, # Levels 120-12F
|
|
|
|
0x07,0xFF,0x0C,0xFF,0x05,0x0C,0x0C,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 130-13F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 140-14F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 150-15F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 160-16F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 170-17F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 180-18F
|
|
|
|
0xFF,0xFF,0xFF,0x12,0x12,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 190-19F
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, # Levels 1A0-1AF
|
|
|
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x19,0x19,0x12,0x02,0x05, # Levels 1B0-1BF
|
|
|
|
0x02,0x07,0x05,0x05,0x03,0x03,0x00,0xFF,0x0F,0x10,0x05,0x05,0x12,0x11,0x14,0x14, # Levels 1C0-1CF
|
|
|
|
0x11,0x12,0x12,0x12,0x11,0x03,0x03,0x19,0x19,0x15,0x16,0x15,0x15,0x15,0xFF,0x05, # Levels 1D0-1DF
|
|
|
|
0x10,0x02,0x06,0x06,0x19,0x05,0x16,0x16,0x15,0x15,0x15,0xFF,0x06,0x05,0x05,0x06, # Levels 1E0-1EF
|
|
|
|
0x05,0x05,0x12,0x14,0x12,0x05,0xFF,0x19,0x05,0x16,0x15,0x15,0x11,0x05,0x12,0x09 # Levels 1F0-1FF
|
|
|
|
]
|
2022-09-29 18:16:59 +00:00
|
|
|
|
|
|
|
mario_palettes = [
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0x1F, 0x39, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0xB6, 0x30, 0xDF, 0x35, 0xFF, 0x03], # Mario
|
|
|
|
[0x3F, 0x4F, 0x1D, 0x58, 0x40, 0x11, 0xE0, 0x3F, 0x07, 0x3C, 0xAE, 0x7C, 0xB3, 0x7D, 0x00, 0x2F, 0x5F, 0x16, 0xFF, 0x03], # Luigi
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0x1F, 0x03, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x16, 0x02, 0xDF, 0x35, 0xFF, 0x03], # Wario
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0x12, 0x7C, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x0D, 0x58, 0xDF, 0x35, 0xFF, 0x03], # Waluigi
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0x00, 0x7C, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x00, 0x58, 0xDF, 0x35, 0xFF, 0x03], # Geno
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0x1F, 0x7C, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x16, 0x58, 0xDF, 0x35, 0xFF, 0x03], # Princess
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0xE0, 0x00, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x80, 0x00, 0xDF, 0x35, 0xFF, 0x03], # Dark
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x0A, 0x00, 0xFF, 0x01, 0xC4, 0x44, 0x08, 0x4E, 0x70, 0x67, 0x5F, 0x01, 0xDF, 0x35, 0xFF, 0x03], # Sponge
|
|
|
|
]
|
|
|
|
|
|
|
|
fire_mario_palettes = [
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x17, 0x00, 0x1F, 0x00, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Mario
|
|
|
|
[0x1F, 0x3B, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x40, 0x11, 0xE0, 0x01, 0xE0, 0x02, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Luigi
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x16, 0x02, 0x1F, 0x03, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Wario
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x0D, 0x58, 0x12, 0x7C, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Waluigi
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x00, 0x58, 0x00, 0x7C, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Geno
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x16, 0x58, 0x1F, 0x7C, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Princess
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x80, 0x00, 0xE0, 0x00, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Dark
|
|
|
|
[0x5F, 0x63, 0x1D, 0x58, 0x29, 0x25, 0xFF, 0x7F, 0x08, 0x00, 0x5F, 0x01, 0xFF, 0x01, 0x7B, 0x57, 0xDF, 0x0D, 0xFF, 0x03], # Sponge
|
|
|
|
]
|
|
|
|
|
|
|
|
ow_mario_palettes = [
|
|
|
|
[0x16, 0x00, 0x1F, 0x00], # Mario
|
|
|
|
[0x80, 0x02, 0xE0, 0x03], # Luigi
|
|
|
|
[0x16, 0x02, 0x1F, 0x03], # Wario
|
|
|
|
[0x0D, 0x58, 0x12, 0x7C], # Waluigi
|
|
|
|
[0x00, 0x58, 0x00, 0x7C], # Geno
|
|
|
|
[0x16, 0x58, 0x1F, 0x7C], # Princess
|
|
|
|
[0x80, 0x00, 0xE0, 0x00], # Dark
|
|
|
|
[0x5F, 0x01, 0xFF, 0x01], # Sponge
|
|
|
|
]
|
|
|
|
|
|
|
|
level_music_address_data = [
|
|
|
|
0x284DB,
|
|
|
|
0x284DC,
|
|
|
|
0x284DD,
|
|
|
|
0x284DE,
|
|
|
|
0x284DF,
|
|
|
|
0x284E0,
|
|
|
|
0x284E1,
|
|
|
|
0x284E2,
|
|
|
|
]
|
|
|
|
|
|
|
|
level_music_value_data = [
|
|
|
|
0x02,
|
|
|
|
0x06,
|
|
|
|
0x01,
|
|
|
|
0x08,
|
|
|
|
0x07,
|
|
|
|
0x03,
|
|
|
|
0x05,
|
|
|
|
0x12,
|
|
|
|
]
|
|
|
|
|
|
|
|
ow_music_address_data = [
|
|
|
|
[0x25BC8, 0x20D8A],
|
|
|
|
[0x25BC9, 0x20D8B],
|
|
|
|
[0x25BCA, 0x20D8C],
|
|
|
|
[0x25BCB, 0x20D8D],
|
|
|
|
[0x25BCC, 0x20D8E],
|
|
|
|
[0x25BCD, 0x20D8F],
|
|
|
|
[0x25BCE, 0x20D90],
|
|
|
|
[0x16C7]
|
|
|
|
]
|
|
|
|
|
|
|
|
ow_music_value_data = [
|
|
|
|
0x02,
|
|
|
|
0x03,
|
|
|
|
0x04,
|
|
|
|
0x06,
|
|
|
|
0x07,
|
|
|
|
0x09,
|
|
|
|
0x05,
|
|
|
|
0x01,
|
|
|
|
]
|
|
|
|
|
|
|
|
valid_foreground_palettes = {
|
|
|
|
0x00: [0x00, 0x01, 0x03, 0x04, 0x05, 0x07], # Normal 1
|
|
|
|
0x01: [0x03, 0x04, 0x05, 0x07], # Castle 1
|
|
|
|
0x02: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Rope 1
|
|
|
|
0x03: [0x02, 0x03, 0x04, 0x05, 0x07], # Underground 1
|
|
|
|
0x04: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Switch Palace 1
|
|
|
|
0x05: [0x04, 0x05], # Ghost House 1
|
|
|
|
0x06: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Rope 2
|
|
|
|
0x07: [0x00, 0x01, 0x03, 0x04, 0x05, 0x07], # Normal 2
|
|
|
|
0x08: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Rope 3
|
|
|
|
0x09: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Underground 2
|
|
|
|
0x0A: [0x01, 0x02, 0x03, 0x04, 0x05, 0x07], # Switch Palace 2
|
|
|
|
0x0B: [0x03, 0x04, 0x05, 0x07], # Castle 2
|
|
|
|
#0x0C: [], # Cloud/Forest
|
|
|
|
0x0D: [0x04, 0x05], # Ghost House 2
|
|
|
|
0x0E: [0x02, 0x03, 0x04, 0x05, 0x07], # Underground 3
|
|
|
|
}
|
|
|
|
|
|
|
|
valid_background_palettes = {
|
|
|
|
0x06861B: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Ghost House Exit
|
|
|
|
0xFFD900: [0x01], # P. Hills
|
|
|
|
0xFFDAB9: [0x04], # Water
|
|
|
|
0xFFDC71: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07], # Hills & Clouds
|
|
|
|
0xFFDD44: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07], # Clouds
|
|
|
|
0xFFDE54: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07], # Small Hills
|
|
|
|
0xFFDF59: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07], # Mountains & Clouds
|
|
|
|
0xFFE103: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07], # Castle Pillars
|
|
|
|
0xFFE472: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07], # Big Hills
|
|
|
|
0xFFE674: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07], # Bonus
|
|
|
|
0xFFE684: [0x01, 0x03, 0x05, 0x06], # Stars
|
|
|
|
0xFFE7C0: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07], # Mountains
|
|
|
|
0xFFE8EE: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Empty/Layer 2
|
|
|
|
0xFFE8FE: [0x01, 0x06], # Cave
|
|
|
|
0xFFEC82: [0x00, 0x02, 0x03, 0x05, 0x06, 0x07], # Bushes
|
|
|
|
0xFFEF80: [0x01, 0x03, 0x05, 0x06], # Ghost House
|
|
|
|
0xFFF175: [0x00, 0x01, 0x02, 0x03, 0x05, 0x06], # Ghost Ship
|
|
|
|
0xFFF45A: [0x01, 0x03, 0x06], # Castle
|
|
|
|
}
|
|
|
|
|
|
|
|
valid_background_colors = {
|
|
|
|
0x06861B: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Ghost House Exit
|
|
|
|
0xFFD900: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # P. Hills
|
|
|
|
0xFFDAB9: [0x02, 0x03, 0x05], # Water
|
|
|
|
0xFFDC71: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Hills & Clouds
|
|
|
|
0xFFDD44: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Clouds
|
|
|
|
0xFFDE54: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Small Hills
|
|
|
|
0xFFDF59: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Mountains & Clouds
|
|
|
|
0xFFE103: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Castle Pillars
|
|
|
|
0xFFE472: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Big Hills
|
|
|
|
0xFFE674: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Bonus
|
|
|
|
0xFFE684: [0x02, 0x03, 0x04, 0x05], # Stars
|
|
|
|
0xFFE7C0: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Mountains
|
|
|
|
0xFFE8EE: [0x03, 0x05], # Empty/Layer 2
|
|
|
|
0xFFE8FE: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Cave
|
|
|
|
0xFFEC82: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Bushes
|
|
|
|
0xFFEF80: [0x03, 0x04], # Ghost House
|
|
|
|
0xFFF175: [0x02, 0x03, 0x04, 0x05], # Ghost Ship
|
|
|
|
0xFFF45A: [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07], # Castle
|
|
|
|
}
|
|
|
|
|
2023-01-30 04:53:56 +00:00
|
|
|
valid_ow_palettes = {
|
|
|
|
0x2D1E: [0x00, 0x01, 0x03], # Main OW
|
|
|
|
0x2D1F: [0x00, 0x03, 0x04], # Yoshi's Island
|
|
|
|
0x2D20: [0x00, 0x01, 0x03, 0x04], # Vanilla Dome
|
|
|
|
0x2D21: [0x00, 0x02, 0x03, 0x04], # Forest of Illusion
|
|
|
|
0x2D22: [0x00, 0x01, 0x03, 0x04], # Valley of Bowser
|
|
|
|
0x2D24: [0x00, 0x02, 0x03], # Star Road
|
|
|
|
}
|
|
|
|
|
2024-03-12 21:00:13 +00:00
|
|
|
valid_sfxs = [
|
|
|
|
[0x01, 1], # Jump
|
|
|
|
[0x01, 0], # Hit head
|
|
|
|
[0x02, 0], # Contact/Spinjump on an enemy
|
|
|
|
[0x03, 0], # Kick item
|
|
|
|
[0x04, 0], # Go in pipe, get hurt
|
|
|
|
[0x05, 0], # Midway point
|
|
|
|
[0x06, 0], # Yoshi gulp
|
|
|
|
[0x07, 0], # Dry bones collapse
|
|
|
|
[0x08, 0], # Kill enemy with a spin jump
|
|
|
|
[0x09, 0], # Fly with cape
|
|
|
|
[0x0A, 0], # Get powerup
|
|
|
|
[0x0B, 0], # ON/OFF switch
|
|
|
|
[0x0C, 0], # Carry item past the goal
|
|
|
|
[0x0D, 0], # Get cape
|
|
|
|
[0x0E, 0], # Swim
|
|
|
|
[0x0F, 0], # Hurt while flying
|
|
|
|
[0x10, 0], # Magikoopa shoot magic
|
|
|
|
[0x13, 0], # Enemy stomp #1
|
|
|
|
[0x14, 0], # Enemy stomp #2
|
|
|
|
[0x15, 0], # Enemy stomp #3
|
|
|
|
[0x16, 0], # Enemy stomp #4
|
|
|
|
[0x17, 0], # Enemy stomp #5
|
|
|
|
[0x18, 0], # Enemy stomp #6
|
|
|
|
[0x19, 0], # Enemy stomp #7
|
|
|
|
[0x1C, 0], # Yoshi Coin
|
|
|
|
[0x1E, 0], # P-Balloon
|
|
|
|
[0x1F, 0], # Koopaling defeated
|
|
|
|
[0x20, 0], # Yoshi spit
|
|
|
|
[0x23, 0], # Lemmy/Wendy falling
|
|
|
|
[0x25, 0], # Blargg roar
|
|
|
|
[0x26, 0], # Firework whistle
|
|
|
|
[0x27, 0], # Firework bang
|
|
|
|
[0x2A, 0], # Peach pops up from the Clown Car
|
|
|
|
[0x04, 1], # Grinder
|
|
|
|
[0x01, 3], # Coin
|
|
|
|
[0x02, 3], # Hit a ? block
|
|
|
|
[0x03, 3], # Hit a block with a vine inside
|
|
|
|
[0x04, 3], # Spin jump
|
|
|
|
[0x05, 3], # 1up
|
|
|
|
[0x06, 3], # Shatter block
|
|
|
|
[0x07, 3], # Shoot fireball
|
|
|
|
[0x08, 3], # Springboard
|
|
|
|
[0x09, 3], # Bullet bill
|
|
|
|
[0x0A, 3], # Egg hatch
|
|
|
|
[0x0B, 3], # Item going into item box
|
|
|
|
[0x0C, 3], # Item falls from item box
|
|
|
|
[0x0E, 3], # L/R scroll
|
|
|
|
[0x0F, 3], # Door
|
|
|
|
[0x13, 3], # Lose Yoshi
|
|
|
|
[0x14, 3], # SMW2: New level available
|
|
|
|
[0x15, 3], # OW tile reveal
|
|
|
|
[0x16, 3], # OW castle collapse
|
|
|
|
[0x17, 3], # Fire spit
|
|
|
|
[0x18, 3], # Thunder
|
|
|
|
[0x19, 3], # Clap
|
|
|
|
[0x1A, 3], # Castle bomb
|
|
|
|
[0x1C, 3], # OW switch palace block ejection
|
|
|
|
[0x1E, 3], # Whistle
|
|
|
|
[0x1F, 3], # Yoshi mount
|
|
|
|
[0x20, 3], # Lemmy/Wendy going in lava
|
|
|
|
[0x21, 3], # Yoshi's tongue
|
|
|
|
[0x22, 3], # Message box hit
|
|
|
|
[0x23, 3], # Landing in a level tile
|
|
|
|
[0x24, 3], # P-Switch running out
|
|
|
|
[0x25, 3], # Yoshi defeats an enemy
|
|
|
|
[0x26, 3], # Swooper
|
|
|
|
[0x27, 3], # Podoboo
|
|
|
|
[0x28, 3], # Enemy hurt
|
|
|
|
[0x29, 3], # Correct
|
|
|
|
[0x2A, 3], # Wrong
|
|
|
|
[0x2B, 3], # Firework whistle
|
|
|
|
[0x2C, 3] # Firework bang
|
|
|
|
]
|
|
|
|
|
|
|
|
game_sfx_calls = [
|
|
|
|
0x0565E, # Jump
|
|
|
|
0x1BABD, # Spin jump
|
|
|
|
0x06D41, # Hit head on ceiling
|
|
|
|
0x0B4F2, # Hit head on sprite
|
|
|
|
0x07EB5, # Shooting a fireball
|
|
|
|
0x0507B, # Cape spin
|
|
|
|
0x058A8, # Cape smash
|
|
|
|
0x075F3, # Taking damage
|
|
|
|
0x075E2, # Taking damage while flying
|
|
|
|
0x07919, # Something during a boss fight
|
|
|
|
0x05AA9, # Swim
|
|
|
|
0x1BC04, # Spin jump off water
|
|
|
|
0x05BA5, # Jump off a net
|
|
|
|
0x05BB2, # Punching a net
|
|
|
|
0x06C10, # Entering a door
|
|
|
|
0x05254, # Entering a pipe #1
|
|
|
|
0x07439, # Entering a pipe #2
|
|
|
|
0x052A5, # Shot from a diagonal pipe
|
|
|
|
0x072E8, # Hit a midway point
|
|
|
|
0x07236, # Hit a wrong block
|
|
|
|
0x07B7D, # Spawn a powerup during the goal tape
|
|
|
|
0x1C342, # Invisible mushroom spawn
|
|
|
|
0x04E3F, # Scrolling the screen with L/R
|
|
|
|
0x0AAFD, # Pressing a P-Switch
|
|
|
|
0x04557, # P-Switch running out
|
|
|
|
0x0BAD7, # Climbing door turning
|
|
|
|
0x0C109, # Break goal tape
|
|
|
|
0x0C548, # Putting item in item box
|
|
|
|
0x10012, # Trigger item box
|
|
|
|
0x2B34D, # Collecting a coin
|
|
|
|
0x07358, # Collecting a Yoshi Coin
|
|
|
|
0x0C57A, # Collecting a powerup (generic)
|
|
|
|
0x0C59C, # Collecting a feather
|
|
|
|
0x0C309, # Collecting a P-Balloon
|
|
|
|
0x0E6A9, # Bouncing off a springboard
|
|
|
|
0x1117D, # Bouncing off a note block
|
|
|
|
0x14DEC, # Bouncing off a wall springboard
|
|
|
|
0x1067F, # Block shattering
|
|
|
|
0x1081E, # Activate ON/OFF switch #1
|
|
|
|
0x1118C, # Activate ON/OFF switch #2
|
|
|
|
0x12045, # Fireballs hitting a block/sprite
|
|
|
|
0x12124, # Fireballs converting an enemy into a coin
|
|
|
|
0x12106, # Fireballs defeating a Chuck
|
|
|
|
0x18D7D, # Activating a message box
|
|
|
|
0x1C209, # Activating a red question block
|
|
|
|
0x0A290, # Baby Yoshi swallowing an item #1
|
|
|
|
0x1C037, # Baby Yoshi swallowing an item #2
|
|
|
|
0x0F756, # Yoshi egg hatching
|
|
|
|
0x0A2C5, # Yoshi growing #1
|
|
|
|
0x1C06C, # Yoshi growing #2
|
|
|
|
0x0ED5F, # Mounting Yoshi
|
|
|
|
0x0F71D, # Yoshi hurt
|
|
|
|
0x12481, # Yoshi hurt (projectiles)
|
|
|
|
0x0EF0E, # Yoshi flying
|
|
|
|
0x06F90, # Yoshi stomping an enemy
|
|
|
|
0x06FB6, # Yoshi ground pound (yellow shell)
|
|
|
|
0x07024, # Yoshi bounces off a triangle
|
|
|
|
0x11BE9, # Yoshi stomping the ground
|
|
|
|
0x0F0D3, # Yoshi swallowing a sprite
|
|
|
|
0x0F0FD, # Yoshi eating a green berry
|
|
|
|
0x1BA7D, # Yoshi sticking out tongue
|
|
|
|
0x0F5A1, # Yoshi unable to eat
|
|
|
|
0x0F2DF, # Yoshi spitting out an item
|
|
|
|
0x0F28F, # Yoshi spitting out flames
|
|
|
|
0x0F3EC, # Collecting Yoshi's wings (eaten)
|
|
|
|
0x0F6C8, # Collecting Yoshi's wings (touched)
|
|
|
|
0x7FE04, # Defeated sprite combo #1 (using Y index)
|
|
|
|
0x7FE0E, # Defeated sprite combo #2 (using Y index)
|
|
|
|
0x7FE18, # Defeated sprite combo #3 (using Y index)
|
|
|
|
0x7FE22, # Defeated sprite combo #4 (using Y index)
|
|
|
|
0x7FE2C, # Defeated sprite combo #5 (using Y index)
|
|
|
|
0x7FE36, # Defeated sprite combo #6 (using Y index)
|
|
|
|
0x7FE40, # Defeated sprite combo #7 (using Y index)
|
|
|
|
0x7FE4B, # Defeated sprite combo #1 (using X index)
|
|
|
|
0x7FE55, # Defeated sprite combo #2 (using X index)
|
|
|
|
0x7FE5F, # Defeated sprite combo #3 (using X index)
|
|
|
|
0x7FE69, # Defeated sprite combo #4 (using X index)
|
|
|
|
0x7FE73, # Defeated sprite combo #5 (using X index)
|
|
|
|
0x7FE7D, # Defeated sprite combo #6 (using X index)
|
|
|
|
0x7FE87, # Defeated sprite combo #7 (using X index)
|
|
|
|
0x0A728, # Kicking a carryable item
|
|
|
|
0x0B12F, # Kicking a stunned and vulnerable enemy
|
|
|
|
0x0A8D8, # Performing a spinjump on a immune enemy
|
|
|
|
0x0A93F, # Defeating an enemy via spinjump
|
|
|
|
0x0999E, # Thrown sprite hitting the ground from the side
|
|
|
|
0x192B8, # Creating/Eating block moving
|
|
|
|
0x195EC, # Rex stomped
|
|
|
|
0x134A7, # Bullet bill blaster shooting
|
|
|
|
0x13088, # Bullet bill generator #1
|
|
|
|
0x130DF, # Bullet bill generator #2
|
|
|
|
0x09631, # Bob-omb explosion
|
|
|
|
0x15918, # Popping a bubble
|
|
|
|
0x15D64, # Sumo bro stomping the ground
|
|
|
|
0x15ECC, # Sumo bro lightning spawning flames
|
|
|
|
0x1726B, # Bouncing off wiggler
|
|
|
|
0x08390, # Banzai bill spawn
|
|
|
|
0x0AF17, # Thwomp hitting the ground
|
|
|
|
0x0AFFC, # Thwimp hitting the ground
|
|
|
|
0x14707, # Chuck running
|
|
|
|
0x14381, # Chuck whistling
|
|
|
|
0x144F8, # Chuck clapping
|
|
|
|
0x14536, # Chuck jumping
|
|
|
|
0x145AE, # Chuck splitting
|
|
|
|
0x147D2, # Chuck bounce
|
|
|
|
0x147F6, # Chuck hurt
|
|
|
|
0x147B8, # Chuck defeated
|
|
|
|
0x19D55, # Dino torch shooting fire
|
|
|
|
0x19FFA, # Blargg attacking
|
|
|
|
0x188FF, # Swooper bat swooping
|
|
|
|
0x08584, # Bowser statue flame spawn
|
|
|
|
0x18ADA, # Bowser statue shooting a flame
|
|
|
|
0x13043, # Bowser statue flame from generator
|
|
|
|
0x0BF28, # Magikoopa shooting a magic spell
|
|
|
|
0x0BC5F, # Magikoopa's magic spell hitting the ground
|
|
|
|
0x0D745, # Line guided sprites' motor
|
|
|
|
0x0DB70, # Grinder sound
|
|
|
|
0x0E0A1, # Podoboo jumping
|
|
|
|
0x0E5F2, # Dry bones/Bony beetle collapsing
|
|
|
|
0x15474, # Giant wooden pillar hitting the ground
|
|
|
|
0x2C9C1, # Spiked columns hitting the ground
|
|
|
|
0x19B03, # Reznor shooting a fireball
|
|
|
|
0x19A66, # Reznor: Hitting a platform
|
|
|
|
0x1D752, # Reznor: Bridge collapsing
|
|
|
|
0x19ABB, # Reznor: Defeated
|
|
|
|
0x180E9, # Big Boo: Reappearing
|
|
|
|
0x18233, # Big Boo: Hurt
|
|
|
|
0x181DE, # Big Boo: Defeated
|
|
|
|
0x1CEC1, # Wendy/Lemmy: Hitting a dummy
|
|
|
|
0x1CECB, # Wendy/Lemmy: Hurt
|
|
|
|
0x1CE33, # Wendy/Lemmy: Hurt (correct)
|
|
|
|
0x1CE46, # Wendy/Lemmy: Hurt (incorrect)
|
|
|
|
0x1CE24, # Wendy/Lemmy: Defeated
|
|
|
|
0x1CE7E, # Wendy/Lemmy: Falling into lava
|
|
|
|
0x0CF0A, # Ludwig: Jumping
|
|
|
|
0x0D059, # Ludwig: Shooting a fireball
|
|
|
|
0x10414, # Morton/Roy: Pillar drop
|
|
|
|
0x0D299, # Morton/Roy: Ground smash
|
|
|
|
0x0D3AB, # Morton/Roy/Ludwig: Hit by a fireball
|
|
|
|
0x0D2FD, # Morton/Roy/Ludwig: Bouncing off
|
|
|
|
0x0D31E, # Morton/Roy/Ludwig: Bouncing off (immune)
|
|
|
|
0x0D334, # Morton/Roy/Ludwig: Bouncing off (immune, going up a wall)
|
|
|
|
0x0CFD0, # Morton/Roy/Ludwig: Defeated
|
|
|
|
0x0FCCE, # Iggy/Larry: Being hit
|
|
|
|
0x0FD40, # Iggy/Larry: Being hit by a fireball
|
|
|
|
0x0FB60, # Iggy/Larry: Falling in lava
|
|
|
|
0x1A8B2, # Peach emerging from Clown Car
|
|
|
|
0x1A8E3, # Peach throwing an item
|
|
|
|
0x1B0B8, # Bumping into Clown Car
|
|
|
|
0x1B129, # Bowser: Hurt
|
|
|
|
0x1AB8C, # Bowser: Slamming the ground (third phase)
|
|
|
|
0x1A5D0, # Bowser: Throwing a Mechakoopa
|
|
|
|
0x1A603, # Bowser: Dropping a ball
|
|
|
|
0x1A7F6, # Bowser: Spawning a flame
|
|
|
|
0x1B1A3, # Bowser's ball slam #1
|
|
|
|
0x1B1B1, # Bowser's ball slam #2
|
|
|
|
0x1E016, # Bowser's arena lightning effect
|
|
|
|
0x26CAA, # Map: Level tile reveal
|
|
|
|
0x26763, # Map: Terrain reveal
|
|
|
|
0x21170, # Map: Using a star
|
|
|
|
0x2666F, # Map: Castle destruction
|
|
|
|
0x272A4, # Map: Switch palace blocks spawning
|
|
|
|
0x203CC, # Map: Earthquake
|
|
|
|
0x27A78, # Map: Fish jumping
|
|
|
|
0x27736, # Map: Valley of bowser thunder
|
|
|
|
0x013C0, # Menu: Nintendo presents
|
|
|
|
0x01AE3, # Menu: File menu option select
|
|
|
|
0x01AF9, # Menu: File menu option change
|
|
|
|
0x01BBB, # Menu: Saving game
|
|
|
|
0x273FF, # Menu: Map misc menu appearing
|
|
|
|
0x27567, # Menu: Something during the map
|
|
|
|
0x1767A, # Cutscene: Castle door opening
|
|
|
|
0x17683, # Cutscene: Castle door closing
|
|
|
|
0x17765, # Cutscene: Ghost house door opening
|
|
|
|
0x1776E, # Cutscene: Ghost house door closing
|
|
|
|
0x04720, # Cutscene: Detonator fuse
|
|
|
|
0x04732, # Cutscene: Bouncing off something
|
|
|
|
0x0475F, # Cutscene: Tossing the castle
|
|
|
|
0x04798, # Cutscene: Picking up the castle
|
|
|
|
0x047AC, # Cutscene: Huff
|
|
|
|
0x047D1, # Cutscene: Hitting a castle
|
|
|
|
0x1C830, # Cutscene: Shooting a firework
|
|
|
|
0x625AF, # Cutscene: Egg shattering
|
|
|
|
0x64F2C, # Cutscene: Hitting a hill
|
|
|
|
0x6512A, # Cutscene: Castle crashing
|
|
|
|
0x65295, # Cutscene: Explosion
|
|
|
|
0x652B2, # Cutscene: Castle sinking
|
|
|
|
0x652BD, # Cutscene: Castle flying
|
|
|
|
0x652D8, # Cutscene: Fake explosion
|
|
|
|
0x653E7, # Cutscene: Castle being hit by a hammer
|
|
|
|
0x657D8 # Cutscene: Castle being mopped away
|
|
|
|
]
|
|
|
|
|
|
|
|
def generate_shuffled_sfx(rom, world: World):
|
|
|
|
# Adjust "hitting sprites in succession" codes
|
|
|
|
rom.write_bytes(0x0A60B, bytearray([0x22, 0x00, 0xFE, 0x0F, 0xEA, 0xEA])) # jsl $0FFE00 : nop #2 # Thrown sprites combo #1
|
|
|
|
rom.write_bytes(0x0A659, bytearray([0x22, 0x47, 0xFE, 0x0F, 0xEA, 0xEA])) # jsl $0FFE47 : nop #2 # Thrown sprites combo #2
|
|
|
|
rom.write_bytes(0x0A865, bytearray([0x22, 0x47, 0xFE, 0x0F, 0xEA, 0xEA])) # jsl $0FFE47 : nop #2 # Star combo
|
|
|
|
rom.write_bytes(0x0AB57, bytearray([0x22, 0x00, 0xFE, 0x0F, 0xEA, 0xEA])) # jsl $0FFE00 : nop #2 # Bouncing off enemies
|
|
|
|
rom.write_bytes(0x172C0, bytearray([0x22, 0x00, 0xFE, 0x0F, 0xEA, 0xEA])) # jsl $0FFE00 : nop #2 # Star combo (wigglers)
|
|
|
|
rom.write_bytes(0x1961D, bytearray([0x22, 0x00, 0xFE, 0x0F, 0xEA, 0xEA])) # jsl $0FFE00 : nop #2 # Star combo (rexes)
|
|
|
|
rom.write_bytes(0x19639, bytearray([0x22, 0x00, 0xFE, 0x0F, 0xEA, 0xEA])) # jsl $0FFE00 : nop #2 # Bouncing off rexes
|
|
|
|
|
|
|
|
COMBO_SFX_ADDR = 0x7FE00
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0000, bytearray([0xC0, 0x01])) # COMBO_Y: CPY #$01
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0002, bytearray([0xD0, 0x06])) # BNE label_0FFE0A
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0004, bytearray([0xA9, 0x13])) # LDA #$13
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0006, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0009, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x000A, bytearray([0xC0, 0x02])) # label_0FFE0A: CPY #$02
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x000C, bytearray([0xD0, 0x06])) # BNE label_0FFE14
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x000E, bytearray([0xA9, 0x14])) # LDA #$14
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0010, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0013, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0014, bytearray([0xC0, 0x03])) # label_0FFE14: CPY #$03
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0016, bytearray([0xD0, 0x06])) # BNE label_0FFE1E
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0018, bytearray([0xA9, 0x15])) # LDA #$15
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x001A, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x001D, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x001E, bytearray([0xC0, 0x04])) # label_0FFE1E: CPY #$04
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0020, bytearray([0xD0, 0x06])) # BNE label_0FFE28
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0022, bytearray([0xA9, 0x16])) # LDA #$16
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0024, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0027, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0028, bytearray([0xC0, 0x05])) # label_0FFE28: CPY #$05
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x002A, bytearray([0xD0, 0x06])) # BNE label_0FFE32
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x002C, bytearray([0xA9, 0x17])) # LDA #$17
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x002E, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0031, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0032, bytearray([0xC0, 0x06])) # label_0FFE32: CPY #$06
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0034, bytearray([0xD0, 0x06])) # BNE label_0FFE3C
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0036, bytearray([0xA9, 0x18])) # LDA #$18
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0038, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x003B, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x003C, bytearray([0xC0, 0x07])) # label_0FFE3C: CPY #$07
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x003E, bytearray([0xD0, 0x06])) # BNE label_0FFE46
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0040, bytearray([0xA9, 0x19])) # LDA #$19
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0042, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0045, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0046, bytearray([0x6B])) # label_0FFE46: RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0047, bytearray([0xE0, 0x01])) # COMBO_X: CPX #$01
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0049, bytearray([0xD0, 0x06])) # BNE label_0FFE51
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x004B, bytearray([0xA9, 0x13])) # LDA #$13
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x004D, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0050, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0051, bytearray([0xE0, 0x02])) # label_0FFE51: CPX #$02
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0053, bytearray([0xD0, 0x06])) # BNE label_0FFE5B
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0055, bytearray([0xA9, 0x14])) # LDA #$14
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0057, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x005A, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x005B, bytearray([0xE0, 0x03])) # label_0FFE5B: CPX #$03
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x005D, bytearray([0xD0, 0x06])) # BNE label_0FFE65
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x005F, bytearray([0xA9, 0x15])) # LDA #$15
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0061, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0064, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0065, bytearray([0xE0, 0x04])) # label_0FFE65: CPX #$04
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0067, bytearray([0xD0, 0x06])) # BNE label_0FFE6F
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0069, bytearray([0xA9, 0x16])) # LDA #$16
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x006B, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x006E, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x006F, bytearray([0xE0, 0x05])) # label_0FFE6F: CPX #$05
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0071, bytearray([0xD0, 0x06])) # BNE label_0FFE79
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0073, bytearray([0xA9, 0x17])) # LDA #$17
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0075, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0078, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0079, bytearray([0xE0, 0x06])) # label_0FFE79: CPX #$06
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x007B, bytearray([0xD0, 0x06])) # BNE label_0FFE83
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x007D, bytearray([0xA9, 0x18])) # LDA #$18
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x007F, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0082, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0083, bytearray([0xE0, 0x07])) # label_0FFE83: CPX #$07
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0085, bytearray([0xD0, 0x06])) # BNE label_0FFE8D
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0087, bytearray([0xA9, 0x19])) # LDA #$19
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x0089, bytearray([0x8D, 0xF9, 0x1D])) # STA $1DF9
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x008C, bytearray([0x6B])) # RTL
|
|
|
|
rom.write_bytes(COMBO_SFX_ADDR + 0x008D, bytearray([0x6B])) # label_0FFE8D: RTL
|
|
|
|
|
|
|
|
# Adjust "Hit head on ceiling" code
|
|
|
|
rom.write_bytes(0x06D41 + 0x00, bytearray([0xA9, 0x01])) # lda #$01
|
|
|
|
rom.write_bytes(0x06D41 + 0x02, bytearray([0x8D, 0xF9, 0x1D])) # sta $1DF9
|
|
|
|
rom.write_bytes(0x06D41 + 0x05, bytearray([0xEA, 0xEA, 0xEA, 0xEA])) # nop #4
|
|
|
|
|
|
|
|
# Manually add "Map: Stepping onto a level tile" random SFX
|
|
|
|
selected_sfx = world.random.choice(valid_sfxs)
|
|
|
|
rom.write_byte(0x2169F + 0x01, selected_sfx[0])
|
|
|
|
rom.write_byte(0x2169F + 0x04, selected_sfx[1] + 0xF9)
|
|
|
|
|
|
|
|
# Disable panning on Bowser's flames
|
|
|
|
rom.write_bytes(0x1A83D, bytearray([0xEA, 0xEA, 0xEA])) # nop #3
|
|
|
|
|
|
|
|
# Randomize SFX calls
|
|
|
|
for address in game_sfx_calls:
|
|
|
|
# Get random SFX
|
|
|
|
if world.options.sfx_shuffle != "singularity":
|
|
|
|
selected_sfx = world.random.choice(valid_sfxs)
|
|
|
|
# Write randomized SFX num
|
|
|
|
rom.write_byte(address + 0x01, selected_sfx[0])
|
|
|
|
# Write randomized SFX port
|
|
|
|
rom.write_byte(address + 0x03, selected_sfx[1] + 0xF9)
|
|
|
|
|
|
|
|
def generate_shuffled_level_music(world: World):
|
2022-09-29 18:16:59 +00:00
|
|
|
shuffled_level_music = level_music_value_data.copy()
|
|
|
|
|
2024-03-12 21:00:13 +00:00
|
|
|
if world.options.music_shuffle == "consistent":
|
|
|
|
world.random.shuffle(shuffled_level_music)
|
|
|
|
elif world.options.music_shuffle == "singularity":
|
|
|
|
single_song = world.random.choice(shuffled_level_music)
|
2022-09-29 18:16:59 +00:00
|
|
|
shuffled_level_music = [single_song for i in range(len(shuffled_level_music))]
|
|
|
|
|
|
|
|
return shuffled_level_music
|
|
|
|
|
2024-03-12 21:00:13 +00:00
|
|
|
def generate_shuffled_ow_music(world: World):
|
2022-09-29 18:16:59 +00:00
|
|
|
shuffled_ow_music = ow_music_value_data.copy()
|
|
|
|
|
2024-03-12 21:00:13 +00:00
|
|
|
if world.options.music_shuffle == "consistent" or world.options.music_shuffle == "full":
|
|
|
|
world.random.shuffle(shuffled_ow_music)
|
|
|
|
elif world.options.music_shuffle == "singularity":
|
|
|
|
single_song = world.random.choice(shuffled_ow_music)
|
2022-09-29 18:16:59 +00:00
|
|
|
shuffled_ow_music = [single_song for i in range(len(shuffled_ow_music))]
|
|
|
|
|
|
|
|
return shuffled_ow_music
|
|
|
|
|
2024-03-12 21:00:13 +00:00
|
|
|
def generate_shuffled_ow_palettes(rom, world: World):
|
|
|
|
if world.options.overworld_palette_shuffle != "on_legacy":
|
|
|
|
return
|
|
|
|
|
|
|
|
for address, valid_palettes in valid_ow_palettes.items():
|
|
|
|
chosen_palette = world.random.choice(valid_palettes)
|
|
|
|
rom.write_byte(address, chosen_palette)
|
2023-01-30 04:53:56 +00:00
|
|
|
|
2024-03-12 21:00:13 +00:00
|
|
|
def generate_shuffled_header_data(rom, world: World):
|
|
|
|
if world.options.music_shuffle != "full" and world.options.level_palette_shuffle != "on_legacy":
|
2022-09-29 18:16:59 +00:00
|
|
|
return
|
|
|
|
|
|
|
|
for level_id in range(0, 0x200):
|
|
|
|
layer1_ptr_list = list(rom.read_bytes(0x2E000 + level_id * 3, 3))
|
|
|
|
layer1_ptr = (layer1_ptr_list[2] << 16 | layer1_ptr_list[1] << 8 | layer1_ptr_list[0])
|
|
|
|
|
|
|
|
if layer1_ptr == 0x68000:
|
|
|
|
# Unused Levels
|
|
|
|
continue
|
|
|
|
|
|
|
|
if layer1_ptr >= 0x70000:
|
|
|
|
layer1_ptr -= 0x8000
|
|
|
|
|
|
|
|
layer1_ptr -= 0x38000
|
|
|
|
|
|
|
|
level_header = list(rom.read_bytes(layer1_ptr, 5))
|
|
|
|
|
|
|
|
tileset = level_header[4] & 0x0F
|
|
|
|
|
2024-03-12 21:00:13 +00:00
|
|
|
if world.options.music_shuffle == "full":
|
2022-09-29 18:16:59 +00:00
|
|
|
level_header[2] &= 0x8F
|
2024-03-12 21:00:13 +00:00
|
|
|
level_header[2] |= (world.random.randint(0, 7) << 5)
|
2022-09-29 18:16:59 +00:00
|
|
|
|
2024-03-12 21:00:13 +00:00
|
|
|
if world.options.level_palette_shuffle == "on_legacy":
|
|
|
|
if tileset in valid_foreground_palettes:
|
|
|
|
level_header[3] &= 0xF8
|
|
|
|
level_header[3] |= world.random.choice(valid_foreground_palettes[tileset])
|
2022-09-29 18:16:59 +00:00
|
|
|
|
|
|
|
layer2_ptr_list = list(rom.read_bytes(0x2E600 + level_id * 3, 3))
|
|
|
|
layer2_ptr = (layer2_ptr_list[2] << 16 | layer2_ptr_list[1] << 8 | layer2_ptr_list[0])
|
|
|
|
|
|
|
|
if layer2_ptr in valid_background_palettes:
|
|
|
|
level_header[0] &= 0x1F
|
2024-03-12 21:00:13 +00:00
|
|
|
level_header[0] |= (world.random.choice(valid_background_palettes[layer2_ptr]) << 5)
|
2022-09-29 18:16:59 +00:00
|
|
|
|
|
|
|
if layer2_ptr in valid_background_colors:
|
|
|
|
level_header[1] &= 0x1F
|
2024-03-12 21:00:13 +00:00
|
|
|
level_header[1] |= (world.random.choice(valid_background_colors[layer2_ptr]) << 5)
|
2022-09-29 18:16:59 +00:00
|
|
|
|
|
|
|
rom.write_bytes(layer1_ptr, bytes(level_header))
|
2024-03-12 21:00:13 +00:00
|
|
|
|
|
|
|
def generate_curated_level_palette_data(rom, world: World):
|
|
|
|
PALETTE_LEVEL_CODE_ADDR = 0x88000
|
|
|
|
PALETTE_INDEX_ADDR = 0x8F000
|
|
|
|
PALETTE_LEVEL_TILESET_ADDR = 0x8F200
|
|
|
|
PALETTE_LEVEL_PTR_ADDR = 0x92000
|
|
|
|
PALETTE_LEVEL_DATA_ADDR = 0xA8000
|
|
|
|
|
|
|
|
addr = pc_to_snes(PALETTE_LEVEL_PTR_ADDR)
|
|
|
|
snes_level_palette_pointers_1 = bytearray([0xBF, (addr)&0xFF, (addr>>8)&0xFF, (addr>>16)&0xFF])
|
|
|
|
snes_level_palette_pointers_2 = bytearray([0xBF, (addr+2)&0xFF, (addr>>8)&0xFF, (addr>>16)&0xFF])
|
|
|
|
|
|
|
|
# Enable curated palette loader
|
|
|
|
rom.write_bytes(0x02BED, bytearray([0x5C, 0x00, 0x80, 0x11])) # org $00ABED : jml custom_palettes
|
|
|
|
rom.write_bytes(0x02330, bytearray([0x5C, 0x02, 0x80, 0x11])) # org $00A318 : jml custom_palettes_original
|
|
|
|
rom.write_bytes(0x013D7, bytearray([0x20, 0x30, 0xA3])) # org $0093D7 : jmp $A330
|
|
|
|
rom.write_bytes(0x014DA, bytearray([0x20, 0x30, 0xA3])) # org $0094DA : jmp $A330
|
|
|
|
rom.write_bytes(0x015EC, bytearray([0x20, 0x30, 0xA3])) # org $0095EC : jmp $A330
|
|
|
|
rom.write_bytes(0x0165B, bytearray([0x20, 0x30, 0xA3])) # org $00965B : jmp $A330
|
|
|
|
rom.write_bytes(0x02DD9, bytearray([0x20, 0x30, 0xA3])) # org $00ADD9 : jmp $A330
|
|
|
|
rom.write_bytes(0x02E1F, bytearray([0x20, 0x30, 0xA3])) # org $00AE1F : jmp $A330
|
|
|
|
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0000, bytearray([0x80, 0x09])) # bra custom_palettes
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0002, bytearray([0xC2, 0x30])) # .original rep #$30
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0004, bytearray([0xA9, 0xDD, 0x7F])) # lda #$7FDD
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0007, bytearray([0x5C, 0xF2, 0xAB, 0x00])) # jml $00ABF2
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x000B, bytearray([0xC2, 0x30])) # custom_palettes: rep #$30
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x000D, bytearray([0xA9, 0x70, 0xB1])) # lda #$B170
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0010, bytearray([0x85, 0x0A])) # sta !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0012, bytearray([0x64, 0x0C])) # stz !_ptr+$02
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0014, bytearray([0xA9, 0x10, 0x00])) # lda.w #$0010
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0017, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0019, bytearray([0xA9, 0x07, 0x00])) # lda #$0007
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x001C, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x001E, bytearray([0xA9, 0x01, 0x00])) # lda #$0001
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0021, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0023, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0026, bytearray([0xAE, 0x0B, 0x01])) # .get_index ldx $010B
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0029, bytearray([0xBF, 0x00, 0xF2, 0x11])) # lda.l level_tilesets,x
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x002D, bytearray([0x29, 0xFF, 0x00])) # and #$00FF
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0030, bytearray([0xEB])) # xba
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0031, bytearray([0x85, 0x00])) # sta !_tileset
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0033, bytearray([0xBF, 0x00, 0xF0, 0x11])) # lda.l level_index,x
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0037, bytearray([0x29, 0xFF, 0x00])) # and #$00FF
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x003A, bytearray([0x05, 0x00])) # ora !_tileset
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x003C, bytearray([0x85, 0x0A])) # sta !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x003E, bytearray([0x0A])) # asl
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x003F, bytearray([0x18])) # clc
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0040, bytearray([0x65, 0x0A])) # adc !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0042, bytearray([0x85, 0x0E])) # sta !_num
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0044, bytearray([0xAA])) # tax
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0045, snes_level_palette_pointers_1) # .back_color lda.l palette_pointers,x
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0049, bytearray([0x85, 0x0A])) # sta !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x004B, snes_level_palette_pointers_2) # lda.l palette_pointers+$02,x
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x004F, bytearray([0x85, 0x0C])) # sta !_ptr+$02
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0051, bytearray([0xA7, 0x0A])) # lda [!_ptr]
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0053, bytearray([0x8D, 0x01, 0x07])) # sta $0701
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0056, bytearray([0xE6, 0x0A])) # inc !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0058, bytearray([0xE6, 0x0A])) # inc !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x005A, bytearray([0xA9, 0x02, 0x00])) # .background lda.w #$0001*$02
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x005D, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x005F, bytearray([0xA9, 0x06, 0x00])) # lda #$0006
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0062, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0064, bytearray([0xA9, 0x01, 0x00])) # lda #$0001
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0067, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0069, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x006C, bytearray([0xA9, 0x42, 0x00])) # .foreground lda.w #$0021*$02
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x006F, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0071, bytearray([0xA9, 0x06, 0x00])) # lda #$0006
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0074, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0076, bytearray([0xA9, 0x01, 0x00])) # lda #$0001
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0079, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x007B, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x007E, bytearray([0xA9, 0x52, 0x00])) # .berries lda.w #$0029*$02
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0081, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0083, bytearray([0xA9, 0x06, 0x00])) # lda #$0006
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0086, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0088, bytearray([0xA9, 0x02, 0x00])) # lda #$0002
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x008B, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x008D, bytearray([0xA5, 0x0A])) # lda !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x008F, bytearray([0x48])) # pha
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0090, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0093, bytearray([0x68])) # pla
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0094, bytearray([0x85, 0x0A])) # sta !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0096, bytearray([0xA9, 0x32, 0x01])) # lda.w #$0099*$02
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0099, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x009B, bytearray([0xA9, 0x06, 0x00])) # lda #$0006
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x009E, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00A0, bytearray([0xA9, 0x02, 0x00])) # lda #$0002
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00A3, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00A5, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00A8, bytearray([0xA9, 0x82, 0x00])) # .global lda.w #$0041*$02
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00AB, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00AD, bytearray([0xA9, 0x06, 0x00])) # lda #$0006
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00B0, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00B2, bytearray([0xA9, 0x0B, 0x00])) # lda #$000B
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00B5, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00B7, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00BA, bytearray([0xA5, 0x00])) # .sprite_specific lda !_tileset
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00BC, bytearray([0xC9, 0x00, 0x05])) # cmp #$0500
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00BF, bytearray([0xD0, 0x1D])) # bne .end
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00C1, bytearray([0xAD, 0x2E, 0x19])) # lda $192E
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00C4, bytearray([0x29, 0x0F, 0x00])) # and #$000F
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00C7, bytearray([0xC9, 0x02, 0x00])) # cmp #$0002
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00CA, bytearray([0xD0, 0x12])) # bne .end
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00CC, bytearray([0xA9, 0xC2, 0x01])) # lda.w #$00E1*$02
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00CF, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00D1, bytearray([0xA9, 0x06, 0x00])) # lda #$0006
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00D4, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00D6, bytearray([0xA9, 0x01, 0x00])) # lda #$0001
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00D9, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00DB, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00DE, bytearray([0xE2, 0x30])) # .end sep #$30
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00E0, bytearray([0x5C, 0xEC, 0xAC, 0x00])) # jml $00ACEC
|
|
|
|
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00E4, bytearray([0xA6, 0x04])) # load_colors: ldx !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00E6, bytearray([0xA4, 0x06])) # ldy !_x_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00E8, bytearray([0xA7, 0x0A])) # .x_loop lda [!_ptr]
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00EA, bytearray([0x9D, 0x03, 0x07])) # sta $0703,x
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00ED, bytearray([0xE6, 0x0A])) # inc !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00EF, bytearray([0xE6, 0x0A])) # inc !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F1, bytearray([0xE8])) # inx
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F2, bytearray([0xE8])) # inx
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F3, bytearray([0x88])) # dey
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F4, bytearray([0x10, 0xF2])) # bpl .x_loop
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F6, bytearray([0xA5, 0x04])) # lda !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F8, bytearray([0x18])) # clc
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F9, bytearray([0x69, 0x20, 0x00])) # adc #$0020
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00FC, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00FE, bytearray([0xC6, 0x08])) # dec !_y_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0100, bytearray([0x10, 0xE2])) # bpl load_colors
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0102, bytearray([0x60])) # rts
|
|
|
|
|
|
|
|
# Load palette paths
|
|
|
|
data = pkgutil.get_data(__name__, f"data/palettes/level/palettes.json").decode("utf-8")
|
|
|
|
tilesets = json.loads(data)
|
|
|
|
|
|
|
|
# Writes the level tileset index to ROM
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_TILESET_ADDR, bytearray(level_palette_index))
|
|
|
|
|
|
|
|
# Builds the table in ROM that holds the palette index for each level, including sublevels
|
|
|
|
for level_id in range(0x200):
|
|
|
|
tileset_num = level_palette_index[level_id]
|
|
|
|
if tileset_num != 0xFF:
|
|
|
|
tileset = tileset_names[tileset_num]
|
|
|
|
else:
|
|
|
|
tileset = tileset_names[0x19]
|
|
|
|
palette = world.random.randint(0, len(tilesets[tileset])-1)
|
|
|
|
rom.write_bytes(PALETTE_INDEX_ADDR + level_id, bytearray([palette]))
|
|
|
|
|
|
|
|
# Writes the actual level palette data and pointer to said data to the ROM
|
|
|
|
pal_offset = 0x0000
|
|
|
|
tileset_num = 0
|
|
|
|
bank_palette_count = 0
|
|
|
|
for tileset in tilesets.keys():
|
|
|
|
for palette in range(len(tilesets[tileset])):
|
|
|
|
# Handle bank crossing
|
|
|
|
if bank_palette_count == 110:
|
|
|
|
pal_offset = (pal_offset & 0xF8000) + 0x8000
|
|
|
|
bank_palette_count = 0
|
|
|
|
# Write pointer
|
|
|
|
data_ptr = pc_to_snes(PALETTE_LEVEL_DATA_ADDR + pal_offset)
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_PTR_ADDR + ((tileset_num*3)<<8) + (palette*3), bytearray([data_ptr & 0xFF, (data_ptr>>8)&0xFF, (data_ptr>>16)&0xFF]))
|
|
|
|
# Write data
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_DATA_ADDR + pal_offset, read_palette_file(tileset, tilesets[tileset][palette], "level"))
|
|
|
|
pal_offset += 0x128
|
|
|
|
bank_palette_count += 1
|
|
|
|
tileset_num += 1
|
|
|
|
|
|
|
|
# Fix eaten berry tiles
|
|
|
|
EATEN_BERRY_ADDR = 0x68248
|
|
|
|
rom.write_byte(EATEN_BERRY_ADDR + 0x01, 0x04)
|
|
|
|
rom.write_byte(EATEN_BERRY_ADDR + 0x03, 0x04)
|
|
|
|
rom.write_byte(EATEN_BERRY_ADDR + 0x05, 0x04)
|
|
|
|
rom.write_byte(EATEN_BERRY_ADDR + 0x07, 0x04)
|
|
|
|
|
|
|
|
# Fix title screen changing background colors
|
|
|
|
rom.write_bytes(0x1D30, bytearray([0xEA, 0xEA, 0xEA]))
|
|
|
|
|
|
|
|
# Skips level intros automatically
|
|
|
|
rom.write_byte(0x4896, 0x80)
|
|
|
|
|
|
|
|
def generate_curated_map_palette_data(rom, world: World):
|
|
|
|
PALETTE_MAP_CODE_ADDR = 0x88200
|
|
|
|
PALETTE_UPLOADER_EDIT = 0x88400
|
|
|
|
PALETTE_MAP_INDEX_ADDR = 0x8F400
|
|
|
|
PALETTE_MAP_PTR_ADDR = 0x90000
|
|
|
|
PALETTE_MAP_DATA_ADDR = 0x98000
|
|
|
|
|
|
|
|
addr = pc_to_snes(PALETTE_MAP_PTR_ADDR)
|
|
|
|
snes_map_palette_pointers_1 = bytearray([0xBF, (addr)&0xFF, (addr>>8)&0xFF, (addr>>16)&0xFF])
|
|
|
|
snes_map_palette_pointers_2 = bytearray([0xBF, (addr+2)&0xFF, (addr>>8)&0xFF, (addr>>16)&0xFF])
|
|
|
|
|
|
|
|
rom.write_bytes(0x02D25, bytearray([0x5C, 0x09, 0x82, 0x11])) # org $00AD25 : jml map_palettes
|
|
|
|
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0000, bytearray([0xC2, 0x30])) # map_og_palettes: rep #$30
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0002, bytearray([0xA0, 0xD8, 0xB3])) # ldy #$B3D8
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0005, bytearray([0x5C, 0x2A, 0xAD, 0x00])) # jml $00AD2A
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0009, bytearray([0xC2, 0x30])) # map_palettes: rep #$30
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x000B, bytearray([0xAD, 0x31, 0x19])) # .prepare_index lda $1931
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x000E, bytearray([0x29, 0x0F, 0x00])) # and #$000F
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0011, bytearray([0x3A])) # dec
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0012, bytearray([0xAA])) # tax
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0013, bytearray([0xEB])) # xba
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0014, bytearray([0x85, 0x0E])) # sta !_num
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0016, bytearray([0xBF, 0x00, 0xF4, 0x11])) # lda.l map_index,x
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x001A, bytearray([0x29, 0xFF, 0x00])) # and #$00FF
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x001D, bytearray([0x05, 0x0E])) # ora !_num
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x001F, bytearray([0x85, 0x0A])) # sta !_ptr
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0021, bytearray([0x0A])) # asl
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0022, bytearray([0x18])) # clc
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0023, bytearray([0x65, 0x0A])) # adc !_ptr
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0025, bytearray([0xAA])) # tax
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0026, snes_map_palette_pointers_1) # lda.l map_palette_pointers,x
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x002A, bytearray([0x85, 0x0A])) # sta !_ptr
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x002C, snes_map_palette_pointers_2) # lda.l map_palette_pointers+$02,x
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0030, bytearray([0x85, 0x0C])) # sta !_ptr+$02
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0032, bytearray([0xA7, 0x0A])) # .load_back_color lda [!_ptr]
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0034, bytearray([0x8D, 0x01, 0x07])) # sta $0701
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0037, bytearray([0xE6, 0x0A])) # inc !_ptr
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0039, bytearray([0xE6, 0x0A])) # inc !_ptr
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x003B, bytearray([0xA9, 0x82, 0x00])) # .load_layer_2 lda.w #$0041*$02
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x003E, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0040, bytearray([0xA9, 0x06, 0x00])) # lda #$0006
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0043, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0045, bytearray([0xA9, 0x03, 0x00])) # lda #$0003
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0048, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x004A, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x004D, bytearray([0xA9, 0x52, 0x00])) # .load_layer_1 lda.w #$0029*$02
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0050, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0052, bytearray([0xA9, 0x06, 0x00])) # lda #$0006
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0055, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0057, bytearray([0xA9, 0x05, 0x00])) # lda #$0005
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x005A, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x005C, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x005F, bytearray([0xA9, 0x10, 0x00])) # .load_layer_3 lda.w #$0008*$02
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0062, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0064, bytearray([0xA9, 0x07, 0x00])) # lda #$0007
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0067, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0069, bytearray([0xA9, 0x01, 0x00])) # lda #$0001
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x006C, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x006E, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0071, bytearray([0xA9, 0x02, 0x01])) # .load_sprites lda.w #$0081*$02
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0074, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0076, bytearray([0xA9, 0x06, 0x00])) # lda #$0006
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0079, bytearray([0x85, 0x06])) # sta !_x_span
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x007B, bytearray([0xA9, 0x07, 0x00])) # lda #$0007
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x007E, bytearray([0x85, 0x08])) # sta !_y_span
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0080, bytearray([0x20, 0xE4, 0x80])) # jsr load_colors
|
|
|
|
rom.write_bytes(PALETTE_MAP_CODE_ADDR + 0x0083, bytearray([0x5C, 0xA3, 0xAD, 0x00])) # .return jml $00ADA3
|
|
|
|
|
|
|
|
rom.write_bytes(0x2488, bytearray([0x5C, 0x00, 0x84, 0x11])) # org $00A488 : jml palette_upload
|
|
|
|
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0000, bytearray([0xAD, 0x00, 0x01])) # palette_upload: lda $0100
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0003, bytearray([0xC9, 0x0E])) # cmp #$0E
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0005, bytearray([0xF0, 0x0A])) # beq .map
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0007, bytearray([0xAC, 0x80, 0x06])) # .regular ldy $0680
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x000A, bytearray([0xBE, 0x81, 0xA4])) # ldx.w $A47F+2,y
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x000D, bytearray([0x5C, 0x8E, 0xA4, 0x00])) # jml $00A48E
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0011, bytearray([0xAD, 0xD9, 0x13])) # .map lda $13D9
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0014, bytearray([0xC9, 0x0A])) # cmp #$0A
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0016, bytearray([0xD0, 0xEF])) # bne .regular
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0018, bytearray([0xAD, 0xE8, 0x1D])) # lda $1DE8
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x001B, bytearray([0xC9, 0x06])) # cmp #$06
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x001D, bytearray([0xD0, 0xE8])) # bne .regular
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x001F, bytearray([0x9C, 0x03, 0x07])) # stz $0703
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0022, bytearray([0x9C, 0x04, 0x07])) # stz $0704
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0025, bytearray([0x9C, 0x21, 0x21])) # stz $2121
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0028, bytearray([0xA2, 0x06])) # ldx #$06
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x002A, bytearray([0xBD, 0x49, 0x92])) # .loop lda.w $9249,x
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x002D, bytearray([0x9D, 0x20, 0x43])) # sta $4320,x
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0030, bytearray([0xCA])) # dex
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0031, bytearray([0x10, 0xF7])) # bpl .loop
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0033, bytearray([0xA9, 0x04])) # lda #$04
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0035, bytearray([0x8D, 0x0B, 0x42])) # sta $420B
|
|
|
|
rom.write_bytes(PALETTE_UPLOADER_EDIT + 0x0038, bytearray([0x5C, 0xCF, 0xA4, 0x00])) # jml $00A4CF
|
|
|
|
|
|
|
|
# Insert this piece of ASM again in case levels are disabled
|
|
|
|
PALETTE_LEVEL_CODE_ADDR = 0x88000
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00E4, bytearray([0xA6, 0x04])) # load_colors: ldx !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00E6, bytearray([0xA4, 0x06])) # ldy !_x_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00E8, bytearray([0xA7, 0x0A])) # .x_loop lda [!_ptr]
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00EA, bytearray([0x9D, 0x03, 0x07])) # sta $0703,x
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00ED, bytearray([0xE6, 0x0A])) # inc !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00EF, bytearray([0xE6, 0x0A])) # inc !_ptr
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F1, bytearray([0xE8])) # inx
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F2, bytearray([0xE8])) # inx
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F3, bytearray([0x88])) # dey
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F4, bytearray([0x10, 0xF2])) # bpl .x_loop
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F6, bytearray([0xA5, 0x04])) # lda !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F8, bytearray([0x18])) # clc
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00F9, bytearray([0x69, 0x20, 0x00])) # adc #$0020
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00FC, bytearray([0x85, 0x04])) # sta !_index
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x00FE, bytearray([0xC6, 0x08])) # dec !_y_span
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0100, bytearray([0x10, 0xE2])) # bpl load_colors
|
|
|
|
rom.write_bytes(PALETTE_LEVEL_CODE_ADDR + 0x0102, bytearray([0x60])) # rts
|
|
|
|
|
|
|
|
# Load palette paths
|
|
|
|
data = pkgutil.get_data(__name__, f"data/palettes/map/palettes.json").decode("utf-8")
|
|
|
|
maps = json.loads(data)
|
|
|
|
|
|
|
|
for map_id in range(0x07):
|
|
|
|
current_map_name = map_names[map_id]
|
|
|
|
palette = world.random.randint(0, len(maps[current_map_name])-1)
|
|
|
|
rom.write_bytes(PALETTE_MAP_INDEX_ADDR + map_id, bytearray([palette]))
|
|
|
|
|
|
|
|
# Writes the actual map palette data and pointer to said data to the ROM
|
|
|
|
pal_offset = 0x0000
|
|
|
|
map_num = 0
|
|
|
|
bank_palette_count = 0
|
|
|
|
for current_map in maps.keys():
|
|
|
|
for palette in range(len(maps[current_map])):
|
|
|
|
# Handle bank crossing
|
|
|
|
if bank_palette_count == 113:
|
|
|
|
pal_offset = (pal_offset & 0xF8000) + 0x8000
|
|
|
|
bank_palette_count = 0
|
|
|
|
# Write pointer
|
|
|
|
data_ptr = pc_to_snes(PALETTE_MAP_DATA_ADDR + pal_offset)
|
|
|
|
rom.write_bytes(PALETTE_MAP_PTR_ADDR + ((map_num*3)<<8) + (palette*3), bytearray([data_ptr & 0xFF, (data_ptr>>8)&0xFF, (data_ptr>>16)&0xFF]))
|
|
|
|
# Write data
|
|
|
|
rom.write_bytes(PALETTE_MAP_DATA_ADDR + pal_offset, read_palette_file(current_map, maps[current_map][palette], "map"))
|
|
|
|
# Update map mario palette
|
|
|
|
chosen_palette = world.options.mario_palette.value
|
|
|
|
rom.write_bytes(PALETTE_MAP_DATA_ADDR + pal_offset + 206, bytes(ow_mario_palettes[chosen_palette]))
|
|
|
|
pal_offset += 0x11C
|
|
|
|
bank_palette_count += 1
|
|
|
|
map_num += 1
|
|
|
|
|
|
|
|
|
|
|
|
def pc_to_snes(address):
|
|
|
|
return ((address << 1) & 0x7F0000) | (address & 0x7FFF) | 0x8000
|
|
|
|
|
|
|
|
def read_palette_file(tileset, filename, type_):
|
|
|
|
palette_file = pkgutil.get_data(__name__, f"data/palettes/{type_}/{tileset}/{filename}")
|
|
|
|
colors = bytearray([])
|
|
|
|
|
|
|
|
# Copy back colors
|
|
|
|
colors += bytearray([palette_file[0x200], palette_file[0x201]])
|
|
|
|
|
|
|
|
if type_ == "level":
|
|
|
|
# Copy background colors
|
|
|
|
colors += bytearray([palette_file[(0x01*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x11*2)+(i)] for i in range(14)])
|
|
|
|
|
|
|
|
# Copy foreground colors
|
|
|
|
colors += bytearray([palette_file[(0x21*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x31*2)+(i)] for i in range(14)])
|
|
|
|
|
|
|
|
# Copy berry colors
|
|
|
|
colors += bytearray([palette_file[(0x29*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x39*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x49*2)+(i)] for i in range(14)])
|
|
|
|
|
|
|
|
# Copy global colors
|
|
|
|
colors += bytearray([palette_file[(0x41*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x51*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x61*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x71*2)+(i)] for i in range(14)])
|
|
|
|
|
|
|
|
# Copy sprite colors
|
|
|
|
colors += bytearray([palette_file[(0x81*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x91*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xA1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xB1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xC1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xD1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xE1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xF1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xE9*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xF9*2)+(i)] for i in range(14)])
|
|
|
|
|
|
|
|
elif type_ == "map":
|
|
|
|
# Copy layer 2 colors
|
|
|
|
colors += bytearray([palette_file[(0x41*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x51*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x61*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x71*2)+(i)] for i in range(14)])
|
|
|
|
|
|
|
|
# Copy layer 1 colors
|
|
|
|
colors += bytearray([palette_file[(0x29*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x39*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x49*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x59*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x69*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x79*2)+(i)] for i in range(14)])
|
|
|
|
|
|
|
|
# Copy layer 3 colors
|
|
|
|
colors += bytearray([palette_file[(0x08*2)+(i)] for i in range(16)])
|
|
|
|
colors += bytearray([palette_file[(0x18*2)+(i)] for i in range(16)])
|
|
|
|
|
|
|
|
# Copy sprite colors
|
|
|
|
colors += bytearray([palette_file[(0x81*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0x91*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xA1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xB1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xC1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xD1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xE1*2)+(i)] for i in range(14)])
|
|
|
|
colors += bytearray([palette_file[(0xF1*2)+(i)] for i in range(14)])
|
|
|
|
|
|
|
|
return colors
|