203 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			203 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | 
 | ||
|  | 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 | ||
|  | } | ||
|  | 
 | ||
|  | def generate_shuffled_level_music(world, player): | ||
|  |     shuffled_level_music = level_music_value_data.copy() | ||
|  | 
 | ||
|  |     if world.music_shuffle[player] == "consistent": | ||
|  |         world.random.shuffle(shuffled_level_music) | ||
|  |     elif world.music_shuffle[player] == "singularity": | ||
|  |         single_song = world.random.choice(shuffled_level_music) | ||
|  |         shuffled_level_music = [single_song for i in range(len(shuffled_level_music))] | ||
|  | 
 | ||
|  |     return shuffled_level_music | ||
|  | 
 | ||
|  | def generate_shuffled_ow_music(world, player): | ||
|  |     shuffled_ow_music = ow_music_value_data.copy() | ||
|  | 
 | ||
|  |     if world.music_shuffle[player] == "consistent" or world.music_shuffle[player] == "full": | ||
|  |         world.random.shuffle(shuffled_ow_music) | ||
|  |     elif world.music_shuffle[player] == "singularity": | ||
|  |         single_song = world.random.choice(shuffled_ow_music) | ||
|  |         shuffled_ow_music = [single_song for i in range(len(shuffled_ow_music))] | ||
|  | 
 | ||
|  |     return shuffled_ow_music | ||
|  | 
 | ||
|  | def generate_shuffled_header_data(rom, world, player): | ||
|  |     if world.music_shuffle[player] != "full" and not world.foreground_palette_shuffle[player] and not world.background_palette_shuffle[player]: | ||
|  |         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 | ||
|  | 
 | ||
|  |         if world.music_shuffle[player] == "full": | ||
|  |             level_header[2] &= 0x8F | ||
|  |             level_header[2] |= (world.random.randint(0, 7) << 5) | ||
|  | 
 | ||
|  |         if (world.foreground_palette_shuffle[player] and tileset in valid_foreground_palettes): | ||
|  |             level_header[3] &= 0xF8 | ||
|  |             level_header[3] |= world.random.choice(valid_foreground_palettes[tileset]) | ||
|  | 
 | ||
|  |         if world.background_palette_shuffle[player]: | ||
|  |             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 | ||
|  |                 level_header[0] |= (world.random.choice(valid_background_palettes[layer2_ptr]) << 5) | ||
|  | 
 | ||
|  |             if layer2_ptr in valid_background_colors: | ||
|  |                 level_header[1] &= 0x1F | ||
|  |                 level_header[1] |= (world.random.choice(valid_background_colors[layer2_ptr]) << 5) | ||
|  | 
 | ||
|  |         rom.write_bytes(layer1_ptr, bytes(level_header)) |