Super Mario World: Implement New Game (#1045)
This commit is contained in:
parent
885c8d3fcc
commit
13edfa60be
|
@ -132,7 +132,7 @@ components: Iterable[Component] = (
|
||||||
Component('Text Client', 'CommonClient', 'ArchipelagoTextClient'),
|
Component('Text Client', 'CommonClient', 'ArchipelagoTextClient'),
|
||||||
# SNI
|
# SNI
|
||||||
Component('SNI Client', 'SNIClient',
|
Component('SNI Client', 'SNIClient',
|
||||||
file_identifier=SuffixIdentifier('.apz3', '.apm3', '.apsoe', '.aplttp', '.apsm', '.apsmz3', '.apdkc3')),
|
file_identifier=SuffixIdentifier('.apz3', '.apm3', '.apsoe', '.aplttp', '.apsm', '.apsmz3', '.apdkc3', '.apsmw')),
|
||||||
Component('LttP Adjuster', 'LttPAdjuster'),
|
Component('LttP Adjuster', 'LttPAdjuster'),
|
||||||
# Factorio
|
# Factorio
|
||||||
Component('Factorio Client', 'FactorioClient'),
|
Component('Factorio Client', 'FactorioClient'),
|
||||||
|
|
1
Patch.py
1
Patch.py
|
@ -171,6 +171,7 @@ GAME_SM = "Super Metroid"
|
||||||
GAME_SOE = "Secret of Evermore"
|
GAME_SOE = "Secret of Evermore"
|
||||||
GAME_SMZ3 = "SMZ3"
|
GAME_SMZ3 = "SMZ3"
|
||||||
GAME_DKC3 = "Donkey Kong Country 3"
|
GAME_DKC3 = "Donkey Kong Country 3"
|
||||||
|
GAME_SMW = "Super Mario World"
|
||||||
supported_games = {"A Link to the Past", "Super Metroid", "Secret of Evermore", "SMZ3", "Donkey Kong Country 3"}
|
supported_games = {"A Link to the Past", "Super Metroid", "Secret of Evermore", "SMZ3", "Donkey Kong Country 3"}
|
||||||
|
|
||||||
preferred_endings = {
|
preferred_endings = {
|
||||||
|
|
|
@ -28,6 +28,7 @@ Currently, the following games are supported:
|
||||||
* Starcraft 2: Wings of Liberty
|
* Starcraft 2: Wings of Liberty
|
||||||
* Donkey Kong Country 3
|
* Donkey Kong Country 3
|
||||||
* Dark Souls 3
|
* Dark Souls 3
|
||||||
|
* Super Mario World
|
||||||
|
|
||||||
For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/).
|
For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/).
|
||||||
Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled
|
Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled
|
||||||
|
|
12
SNIClient.py
12
SNIClient.py
|
@ -30,7 +30,7 @@ from worlds.sm.Rom import ROM_PLAYER_LIMIT as SM_ROM_PLAYER_LIMIT
|
||||||
from worlds.smz3.Rom import ROM_PLAYER_LIMIT as SMZ3_ROM_PLAYER_LIMIT
|
from worlds.smz3.Rom import ROM_PLAYER_LIMIT as SMZ3_ROM_PLAYER_LIMIT
|
||||||
import Utils
|
import Utils
|
||||||
from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser
|
from CommonClient import CommonContext, server_loop, ClientCommandProcessor, gui_enabled, get_base_parser
|
||||||
from Patch import GAME_ALTTP, GAME_SM, GAME_SMZ3, GAME_DKC3
|
from Patch import GAME_ALTTP, GAME_SM, GAME_SMZ3, GAME_DKC3, GAME_SMW
|
||||||
|
|
||||||
snes_logger = logging.getLogger("SNES")
|
snes_logger = logging.getLogger("SNES")
|
||||||
|
|
||||||
|
@ -236,6 +236,10 @@ async def deathlink_kill_player(ctx: Context):
|
||||||
snes_buffered_write(ctx, WRAM_START + 0x0A50, bytes([255])) # deal 255 of damage at next opportunity
|
snes_buffered_write(ctx, WRAM_START + 0x0A50, bytes([255])) # deal 255 of damage at next opportunity
|
||||||
if not ctx.death_link_allow_survive:
|
if not ctx.death_link_allow_survive:
|
||||||
snes_buffered_write(ctx, WRAM_START + 0x09D6, bytes([0, 0])) # set current reserve to 0
|
snes_buffered_write(ctx, WRAM_START + 0x09D6, bytes([0, 0])) # set current reserve to 0
|
||||||
|
elif ctx.game == GAME_SMW:
|
||||||
|
from worlds.smw.Client import deathlink_kill_player as smw_deathlink_kill_player
|
||||||
|
await smw_deathlink_kill_player(ctx)
|
||||||
|
|
||||||
await snes_flush_writes(ctx)
|
await snes_flush_writes(ctx)
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
@ -1041,6 +1045,9 @@ async def game_watcher(ctx: Context):
|
||||||
|
|
||||||
from worlds.dkc3.Client import dkc3_rom_init
|
from worlds.dkc3.Client import dkc3_rom_init
|
||||||
init_handled = await dkc3_rom_init(ctx)
|
init_handled = await dkc3_rom_init(ctx)
|
||||||
|
if not init_handled:
|
||||||
|
from worlds.smw.Client import smw_rom_init
|
||||||
|
init_handled = await smw_rom_init(ctx)
|
||||||
if not init_handled:
|
if not init_handled:
|
||||||
game_name = await snes_read(ctx, SM_ROMNAME_START, 5)
|
game_name = await snes_read(ctx, SM_ROMNAME_START, 5)
|
||||||
if game_name is None:
|
if game_name is None:
|
||||||
|
@ -1299,6 +1306,9 @@ async def game_watcher(ctx: Context):
|
||||||
elif ctx.game == GAME_DKC3:
|
elif ctx.game == GAME_DKC3:
|
||||||
from worlds.dkc3.Client import dkc3_game_watcher
|
from worlds.dkc3.Client import dkc3_game_watcher
|
||||||
await dkc3_game_watcher(ctx)
|
await dkc3_game_watcher(ctx)
|
||||||
|
elif ctx.game == GAME_SMW:
|
||||||
|
from worlds.smw.Client import smw_game_watcher
|
||||||
|
await smw_game_watcher(ctx)
|
||||||
|
|
||||||
|
|
||||||
async def run_game(romfile):
|
async def run_game(romfile):
|
||||||
|
|
5
Utils.py
5
Utils.py
|
@ -288,6 +288,11 @@ def get_default_options() -> OptionsType:
|
||||||
"sni": "SNI",
|
"sni": "SNI",
|
||||||
"rom_start": True,
|
"rom_start": True,
|
||||||
},
|
},
|
||||||
|
"smw_options": {
|
||||||
|
"rom_file": "Super Mario World (USA).sfc",
|
||||||
|
"sni": "SNI",
|
||||||
|
"rom_start": True,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
return options
|
return options
|
||||||
|
|
|
@ -138,3 +138,12 @@ dkc3_options:
|
||||||
# True for operating system default program
|
# True for operating system default program
|
||||||
# Alternatively, a path to a program to open the .sfc file with
|
# Alternatively, a path to a program to open the .sfc file with
|
||||||
rom_start: true
|
rom_start: true
|
||||||
|
smw_options:
|
||||||
|
# File name of the SMW US rom
|
||||||
|
rom_file: "Super Mario World (USA).sfc"
|
||||||
|
# Set this to your SNI folder location if you want the MultiClient to attempt an auto start, does nothing if not found
|
||||||
|
sni: "SNI"
|
||||||
|
# Set this to false to never autostart a rom (such as after patching)
|
||||||
|
# True for operating system default program
|
||||||
|
# Alternatively, a path to a program to open the .sfc file with
|
||||||
|
rom_start: true
|
||||||
|
|
|
@ -55,6 +55,7 @@ Name: "core"; Description: "Core Files"; Types: full hosting playing
|
||||||
Name: "generator"; Description: "Generator"; Types: full hosting
|
Name: "generator"; Description: "Generator"; Types: full hosting
|
||||||
Name: "generator/sm"; Description: "Super Metroid ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
|
Name: "generator/sm"; Description: "Super Metroid ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
|
||||||
Name: "generator/dkc3"; Description: "Donkey Kong Country 3 ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
|
Name: "generator/dkc3"; Description: "Donkey Kong Country 3 ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
|
||||||
|
Name: "generator/smw"; Description: "Super Mario World ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
|
||||||
Name: "generator/soe"; Description: "Secret of Evermore ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
|
Name: "generator/soe"; Description: "Secret of Evermore ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 3145728; Flags: disablenouninstallwarning
|
||||||
Name: "generator/lttp"; Description: "A Link to the Past ROM Setup and Enemizer"; Types: full hosting; ExtraDiskSpaceRequired: 5191680
|
Name: "generator/lttp"; Description: "A Link to the Past ROM Setup and Enemizer"; Types: full hosting; ExtraDiskSpaceRequired: 5191680
|
||||||
Name: "generator/oot"; Description: "Ocarina of Time ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 100663296; Flags: disablenouninstallwarning
|
Name: "generator/oot"; Description: "Ocarina of Time ROM Setup"; Types: full hosting; ExtraDiskSpaceRequired: 100663296; Flags: disablenouninstallwarning
|
||||||
|
@ -64,6 +65,7 @@ Name: "client/sni"; Description: "SNI Client"; Types: full playing
|
||||||
Name: "client/sni/lttp"; Description: "SNI Client - A Link to the Past Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
|
Name: "client/sni/lttp"; Description: "SNI Client - A Link to the Past Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
|
||||||
Name: "client/sni/sm"; Description: "SNI Client - Super Metroid Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
|
Name: "client/sni/sm"; Description: "SNI Client - Super Metroid Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
|
||||||
Name: "client/sni/dkc3"; Description: "SNI Client - Donkey Kong Country 3 Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
|
Name: "client/sni/dkc3"; Description: "SNI Client - Donkey Kong Country 3 Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
|
||||||
|
Name: "client/sni/smw"; Description: "SNI Client - Super Mario World Patch Setup"; Types: full playing; Flags: disablenouninstallwarning
|
||||||
Name: "client/factorio"; Description: "Factorio"; Types: full playing
|
Name: "client/factorio"; Description: "Factorio"; Types: full playing
|
||||||
Name: "client/minecraft"; Description: "Minecraft"; Types: full playing; ExtraDiskSpaceRequired: 226894278
|
Name: "client/minecraft"; Description: "Minecraft"; Types: full playing; ExtraDiskSpaceRequired: 226894278
|
||||||
Name: "client/oot"; Description: "Ocarina of Time"; Types: full playing
|
Name: "client/oot"; Description: "Ocarina of Time"; Types: full playing
|
||||||
|
@ -79,6 +81,7 @@ NAME: "{app}"; Flags: setntfscompression; Permissions: everyone-modify users-mod
|
||||||
Source: "{code:GetROMPath}"; DestDir: "{app}"; DestName: "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"; Flags: external; Components: client/sni/lttp or generator/lttp
|
Source: "{code:GetROMPath}"; DestDir: "{app}"; DestName: "Zelda no Densetsu - Kamigami no Triforce (Japan).sfc"; Flags: external; Components: client/sni/lttp or generator/lttp
|
||||||
Source: "{code:GetSMROMPath}"; DestDir: "{app}"; DestName: "Super Metroid (JU).sfc"; Flags: external; Components: client/sni/sm or generator/sm
|
Source: "{code:GetSMROMPath}"; DestDir: "{app}"; DestName: "Super Metroid (JU).sfc"; Flags: external; Components: client/sni/sm or generator/sm
|
||||||
Source: "{code:GetDKC3ROMPath}"; DestDir: "{app}"; DestName: "Donkey Kong Country 3 - Dixie Kong's Double Trouble! (USA) (En,Fr).sfc"; Flags: external; Components: client/sni/dkc3 or generator/dkc3
|
Source: "{code:GetDKC3ROMPath}"; DestDir: "{app}"; DestName: "Donkey Kong Country 3 - Dixie Kong's Double Trouble! (USA) (En,Fr).sfc"; Flags: external; Components: client/sni/dkc3 or generator/dkc3
|
||||||
|
Source: "{code:GetSMWROMPath}"; DestDir: "{app}"; DestName: "Super Mario World (USA).sfc"; Flags: external; Components: client/sni/smw or generator/smw
|
||||||
Source: "{code:GetSoEROMPath}"; DestDir: "{app}"; DestName: "Secret of Evermore (USA).sfc"; Flags: external; Components: generator/soe
|
Source: "{code:GetSoEROMPath}"; DestDir: "{app}"; DestName: "Secret of Evermore (USA).sfc"; Flags: external; Components: generator/soe
|
||||||
Source: "{code:GetOoTROMPath}"; DestDir: "{app}"; DestName: "The Legend of Zelda - Ocarina of Time.z64"; Flags: external; Components: client/oot or generator/oot
|
Source: "{code:GetOoTROMPath}"; DestDir: "{app}"; DestName: "The Legend of Zelda - Ocarina of Time.z64"; Flags: external; Components: client/oot or generator/oot
|
||||||
Source: "{#source_path}\*"; Excludes: "*.sfc, *.log, data\sprites\alttpr, SNI, EnemizerCLI, Archipelago*.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
Source: "{#source_path}\*"; Excludes: "*.sfc, *.log, data\sprites\alttpr, SNI, EnemizerCLI, Archipelago*.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
||||||
|
@ -151,6 +154,11 @@ Root: HKCR; Subkey: "{#MyAppName}dkc3patch"; ValueData: "Arc
|
||||||
Root: HKCR; Subkey: "{#MyAppName}dkc3patch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: ""; Components: client/sni
|
Root: HKCR; Subkey: "{#MyAppName}dkc3patch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: ""; Components: client/sni
|
||||||
Root: HKCR; Subkey: "{#MyAppName}dkc3patch\shell\open\command"; ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1"""; ValueType: string; ValueName: ""; Components: client/sni
|
Root: HKCR; Subkey: "{#MyAppName}dkc3patch\shell\open\command"; ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1"""; ValueType: string; ValueName: ""; Components: client/sni
|
||||||
|
|
||||||
|
Root: HKCR; Subkey: ".apsmw"; ValueData: "{#MyAppName}smwpatch"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Components: client/sni
|
||||||
|
Root: HKCR; Subkey: "{#MyAppName}smwpatch"; ValueData: "Archipelago Super Mario World Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Components: client/sni
|
||||||
|
Root: HKCR; Subkey: "{#MyAppName}smwpatch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: ""; Components: client/sni
|
||||||
|
Root: HKCR; Subkey: "{#MyAppName}smwpatch\shell\open\command"; ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1"""; ValueType: string; ValueName: ""; Components: client/sni
|
||||||
|
|
||||||
Root: HKCR; Subkey: ".apsmz3"; ValueData: "{#MyAppName}smz3patch"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Components: client/sni
|
Root: HKCR; Subkey: ".apsmz3"; ValueData: "{#MyAppName}smz3patch"; Flags: uninsdeletevalue; ValueType: string; ValueName: ""; Components: client/sni
|
||||||
Root: HKCR; Subkey: "{#MyAppName}smz3patch"; ValueData: "Archipelago SMZ3 Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Components: client/sni
|
Root: HKCR; Subkey: "{#MyAppName}smz3patch"; ValueData: "Archipelago SMZ3 Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: ""; Components: client/sni
|
||||||
Root: HKCR; Subkey: "{#MyAppName}smz3patch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: ""; Components: client/sni
|
Root: HKCR; Subkey: "{#MyAppName}smz3patch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: ""; Components: client/sni
|
||||||
|
@ -217,6 +225,9 @@ var SMRomFilePage: TInputFileWizardPage;
|
||||||
var dkc3rom: string;
|
var dkc3rom: string;
|
||||||
var DKC3RomFilePage: TInputFileWizardPage;
|
var DKC3RomFilePage: TInputFileWizardPage;
|
||||||
|
|
||||||
|
var smwrom: string;
|
||||||
|
var SMWRomFilePage: TInputFileWizardPage;
|
||||||
|
|
||||||
var soerom: string;
|
var soerom: string;
|
||||||
var SoERomFilePage: TInputFileWizardPage;
|
var SoERomFilePage: TInputFileWizardPage;
|
||||||
|
|
||||||
|
@ -308,6 +319,8 @@ begin
|
||||||
Result := not (SMROMFilePage.Values[0] = '')
|
Result := not (SMROMFilePage.Values[0] = '')
|
||||||
else if (assigned(DKC3ROMFilePage)) and (CurPageID = DKC3ROMFilePage.ID) then
|
else if (assigned(DKC3ROMFilePage)) and (CurPageID = DKC3ROMFilePage.ID) then
|
||||||
Result := not (DKC3ROMFilePage.Values[0] = '')
|
Result := not (DKC3ROMFilePage.Values[0] = '')
|
||||||
|
else if (assigned(SMWROMFilePage)) and (CurPageID = SMWROMFilePage.ID) then
|
||||||
|
Result := not (SMWROMFilePage.Values[0] = '')
|
||||||
else if (assigned(SoEROMFilePage)) and (CurPageID = SoEROMFilePage.ID) then
|
else if (assigned(SoEROMFilePage)) and (CurPageID = SoEROMFilePage.ID) then
|
||||||
Result := not (SoEROMFilePage.Values[0] = '')
|
Result := not (SoEROMFilePage.Values[0] = '')
|
||||||
else if (assigned(OoTROMFilePage)) and (CurPageID = OoTROMFilePage.ID) then
|
else if (assigned(OoTROMFilePage)) and (CurPageID = OoTROMFilePage.ID) then
|
||||||
|
@ -364,6 +377,22 @@ begin
|
||||||
Result := '';
|
Result := '';
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function GetSMWROMPath(Param: string): string;
|
||||||
|
begin
|
||||||
|
if Length(smwrom) > 0 then
|
||||||
|
Result := smwrom
|
||||||
|
else if Assigned(SMWRomFilePage) then
|
||||||
|
begin
|
||||||
|
R := CompareStr(GetSNESMD5OfFile(SMWROMFilePage.Values[0]), 'cdd3c8c37322978ca8669b34bc89c804')
|
||||||
|
if R <> 0 then
|
||||||
|
MsgBox('Super Mario World ROM validation failed. Very likely wrong file.', mbInformation, MB_OK);
|
||||||
|
|
||||||
|
Result := SMWROMFilePage.Values[0]
|
||||||
|
end
|
||||||
|
else
|
||||||
|
Result := '';
|
||||||
|
end;
|
||||||
|
|
||||||
function GetSoEROMPath(Param: string): string;
|
function GetSoEROMPath(Param: string): string;
|
||||||
begin
|
begin
|
||||||
if Length(soerom) > 0 then
|
if Length(soerom) > 0 then
|
||||||
|
@ -412,6 +441,10 @@ begin
|
||||||
if Length(dkc3rom) = 0 then
|
if Length(dkc3rom) = 0 then
|
||||||
DKC3RomFilePage:= AddRomPage('Donkey Kong Country 3 - Dixie Kong''s Double Trouble! (USA) (En,Fr).sfc');
|
DKC3RomFilePage:= AddRomPage('Donkey Kong Country 3 - Dixie Kong''s Double Trouble! (USA) (En,Fr).sfc');
|
||||||
|
|
||||||
|
smwrom := CheckRom('Super Mario World (USA).sfc', 'cdd3c8c37322978ca8669b34bc89c804');
|
||||||
|
if Length(smwrom) = 0 then
|
||||||
|
SMWRomFilePage:= AddRomPage('Super Mario World (USA).sfc');
|
||||||
|
|
||||||
soerom := CheckRom('Secret of Evermore (USA).sfc', '6e9c94511d04fac6e0a1e582c170be3a');
|
soerom := CheckRom('Secret of Evermore (USA).sfc', '6e9c94511d04fac6e0a1e582c170be3a');
|
||||||
if Length(soerom) = 0 then
|
if Length(soerom) = 0 then
|
||||||
SoEROMFilePage:= AddRomPage('Secret of Evermore (USA).sfc');
|
SoEROMFilePage:= AddRomPage('Secret of Evermore (USA).sfc');
|
||||||
|
@ -427,6 +460,8 @@ begin
|
||||||
Result := not (WizardIsComponentSelected('client/sni/sm') or WizardIsComponentSelected('generator/sm'));
|
Result := not (WizardIsComponentSelected('client/sni/sm') or WizardIsComponentSelected('generator/sm'));
|
||||||
if (assigned(DKC3ROMFilePage)) and (PageID = DKC3ROMFilePage.ID) then
|
if (assigned(DKC3ROMFilePage)) and (PageID = DKC3ROMFilePage.ID) then
|
||||||
Result := not (WizardIsComponentSelected('client/sni/dkc3') or WizardIsComponentSelected('generator/dkc3'));
|
Result := not (WizardIsComponentSelected('client/sni/dkc3') or WizardIsComponentSelected('generator/dkc3'));
|
||||||
|
if (assigned(SMWROMFilePage)) and (PageID = SMWROMFilePage.ID) then
|
||||||
|
Result := not (WizardIsComponentSelected('client/sni/smw') or WizardIsComponentSelected('generator/smw'));
|
||||||
if (assigned(SoEROMFilePage)) and (PageID = SoEROMFilePage.ID) then
|
if (assigned(SoEROMFilePage)) and (PageID = SoEROMFilePage.ID) then
|
||||||
Result := not (WizardIsComponentSelected('generator/soe'));
|
Result := not (WizardIsComponentSelected('generator/soe'));
|
||||||
if (assigned(OoTROMFilePage)) and (PageID = OoTROMFilePage.ID) then
|
if (assigned(OoTROMFilePage)) and (PageID = OoTROMFilePage.ID) then
|
||||||
|
|
|
@ -0,0 +1,202 @@
|
||||||
|
|
||||||
|
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))
|
|
@ -0,0 +1,455 @@
|
||||||
|
import logging
|
||||||
|
import asyncio
|
||||||
|
import time
|
||||||
|
|
||||||
|
from NetUtils import ClientStatus, color
|
||||||
|
from worlds import AutoWorldRegister
|
||||||
|
from SNIClient import Context, snes_buffered_write, snes_flush_writes, snes_read
|
||||||
|
from .Names.TextBox import generate_received_text
|
||||||
|
from Patch import GAME_SMW
|
||||||
|
|
||||||
|
snes_logger = logging.getLogger("SNES")
|
||||||
|
|
||||||
|
ROM_START = 0x000000
|
||||||
|
WRAM_START = 0xF50000
|
||||||
|
WRAM_SIZE = 0x20000
|
||||||
|
SRAM_START = 0xE00000
|
||||||
|
|
||||||
|
SAVEDATA_START = WRAM_START + 0xF000
|
||||||
|
SAVEDATA_SIZE = 0x500
|
||||||
|
|
||||||
|
SMW_ROMHASH_START = 0x7FC0
|
||||||
|
ROMHASH_SIZE = 0x15
|
||||||
|
|
||||||
|
SMW_PROGRESS_DATA = WRAM_START + 0x1F02
|
||||||
|
SMW_DRAGON_COINS_DATA = WRAM_START + 0x1F2F
|
||||||
|
SMW_PATH_DATA = WRAM_START + 0x1EA2
|
||||||
|
SMW_EVENT_ROM_DATA = ROM_START + 0x2D608
|
||||||
|
SMW_ACTIVE_LEVEL_DATA = ROM_START + 0x37F70
|
||||||
|
|
||||||
|
SMW_GOAL_DATA = ROM_START + 0x01BFA0
|
||||||
|
SMW_REQUIRED_BOSSES_DATA = ROM_START + 0x01BFA1
|
||||||
|
SMW_REQUIRED_EGGS_DATA = ROM_START + 0x01BFA2
|
||||||
|
SMW_SEND_MSG_DATA = ROM_START + 0x01BFA3
|
||||||
|
SMW_RECEIVE_MSG_DATA = ROM_START + 0x01BFA4
|
||||||
|
SMW_DEATH_LINK_ACTIVE_ADDR = ROM_START + 0x01BFA5
|
||||||
|
SMW_DRAGON_COINS_ACTIVE_ADDR = ROM_START + 0x01BFA6
|
||||||
|
SMW_SWAMP_DONUT_GH_ADDR = ROM_START + 0x01BFA7
|
||||||
|
|
||||||
|
SMW_GAME_STATE_ADDR = WRAM_START + 0x100
|
||||||
|
SMW_MARIO_STATE_ADDR = WRAM_START + 0x71
|
||||||
|
SMW_BOSS_STATE_ADDR = WRAM_START + 0xD9B
|
||||||
|
SMW_ACTIVE_BOSS_ADDR = WRAM_START + 0x13FC
|
||||||
|
SMW_CURRENT_LEVEL_ADDR = WRAM_START + 0x13BF
|
||||||
|
SMW_MESSAGE_BOX_ADDR = WRAM_START + 0x1426
|
||||||
|
SMW_BONUS_STAR_ADDR = WRAM_START + 0xF48
|
||||||
|
SMW_EGG_COUNT_ADDR = WRAM_START + 0x1F24
|
||||||
|
SMW_BOSS_COUNT_ADDR = WRAM_START + 0x1F26
|
||||||
|
SMW_NUM_EVENTS_ADDR = WRAM_START + 0x1F2E
|
||||||
|
SMW_SFX_ADDR = WRAM_START + 0x1DFC
|
||||||
|
SMW_PAUSE_ADDR = WRAM_START + 0x13D4
|
||||||
|
SMW_MESSAGE_QUEUE_ADDR = WRAM_START + 0xC391
|
||||||
|
|
||||||
|
SMW_RECV_PROGRESS_ADDR = WRAM_START + 0x1F2B
|
||||||
|
|
||||||
|
SMW_GOAL_LEVELS = [0x28, 0x31, 0x32]
|
||||||
|
SMW_INVALID_MARIO_STATES = [0x05, 0x06, 0x0A, 0x0C, 0x0D]
|
||||||
|
SMW_BAD_TEXT_BOX_LEVELS = [0x26, 0x02, 0x4B]
|
||||||
|
SMW_BOSS_STATES = [0x80, 0xC0, 0xC1]
|
||||||
|
SMW_UNCOLLECTABLE_LEVELS = [0x25, 0x07, 0x0B, 0x40, 0x0E, 0x1F, 0x20, 0x1B, 0x1A, 0x35, 0x34, 0x31, 0x32]
|
||||||
|
|
||||||
|
async def deathlink_kill_player(ctx: Context):
|
||||||
|
if ctx.game == GAME_SMW:
|
||||||
|
game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1)
|
||||||
|
if game_state[0] != 0x14:
|
||||||
|
return
|
||||||
|
|
||||||
|
mario_state = await snes_read(ctx, SMW_MARIO_STATE_ADDR, 0x1)
|
||||||
|
if mario_state[0] != 0x00:
|
||||||
|
return
|
||||||
|
|
||||||
|
message_box = await snes_read(ctx, SMW_MESSAGE_BOX_ADDR, 0x1)
|
||||||
|
if message_box[0] != 0x00:
|
||||||
|
return
|
||||||
|
|
||||||
|
pause_state = await snes_read(ctx, SMW_PAUSE_ADDR, 0x1)
|
||||||
|
if pause_state[0] != 0x00:
|
||||||
|
return
|
||||||
|
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x9D, bytes([0x30])) # Freeze Gameplay
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x1DFB, bytes([0x09])) # Death Music
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x0DDA, bytes([0xFF])) # Flush Music Buffer
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x1407, bytes([0x00])) # Flush Cape Fly Phase
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x140D, bytes([0x00])) # Flush Spin Jump Flag
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x188A, bytes([0x00])) # Flush Empty Byte because the game does it
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x7D, bytes([0x90])) # Mario Y Speed
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x1496, bytes([0x30])) # Death Timer
|
||||||
|
snes_buffered_write(ctx, SMW_MARIO_STATE_ADDR, bytes([0x09])) # Mario State -> Dead
|
||||||
|
|
||||||
|
await snes_flush_writes(ctx)
|
||||||
|
|
||||||
|
from SNIClient import DeathState
|
||||||
|
ctx.death_state = DeathState.dead
|
||||||
|
ctx.last_death_link = time.time()
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
async def smw_rom_init(ctx: Context):
|
||||||
|
if not ctx.rom:
|
||||||
|
ctx.finished_game = False
|
||||||
|
ctx.death_link_allow_survive = False
|
||||||
|
game_hash = await snes_read(ctx, SMW_ROMHASH_START, ROMHASH_SIZE)
|
||||||
|
if game_hash is None or game_hash == bytes([0] * ROMHASH_SIZE) or game_hash[:3] != b"SMW":
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
ctx.game = GAME_SMW
|
||||||
|
ctx.items_handling = 0b111 # remote items
|
||||||
|
|
||||||
|
ctx.rom = game_hash
|
||||||
|
|
||||||
|
receive_option = await snes_read(ctx, SMW_RECEIVE_MSG_DATA, 0x1)
|
||||||
|
send_option = await snes_read(ctx, SMW_SEND_MSG_DATA, 0x1)
|
||||||
|
|
||||||
|
ctx.receive_option = receive_option[0]
|
||||||
|
ctx.send_option = send_option[0]
|
||||||
|
|
||||||
|
ctx.message_queue = []
|
||||||
|
|
||||||
|
ctx.allow_collect = True
|
||||||
|
|
||||||
|
death_link = await snes_read(ctx, SMW_DEATH_LINK_ACTIVE_ADDR, 1)
|
||||||
|
if death_link:
|
||||||
|
await ctx.update_death_link(bool(death_link[0] & 0b1))
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def add_message_to_queue(ctx: Context, new_message):
|
||||||
|
|
||||||
|
if not hasattr(ctx, "message_queue"):
|
||||||
|
ctx.message_queue = []
|
||||||
|
|
||||||
|
ctx.message_queue.append(new_message)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
async def handle_message_queue(ctx: Context):
|
||||||
|
|
||||||
|
game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1)
|
||||||
|
if game_state[0] != 0x14:
|
||||||
|
return
|
||||||
|
|
||||||
|
mario_state = await snes_read(ctx, SMW_MARIO_STATE_ADDR, 0x1)
|
||||||
|
if mario_state[0] != 0x00:
|
||||||
|
return
|
||||||
|
|
||||||
|
message_box = await snes_read(ctx, SMW_MESSAGE_BOX_ADDR, 0x1)
|
||||||
|
if message_box[0] != 0x00:
|
||||||
|
return
|
||||||
|
|
||||||
|
pause_state = await snes_read(ctx, SMW_PAUSE_ADDR, 0x1)
|
||||||
|
if pause_state[0] != 0x00:
|
||||||
|
return
|
||||||
|
|
||||||
|
current_level = await snes_read(ctx, SMW_CURRENT_LEVEL_ADDR, 0x1)
|
||||||
|
if current_level[0] in SMW_BAD_TEXT_BOX_LEVELS:
|
||||||
|
return
|
||||||
|
|
||||||
|
boss_state = await snes_read(ctx, SMW_BOSS_STATE_ADDR, 0x1)
|
||||||
|
if boss_state[0] in SMW_BOSS_STATES:
|
||||||
|
return
|
||||||
|
|
||||||
|
active_boss = await snes_read(ctx, SMW_ACTIVE_BOSS_ADDR, 0x1)
|
||||||
|
if active_boss[0] != 0x00:
|
||||||
|
return
|
||||||
|
|
||||||
|
if not hasattr(ctx, "message_queue") or len(ctx.message_queue) == 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
next_message = ctx.message_queue.pop(0)
|
||||||
|
|
||||||
|
snes_buffered_write(ctx, SMW_MESSAGE_QUEUE_ADDR, bytes(next_message))
|
||||||
|
snes_buffered_write(ctx, SMW_MESSAGE_BOX_ADDR, bytes([0x03]))
|
||||||
|
snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x22]))
|
||||||
|
|
||||||
|
await snes_flush_writes(ctx)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
async def smw_game_watcher(ctx: Context):
|
||||||
|
if ctx.game == GAME_SMW:
|
||||||
|
# SMW_TODO: Handle Deathlink
|
||||||
|
game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1)
|
||||||
|
mario_state = await snes_read(ctx, SMW_MARIO_STATE_ADDR, 0x1)
|
||||||
|
if game_state is None:
|
||||||
|
# We're not properly connected
|
||||||
|
return
|
||||||
|
elif game_state[0] >= 0x18:
|
||||||
|
if not ctx.finished_game:
|
||||||
|
current_level = await snes_read(ctx, SMW_CURRENT_LEVEL_ADDR, 0x1)
|
||||||
|
|
||||||
|
if current_level[0] in SMW_GOAL_LEVELS:
|
||||||
|
await ctx.send_msgs([{"cmd": "StatusUpdate", "status": ClientStatus.CLIENT_GOAL}])
|
||||||
|
ctx.finished_game = True
|
||||||
|
return
|
||||||
|
elif game_state[0] < 0x0B:
|
||||||
|
# We haven't loaded a save file
|
||||||
|
ctx.message_queue = []
|
||||||
|
return
|
||||||
|
elif mario_state[0] in SMW_INVALID_MARIO_STATES:
|
||||||
|
# Mario can't come to the phone right now
|
||||||
|
return
|
||||||
|
|
||||||
|
if "DeathLink" in ctx.tags and game_state[0] == 0x14 and ctx.last_death_link + 1 < time.time():
|
||||||
|
currently_dead = mario_state[0] == 0x09
|
||||||
|
await ctx.handle_deathlink_state(currently_dead)
|
||||||
|
|
||||||
|
# Check for Egg Hunt ending
|
||||||
|
goal = await snes_read(ctx, SMW_GOAL_DATA, 0x1)
|
||||||
|
if game_state[0] == 0x14 and goal[0] == 1:
|
||||||
|
current_level = await snes_read(ctx, SMW_CURRENT_LEVEL_ADDR, 0x1)
|
||||||
|
message_box = await snes_read(ctx, SMW_MESSAGE_BOX_ADDR, 0x1)
|
||||||
|
egg_count = await snes_read(ctx, SMW_EGG_COUNT_ADDR, 0x1)
|
||||||
|
required_egg_count = await snes_read(ctx, SMW_REQUIRED_EGGS_DATA, 0x1)
|
||||||
|
|
||||||
|
if current_level[0] == 0x28 and message_box[0] == 0x01 and egg_count[0] >= required_egg_count[0]:
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x13C6, bytes([0x08]))
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x13CE, bytes([0x01]))
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x1DE9, bytes([0x01]))
|
||||||
|
snes_buffered_write(ctx, SMW_GAME_STATE_ADDR, bytes([0x18]))
|
||||||
|
|
||||||
|
await snes_flush_writes(ctx)
|
||||||
|
return
|
||||||
|
|
||||||
|
egg_count = await snes_read(ctx, SMW_EGG_COUNT_ADDR, 0x1)
|
||||||
|
boss_count = await snes_read(ctx, SMW_BOSS_COUNT_ADDR, 0x1)
|
||||||
|
display_count = await snes_read(ctx, SMW_BONUS_STAR_ADDR, 0x1)
|
||||||
|
|
||||||
|
if goal[0] == 0 and boss_count[0] > display_count[0]:
|
||||||
|
snes_buffered_write(ctx, SMW_BONUS_STAR_ADDR, bytes([boss_count[0]]))
|
||||||
|
await snes_flush_writes(ctx)
|
||||||
|
elif goal[0] == 1 and egg_count[0] > display_count[0]:
|
||||||
|
snes_buffered_write(ctx, SMW_BONUS_STAR_ADDR, bytes([egg_count[0]]))
|
||||||
|
await snes_flush_writes(ctx)
|
||||||
|
|
||||||
|
await handle_message_queue(ctx)
|
||||||
|
|
||||||
|
new_checks = []
|
||||||
|
event_data = await snes_read(ctx, SMW_EVENT_ROM_DATA, 0x60)
|
||||||
|
progress_data = bytearray(await snes_read(ctx, SMW_PROGRESS_DATA, 0x0F))
|
||||||
|
dragon_coins_data = bytearray(await snes_read(ctx, SMW_DRAGON_COINS_DATA, 0x0C))
|
||||||
|
dragon_coins_active = await snes_read(ctx, SMW_DRAGON_COINS_ACTIVE_ADDR, 0x1)
|
||||||
|
from worlds.smw.Rom import item_rom_data, ability_rom_data
|
||||||
|
from worlds.smw.Levels import location_id_to_level_id, level_info_dict
|
||||||
|
for loc_name, level_data in location_id_to_level_id.items():
|
||||||
|
loc_id = AutoWorldRegister.world_types[ctx.game].location_name_to_id[loc_name]
|
||||||
|
if loc_id not in ctx.locations_checked:
|
||||||
|
|
||||||
|
event_id = event_data[level_data[0]]
|
||||||
|
|
||||||
|
if level_data[1] == 2:
|
||||||
|
# Dragon Coins Check
|
||||||
|
if not dragon_coins_active or dragon_coins_active[0] == 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
progress_byte = (level_data[0] // 8)
|
||||||
|
progress_bit = 7 - (level_data[0] % 8)
|
||||||
|
|
||||||
|
data = dragon_coins_data[progress_byte]
|
||||||
|
masked_data = data & (1 << progress_bit)
|
||||||
|
bit_set = (masked_data != 0)
|
||||||
|
|
||||||
|
if bit_set:
|
||||||
|
# SMW_TODO: Handle non-included checks
|
||||||
|
new_checks.append(loc_id)
|
||||||
|
else:
|
||||||
|
event_id_value = event_id + level_data[1]
|
||||||
|
|
||||||
|
progress_byte = (event_id_value // 8)
|
||||||
|
progress_bit = 7 - (event_id_value % 8)
|
||||||
|
|
||||||
|
data = progress_data[progress_byte]
|
||||||
|
masked_data = data & (1 << progress_bit)
|
||||||
|
bit_set = (masked_data != 0)
|
||||||
|
|
||||||
|
if bit_set:
|
||||||
|
# SMW_TODO: Handle non-included checks
|
||||||
|
new_checks.append(loc_id)
|
||||||
|
|
||||||
|
verify_game_state = await snes_read(ctx, SMW_GAME_STATE_ADDR, 0x1)
|
||||||
|
if verify_game_state is None or verify_game_state[0] < 0x0B or verify_game_state[0] > 0x29:
|
||||||
|
# We have somehow exited the save file (or worse)
|
||||||
|
print("Exit Save File")
|
||||||
|
return
|
||||||
|
|
||||||
|
rom = await snes_read(ctx, SMW_ROMHASH_START, ROMHASH_SIZE)
|
||||||
|
if rom != ctx.rom:
|
||||||
|
ctx.rom = None
|
||||||
|
print("Exit ROM")
|
||||||
|
# We have somehow loaded a different ROM
|
||||||
|
return
|
||||||
|
|
||||||
|
for new_check_id in new_checks:
|
||||||
|
ctx.locations_checked.add(new_check_id)
|
||||||
|
location = ctx.location_names[new_check_id]
|
||||||
|
snes_logger.info(
|
||||||
|
f'New Check: {location} ({len(ctx.locations_checked)}/{len(ctx.missing_locations) + len(ctx.checked_locations)})')
|
||||||
|
await ctx.send_msgs([{"cmd": 'LocationChecks', "locations": [new_check_id]}])
|
||||||
|
|
||||||
|
if game_state[0] != 0x14:
|
||||||
|
# Don't receive items or collect locations outside of in-level mode
|
||||||
|
return
|
||||||
|
|
||||||
|
recv_count = await snes_read(ctx, SMW_RECV_PROGRESS_ADDR, 1)
|
||||||
|
recv_index = recv_count[0]
|
||||||
|
|
||||||
|
if recv_index < len(ctx.items_received):
|
||||||
|
item = ctx.items_received[recv_index]
|
||||||
|
recv_index += 1
|
||||||
|
logging.info('Received %s from %s (%s) (%d/%d in list)' % (
|
||||||
|
color(ctx.item_names[item.item], 'red', 'bold'),
|
||||||
|
color(ctx.player_names[item.player], 'yellow'),
|
||||||
|
ctx.location_names[item.location], recv_index, len(ctx.items_received)))
|
||||||
|
|
||||||
|
if ctx.receive_option == 1 or (ctx.receive_option == 2 and ((item.flags & 1) != 0)):
|
||||||
|
if item.item != 0xBC0012:
|
||||||
|
# Don't send messages for Boss Tokens
|
||||||
|
item_name = ctx.item_names[item.item]
|
||||||
|
player_name = ctx.player_names[item.player]
|
||||||
|
|
||||||
|
receive_message = generate_received_text(item_name, player_name)
|
||||||
|
add_message_to_queue(ctx, receive_message)
|
||||||
|
|
||||||
|
snes_buffered_write(ctx, SMW_RECV_PROGRESS_ADDR, bytes([recv_index]))
|
||||||
|
if item.item in item_rom_data:
|
||||||
|
item_count = await snes_read(ctx, WRAM_START + item_rom_data[item.item][0], 0x1)
|
||||||
|
increment = item_rom_data[item.item][1]
|
||||||
|
|
||||||
|
new_item_count = item_count[0]
|
||||||
|
if increment > 1:
|
||||||
|
new_item_count = increment
|
||||||
|
else:
|
||||||
|
new_item_count += increment
|
||||||
|
|
||||||
|
if verify_game_state[0] == 0x14 and len(item_rom_data[item.item]) > 2:
|
||||||
|
snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([item_rom_data[item.item][2]]))
|
||||||
|
|
||||||
|
snes_buffered_write(ctx, WRAM_START + item_rom_data[item.item][0], bytes([new_item_count]))
|
||||||
|
elif item.item in ability_rom_data:
|
||||||
|
# Handle Upgrades
|
||||||
|
for rom_data in ability_rom_data[item.item]:
|
||||||
|
data = await snes_read(ctx, WRAM_START + rom_data[0], 1)
|
||||||
|
masked_data = data[0] | (1 << rom_data[1])
|
||||||
|
snes_buffered_write(ctx, WRAM_START + rom_data[0], bytes([masked_data]))
|
||||||
|
snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x3E])) # SMW_TODO: Custom sounds for each
|
||||||
|
elif item.item == 0xBC000A:
|
||||||
|
# Handle Progressive Powerup
|
||||||
|
data = await snes_read(ctx, WRAM_START + 0x1F2D, 1)
|
||||||
|
mushroom_data = data[0] & (1 << 0)
|
||||||
|
fire_flower_data = data[0] & (1 << 1)
|
||||||
|
cape_data = data[0] & (1 << 2)
|
||||||
|
if mushroom_data == 0:
|
||||||
|
masked_data = data[0] | (1 << 0)
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x1F2D, bytes([masked_data]))
|
||||||
|
snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x3E]))
|
||||||
|
elif fire_flower_data == 0:
|
||||||
|
masked_data = data[0] | (1 << 1)
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x1F2D, bytes([masked_data]))
|
||||||
|
snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x3E]))
|
||||||
|
elif cape_data == 0:
|
||||||
|
masked_data = data[0] | (1 << 2)
|
||||||
|
snes_buffered_write(ctx, WRAM_START + 0x1F2D, bytes([masked_data]))
|
||||||
|
snes_buffered_write(ctx, SMW_SFX_ADDR, bytes([0x41]))
|
||||||
|
else:
|
||||||
|
# Extra Powerup?
|
||||||
|
pass
|
||||||
|
elif item.item == 0xBC0015:
|
||||||
|
# Handle Literature Trap
|
||||||
|
from .Names.LiteratureTrap import lit_trap_text_list
|
||||||
|
import random
|
||||||
|
rand_trap = random.choice(lit_trap_text_list)
|
||||||
|
|
||||||
|
for message in rand_trap:
|
||||||
|
add_message_to_queue(ctx, message)
|
||||||
|
|
||||||
|
await snes_flush_writes(ctx)
|
||||||
|
|
||||||
|
# Handle Collected Locations
|
||||||
|
new_events = 0
|
||||||
|
path_data = bytearray(await snes_read(ctx, SMW_PATH_DATA, 0x60))
|
||||||
|
donut_gh_swapped = await snes_read(ctx, SMW_SWAMP_DONUT_GH_ADDR, 0x1)
|
||||||
|
new_dragon_coin = False
|
||||||
|
for loc_id in ctx.checked_locations:
|
||||||
|
if loc_id not in ctx.locations_checked:
|
||||||
|
ctx.locations_checked.add(loc_id)
|
||||||
|
loc_name = ctx.location_names[loc_id]
|
||||||
|
|
||||||
|
if loc_name not in location_id_to_level_id:
|
||||||
|
continue
|
||||||
|
|
||||||
|
level_data = location_id_to_level_id[loc_name]
|
||||||
|
|
||||||
|
if level_data[1] == 2:
|
||||||
|
# Dragon Coins Check
|
||||||
|
|
||||||
|
progress_byte = (level_data[0] // 8)
|
||||||
|
progress_bit = 7 - (level_data[0] % 8)
|
||||||
|
|
||||||
|
data = dragon_coins_data[progress_byte]
|
||||||
|
new_data = data | (1 << progress_bit)
|
||||||
|
dragon_coins_data[progress_byte] = new_data
|
||||||
|
|
||||||
|
new_dragon_coin = True
|
||||||
|
else:
|
||||||
|
if level_data[0] in SMW_UNCOLLECTABLE_LEVELS:
|
||||||
|
continue
|
||||||
|
|
||||||
|
event_id = event_data[level_data[0]]
|
||||||
|
event_id_value = event_id + level_data[1]
|
||||||
|
|
||||||
|
progress_byte = (event_id_value // 8)
|
||||||
|
progress_bit = 7 - (event_id_value % 8)
|
||||||
|
|
||||||
|
data = progress_data[progress_byte]
|
||||||
|
masked_data = data & (1 << progress_bit)
|
||||||
|
bit_set = (masked_data != 0)
|
||||||
|
|
||||||
|
if bit_set:
|
||||||
|
continue
|
||||||
|
|
||||||
|
new_events += 1
|
||||||
|
new_data = data | (1 << progress_bit)
|
||||||
|
progress_data[progress_byte] = new_data
|
||||||
|
|
||||||
|
tile_id = await snes_read(ctx, SMW_ACTIVE_LEVEL_DATA + level_data[0], 0x1)
|
||||||
|
|
||||||
|
level_info = level_info_dict[tile_id[0]]
|
||||||
|
|
||||||
|
path = level_info.exit1Path if level_data[1] == 0 else level_info.exit2Path
|
||||||
|
|
||||||
|
if donut_gh_swapped[0] != 0 and tile_id[0] == 0x04:
|
||||||
|
# Handle Swapped Donut GH Exits
|
||||||
|
path = level_info.exit2Path if level_data[1] == 0 else level_info.exit1Path
|
||||||
|
|
||||||
|
if not path:
|
||||||
|
continue
|
||||||
|
|
||||||
|
this_end_path = path_data[tile_id[0]]
|
||||||
|
new_data = this_end_path | path.thisEndDirection
|
||||||
|
path_data[tile_id[0]] = new_data
|
||||||
|
|
||||||
|
other_end_path = path_data[path.otherLevelID]
|
||||||
|
new_data = other_end_path | path.otherEndDirection
|
||||||
|
path_data[path.otherLevelID] = new_data
|
||||||
|
|
||||||
|
if new_dragon_coin:
|
||||||
|
snes_buffered_write(ctx, SMW_DRAGON_COINS_DATA, bytes(dragon_coins_data))
|
||||||
|
if new_events > 0:
|
||||||
|
snes_buffered_write(ctx, SMW_PROGRESS_DATA, bytes(progress_data))
|
||||||
|
snes_buffered_write(ctx, SMW_PATH_DATA, bytes(path_data))
|
||||||
|
old_events = await snes_read(ctx, SMW_NUM_EVENTS_ADDR, 0x1)
|
||||||
|
snes_buffered_write(ctx, SMW_NUM_EVENTS_ADDR, bytes([old_events[0] + new_events]))
|
||||||
|
|
||||||
|
await snes_flush_writes(ctx)
|
|
@ -0,0 +1,69 @@
|
||||||
|
import typing
|
||||||
|
|
||||||
|
from BaseClasses import Item, ItemClassification
|
||||||
|
from .Names import ItemName
|
||||||
|
|
||||||
|
|
||||||
|
class ItemData(typing.NamedTuple):
|
||||||
|
code: typing.Optional[int]
|
||||||
|
progression: bool
|
||||||
|
trap: bool = False
|
||||||
|
quantity: int = 1
|
||||||
|
event: bool = False
|
||||||
|
|
||||||
|
|
||||||
|
class SMWItem(Item):
|
||||||
|
game: str = "Super Mario World"
|
||||||
|
|
||||||
|
|
||||||
|
# Separate tables for each type of item.
|
||||||
|
junk_table = {
|
||||||
|
ItemName.one_up_mushroom: ItemData(0xBC0001, False),
|
||||||
|
}
|
||||||
|
|
||||||
|
collectable_table = {
|
||||||
|
ItemName.yoshi_egg: ItemData(0xBC0002, True),
|
||||||
|
}
|
||||||
|
|
||||||
|
upgrade_table = {
|
||||||
|
ItemName.mario_run: ItemData(0xBC0003, True),
|
||||||
|
ItemName.mario_carry: ItemData(0xBC0004, True),
|
||||||
|
ItemName.mario_swim: ItemData(0xBC0005, True),
|
||||||
|
ItemName.mario_spin_jump: ItemData(0xBC0006, True),
|
||||||
|
ItemName.mario_climb: ItemData(0xBC0007, True),
|
||||||
|
ItemName.yoshi_activate: ItemData(0xBC0008, True),
|
||||||
|
ItemName.p_switch: ItemData(0xBC0009, True),
|
||||||
|
ItemName.progressive_powerup: ItemData(0xBC000A, True),
|
||||||
|
ItemName.p_balloon: ItemData(0xBC000B, True),
|
||||||
|
ItemName.super_star_active: ItemData(0xBC000D, True),
|
||||||
|
}
|
||||||
|
|
||||||
|
switch_palace_table = {
|
||||||
|
ItemName.yellow_switch_palace: ItemData(0xBC000E, True),
|
||||||
|
ItemName.green_switch_palace: ItemData(0xBC000F, True),
|
||||||
|
ItemName.red_switch_palace: ItemData(0xBC0010, True),
|
||||||
|
ItemName.blue_switch_palace: ItemData(0xBC0011, True),
|
||||||
|
}
|
||||||
|
|
||||||
|
trap_table = {
|
||||||
|
ItemName.ice_trap: ItemData(0xBC0013, False, True),
|
||||||
|
ItemName.stun_trap: ItemData(0xBC0014, False, True),
|
||||||
|
ItemName.literature_trap: ItemData(0xBC0015, False, True),
|
||||||
|
}
|
||||||
|
|
||||||
|
event_table = {
|
||||||
|
ItemName.victory: ItemData(0xBC0000, True),
|
||||||
|
ItemName.koopaling: ItemData(0xBC0012, True),
|
||||||
|
}
|
||||||
|
|
||||||
|
# Complete item table.
|
||||||
|
item_table = {
|
||||||
|
**junk_table,
|
||||||
|
**collectable_table,
|
||||||
|
**upgrade_table,
|
||||||
|
**switch_palace_table,
|
||||||
|
**trap_table,
|
||||||
|
**event_table,
|
||||||
|
}
|
||||||
|
|
||||||
|
lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in item_table.items() if data.code}
|
|
@ -0,0 +1,579 @@
|
||||||
|
|
||||||
|
from .Names import LocationName
|
||||||
|
|
||||||
|
class SMWPath():
|
||||||
|
thisEndDirection: int
|
||||||
|
otherLevelID: int
|
||||||
|
otherEndDirection: int
|
||||||
|
|
||||||
|
def __init__(self, thisEndDirection: int, otherLevelID: int, otherEndDirection: int):
|
||||||
|
self.thisEndDirection = thisEndDirection
|
||||||
|
self.otherLevelID = otherLevelID
|
||||||
|
self.otherEndDirection = otherEndDirection
|
||||||
|
|
||||||
|
|
||||||
|
class SMWLevel():
|
||||||
|
levelName: str
|
||||||
|
levelIDAddress: int
|
||||||
|
#eventIDAddress: int
|
||||||
|
eventIDValue: int
|
||||||
|
#progressByte: int
|
||||||
|
#progressBit: int
|
||||||
|
exit1Path: SMWPath
|
||||||
|
exit2Path: SMWPath
|
||||||
|
|
||||||
|
def __init__(self, levelName: str, levelIDAddress: int, eventIDValue: int, exit1Path: SMWPath = None, exit2Path: SMWPath = None):
|
||||||
|
self.levelName = levelName
|
||||||
|
self.levelIDAddress = levelIDAddress
|
||||||
|
#self.eventIDAddress = eventIDAddress # Inferred from: LevelIDValue (Dict Key): $2D608 + LevelIDValue
|
||||||
|
self.eventIDValue = eventIDValue
|
||||||
|
#self.progressByte = progressByte # Inferred from EventIDValue: (ID / 8) + $1F02
|
||||||
|
#self.progressBit = progressBit # Inferred from EventIDValue: 1 << (7 - (ID % 8))
|
||||||
|
self.exit1Path = exit1Path
|
||||||
|
self.exit2Path = exit2Path
|
||||||
|
|
||||||
|
|
||||||
|
level_info_dict = {
|
||||||
|
0x28: SMWLevel(LocationName.yoshis_house, 0x37A76, 0x00),
|
||||||
|
0x29: SMWLevel(LocationName.yoshis_island_1_region, 0x37A83, 0x01, SMWPath(0x08, 0x14, 0x04)),
|
||||||
|
0x14: SMWLevel(LocationName.yellow_switch_palace, 0x37812, 0x02),
|
||||||
|
0x2A: SMWLevel(LocationName.yoshis_island_2_region, 0x37A89, 0x03, SMWPath(0x08, 0x27, 0x04)),
|
||||||
|
0x27: SMWLevel(LocationName.yoshis_island_3_region, 0x37A69, 0x04, SMWPath(0x01, 0x26, 0x04)),
|
||||||
|
0x26: SMWLevel(LocationName.yoshis_island_4_region, 0x37A4B, 0x05, SMWPath(0x08, 0x25, 0x01)),
|
||||||
|
0x25: SMWLevel(LocationName.yoshis_island_castle_region, 0x37A29, 0x06, SMWPath(0x08, 0x15, 0x04)),
|
||||||
|
|
||||||
|
0x15: SMWLevel(LocationName.donut_plains_1_region, 0x37815, 0x07, SMWPath(0x02, 0x09, 0x04), SMWPath(0x08, 0x0A, 0x04)),
|
||||||
|
0x09: SMWLevel(LocationName.donut_plains_2_region, 0x376D3, 0x09, SMWPath(0x08, 0x04, 0x02), SMWPath(0x02, 0x08, 0x01)),
|
||||||
|
0x0A: SMWLevel(LocationName.donut_secret_1_region, 0x376E5, 0x10, SMWPath(0x08, 0x04, 0x04), SMWPath(0x01, 0x13, 0x08)),
|
||||||
|
0x08: SMWLevel(LocationName.green_switch_palace, 0x376D1, 0x28),
|
||||||
|
0x04: SMWLevel(LocationName.donut_ghost_house_region, 0x376A5, 0x0B, SMWPath(0x08, 0x03, 0x04), SMWPath(0x01, 0x05, 0x02)),
|
||||||
|
0x13: SMWLevel(LocationName.donut_secret_house_region, 0x37807, 0x12, SMWPath(0x01, 0x2F, 0x04), SMWPath(0x04, 0x16, 0x08)), # SMW_TODO: Check this wrt pipe behavior
|
||||||
|
0x05: SMWLevel(LocationName.donut_plains_3_region, 0x376A9, 0x0D, SMWPath(0x01, 0x06, 0x08)),
|
||||||
|
0x06: SMWLevel(LocationName.donut_plains_4_region, 0x376CB, 0x0E, SMWPath(0x01, 0x07, 0x02)),
|
||||||
|
0x2F: SMWLevel(LocationName.donut_secret_2_region, 0x37B10, 0x14, SMWPath(0x01, 0x05, 0x04)),
|
||||||
|
0x07: SMWLevel(LocationName.donut_plains_castle_region, 0x376CD, 0x0F, SMWPath(0x08, 0x3E, 0x04)),
|
||||||
|
0x03: SMWLevel(LocationName.donut_plains_top_secret, 0x37685, 0xFF),
|
||||||
|
0x16: SMWLevel(LocationName.donut_plains_star_road, 0x37827, 0xFF),
|
||||||
|
|
||||||
|
0x3E: SMWLevel(LocationName.vanilla_dome_1_region, 0x37C25, 0x15, SMWPath(0x01, 0x3C, 0x04), SMWPath(0x02, 0x2D, 0x04)),
|
||||||
|
0x3C: SMWLevel(LocationName.vanilla_dome_2_region, 0x37C08, 0x17, SMWPath(0x08, 0x2B, 0x04), SMWPath(0x01, 0x3F, 0x08)),
|
||||||
|
0x2D: SMWLevel(LocationName.vanilla_secret_1_region, 0x37AE3, 0x1D, SMWPath(0x08, 0x01, 0x02), SMWPath(0x02, 0x2C, 0x01)),
|
||||||
|
0x2B: SMWLevel(LocationName.vanilla_ghost_house_region, 0x37AC8, 0x19, SMWPath(0x01, 0x2E, 0x08)),
|
||||||
|
0x2E: SMWLevel(LocationName.vanilla_dome_3_region, 0x37AEC, 0x1A, SMWPath(0x04, 0x3D, 0x08)),
|
||||||
|
0x3D: SMWLevel(LocationName.vanilla_dome_4_region, 0x37C0C, 0x1B, SMWPath(0x04, 0x40, 0x08)),
|
||||||
|
0x3F: SMWLevel(LocationName.red_switch_palace, 0x37C2A, 0x29),
|
||||||
|
0x01: SMWLevel(LocationName.vanilla_secret_2_region, 0x3763C, 0x1F, SMWPath(0x01, 0x02, 0x02)),
|
||||||
|
0x02: SMWLevel(LocationName.vanilla_secret_3_region, 0x3763E, 0x20, SMWPath(0x01, 0x0B, 0x02)),
|
||||||
|
0x0B: SMWLevel(LocationName.vanilla_fortress_region, 0x37730, 0x21, SMWPath(0x01, 0x0C, 0x02)),
|
||||||
|
0x40: SMWLevel(LocationName.vanilla_dome_castle_region, 0x37C2C, 0x1C, SMWPath(0x04, 0x0F, 0x02)),
|
||||||
|
0x2C: SMWLevel(LocationName.vanilla_dome_star_road, 0x37AE0, 0xFF),
|
||||||
|
|
||||||
|
0x0C: SMWLevel(LocationName.butter_bridge_1_region, 0x37734, 0x22, SMWPath(0x01, 0x0D, 0x02)),
|
||||||
|
0x0D: SMWLevel(LocationName.butter_bridge_2_region, 0x37736, 0x23, SMWPath(0x01, 0x0E, 0x02)),
|
||||||
|
0x0F: SMWLevel(LocationName.cheese_bridge_region, 0x37754, 0x25, SMWPath(0x01, 0x10, 0x02), SMWPath(0x04, 0x11, 0x08)),
|
||||||
|
0x11: SMWLevel(LocationName.soda_lake_region, 0x37784, 0x60, SMWPath(0x04, 0x12, 0x04)),
|
||||||
|
0x10: SMWLevel(LocationName.cookie_mountain_region, 0x37757, 0x27, SMWPath(0x04, 0x0E, 0x04)),
|
||||||
|
0x0E: SMWLevel(LocationName.twin_bridges_castle_region, 0x3773A, 0x24, SMWPath(0x01, 0x42, 0x08)),
|
||||||
|
0x12: SMWLevel(LocationName.twin_bridges_star_road, 0x377F0, 0xFF),
|
||||||
|
|
||||||
|
0x42: SMWLevel(LocationName.forest_of_illusion_1_region, 0x37C78, 0x2A, SMWPath(0x01, 0x44, 0x08), SMWPath(0x02, 0x41, 0x01)),
|
||||||
|
0x44: SMWLevel(LocationName.forest_of_illusion_2_region, 0x37CAA, 0x2C, SMWPath(0x04, 0x47, 0x08), SMWPath(0x01, 0x45, 0x02)),
|
||||||
|
0x47: SMWLevel(LocationName.forest_of_illusion_3_region, 0x37CC8, 0x2E, SMWPath(0x02, 0x41, 0x04), SMWPath(0x04, 0x20, 0x01)),
|
||||||
|
0x43: SMWLevel(LocationName.forest_of_illusion_4_region, 0x37CA4, 0x32, SMWPath(0x01, 0x44, 0x02), SMWPath(0x04, 0x46, 0x08)),
|
||||||
|
0x41: SMWLevel(LocationName.forest_ghost_house_region, 0x37C76, 0x30, SMWPath(0x01, 0x42, 0x02), SMWPath(0x02, 0x43, 0x08)),
|
||||||
|
0x46: SMWLevel(LocationName.forest_secret_region, 0x37CC4, 0x34, SMWPath(0x04, 0x1F, 0x01)),
|
||||||
|
0x45: SMWLevel(LocationName.blue_switch_palace, 0x37CAC, 0x37),
|
||||||
|
0x1F: SMWLevel(LocationName.forest_fortress_region, 0x37906, 0x35, SMWPath(0x02, 0x1E, 0x01)),
|
||||||
|
0x20: SMWLevel(LocationName.forest_castle_region, 0x37928, 0x61, SMWPath(0x04, 0x22, 0x08)),
|
||||||
|
0x1E: SMWLevel(LocationName.forest_star_road, 0x37904, 0x36),
|
||||||
|
|
||||||
|
0x22: SMWLevel(LocationName.chocolate_island_1_region, 0x37968, 0x62, SMWPath(0x02, 0x21, 0x01)),
|
||||||
|
0x24: SMWLevel(LocationName.chocolate_island_2_region, 0x379B5, 0x46, SMWPath(0x02, 0x23, 0x01), SMWPath(0x04, 0x3B, 0x01)),
|
||||||
|
0x23: SMWLevel(LocationName.chocolate_island_3_region, 0x379B3, 0x48, SMWPath(0x04, 0x23, 0x08), SMWPath(0x02, 0x1B, 0x01)),
|
||||||
|
0x1D: SMWLevel(LocationName.chocolate_island_4_region, 0x378DF, 0x4B, SMWPath(0x02, 0x1C, 0x01)),
|
||||||
|
0x1C: SMWLevel(LocationName.chocolate_island_5_region, 0x378DC, 0x4C, SMWPath(0x08, 0x1A, 0x04)),
|
||||||
|
0x21: SMWLevel(LocationName.chocolate_ghost_house_region, 0x37965, 0x63, SMWPath(0x04, 0x24, 0x08)),
|
||||||
|
0x1B: SMWLevel(LocationName.chocolate_fortress_region, 0x378BF, 0x4A, SMWPath(0x04, 0x1D, 0x08)),
|
||||||
|
0x3B: SMWLevel(LocationName.chocolate_secret_region, 0x37B97, 0x4F, SMWPath(0x02, 0x1A, 0x02)),
|
||||||
|
0x1A: SMWLevel(LocationName.chocolate_castle_region, 0x378BC, 0x4D, SMWPath(0x08, 0x18, 0x02)),
|
||||||
|
|
||||||
|
0x18: SMWLevel(LocationName.sunken_ghost_ship_region, 0x3787E, 0x4E, SMWPath(0x08, 0x3A, 0x01)),
|
||||||
|
0x3A: SMWLevel(LocationName.valley_of_bowser_1_region, 0x37B7B, 0x38, SMWPath(0x02, 0x39, 0x01)),
|
||||||
|
0x39: SMWLevel(LocationName.valley_of_bowser_2_region, 0x37B79, 0x39, SMWPath(0x02, 0x38, 0x01), SMWPath(0x08, 0x35, 0x04)),
|
||||||
|
0x37: SMWLevel(LocationName.valley_of_bowser_3_region, 0x37B74, 0x3D, SMWPath(0x08, 0x33, 0x04)),
|
||||||
|
0x33: SMWLevel(LocationName.valley_of_bowser_4_region, 0x37B54, 0x3E, SMWPath(0x01, 0x34, 0x02), SMWPath(0x08, 0x30, 0x04)),
|
||||||
|
0x38: SMWLevel(LocationName.valley_ghost_house_region, 0x37B77, 0x3B, SMWPath(0x02, 0x37, 0x01), SMWPath(0x08, 0x34, 0x04)),
|
||||||
|
0x35: SMWLevel(LocationName.valley_fortress_region, 0x37B59, 0x41, SMWPath(0x08, 0x32, 0x04)),
|
||||||
|
0x34: SMWLevel(LocationName.valley_castle_region, 0x37B57, 0x40, SMWPath(0x08, 0x31, 0x04)),
|
||||||
|
0x31: SMWLevel(LocationName.front_door, 0x37B37, 0x45),
|
||||||
|
0x81: SMWLevel(LocationName.front_door, 0x37B37, 0x45), # Fake Extra Front Door
|
||||||
|
0x32: SMWLevel(LocationName.back_door, 0x37B39, 0x42),
|
||||||
|
0x82: SMWLevel(LocationName.back_door, 0x37B39, 0x42), # Fake Extra Back Door
|
||||||
|
0x30: SMWLevel(LocationName.valley_star_road, 0x37B34, 0x44),
|
||||||
|
|
||||||
|
0x5B: SMWLevel(LocationName.star_road_donut, 0x37DD3, 0x50),
|
||||||
|
0x58: SMWLevel(LocationName.star_road_1_region, 0x37DA4, 0x51, None, SMWPath(0x02, 0x53, 0x04)),
|
||||||
|
0x53: SMWLevel(LocationName.star_road_vanilla, 0x37D82, 0x53),
|
||||||
|
0x54: SMWLevel(LocationName.star_road_2_region, 0x37D85, 0x54, None, SMWPath(0x08, 0x52, 0x02)),
|
||||||
|
0x52: SMWLevel(LocationName.star_road_twin_bridges, 0x37D67, 0x56),
|
||||||
|
0x56: SMWLevel(LocationName.star_road_3_region, 0x37D89, 0x57, None, SMWPath(0x01, 0x57, 0x02)),
|
||||||
|
0x57: SMWLevel(LocationName.star_road_forest, 0x37D8C, 0x59),
|
||||||
|
0x59: SMWLevel(LocationName.star_road_4_region, 0x37DAA, 0x5A, None, SMWPath(0x04, 0x5C, 0x08)),
|
||||||
|
0x5C: SMWLevel(LocationName.star_road_valley, 0x37DDC, 0x5C),
|
||||||
|
0x5A: SMWLevel(LocationName.star_road_5_region, 0x37DB7, 0x5D, SMWPath(0x02, 0x5B, 0x01), SMWPath(0x08, 0x55, 0x04)),
|
||||||
|
0x55: SMWLevel(LocationName.star_road_special, 0x37D87, 0x5F),
|
||||||
|
|
||||||
|
0x4D: SMWLevel(LocationName.special_star_road, 0x37D31, 0x64),
|
||||||
|
0x4E: SMWLevel(LocationName.special_zone_1_region, 0x37D33, 0x65, SMWPath(0x01, 0x4F, 0x02)),
|
||||||
|
0x4F: SMWLevel(LocationName.special_zone_2_region, 0x37D36, 0x66, SMWPath(0x01, 0x50, 0x02)),
|
||||||
|
0x50: SMWLevel(LocationName.special_zone_3_region, 0x37D39, 0x67, SMWPath(0x01, 0x51, 0x02)),
|
||||||
|
0x51: SMWLevel(LocationName.special_zone_4_region, 0x37D3C, 0x68, SMWPath(0x01, 0x4C, 0x01)),
|
||||||
|
0x4C: SMWLevel(LocationName.special_zone_5_region, 0x37D1C, 0x69, SMWPath(0x02, 0x4B, 0x01)),
|
||||||
|
0x4B: SMWLevel(LocationName.special_zone_6_region, 0x37D19, 0x6A, SMWPath(0x02, 0x4A, 0x01)),
|
||||||
|
0x4A: SMWLevel(LocationName.special_zone_7_region, 0x37D16, 0x6B, SMWPath(0x02, 0x49, 0x01)),
|
||||||
|
0x49: SMWLevel(LocationName.special_zone_8_region, 0x37D13, 0x6C, SMWPath(0x02, 0x48, 0x01)),
|
||||||
|
0x48: SMWLevel(LocationName.special_complete, 0x37D11, 0x6D),
|
||||||
|
}
|
||||||
|
|
||||||
|
full_level_list = [
|
||||||
|
0x28, 0x29, 0x14, 0x2A, 0x27, 0x26, 0x25,
|
||||||
|
0x15, 0x09, 0x0A, 0x08, 0x04, 0x13, 0x05, 0x06, 0x2F, 0x07, 0x03, 0x16,
|
||||||
|
0x3E, 0x3C, 0x2D, 0x2B, 0x2E, 0x3D, 0x3F, 0x01, 0x02, 0x0B, 0x40, 0x2C,
|
||||||
|
0x0C, 0x0D, 0x0F, 0x11, 0x10, 0x0E, 0x12,
|
||||||
|
0x42, 0x44, 0x47, 0x43, 0x41, 0x46, 0x45, 0x1F, 0x20, 0x1E,
|
||||||
|
0x22, 0x24, 0x23, 0x1D, 0x1C, 0x21, 0x1B, 0x3B, 0x1A,
|
||||||
|
0x18, 0x3A, 0x39, 0x37, 0x33, 0x38, 0x35, 0x34, 0x31, 0x32, 0x30,
|
||||||
|
0x5B, 0x58, 0x53, 0x54, 0x52, 0x56, 0x57, 0x59, 0x5C, 0x5A, 0x55,
|
||||||
|
0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x4C, 0x4B, 0x4A, 0x49, 0x48,
|
||||||
|
]
|
||||||
|
|
||||||
|
submap_level_list = [
|
||||||
|
0x28, 0x29, 0x2A, 0x27, 0x26, 0x25,
|
||||||
|
0x2F,
|
||||||
|
0x3E, 0x3C, 0x2D, 0x2B, 0x2E, 0x3D, 0x3F, 0x40, 0x2C,
|
||||||
|
0x42, 0x44, 0x47, 0x43, 0x41, 0x46, 0x45,
|
||||||
|
0x3B,
|
||||||
|
0x3A, 0x39, 0x37, 0x33, 0x38, 0x35, 0x34, 0x31, 0x32, 0x30,
|
||||||
|
0x5B, 0x58, 0x53, 0x54, 0x52, 0x56, 0x57, 0x59, 0x5C, 0x5A, 0x55,
|
||||||
|
0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x4C, 0x4B, 0x4A, 0x49, 0x48,
|
||||||
|
]
|
||||||
|
|
||||||
|
easy_castle_fortress_levels = [
|
||||||
|
0x07,
|
||||||
|
0x40,
|
||||||
|
0x1F,
|
||||||
|
0x20,
|
||||||
|
0x1B,
|
||||||
|
0x34,
|
||||||
|
]
|
||||||
|
|
||||||
|
hard_castle_fortress_levels = [
|
||||||
|
0x25,
|
||||||
|
0x0B,
|
||||||
|
0x0E,
|
||||||
|
0x1A,
|
||||||
|
0x35,
|
||||||
|
]
|
||||||
|
|
||||||
|
easy_single_levels = [
|
||||||
|
0x29,
|
||||||
|
0x2A,
|
||||||
|
0x27,
|
||||||
|
0x26,
|
||||||
|
0x05,
|
||||||
|
0x06,
|
||||||
|
0x2F,
|
||||||
|
0x2E,
|
||||||
|
0x3D,
|
||||||
|
0x01,
|
||||||
|
0x0C,
|
||||||
|
0x0D,
|
||||||
|
0x46,
|
||||||
|
0x1D,
|
||||||
|
]
|
||||||
|
|
||||||
|
hard_single_levels = [
|
||||||
|
0x2B,
|
||||||
|
0x02,
|
||||||
|
0x11,
|
||||||
|
0x10,
|
||||||
|
0x22,
|
||||||
|
0x1C,
|
||||||
|
0x21,
|
||||||
|
0x3B,
|
||||||
|
0x3A,
|
||||||
|
0x37,
|
||||||
|
0x4E,
|
||||||
|
0x4F,
|
||||||
|
0x50,
|
||||||
|
0x51,
|
||||||
|
0x4C,
|
||||||
|
0x4B,
|
||||||
|
0x4A,
|
||||||
|
0x49,
|
||||||
|
]
|
||||||
|
|
||||||
|
easy_double_levels = [
|
||||||
|
0x15,
|
||||||
|
0x09,
|
||||||
|
0x0F,
|
||||||
|
0x42,
|
||||||
|
0x43,
|
||||||
|
0x24,
|
||||||
|
0x38,
|
||||||
|
0x58,
|
||||||
|
0x54,
|
||||||
|
0x56,
|
||||||
|
]
|
||||||
|
|
||||||
|
hard_double_levels = [
|
||||||
|
0x0A,
|
||||||
|
0x04,
|
||||||
|
0x13,
|
||||||
|
0x3E,
|
||||||
|
0x3C,
|
||||||
|
0x2D,
|
||||||
|
0x44,
|
||||||
|
0x47,
|
||||||
|
0x41,
|
||||||
|
0x23,
|
||||||
|
0x33,
|
||||||
|
0x39,
|
||||||
|
0x59,
|
||||||
|
0x5A,
|
||||||
|
]
|
||||||
|
|
||||||
|
switch_palace_levels = [
|
||||||
|
0x14,
|
||||||
|
0x08,
|
||||||
|
0x3F,
|
||||||
|
0x45,
|
||||||
|
]
|
||||||
|
|
||||||
|
location_id_to_level_id = {
|
||||||
|
LocationName.yoshis_island_1_exit_1: [0x29, 0],
|
||||||
|
LocationName.yoshis_island_1_dragon: [0x29, 2],
|
||||||
|
LocationName.yoshis_island_2_exit_1: [0x2A, 0],
|
||||||
|
LocationName.yoshis_island_2_dragon: [0x2A, 2],
|
||||||
|
LocationName.yoshis_island_3_exit_1: [0x27, 0],
|
||||||
|
LocationName.yoshis_island_3_dragon: [0x27, 2],
|
||||||
|
LocationName.yoshis_island_4_exit_1: [0x26, 0],
|
||||||
|
LocationName.yoshis_island_4_dragon: [0x26, 2],
|
||||||
|
LocationName.yoshis_island_castle: [0x25, 0],
|
||||||
|
LocationName.yoshis_island_koopaling: [0x25, 0],
|
||||||
|
LocationName.yellow_switch_palace: [0x14, 0],
|
||||||
|
|
||||||
|
LocationName.donut_plains_1_exit_1: [0x15, 0],
|
||||||
|
LocationName.donut_plains_1_exit_2: [0x15, 1],
|
||||||
|
LocationName.donut_plains_1_dragon: [0x15, 2],
|
||||||
|
LocationName.donut_plains_2_exit_1: [0x09, 0],
|
||||||
|
LocationName.donut_plains_2_exit_2: [0x09, 1],
|
||||||
|
LocationName.donut_plains_2_dragon: [0x09, 2],
|
||||||
|
LocationName.donut_plains_3_exit_1: [0x05, 0],
|
||||||
|
LocationName.donut_plains_3_dragon: [0x05, 2],
|
||||||
|
LocationName.donut_plains_4_exit_1: [0x06, 0],
|
||||||
|
LocationName.donut_plains_4_dragon: [0x06, 2],
|
||||||
|
LocationName.donut_secret_1_exit_1: [0x0A, 0],
|
||||||
|
LocationName.donut_secret_1_exit_2: [0x0A, 1],
|
||||||
|
LocationName.donut_secret_1_dragon: [0x0A, 2],
|
||||||
|
LocationName.donut_secret_2_exit_1: [0x2F, 0],
|
||||||
|
LocationName.donut_secret_2_dragon: [0x2F, 2],
|
||||||
|
LocationName.donut_ghost_house_exit_1: [0x04, 0],
|
||||||
|
LocationName.donut_ghost_house_exit_2: [0x04, 1],
|
||||||
|
LocationName.donut_secret_house_exit_1: [0x13, 0],
|
||||||
|
LocationName.donut_secret_house_exit_2: [0x13, 1],
|
||||||
|
LocationName.donut_plains_castle: [0x07, 0],
|
||||||
|
LocationName.donut_plains_koopaling: [0x07, 0],
|
||||||
|
LocationName.green_switch_palace: [0x08, 0],
|
||||||
|
|
||||||
|
LocationName.vanilla_dome_1_exit_1: [0x3E, 0],
|
||||||
|
LocationName.vanilla_dome_1_exit_2: [0x3E, 1],
|
||||||
|
LocationName.vanilla_dome_1_dragon: [0x3E, 2],
|
||||||
|
LocationName.vanilla_dome_2_exit_1: [0x3C, 0],
|
||||||
|
LocationName.vanilla_dome_2_exit_2: [0x3C, 1],
|
||||||
|
LocationName.vanilla_dome_2_dragon: [0x3C, 2],
|
||||||
|
LocationName.vanilla_dome_3_exit_1: [0x2E, 0],
|
||||||
|
LocationName.vanilla_dome_3_dragon: [0x2E, 2],
|
||||||
|
LocationName.vanilla_dome_4_exit_1: [0x3D, 0],
|
||||||
|
LocationName.vanilla_dome_4_dragon: [0x3D, 2],
|
||||||
|
LocationName.vanilla_secret_1_exit_1: [0x2D, 0],
|
||||||
|
LocationName.vanilla_secret_1_exit_2: [0x2D, 1],
|
||||||
|
LocationName.vanilla_secret_1_dragon: [0x2D, 2],
|
||||||
|
LocationName.vanilla_secret_2_exit_1: [0x01, 0],
|
||||||
|
LocationName.vanilla_secret_2_dragon: [0x01, 2],
|
||||||
|
LocationName.vanilla_secret_3_exit_1: [0x02, 0],
|
||||||
|
LocationName.vanilla_secret_3_dragon: [0x02, 2],
|
||||||
|
LocationName.vanilla_ghost_house_exit_1: [0x2B, 0],
|
||||||
|
LocationName.vanilla_ghost_house_dragon: [0x2B, 2],
|
||||||
|
LocationName.vanilla_fortress: [0x0B, 0],
|
||||||
|
LocationName.vanilla_reznor: [0x0B, 0],
|
||||||
|
LocationName.vanilla_dome_castle: [0x40, 0],
|
||||||
|
LocationName.vanilla_dome_koopaling: [0x40, 0],
|
||||||
|
LocationName.red_switch_palace: [0x3F, 0],
|
||||||
|
|
||||||
|
LocationName.butter_bridge_1_exit_1: [0x0C, 0],
|
||||||
|
LocationName.butter_bridge_1_dragon: [0x0C, 2],
|
||||||
|
LocationName.butter_bridge_2_exit_1: [0x0D, 0],
|
||||||
|
LocationName.butter_bridge_2_dragon: [0x0D, 2],
|
||||||
|
LocationName.cheese_bridge_exit_1: [0x0F, 0],
|
||||||
|
LocationName.cheese_bridge_exit_2: [0x0F, 1],
|
||||||
|
LocationName.cheese_bridge_dragon: [0x0F, 2],
|
||||||
|
LocationName.cookie_mountain_exit_1: [0x10, 0],
|
||||||
|
LocationName.cookie_mountain_dragon: [0x10, 2],
|
||||||
|
LocationName.soda_lake_exit_1: [0x11, 0],
|
||||||
|
LocationName.soda_lake_dragon: [0x11, 2],
|
||||||
|
LocationName.twin_bridges_castle: [0x0E, 0],
|
||||||
|
LocationName.twin_bridges_koopaling: [0x0E, 0],
|
||||||
|
|
||||||
|
LocationName.forest_of_illusion_1_exit_1: [0x42, 0],
|
||||||
|
LocationName.forest_of_illusion_1_exit_2: [0x42, 1],
|
||||||
|
LocationName.forest_of_illusion_2_exit_1: [0x44, 0],
|
||||||
|
LocationName.forest_of_illusion_2_exit_2: [0x44, 1],
|
||||||
|
LocationName.forest_of_illusion_2_dragon: [0x44, 2],
|
||||||
|
LocationName.forest_of_illusion_3_exit_1: [0x47, 0],
|
||||||
|
LocationName.forest_of_illusion_3_exit_2: [0x47, 1],
|
||||||
|
LocationName.forest_of_illusion_3_dragon: [0x47, 2],
|
||||||
|
LocationName.forest_of_illusion_4_exit_1: [0x43, 0],
|
||||||
|
LocationName.forest_of_illusion_4_exit_2: [0x43, 1],
|
||||||
|
LocationName.forest_of_illusion_4_dragon: [0x43, 2],
|
||||||
|
LocationName.forest_ghost_house_exit_1: [0x41, 0],
|
||||||
|
LocationName.forest_ghost_house_exit_2: [0x41, 1],
|
||||||
|
LocationName.forest_ghost_house_dragon: [0x41, 2],
|
||||||
|
LocationName.forest_secret_exit_1: [0x46, 0],
|
||||||
|
LocationName.forest_secret_dragon: [0x46, 2],
|
||||||
|
LocationName.forest_fortress: [0x1F, 0],
|
||||||
|
LocationName.forest_reznor: [0x1F, 0],
|
||||||
|
LocationName.forest_castle: [0x20, 0],
|
||||||
|
LocationName.forest_koopaling: [0x20, 0],
|
||||||
|
LocationName.forest_castle_dragon: [0x20, 2],
|
||||||
|
LocationName.blue_switch_palace: [0x45, 0],
|
||||||
|
|
||||||
|
LocationName.chocolate_island_1_exit_1: [0x22, 0],
|
||||||
|
LocationName.chocolate_island_1_dragon: [0x22, 2],
|
||||||
|
LocationName.chocolate_island_2_exit_1: [0x24, 0],
|
||||||
|
LocationName.chocolate_island_2_exit_2: [0x24, 1],
|
||||||
|
LocationName.chocolate_island_2_dragon: [0x24, 2],
|
||||||
|
LocationName.chocolate_island_3_exit_1: [0x23, 0],
|
||||||
|
LocationName.chocolate_island_3_exit_2: [0x23, 1],
|
||||||
|
LocationName.chocolate_island_3_dragon: [0x23, 2],
|
||||||
|
LocationName.chocolate_island_4_exit_1: [0x1D, 0],
|
||||||
|
LocationName.chocolate_island_4_dragon: [0x1D, 2],
|
||||||
|
LocationName.chocolate_island_5_exit_1: [0x1C, 0],
|
||||||
|
LocationName.chocolate_island_5_dragon: [0x1C, 2],
|
||||||
|
LocationName.chocolate_ghost_house_exit_1: [0x21, 0],
|
||||||
|
LocationName.chocolate_secret_exit_1: [0x3B, 0],
|
||||||
|
LocationName.chocolate_fortress: [0x1B, 0],
|
||||||
|
LocationName.chocolate_reznor: [0x1B, 0],
|
||||||
|
LocationName.chocolate_castle: [0x1A, 0],
|
||||||
|
LocationName.chocolate_koopaling: [0x1A, 0],
|
||||||
|
|
||||||
|
LocationName.sunken_ghost_ship: [0x18, 0],
|
||||||
|
LocationName.sunken_ghost_ship_dragon: [0x18, 2],
|
||||||
|
|
||||||
|
LocationName.valley_of_bowser_1_exit_1: [0x3A, 0],
|
||||||
|
LocationName.valley_of_bowser_1_dragon: [0x3A, 2],
|
||||||
|
LocationName.valley_of_bowser_2_exit_1: [0x39, 0],
|
||||||
|
LocationName.valley_of_bowser_2_exit_2: [0x39, 1],
|
||||||
|
LocationName.valley_of_bowser_2_dragon: [0x39, 2],
|
||||||
|
LocationName.valley_of_bowser_3_exit_1: [0x37, 0],
|
||||||
|
LocationName.valley_of_bowser_3_dragon: [0x37, 2],
|
||||||
|
LocationName.valley_of_bowser_4_exit_1: [0x33, 0],
|
||||||
|
LocationName.valley_of_bowser_4_exit_2: [0x33, 1],
|
||||||
|
LocationName.valley_ghost_house_exit_1: [0x38, 0],
|
||||||
|
LocationName.valley_ghost_house_exit_2: [0x38, 1],
|
||||||
|
LocationName.valley_ghost_house_dragon: [0x38, 2],
|
||||||
|
LocationName.valley_fortress: [0x35, 0],
|
||||||
|
LocationName.valley_reznor: [0x35, 0],
|
||||||
|
LocationName.valley_castle: [0x34, 0],
|
||||||
|
LocationName.valley_koopaling: [0x34, 0],
|
||||||
|
LocationName.valley_castle_dragon: [0x34, 2],
|
||||||
|
|
||||||
|
LocationName.star_road_1_exit_1: [0x58, 0],
|
||||||
|
LocationName.star_road_1_exit_2: [0x58, 1],
|
||||||
|
LocationName.star_road_1_dragon: [0x58, 2],
|
||||||
|
LocationName.star_road_2_exit_1: [0x54, 0],
|
||||||
|
LocationName.star_road_2_exit_2: [0x54, 1],
|
||||||
|
LocationName.star_road_3_exit_1: [0x56, 0],
|
||||||
|
LocationName.star_road_3_exit_2: [0x56, 1],
|
||||||
|
LocationName.star_road_4_exit_1: [0x59, 0],
|
||||||
|
LocationName.star_road_4_exit_2: [0x59, 1],
|
||||||
|
LocationName.star_road_5_exit_1: [0x5A, 0],
|
||||||
|
LocationName.star_road_5_exit_2: [0x5A, 1],
|
||||||
|
|
||||||
|
LocationName.special_zone_1_exit_1: [0x4E, 0],
|
||||||
|
LocationName.special_zone_1_dragon: [0x4E, 2],
|
||||||
|
LocationName.special_zone_2_exit_1: [0x4F, 0],
|
||||||
|
LocationName.special_zone_2_dragon: [0x4F, 2],
|
||||||
|
LocationName.special_zone_3_exit_1: [0x50, 0],
|
||||||
|
LocationName.special_zone_3_dragon: [0x50, 2],
|
||||||
|
LocationName.special_zone_4_exit_1: [0x51, 0],
|
||||||
|
LocationName.special_zone_4_dragon: [0x51, 2],
|
||||||
|
LocationName.special_zone_5_exit_1: [0x4C, 0],
|
||||||
|
LocationName.special_zone_5_dragon: [0x4C, 2],
|
||||||
|
LocationName.special_zone_6_exit_1: [0x4B, 0],
|
||||||
|
LocationName.special_zone_6_dragon: [0x4B, 2],
|
||||||
|
LocationName.special_zone_7_exit_1: [0x4A, 0],
|
||||||
|
LocationName.special_zone_7_dragon: [0x4A, 2],
|
||||||
|
LocationName.special_zone_8_exit_1: [0x49, 0],
|
||||||
|
LocationName.special_zone_8_dragon: [0x49, 2],
|
||||||
|
}
|
||||||
|
|
||||||
|
def generate_level_list(world, player):
|
||||||
|
|
||||||
|
if not world.level_shuffle[player]:
|
||||||
|
out_level_list = full_level_list.copy()
|
||||||
|
out_level_list[0x00] = 0x03
|
||||||
|
out_level_list[0x11] = 0x28
|
||||||
|
|
||||||
|
if world.bowser_castle_doors[player] == "fast":
|
||||||
|
out_level_list[0x41] = 0x82
|
||||||
|
out_level_list[0x42] = 0x32
|
||||||
|
elif world.bowser_castle_doors[player] == "slow":
|
||||||
|
out_level_list[0x41] = 0x31
|
||||||
|
out_level_list[0x42] = 0x81
|
||||||
|
|
||||||
|
return out_level_list
|
||||||
|
|
||||||
|
shuffled_level_list = []
|
||||||
|
easy_castle_fortress_levels_copy = easy_castle_fortress_levels.copy()
|
||||||
|
world.random.shuffle(easy_castle_fortress_levels_copy)
|
||||||
|
hard_castle_fortress_levels_copy = hard_castle_fortress_levels.copy()
|
||||||
|
world.random.shuffle(hard_castle_fortress_levels_copy)
|
||||||
|
easy_single_levels_copy = easy_single_levels.copy()
|
||||||
|
world.random.shuffle(easy_single_levels_copy)
|
||||||
|
hard_single_levels_copy = hard_single_levels.copy()
|
||||||
|
world.random.shuffle(hard_single_levels_copy)
|
||||||
|
easy_double_levels_copy = easy_double_levels.copy()
|
||||||
|
world.random.shuffle(easy_double_levels_copy)
|
||||||
|
hard_double_levels_copy = hard_double_levels.copy()
|
||||||
|
world.random.shuffle(hard_double_levels_copy)
|
||||||
|
switch_palace_levels_copy = switch_palace_levels.copy()
|
||||||
|
world.random.shuffle(switch_palace_levels_copy)
|
||||||
|
|
||||||
|
# Yoshi's Island
|
||||||
|
shuffled_level_list.append(0x03)
|
||||||
|
shuffled_level_list.append(easy_single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x14)
|
||||||
|
shuffled_level_list.append(easy_single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(easy_single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(easy_single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(easy_castle_fortress_levels_copy.pop(0))
|
||||||
|
|
||||||
|
# Donut Plains
|
||||||
|
shuffled_level_list.append(easy_double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(easy_double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(easy_double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x08)
|
||||||
|
shuffled_level_list.append(easy_double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(easy_double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(easy_single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(easy_single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(easy_single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(easy_castle_fortress_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x28)
|
||||||
|
shuffled_level_list.append(0x16)
|
||||||
|
|
||||||
|
single_levels_copy = (easy_single_levels_copy.copy() + hard_single_levels_copy.copy())
|
||||||
|
world.random.shuffle(single_levels_copy)
|
||||||
|
|
||||||
|
castle_fortress_levels_copy = (easy_castle_fortress_levels_copy.copy() + hard_castle_fortress_levels_copy.copy())
|
||||||
|
world.random.shuffle(castle_fortress_levels_copy)
|
||||||
|
|
||||||
|
double_levels_copy = (easy_double_levels_copy.copy() + hard_double_levels_copy.copy())
|
||||||
|
world.random.shuffle(double_levels_copy)
|
||||||
|
|
||||||
|
# Vanilla Dome
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x3F)
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x2C)
|
||||||
|
|
||||||
|
# Twin Bridges
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x12)
|
||||||
|
|
||||||
|
# Forest of Illusion
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x45)
|
||||||
|
shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x1E)
|
||||||
|
|
||||||
|
# Chocolate Island
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
|
||||||
|
|
||||||
|
# Valley of Bowser
|
||||||
|
shuffled_level_list.append(0x18)
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(castle_fortress_levels_copy.pop(0))
|
||||||
|
|
||||||
|
# Front/Back Door
|
||||||
|
if world.bowser_castle_doors[player] == "fast":
|
||||||
|
shuffled_level_list.append(0x82)
|
||||||
|
shuffled_level_list.append(0x32)
|
||||||
|
elif world.bowser_castle_doors[player] == "slow":
|
||||||
|
shuffled_level_list.append(0x31)
|
||||||
|
shuffled_level_list.append(0x81)
|
||||||
|
else:
|
||||||
|
shuffled_level_list.append(0x31)
|
||||||
|
shuffled_level_list.append(0x32)
|
||||||
|
|
||||||
|
shuffled_level_list.append(0x30)
|
||||||
|
|
||||||
|
# Star Road
|
||||||
|
shuffled_level_list.append(0x5B)
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x53)
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x52)
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x57)
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x5C)
|
||||||
|
shuffled_level_list.append(double_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x55)
|
||||||
|
|
||||||
|
# Special Zone
|
||||||
|
shuffled_level_list.append(0x4D)
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(single_levels_copy.pop(0))
|
||||||
|
shuffled_level_list.append(0x48)
|
||||||
|
|
||||||
|
return shuffled_level_list
|
|
@ -0,0 +1,233 @@
|
||||||
|
import typing
|
||||||
|
|
||||||
|
from BaseClasses import Location
|
||||||
|
from .Names import LocationName
|
||||||
|
|
||||||
|
|
||||||
|
class SMWLocation(Location):
|
||||||
|
game: str = "Super Mario World"
|
||||||
|
|
||||||
|
def __init__(self, player: int, name: str = '', address: int = None, parent=None, prog_byte: int = None, prog_bit: int = None):
|
||||||
|
super().__init__(player, name, address, parent)
|
||||||
|
self.progress_byte = prog_byte
|
||||||
|
self.progress_bit = prog_bit
|
||||||
|
|
||||||
|
|
||||||
|
level_location_table = {
|
||||||
|
LocationName.yoshis_island_1_exit_1: 0xBC0000,
|
||||||
|
LocationName.yoshis_island_2_exit_1: 0xBC0001,
|
||||||
|
LocationName.yoshis_island_3_exit_1: 0xBC0002,
|
||||||
|
LocationName.yoshis_island_4_exit_1: 0xBC0003,
|
||||||
|
LocationName.yoshis_island_castle: 0xBC0004,
|
||||||
|
LocationName.yoshis_island_koopaling: 0xBC00A0,
|
||||||
|
|
||||||
|
LocationName.yellow_switch_palace: 0xBC0005,
|
||||||
|
|
||||||
|
LocationName.donut_plains_1_exit_1: 0xBC0006,
|
||||||
|
LocationName.donut_plains_1_exit_2: 0xBC0007,
|
||||||
|
LocationName.donut_plains_2_exit_1: 0xBC0008,
|
||||||
|
LocationName.donut_plains_2_exit_2: 0xBC0009,
|
||||||
|
LocationName.donut_plains_3_exit_1: 0xBC000A,
|
||||||
|
LocationName.donut_plains_4_exit_1: 0xBC000B,
|
||||||
|
LocationName.donut_secret_1_exit_1: 0xBC000C,
|
||||||
|
LocationName.donut_secret_1_exit_2: 0xBC000D,
|
||||||
|
LocationName.donut_secret_2_exit_1: 0xBC0063,
|
||||||
|
LocationName.donut_ghost_house_exit_1: 0xBC000E,
|
||||||
|
LocationName.donut_ghost_house_exit_2: 0xBC000F,
|
||||||
|
LocationName.donut_secret_house_exit_1: 0xBC0010,
|
||||||
|
LocationName.donut_secret_house_exit_2: 0xBC0011,
|
||||||
|
LocationName.donut_plains_castle: 0xBC0012,
|
||||||
|
LocationName.donut_plains_koopaling: 0xBC00A1,
|
||||||
|
|
||||||
|
LocationName.green_switch_palace: 0xBC0013,
|
||||||
|
|
||||||
|
LocationName.vanilla_dome_1_exit_1: 0xBC0014,
|
||||||
|
LocationName.vanilla_dome_1_exit_2: 0xBC0015,
|
||||||
|
LocationName.vanilla_dome_2_exit_1: 0xBC0016,
|
||||||
|
LocationName.vanilla_dome_2_exit_2: 0xBC0017,
|
||||||
|
LocationName.vanilla_dome_3_exit_1: 0xBC0018,
|
||||||
|
LocationName.vanilla_dome_4_exit_1: 0xBC0019,
|
||||||
|
LocationName.vanilla_secret_1_exit_1: 0xBC001A,
|
||||||
|
LocationName.vanilla_secret_1_exit_2: 0xBC001B,
|
||||||
|
LocationName.vanilla_secret_2_exit_1: 0xBC001C,
|
||||||
|
LocationName.vanilla_secret_3_exit_1: 0xBC001D,
|
||||||
|
LocationName.vanilla_ghost_house_exit_1: 0xBC001E,
|
||||||
|
LocationName.vanilla_fortress: 0xBC0020,
|
||||||
|
LocationName.vanilla_reznor: 0xBC00B0,
|
||||||
|
LocationName.vanilla_dome_castle: 0xBC0021,
|
||||||
|
LocationName.vanilla_dome_koopaling: 0xBC00A2,
|
||||||
|
|
||||||
|
LocationName.red_switch_palace: 0xBC0022,
|
||||||
|
|
||||||
|
LocationName.butter_bridge_1_exit_1: 0xBC0023,
|
||||||
|
LocationName.butter_bridge_2_exit_1: 0xBC0024,
|
||||||
|
LocationName.cheese_bridge_exit_1: 0xBC0025,
|
||||||
|
LocationName.cheese_bridge_exit_2: 0xBC0026,
|
||||||
|
LocationName.cookie_mountain_exit_1: 0xBC0027,
|
||||||
|
LocationName.soda_lake_exit_1: 0xBC0028,
|
||||||
|
LocationName.twin_bridges_castle: 0xBC0029,
|
||||||
|
LocationName.twin_bridges_koopaling: 0xBC00A3,
|
||||||
|
|
||||||
|
LocationName.forest_of_illusion_1_exit_1: 0xBC002A,
|
||||||
|
LocationName.forest_of_illusion_1_exit_2: 0xBC002B,
|
||||||
|
LocationName.forest_of_illusion_2_exit_1: 0xBC002C,
|
||||||
|
LocationName.forest_of_illusion_2_exit_2: 0xBC002D,
|
||||||
|
LocationName.forest_of_illusion_3_exit_1: 0xBC002E,
|
||||||
|
LocationName.forest_of_illusion_3_exit_2: 0xBC002F,
|
||||||
|
LocationName.forest_of_illusion_4_exit_1: 0xBC0030,
|
||||||
|
LocationName.forest_of_illusion_4_exit_2: 0xBC0031,
|
||||||
|
LocationName.forest_ghost_house_exit_1: 0xBC0032,
|
||||||
|
LocationName.forest_ghost_house_exit_2: 0xBC0033,
|
||||||
|
LocationName.forest_secret_exit_1: 0xBC0034,
|
||||||
|
LocationName.forest_fortress: 0xBC0035,
|
||||||
|
LocationName.forest_reznor: 0xBC00B1,
|
||||||
|
LocationName.forest_castle: 0xBC0036,
|
||||||
|
LocationName.forest_koopaling: 0xBC00A4,
|
||||||
|
|
||||||
|
LocationName.blue_switch_palace: 0xBC0037,
|
||||||
|
|
||||||
|
LocationName.chocolate_island_1_exit_1: 0xBC0038,
|
||||||
|
LocationName.chocolate_island_2_exit_1: 0xBC0039,
|
||||||
|
LocationName.chocolate_island_2_exit_2: 0xBC003A,
|
||||||
|
LocationName.chocolate_island_3_exit_1: 0xBC003B,
|
||||||
|
LocationName.chocolate_island_3_exit_2: 0xBC003C,
|
||||||
|
LocationName.chocolate_island_4_exit_1: 0xBC003D,
|
||||||
|
LocationName.chocolate_island_5_exit_1: 0xBC003E,
|
||||||
|
LocationName.chocolate_ghost_house_exit_1: 0xBC003F,
|
||||||
|
LocationName.chocolate_secret_exit_1: 0xBC0041,
|
||||||
|
LocationName.chocolate_fortress: 0xBC0042,
|
||||||
|
LocationName.chocolate_reznor: 0xBC00B2,
|
||||||
|
LocationName.chocolate_castle: 0xBC0043,
|
||||||
|
LocationName.chocolate_koopaling: 0xBC00A5,
|
||||||
|
|
||||||
|
LocationName.sunken_ghost_ship: 0xBC0044,
|
||||||
|
|
||||||
|
LocationName.valley_of_bowser_1_exit_1: 0xBC0045,
|
||||||
|
LocationName.valley_of_bowser_2_exit_1: 0xBC0046,
|
||||||
|
LocationName.valley_of_bowser_2_exit_2: 0xBC0047,
|
||||||
|
LocationName.valley_of_bowser_3_exit_1: 0xBC0048,
|
||||||
|
LocationName.valley_of_bowser_4_exit_1: 0xBC0049,
|
||||||
|
LocationName.valley_of_bowser_4_exit_2: 0xBC004A,
|
||||||
|
LocationName.valley_ghost_house_exit_1: 0xBC004B,
|
||||||
|
LocationName.valley_ghost_house_exit_2: 0xBC004C,
|
||||||
|
LocationName.valley_fortress: 0xBC004E,
|
||||||
|
LocationName.valley_reznor: 0xBC00B3,
|
||||||
|
LocationName.valley_castle: 0xBC004F,
|
||||||
|
LocationName.valley_koopaling: 0xBC00A6,
|
||||||
|
|
||||||
|
LocationName.star_road_1_exit_1: 0xBC0051,
|
||||||
|
LocationName.star_road_1_exit_2: 0xBC0052,
|
||||||
|
LocationName.star_road_2_exit_1: 0xBC0053,
|
||||||
|
LocationName.star_road_2_exit_2: 0xBC0054,
|
||||||
|
LocationName.star_road_3_exit_1: 0xBC0055,
|
||||||
|
LocationName.star_road_3_exit_2: 0xBC0056,
|
||||||
|
LocationName.star_road_4_exit_1: 0xBC0057,
|
||||||
|
LocationName.star_road_4_exit_2: 0xBC0058,
|
||||||
|
LocationName.star_road_5_exit_1: 0xBC0059,
|
||||||
|
LocationName.star_road_5_exit_2: 0xBC005A,
|
||||||
|
|
||||||
|
LocationName.special_zone_1_exit_1: 0xBC005B,
|
||||||
|
LocationName.special_zone_2_exit_1: 0xBC005C,
|
||||||
|
LocationName.special_zone_3_exit_1: 0xBC005D,
|
||||||
|
LocationName.special_zone_4_exit_1: 0xBC005E,
|
||||||
|
LocationName.special_zone_5_exit_1: 0xBC005F,
|
||||||
|
LocationName.special_zone_6_exit_1: 0xBC0060,
|
||||||
|
LocationName.special_zone_7_exit_1: 0xBC0061,
|
||||||
|
LocationName.special_zone_8_exit_1: 0xBC0062,
|
||||||
|
}
|
||||||
|
|
||||||
|
dragon_coin_location_table = {
|
||||||
|
LocationName.yoshis_island_1_dragon: 0xBC0100,
|
||||||
|
LocationName.yoshis_island_2_dragon: 0xBC0101,
|
||||||
|
LocationName.yoshis_island_3_dragon: 0xBC0102,
|
||||||
|
LocationName.yoshis_island_4_dragon: 0xBC0103,
|
||||||
|
|
||||||
|
LocationName.donut_plains_1_dragon: 0xBC0106,
|
||||||
|
LocationName.donut_plains_2_dragon: 0xBC0108,
|
||||||
|
LocationName.donut_plains_3_dragon: 0xBC010A,
|
||||||
|
LocationName.donut_plains_4_dragon: 0xBC010B,
|
||||||
|
LocationName.donut_secret_1_dragon: 0xBC010C,
|
||||||
|
LocationName.donut_secret_2_dragon: 0xBC010D,
|
||||||
|
|
||||||
|
LocationName.vanilla_dome_1_dragon: 0xBC0114,
|
||||||
|
LocationName.vanilla_dome_2_dragon: 0xBC0116,
|
||||||
|
LocationName.vanilla_dome_3_dragon: 0xBC0118,
|
||||||
|
LocationName.vanilla_dome_4_dragon: 0xBC0119,
|
||||||
|
LocationName.vanilla_secret_1_dragon: 0xBC011A,
|
||||||
|
LocationName.vanilla_secret_2_dragon: 0xBC011C,
|
||||||
|
LocationName.vanilla_secret_3_dragon: 0xBC011D,
|
||||||
|
LocationName.vanilla_ghost_house_dragon: 0xBC011E,
|
||||||
|
|
||||||
|
LocationName.butter_bridge_1_dragon: 0xBC0123,
|
||||||
|
LocationName.butter_bridge_2_dragon: 0xBC0124,
|
||||||
|
LocationName.cheese_bridge_dragon: 0xBC0125,
|
||||||
|
LocationName.cookie_mountain_dragon: 0xBC0127,
|
||||||
|
LocationName.soda_lake_dragon: 0xBC0128,
|
||||||
|
|
||||||
|
LocationName.forest_of_illusion_2_dragon: 0xBC012C,
|
||||||
|
LocationName.forest_of_illusion_3_dragon: 0xBC012E,
|
||||||
|
LocationName.forest_of_illusion_4_dragon: 0xBC0130,
|
||||||
|
LocationName.forest_ghost_house_dragon: 0xBC0132,
|
||||||
|
LocationName.forest_secret_dragon: 0xBC0134,
|
||||||
|
LocationName.forest_castle_dragon: 0xBC0136,
|
||||||
|
|
||||||
|
LocationName.chocolate_island_1_dragon: 0xBC0138,
|
||||||
|
LocationName.chocolate_island_2_dragon: 0xBC0139,
|
||||||
|
LocationName.chocolate_island_3_dragon: 0xBC013B,
|
||||||
|
LocationName.chocolate_island_4_dragon: 0xBC013D,
|
||||||
|
LocationName.chocolate_island_5_dragon: 0xBC013E,
|
||||||
|
|
||||||
|
LocationName.sunken_ghost_ship_dragon: 0xBC0144,
|
||||||
|
|
||||||
|
LocationName.valley_of_bowser_1_dragon: 0xBC0145,
|
||||||
|
LocationName.valley_of_bowser_2_dragon: 0xBC0146,
|
||||||
|
LocationName.valley_of_bowser_3_dragon: 0xBC0148,
|
||||||
|
LocationName.valley_ghost_house_dragon: 0xBC014B,
|
||||||
|
LocationName.valley_castle_dragon: 0xBC014F,
|
||||||
|
|
||||||
|
LocationName.star_road_1_dragon: 0xBC0151,
|
||||||
|
|
||||||
|
LocationName.special_zone_1_dragon: 0xBC015B,
|
||||||
|
LocationName.special_zone_2_dragon: 0xBC015C,
|
||||||
|
LocationName.special_zone_3_dragon: 0xBC015D,
|
||||||
|
LocationName.special_zone_4_dragon: 0xBC015E,
|
||||||
|
LocationName.special_zone_5_dragon: 0xBC015F,
|
||||||
|
LocationName.special_zone_6_dragon: 0xBC0160,
|
||||||
|
LocationName.special_zone_7_dragon: 0xBC0161,
|
||||||
|
LocationName.special_zone_8_dragon: 0xBC0162,
|
||||||
|
}
|
||||||
|
|
||||||
|
bowser_location_table = {
|
||||||
|
LocationName.bowser: 0xBC0200,
|
||||||
|
}
|
||||||
|
|
||||||
|
yoshi_house_location_table = {
|
||||||
|
LocationName.yoshis_house: 0xBC0201,
|
||||||
|
}
|
||||||
|
|
||||||
|
all_locations = {
|
||||||
|
**level_location_table,
|
||||||
|
**dragon_coin_location_table,
|
||||||
|
**bowser_location_table,
|
||||||
|
**yoshi_house_location_table,
|
||||||
|
}
|
||||||
|
|
||||||
|
location_table = {}
|
||||||
|
|
||||||
|
|
||||||
|
def setup_locations(world, player: int):
|
||||||
|
location_table = {**level_location_table}
|
||||||
|
|
||||||
|
# Dragon Coins here
|
||||||
|
if world.dragon_coin_checks[player].value:
|
||||||
|
location_table.update({**dragon_coin_location_table})
|
||||||
|
|
||||||
|
if world.goal[player] == "yoshi_egg_hunt":
|
||||||
|
location_table.update({**yoshi_house_location_table})
|
||||||
|
else:
|
||||||
|
location_table.update({**bowser_location_table})
|
||||||
|
|
||||||
|
return location_table
|
||||||
|
|
||||||
|
|
||||||
|
lookup_id_to_name: typing.Dict[int, str] = {id: name for name, _ in all_locations.items()}
|
|
@ -0,0 +1,32 @@
|
||||||
|
# Junk Definitions
|
||||||
|
one_up_mushroom = "1-Up Mushroom"
|
||||||
|
|
||||||
|
# Collectable Definitions
|
||||||
|
yoshi_egg = "Yoshi Egg"
|
||||||
|
|
||||||
|
# Upgrade Definitions
|
||||||
|
mario_run = "Run"
|
||||||
|
mario_carry = "Carry"
|
||||||
|
mario_swim = "Swim"
|
||||||
|
mario_spin_jump = "Spin Jump"
|
||||||
|
mario_climb = "Climb"
|
||||||
|
yoshi_activate = "Yoshi"
|
||||||
|
p_switch = "P-Switch"
|
||||||
|
p_balloon = "P-Balloon"
|
||||||
|
progressive_powerup = "Progressive Powerup"
|
||||||
|
super_star_active = "Super Star Activate"
|
||||||
|
|
||||||
|
# Switch Palace Definitions
|
||||||
|
yellow_switch_palace = "Yellow Switch Palace"
|
||||||
|
green_switch_palace = "Green Switch Palace"
|
||||||
|
red_switch_palace = "Red Switch Palace"
|
||||||
|
blue_switch_palace = "Blue Switch Palace"
|
||||||
|
|
||||||
|
# Trap Definitions
|
||||||
|
ice_trap = "Ice Trap"
|
||||||
|
stun_trap = "Stun Trap"
|
||||||
|
literature_trap = "Literature Trap"
|
||||||
|
|
||||||
|
# Other Definitions
|
||||||
|
victory = "The Princess"
|
||||||
|
koopaling = "Boss Token"
|
|
@ -0,0 +1,52 @@
|
||||||
|
lit_trap_text_list = [
|
||||||
|
[[0x8, 0x1f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x45, 0x44, 0x40, 0x51, 0x1b, 0x9f, 0x5, 0x44, 0x40, 0x51, 0x1f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4c, 0x48, 0x4d, 0x43, 0x1c, 0x4a, 0x48, 0x4b, 0x4b, 0x44, 0x51, 0x1b, 0x1f, 0x5, 0x44, 0x40, 0x51, 0x9f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4b, 0x48, 0x53, 0x53, 0x4b, 0x44, 0x1c, 0x43, 0x44, 0x40, 0x53, 0x47, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x41, 0x51, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x40, 0x41, 0x4e, 0x54, 0x53, 0x1f, 0x53, 0x4e, 0x53, 0x40, 0xcb, 0x4e, 0x41, 0x4b, 0x48, 0x53, 0x44, 0x51, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1b, 0x1f, 0x8, 0x9f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x45, 0x40, 0x42, 0x44, 0x1f, 0x4c, 0x58, 0x1f, 0x45, 0x44, 0x40, 0x51, 0x9b, ], [0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4f, 0x44, 0x51, 0x4c, 0x48, 0x53, 0x1f, 0x48, 0x53, 0x9f, 0x53, 0x4e, 0x1f, 0x4f, 0x40, 0x52, 0x52, 0x1f, 0x4e, 0x55, 0x44, 0x51, 0x1f, 0x4c, 0x44, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x1f, 0x4c, 0x44, 0x1b, 0x9f, 0x0, 0x4d, 0x43, 0x1f, 0x56, 0x47, 0x44, 0x4d, 0x1f, 0x48, 0x53, 0x1f, 0x47, 0x40, 0x52, 0x9f, 0x46, 0x4e, 0x4d, 0x44, 0x1f, 0x4f, 0x40, 0x52, 0x53, 0x1f, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x9f, 0x53, 0x54, 0x51, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x48, 0x4d, 0x4d, 0x44, 0x51, 0x1f, 0x44, 0x58, 0xc4, 0x53, 0x4e, 0x1f, 0x52, 0x44, 0x44, 0x1f, 0x48, 0x53, 0x52, 0x1f, 0x4f, 0x40, 0x53, 0x47, 0x1b, 0x9f, 0x16, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x45, 0x44, 0x40, 0x51, 0x1f, 0x47, 0x40, 0xd2, ], [0x46, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x9f, 0x41, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0xe, 0x4d, 0x4b, 0x58, 0x1f, 0x88, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x51, 0x44, 0x4c, 0x40, 0x48, 0x4d, 0x1b, 0x9f, 0x1c, 0x7, 0x44, 0x51, 0x41, 0x44, 0x51, 0x53, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x0, 0x41, 0x4e, 0x54, 0x53, 0x1f, 0x53, 0x47, 0x51, 0x44, 0x44, 0x1f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0xd2, 0x8, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x40, 0x41, 0x52, 0x4e, 0x4b, 0x54, 0x53, 0x44, 0x4b, 0x58, 0x9f, 0x4f, 0x4e, 0x52, 0x48, 0x53, 0x48, 0x55, 0x44, 0x1b, 0x1f, 0x5, 0x48, 0x51, 0x52, 0x53, 0x1d, 0x9f, 0x4, 0x43, 0x56, 0x40, 0x51, 0x43, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x40, 0x9f, 0x55, 0x40, 0x4c, 0x4f, 0x48, 0x51, 0x44, 0x1b, 0x1f, 0x12, 0x44, 0x42, 0x4e, 0x4d, 0x43, 0x1d, 0x9f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x40, 0x1f, 0x4f, 0x40, 0x51, 0x53, 0x9f, 0x4e, 0x45, 0x1f, 0x47, 0x48, 0x4c, 0x1f, 0x1c, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x8, 0x9f, 0x43, 0x48, 0x43, 0x4d, 0x5d, 0x53, 0x1f, 0x4a, 0x4d, 0x4e, 0x56, 0x1f, 0x47, 0x4e, 0x56, 0x9f, ], [0x4f, 0x4e, 0x53, 0x44, 0x4d, 0x53, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4f, 0x40, 0x51, 0x53, 0x9f, 0x4c, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x41, 0x44, 0x1f, 0x1c, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x53, 0x47, 0x48, 0x51, 0x52, 0x53, 0x44, 0x43, 0x1f, 0x45, 0x4e, 0x51, 0x1f, 0x4c, 0x58, 0x9f, 0x41, 0x4b, 0x4e, 0x4e, 0x43, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x48, 0x51, 0x43, 0x1d, 0x9f, 0x8, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x54, 0x4d, 0x42, 0x4e, 0x4d, 0x43, 0x48, 0x53, 0x48, 0x4e, 0x4d, 0x40, 0x4b, 0x4b, 0x58, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x48, 0x51, 0x51, 0x44, 0x55, 0x4e, 0x42, 0x40, 0x41, 0x4b, 0x58, 0x1f, 0x48, 0xcd, 0x4b, 0x4e, 0x55, 0x44, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x47, 0x48, 0x4c, 0x1b, 0x9f, ], [0x1c, 0xc, 0x44, 0x58, 0x44, 0x51, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x12, 0x40, 0x58, 0x1a, 0x1f, 0x8, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x46, 0x51, 0x44, 0x44, 0x4d, 0x9f, 0x44, 0x46, 0x46, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x40, 0x4c, 0x1a, 0x1f, 0x8, 0x9f, 0x43, 0x4e, 0x1a, 0x1f, 0x8, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1d, 0x9f, 0x12, 0x40, 0x4c, 0x1c, 0x8, 0x1c, 0x40, 0x4c, 0x1a, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x8, 0x9f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x48, 0x4d, 0x9f, 0x40, 0x1f, 0x41, 0x4e, 0x40, 0x53, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x8, 0x9f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x40, 0x1f, 0x46, 0x4e, 0x40, 0x53, 0x1b, 0x1b, 0x1b, 0x1f, 0x0, 0x4d, 0xc3, ], [0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x48, 0xcd, 0x53, 0x47, 0x44, 0x1f, 0x51, 0x40, 0x48, 0x4d, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x48, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x40, 0x51, 0x4a, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x4e, 0x4d, 0x1f, 0xc0, 0x53, 0x51, 0x40, 0x48, 0x4d, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x9f, 0x42, 0x40, 0x51, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x9f, 0x53, 0x51, 0x44, 0x44, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x1f, 0x40, 0x51, 0x44, 0x1f, 0x52, 0x4e, 0x9f, 0x46, 0x4e, 0x4e, 0x43, 0x1d, 0x1f, 0x52, 0x4e, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1d, 0x1f, 0x58, 0x4e, 0xd4, 0x52, 0x44, 0x44, 0x1a, 0x1f, 0x12, 0x4e, 0x1f, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x44, 0x40, 0xd3, ], [0x53, 0x47, 0x44, 0x4c, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x1f, 0x41, 0x4e, 0x57, 0x1b, 0x1f, 0x0, 0x4d, 0xc3, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x40, 0x1f, 0x45, 0x4e, 0x57, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x8, 0x9f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x48, 0x4d, 0x1f, 0xc0, 0x47, 0x4e, 0x54, 0x52, 0x44, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x9f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x40, 0x9f, 0x4c, 0x4e, 0x54, 0x52, 0x44, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x9f, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x40, 0x4d, 0x43, 0x9f, ], [0x53, 0x47, 0x44, 0x51, 0x44, 0x1b, 0x1f, 0x12, 0x40, 0x58, 0x1a, 0x1f, 0x8, 0x1f, 0x56, 0x48, 0x4b, 0xcb, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x40, 0x4d, 0x58, 0x56, 0x47, 0x44, 0x51, 0x44, 0x9a, 0x8, 0x1f, 0x43, 0x4e, 0x1f, 0x52, 0x4e, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x46, 0x51, 0x44, 0x44, 0xcd, 0x44, 0x46, 0x46, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x40, 0x4c, 0x1a, 0x9f, 0x13, 0x47, 0x40, 0x4d, 0x4a, 0x1f, 0x58, 0x4e, 0x54, 0x1a, 0x1f, 0x13, 0x47, 0x40, 0x4d, 0x4a, 0x9f, 0x58, 0x4e, 0x54, 0x1d, 0x1f, 0x12, 0x40, 0x4c, 0x1c, 0x8, 0x1c, 0x40, 0x4c, 0x1a, 0x9f, 0x1c, 0x12, 0x44, 0x54, 0x52, 0x52, 0x1f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x1, 0x54, 0x53, 0x1d, 0x1f, 0x52, 0x4e, 0x45, 0x53, 0x1a, 0x1f, 0x56, 0x47, 0x40, 0x53, 0x9f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, 0x58, 0x4e, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x56, 0x48, 0x4d, 0x43, 0x4e, 0x56, 0x9f, 0x41, 0x51, 0x44, 0x40, 0x4a, 0x52, 0x1e, 0x1f, 0x8, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x44, 0x40, 0x52, 0x53, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x9, 0x54, 0x4b, 0x48, 0x44, 0x53, 0x9f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x54, 0x4d, 0x1b, 0x1f, 0x0, 0x51, 0x48, 0x52, 0x44, 0x9d, 0x45, 0x40, 0x48, 0x51, 0x1f, 0x52, 0x54, 0x4d, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4a, 0x48, 0x4b, 0xcb, 0x53, 0x47, 0x44, 0x1f, 0x44, 0x4d, 0x55, 0x48, 0x4e, 0x54, 0x52, 0x1f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1d, 0x9f, ], [0x16, 0x47, 0x4e, 0x1f, 0x48, 0x52, 0x1f, 0x40, 0x4b, 0x51, 0x44, 0x40, 0x43, 0x58, 0x9f, 0x52, 0x48, 0x42, 0x4a, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4f, 0x40, 0x4b, 0x44, 0x1f, 0x56, 0x48, 0x53, 0xc7, 0x46, 0x51, 0x48, 0x44, 0x45, 0x1d, 0x1f, 0x13, 0x47, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x4e, 0x54, 0x9f, 0x47, 0x44, 0x51, 0x1f, 0x4c, 0x40, 0x48, 0x43, 0x1f, 0x40, 0x51, 0x53, 0x1f, 0x45, 0x40, 0x51, 0x9f, 0x4c, 0x4e, 0x51, 0x44, 0x1f, 0x45, 0x40, 0x48, 0x51, 0x1f, 0x53, 0x47, 0x40, 0x4d, 0x9f, 0x52, 0x47, 0x44, 0x1b, 0x1f, 0x1, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x47, 0x44, 0x51, 0x9f, 0x4c, 0x40, 0x48, 0x43, 0x1d, 0x1f, 0x52, 0x48, 0x4d, 0x42, 0x44, 0x1f, 0x52, 0x47, 0x44, 0x1f, 0x48, 0xd2, 0x44, 0x4d, 0x55, 0x48, 0x4e, 0x54, 0x52, 0x1b, 0x1f, 0x7, 0x44, 0x51, 0x9f, ], [0x55, 0x44, 0x52, 0x53, 0x40, 0x4b, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x51, 0x58, 0x1f, 0x48, 0x52, 0x9f, 0x41, 0x54, 0x53, 0x1f, 0x52, 0x48, 0x42, 0x4a, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x46, 0x51, 0x44, 0x44, 0xcd, 0x0, 0x4d, 0x43, 0x1f, 0x4d, 0x4e, 0x4d, 0x44, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x45, 0x4e, 0x4e, 0x4b, 0xd2, 0x43, 0x4e, 0x1f, 0x56, 0x44, 0x40, 0x51, 0x1f, 0x48, 0x53, 0x1b, 0x1f, 0x42, 0x40, 0x52, 0x53, 0x9f, 0x48, 0x53, 0x1f, 0x4e, 0x45, 0x45, 0x1b, 0x1f, 0x8, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x4c, 0x58, 0x9f, 0x4b, 0x40, 0x43, 0x58, 0x1d, 0x1f, 0xe, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x4c, 0x58, 0x9f, 0x4b, 0x4e, 0x55, 0x44, 0x1a, 0x1f, 0xe, 0x1d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x52, 0x47, 0x44, 0x9f, 0x4a, 0x4d, 0x44, 0x56, 0x1f, 0x52, 0x47, 0x44, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1a, 0x9f, ], [0x1c, 0x12, 0x47, 0x40, 0x4a, 0x44, 0x52, 0x4f, 0x44, 0x40, 0x51, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x8, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x41, 0x44, 0x52, 0x53, 0x1f, 0x4e, 0xc5, 0x53, 0x48, 0x4c, 0x44, 0x52, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x4e, 0x51, 0x52, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x48, 0x4c, 0x44, 0x52, 0x1d, 0x1f, 0x48, 0xd3, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x40, 0x46, 0x44, 0x1f, 0x4e, 0x45, 0x9f, 0x56, 0x48, 0x52, 0x43, 0x4e, 0x4c, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0xc4, 0x40, 0x46, 0x44, 0x1f, 0x4e, 0x45, 0x9f, 0x45, 0x4e, 0x4e, 0x4b, 0x48, 0x52, 0x47, 0x4d, 0x44, 0x52, 0x52, 0x1d, 0x1f, 0x48, 0x53, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x44, 0x4f, 0x4e, 0x42, 0x47, 0x1f, 0x4e, 0x45, 0x9f, ], [0x41, 0x44, 0x4b, 0x48, 0x44, 0x45, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0xc4, 0x44, 0x4f, 0x4e, 0x42, 0x47, 0x1f, 0x4e, 0x45, 0x9f, 0x48, 0x4d, 0x42, 0x51, 0x44, 0x43, 0x54, 0x4b, 0x48, 0x53, 0x58, 0x1d, 0x1f, 0x48, 0x53, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x44, 0x40, 0x52, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x9f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x52, 0x44, 0x40, 0x52, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x9f, 0x43, 0x40, 0x51, 0x4a, 0x4d, 0x44, 0x52, 0x52, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x4f, 0x51, 0x48, 0x4d, 0x46, 0x1f, 0x4e, 0x45, 0x9f, ], [0x47, 0x4e, 0x4f, 0x44, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x48, 0x4d, 0x53, 0x44, 0x51, 0x1f, 0x4e, 0x45, 0x1f, 0x43, 0x44, 0x52, 0x4f, 0x40, 0x48, 0x51, 0x9b, 0x1c, 0x3, 0x48, 0x42, 0x4a, 0x44, 0x4d, 0x52, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0xc, 0x40, 0x51, 0x4b, 0x44, 0x58, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x43, 0x44, 0x40, 0x43, 0x1d, 0x9f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x46, 0x48, 0x4d, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1b, 0x9f, 0x13, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x48, 0x52, 0x1f, 0x4d, 0x4e, 0x1f, 0x43, 0x4e, 0x54, 0x41, 0x53, 0x9f, 0x56, 0x47, 0x40, 0x53, 0x44, 0x55, 0x44, 0x51, 0x1d, 0x1f, 0x40, 0x41, 0x4e, 0x54, 0x53, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x1f, 0x51, 0x44, 0x46, 0x48, 0x52, 0x53, 0x44, 0xd1, 0x4e, 0x45, 0x1f, 0x47, 0x48, 0x52, 0x1f, 0x41, 0x54, 0x51, 0x48, 0x40, 0x4b, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x52, 0x48, 0x46, 0x4d, 0x44, 0x43, 0x1f, 0x41, 0x58, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x42, 0x4b, 0x44, 0x51, 0x46, 0x58, 0x4c, 0x40, 0x4d, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, ], [0x42, 0x4b, 0x44, 0x51, 0x4a, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x53, 0x40, 0x4a, 0x44, 0x51, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x42, 0x47, 0x48, 0x44, 0x45, 0x1f, 0x4c, 0x4e, 0x54, 0x51, 0x4d, 0x44, 0x51, 0x9b, 0x12, 0x42, 0x51, 0x4e, 0x4e, 0x46, 0x44, 0x1f, 0x52, 0x48, 0x46, 0x4d, 0x44, 0x43, 0x1f, 0x48, 0x53, 0x9b, 0x40, 0x4d, 0x43, 0x1f, 0x12, 0x42, 0x51, 0x4e, 0x4e, 0x46, 0x44, 0x5d, 0x52, 0x1f, 0x4d, 0x40, 0x4c, 0xc4, 0x56, 0x40, 0x52, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x54, 0x4f, 0x4e, 0x4d, 0x9f, 0x5d, 0x42, 0x47, 0x40, 0x4d, 0x46, 0x44, 0x1d, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0x40, 0x4d, 0x58, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x47, 0x44, 0x1f, 0x42, 0x47, 0x4e, 0x52, 0x44, 0x9f, ], [0x53, 0x4e, 0x1f, 0x4f, 0x54, 0x53, 0x1f, 0x47, 0x48, 0x52, 0x1f, 0x47, 0x40, 0x4d, 0x43, 0x9f, 0x53, 0x4e, 0x1b, 0x1f, 0xe, 0x4b, 0x43, 0x1f, 0xc, 0x40, 0x51, 0x4b, 0x44, 0x58, 0x1f, 0x56, 0x40, 0xd2, 0x40, 0x52, 0x1f, 0x43, 0x44, 0x40, 0x43, 0x1f, 0x40, 0x52, 0x1f, 0x40, 0x9f, 0x43, 0x4e, 0x4e, 0x51, 0x1c, 0x4d, 0x40, 0x48, 0x4b, 0x1b, 0x9f, 0x1c, 0x3, 0x48, 0x42, 0x4a, 0x44, 0x4d, 0x52, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0xc, 0x40, 0x4d, 0x58, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x9f, 0x43, 0x44, 0x52, 0x44, 0x51, 0x55, 0x44, 0x1f, 0x43, 0x44, 0x40, 0x53, 0x47, 0x1b, 0x1f, 0x0, 0x4d, 0xc3, 0x52, 0x4e, 0x4c, 0x44, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x43, 0x48, 0x44, 0x9f, 0x43, 0x44, 0x52, 0x44, 0x51, 0x55, 0x44, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x1b, 0x1f, 0x2, 0x40, 0x4d, 0x9f, 0x58, 0x4e, 0x54, 0x1f, 0x46, 0x48, 0x55, 0x44, 0x1f, 0x48, 0x53, 0x1f, 0x53, 0x4e, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x1e, 0x1f, 0x13, 0x47, 0x44, 0x4d, 0x1f, 0x43, 0x4e, 0x1f, 0x4d, 0x4e, 0x53, 0x9f, 0x41, 0x44, 0x1f, 0x53, 0x4e, 0x4e, 0x1f, 0x44, 0x40, 0x46, 0x44, 0x51, 0x1f, 0x53, 0x4e, 0x9f, 0x43, 0x44, 0x40, 0x4b, 0x1f, 0x4e, 0x54, 0x53, 0x1f, 0x43, 0x44, 0x40, 0x53, 0x47, 0x1f, 0x48, 0x4d, 0x9f, ], [0x49, 0x54, 0x43, 0x46, 0x44, 0x4c, 0x44, 0x4d, 0x53, 0x1b, 0x1f, 0x5, 0x4e, 0x51, 0x9f, 0x44, 0x55, 0x44, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x55, 0x44, 0x51, 0x58, 0x1f, 0x56, 0x48, 0x52, 0xc4, 0x42, 0x40, 0x4d, 0x4d, 0x4e, 0x53, 0x1f, 0x52, 0x44, 0x44, 0x1f, 0x40, 0x4b, 0x4b, 0x9f, 0x44, 0x4d, 0x43, 0x52, 0x1b, 0x1f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x8, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x40, 0x1f, 0x53, 0x51, 0x54, 0x53, 0x47, 0x9f, 0x54, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x40, 0x4b, 0x4b, 0x58, 0x9f, 0x40, 0x42, 0x4a, 0x4d, 0x4e, 0x56, 0x4b, 0x44, 0x43, 0x46, 0x44, 0x43, 0x1d, 0x1f, 0x53, 0x47, 0x40, 0xd3, 0x40, 0x1f, 0x52, 0x48, 0x4d, 0x46, 0x4b, 0x44, 0x1f, 0x4c, 0x40, 0x4d, 0x1f, 0x48, 0x4d, 0x9f, 0x4f, 0x4e, 0x52, 0x52, 0x44, 0x52, 0x52, 0x48, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x9f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x45, 0x4e, 0x51, 0x53, 0x54, 0x4d, 0x44, 0x1d, 0x1f, 0x4c, 0x54, 0x52, 0xd3, 0x41, 0x44, 0x1f, 0x48, 0x4d, 0x1f, 0x56, 0x40, 0x4d, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x9f, 0x56, 0x48, 0x45, 0x44, 0x1b, 0x1f, 0x1c, 0x0, 0x54, 0x52, 0x53, 0x44, 0x4d, 0x1f, 0x9f, ]],
|
||||||
|
[[0x13, 0x47, 0x44, 0x1f, 0x53, 0x51, 0x54, 0x53, 0x47, 0x1f, 0x40, 0x4b, 0x56, 0x40, 0x58, 0x52, 0x9f, 0x42, 0x40, 0x51, 0x51, 0x48, 0x44, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x40, 0x4c, 0x41, 0x48, 0x46, 0x54, 0x48, 0x53, 0x58, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x4e, 0x51, 0x43, 0x52, 0x1f, 0x54, 0x52, 0x44, 0x43, 0x1f, 0x53, 0x4e, 0x9f, 0x44, 0x57, 0x4f, 0x51, 0x44, 0x52, 0x52, 0x1f, 0x48, 0x53, 0x1b, 0x9f, 0x1c, 0x7, 0x44, 0x51, 0x41, 0x44, 0x51, 0x53, 0x1f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x5d, 0x8, 0x1f, 0x43, 0x40, 0x51, 0x44, 0x52, 0x40, 0x58, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x4d, 0x5d, 0x53, 0x1f, 0x47, 0x40, 0x43, 0x1f, 0x4c, 0x54, 0x42, 0x47, 0x9f, 0x4f, 0x51, 0x40, 0x42, 0x53, 0x48, 0x42, 0x44, 0x1d, 0x5d, 0x1f, 0x52, 0x40, 0x48, 0x43, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x10, 0x54, 0x44, 0x44, 0x4d, 0x1b, 0x1f, 0x5d, 0x16, 0x47, 0x44, 0x4d, 0x1f, 0x88, 0x56, 0x40, 0x52, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x1f, 0x40, 0x46, 0x44, 0x1d, 0x1f, 0x8, 0x9f, 0x40, 0x4b, 0x56, 0x40, 0x58, 0x52, 0x1f, 0x43, 0x48, 0x43, 0x1f, 0x48, 0x53, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0x47, 0x40, 0x4b, 0x45, 0x1c, 0x40, 0x4d, 0x1c, 0x47, 0x4e, 0x54, 0x51, 0x1f, 0x40, 0x9f, 0x43, 0x40, 0x58, 0x1b, 0x1f, 0x16, 0x47, 0x58, 0x1d, 0x9f, ], [0x52, 0x4e, 0x4c, 0x44, 0x53, 0x48, 0x4c, 0x44, 0x52, 0x1f, 0x8, 0x5d, 0x55, 0x44, 0x9f, 0x41, 0x44, 0x4b, 0x48, 0x44, 0x55, 0x44, 0x43, 0x1f, 0x40, 0x52, 0x1f, 0x4c, 0x40, 0x4d, 0x58, 0x9f, 0x40, 0x52, 0x1f, 0x52, 0x48, 0x57, 0x1f, 0x48, 0x4c, 0x4f, 0x4e, 0x52, 0x52, 0x48, 0x41, 0x4b, 0x44, 0x9f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x41, 0x44, 0x45, 0x4e, 0x51, 0x44, 0x9f, 0x41, 0x51, 0x44, 0x40, 0x4a, 0x45, 0x40, 0x52, 0x53, 0x1b, 0x5d, 0x9f, 0x1c, 0x2, 0x40, 0x51, 0x51, 0x4e, 0x4b, 0x4b, 0x1f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0xb, 0x48, 0x45, 0x44, 0x1d, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x48, 0x53, 0x52, 0x9f, 0x51, 0x54, 0x4b, 0x44, 0x52, 0x1d, 0x1f, 0x48, 0x53, 0x52, 0x9f, 0x4e, 0x41, 0x4b, 0x48, 0x46, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x52, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x48, 0x53, 0x52, 0x1f, 0x45, 0x51, 0x44, 0x44, 0x43, 0x4e, 0x4c, 0x52, 0x1d, 0x1f, 0x48, 0x52, 0x9f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x40, 0x1f, 0x52, 0x4e, 0x4d, 0x4d, 0x44, 0x53, 0x1b, 0x9f, 0x18, 0x4e, 0x54, 0x5d, 0x51, 0x44, 0x1f, 0x46, 0x48, 0x55, 0x44, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x45, 0x4e, 0x51, 0x4c, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x47, 0x40, 0x55, 0xc4, 0x53, 0x4e, 0x1f, 0x56, 0x51, 0x48, 0x53, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x9f, ], [0x52, 0x4e, 0x4d, 0x4d, 0x44, 0x53, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x52, 0x44, 0x4b, 0x45, 0x1b, 0x9f, 0x1c, 0xb, 0x5d, 0x4, 0x4d, 0x46, 0x4b, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0xb, 0x48, 0x4a, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1f, 0x4e, 0x55, 0x44, 0xd1, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x40, 0x58, 0x1f, 0x4c, 0x58, 0x1f, 0x46, 0x44, 0x4d, 0x48, 0x54, 0x52, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x41, 0x51, 0x40, 0x56, 0x4d, 0x1f, 0x40, 0x51, 0x44, 0x1f, 0x4b, 0x4e, 0x52, 0xd3, 0x4e, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x52, 0x44, 0x1f, 0x45, 0x4e, 0x4e, 0x4b, 0x52, 0x9f, 0x1c, 0x7, 0x40, 0x48, 0x4a, 0x54, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x8, 0x4d, 0x1f, 0x40, 0x1f, 0x47, 0x4e, 0x4b, 0x44, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x46, 0x51, 0x4e, 0x54, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0xc3, 0x40, 0x1f, 0x47, 0x4e, 0x41, 0x41, 0x48, 0x53, 0x1b, 0x1f, 0xd, 0x4e, 0x53, 0x1f, 0x40, 0x9f, 0x4d, 0x40, 0x52, 0x53, 0x58, 0x1d, 0x1f, 0x43, 0x48, 0x51, 0x53, 0x58, 0x1d, 0x1f, 0x56, 0x44, 0x53, 0x9f, 0x47, 0x4e, 0x4b, 0x44, 0x1d, 0x1f, 0x45, 0x48, 0x4b, 0x4b, 0x44, 0x43, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x44, 0x4d, 0x43, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x56, 0x4e, 0x51, 0x4c, 0x52, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x40, 0x4d, 0x1f, 0x4e, 0x4e, 0x59, 0x58, 0x1f, 0x52, 0x4c, 0x44, 0x4b, 0x4b, 0x9d, 0x4d, 0x4e, 0x51, 0x1f, 0x58, 0x44, 0x53, 0x1f, 0x40, 0x1f, 0x43, 0x51, 0x58, 0x1d, 0x9f, ], [0x41, 0x40, 0x51, 0x44, 0x1d, 0x1f, 0x52, 0x40, 0x4d, 0x43, 0x58, 0x1f, 0x47, 0x4e, 0x4b, 0x44, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x4d, 0x4e, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x48, 0x4d, 0x1f, 0x48, 0xd3, 0x53, 0x4e, 0x1f, 0x52, 0x48, 0x53, 0x1f, 0x43, 0x4e, 0x56, 0x4d, 0x1f, 0x4e, 0x4d, 0x1f, 0x4e, 0x51, 0x9f, 0x53, 0x4e, 0x1f, 0x44, 0x40, 0x53, 0x1b, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x40, 0x9f, 0x47, 0x4e, 0x41, 0x41, 0x48, 0x53, 0x1c, 0x47, 0x4e, 0x4b, 0x44, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4c, 0x44, 0x40, 0x4d, 0x52, 0x9f, 0x42, 0x4e, 0x4c, 0x45, 0x4e, 0x51, 0x53, 0x1b, 0x1f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x5d, 0x6, 0x4e, 0x4e, 0x43, 0x1f, 0xc, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1a, 0x5d, 0x9f, 0x52, 0x40, 0x48, 0x43, 0x1f, 0x1, 0x48, 0x4b, 0x41, 0x4e, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0xc4, 0x4c, 0x44, 0x40, 0x4d, 0x53, 0x1f, 0x48, 0x53, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x1f, 0x52, 0x54, 0x4d, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x52, 0x47, 0x48, 0x4d, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x46, 0x51, 0x40, 0x52, 0x52, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x55, 0x44, 0x51, 0xd8, 0x46, 0x51, 0x44, 0x44, 0x4d, 0x1b, 0x1f, 0x1, 0x54, 0x53, 0x1f, 0x6, 0x40, 0x4d, 0x43, 0x40, 0x4b, 0xc5, 0x4b, 0x4e, 0x4e, 0x4a, 0x44, 0x43, 0x1f, 0x40, 0x53, 0x1f, 0x47, 0x48, 0x4c, 0x1f, 0x45, 0x51, 0x4e, 0xcc, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x4b, 0x4e, 0x4d, 0x46, 0x1f, 0x41, 0x54, 0x52, 0x47, 0x58, 0x9f, ], [0x44, 0x58, 0x44, 0x41, 0x51, 0x4e, 0x56, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x52, 0x53, 0x54, 0x42, 0x4a, 0x1f, 0x4e, 0x54, 0x53, 0x1f, 0x45, 0x54, 0x51, 0x53, 0x47, 0x44, 0x51, 0x9f, 0x53, 0x47, 0x40, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x41, 0x51, 0x48, 0x4c, 0x1f, 0x4e, 0x45, 0x9f, 0x47, 0x48, 0x52, 0x1f, 0x52, 0x47, 0x40, 0x43, 0x58, 0x1f, 0x47, 0x40, 0x53, 0x1b, 0x9f, 0x5d, 0x16, 0x47, 0x40, 0x53, 0x1f, 0x43, 0x4e, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x4c, 0x44, 0x40, 0x4d, 0x1e, 0x5d, 0x1f, 0x47, 0x44, 0x1f, 0x52, 0x40, 0x48, 0x43, 0x1b, 0x9f, 0x5d, 0x3, 0x4e, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x56, 0x48, 0x52, 0x47, 0x1f, 0x4c, 0x44, 0x1f, 0x40, 0x9f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x4e, 0x51, 0x9f, ], [0x4c, 0x44, 0x40, 0x4d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x48, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x40, 0x9f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x9f, 0x56, 0x47, 0x44, 0x53, 0x47, 0x44, 0x51, 0x1f, 0x8, 0x1f, 0x56, 0x40, 0x4d, 0x53, 0x1f, 0x48, 0x53, 0x9f, 0x4e, 0x51, 0x1f, 0x4d, 0x4e, 0x53, 0x1d, 0x1f, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x58, 0x4e, 0x54, 0x1f, 0x45, 0x44, 0x44, 0x4b, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x53, 0x47, 0x48, 0xd2, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x48, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x40, 0x1f, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0xce, 0x41, 0x44, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x4e, 0x4d, 0x1e, 0x5d, 0x1f, 0x5d, 0x0, 0x4b, 0x4b, 0x9f, ], [0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x40, 0x53, 0x1f, 0x4e, 0x4d, 0x42, 0x44, 0x1d, 0x5d, 0x9f, 0x52, 0x40, 0x48, 0x43, 0x1f, 0x1, 0x48, 0x4b, 0x41, 0x4e, 0x1b, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x5d, 0x6, 0x4e, 0x4e, 0x43, 0x1f, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1a, 0x5d, 0x1f, 0x47, 0xc4, 0x52, 0x40, 0x48, 0x43, 0x1f, 0x40, 0x53, 0x1f, 0x4b, 0x40, 0x52, 0x53, 0x1b, 0x1f, 0x5d, 0x16, 0x44, 0x9f, 0x43, 0x4e, 0x4d, 0x5d, 0x53, 0x1f, 0x56, 0x40, 0x4d, 0x53, 0x1f, 0x40, 0x4d, 0x58, 0x9f, 0x40, 0x43, 0x55, 0x44, 0x4d, 0x53, 0x54, 0x51, 0x44, 0x52, 0x1f, 0x47, 0x44, 0x51, 0x44, 0x1d, 0x9f, 0x53, 0x47, 0x40, 0x4d, 0x4a, 0x1f, 0x58, 0x4e, 0x54, 0x1a, 0x1f, 0x18, 0x4e, 0x54, 0x9f, 0x4c, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x53, 0x51, 0x58, 0x1f, 0x4e, 0x55, 0x44, 0x51, 0x1f, 0x13, 0x47, 0xc4, 0x7, 0x48, 0x4b, 0x4b, 0x1f, 0x4e, 0x51, 0x1f, 0x40, 0x42, 0x51, 0x4e, 0x52, 0x52, 0x1f, 0x13, 0x47, 0xc4, 0x16, 0x40, 0x53, 0x44, 0x51, 0x1b, 0x5d, 0x1f, 0x1, 0x58, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x47, 0xc4, ], [0x4c, 0x44, 0x40, 0x4d, 0x53, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x42, 0x4e, 0x4d, 0x55, 0x44, 0x51, 0x52, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x40, 0x53, 0x1f, 0x40, 0x4d, 0x1f, 0x44, 0x4d, 0x43, 0x1b, 0x1f, 0x5d, 0x16, 0x47, 0x40, 0x53, 0x1f, 0xc0, 0x4b, 0x4e, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x43, 0x4e, 0x1f, 0x54, 0x52, 0x44, 0x1f, 0x6, 0x4e, 0x4e, 0x43, 0x9f, 0x4c, 0x4e, 0x51, 0x4d, 0x48, 0x4d, 0x46, 0x1f, 0x45, 0x4e, 0x51, 0x1a, 0x5d, 0x1f, 0x52, 0x40, 0x48, 0xc3, 0x6, 0x40, 0x4d, 0x43, 0x40, 0x4b, 0x45, 0x1b, 0x1f, 0x5d, 0xd, 0x4e, 0x56, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x4c, 0x44, 0x40, 0x4d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x56, 0x40, 0x4d, 0xd3, ], [0x53, 0x4e, 0x1f, 0x46, 0x44, 0x53, 0x1f, 0x51, 0x48, 0x43, 0x1f, 0x4e, 0x45, 0x1f, 0x4c, 0x44, 0x1d, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x4e, 0x4d, 0x5d, 0x53, 0x9f, 0x41, 0x44, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x53, 0x48, 0x4b, 0x4b, 0x1f, 0x8, 0x9f, 0x4c, 0x4e, 0x55, 0x44, 0x1f, 0x4e, 0x45, 0x45, 0x1b, 0x1b, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x5d, 0x13, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x48, 0x52, 0x1f, 0x4d, 0x4e, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x9f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x4b, 0x4e, 0x4e, 0x4a, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x48, 0x45, 0x9f, 0x58, 0x4e, 0x54, 0x1f, 0x56, 0x40, 0x4d, 0x53, 0x1f, 0x53, 0x4e, 0x1f, 0x45, 0x48, 0x4d, 0x43, 0x9f, 0x52, 0x4e, 0x4c, 0x44, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0x18, 0x4e, 0x54, 0x9f, 0x42, 0x44, 0x51, 0x53, 0x40, 0x48, 0x4d, 0x4b, 0x58, 0x1f, 0x54, 0x52, 0x54, 0x40, 0x4b, 0x4b, 0x58, 0x9f, 0x45, 0x48, 0x4d, 0x43, 0x1f, 0x52, 0x4e, 0x4c, 0x44, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x48, 0xc5, 0x58, 0x4e, 0x54, 0x1f, 0x4b, 0x4e, 0x4e, 0x4a, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x48, 0x53, 0x9f, 0x48, 0x52, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x40, 0x4b, 0x56, 0x40, 0x58, 0x52, 0x9f, ], [0x50, 0x54, 0x48, 0x53, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x52, 0x4e, 0x4c, 0x44, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x56, 0x44, 0x51, 0xc4, 0x40, 0x45, 0x53, 0x44, 0x51, 0x1b, 0x5d, 0x1f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x3, 0x51, 0x54, 0x4c, 0x4c, 0x44, 0x51, 0x1d, 0x1f, 0x41, 0x44, 0x40, 0x53, 0x1d, 0x1f, 0x40, 0x4d, 0xc3, 0x4f, 0x48, 0x4f, 0x44, 0x51, 0x1d, 0x1f, 0x41, 0x4b, 0x4e, 0x56, 0x1b, 0x9f, 0x7, 0x40, 0x51, 0x4f, 0x44, 0x51, 0x1d, 0x1f, 0x52, 0x53, 0x51, 0x48, 0x4a, 0x44, 0x1d, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x52, 0x4e, 0x4b, 0x43, 0x48, 0x44, 0x51, 0x1d, 0x1f, 0x46, 0x4e, 0x1b, 0x9f, 0x5, 0x51, 0x44, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x45, 0x4b, 0x40, 0x4c, 0x44, 0x1f, 0x40, 0x4d, 0xc3, 0x52, 0x44, 0x40, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x46, 0x51, 0x40, 0x52, 0x52, 0x44, 0x52, 0x1d, 0x9f, 0x13, 0x48, 0x4b, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x40, 0x56, 0x4d, 0x48, 0x4d, 0x46, 0x9f, 0x11, 0x44, 0x43, 0x1f, 0x12, 0x53, 0x40, 0x51, 0x1f, 0x4f, 0x40, 0x52, 0x52, 0x44, 0x52, 0x1b, 0x9f, ], [0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x13, 0x47, 0x44, 0x1f, 0x53, 0x44, 0x40, 0x51, 0x52, 0x1f, 0x8, 0x1f, 0x45, 0x44, 0x44, 0x4b, 0x9f, 0x53, 0x4e, 0x43, 0x40, 0x58, 0x1f, 0x8, 0x5d, 0x4b, 0x4b, 0x1f, 0x56, 0x40, 0x48, 0x53, 0x1f, 0x53, 0xce, 0x52, 0x47, 0x44, 0x43, 0x1f, 0x53, 0x4e, 0x4c, 0x4e, 0x51, 0x51, 0x4e, 0x56, 0x1b, 0x9f, 0x13, 0x47, 0x4e, 0x54, 0x46, 0x47, 0x1f, 0x8, 0x5d, 0x4b, 0x4b, 0x1f, 0x4d, 0x4e, 0x53, 0x9f, 0x52, 0x4b, 0x44, 0x44, 0x4f, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x4d, 0x48, 0x46, 0x47, 0x53, 0x9f, 0xd, 0x4e, 0x51, 0x1f, 0x45, 0x48, 0x4d, 0x43, 0x1f, 0x52, 0x54, 0x51, 0x42, 0x44, 0x40, 0x52, 0x44, 0x9f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x52, 0x4e, 0x51, 0x51, 0x4e, 0x56, 0x1b, 0x1f, 0xc, 0x58, 0x9f, 0x44, 0x58, 0x44, 0x52, 0x1f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x4a, 0x44, 0x44, 0x4f, 0x9f, ], [0x53, 0x47, 0x44, 0x48, 0x51, 0x1f, 0x52, 0x48, 0x46, 0x47, 0x53, 0x1b, 0x1f, 0x8, 0x9f, 0x43, 0x40, 0x51, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x41, 0x44, 0x9f, 0x53, 0x44, 0x40, 0x51, 0x1c, 0x41, 0x4b, 0x48, 0x4d, 0x43, 0x44, 0x43, 0x1b, 0x1f, 0x8, 0x9f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x41, 0x44, 0x1f, 0x45, 0x51, 0x44, 0x44, 0x1f, 0x53, 0x4e, 0x9f, 0x53, 0x40, 0x4b, 0x4a, 0x1f, 0xd, 0x4e, 0x53, 0x1f, 0x42, 0x47, 0x4e, 0x4a, 0x44, 0x43, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x46, 0x51, 0x48, 0x44, 0x45, 0x1d, 0x9f, 0x42, 0x4b, 0x44, 0x40, 0x51, 0x1c, 0x4c, 0x48, 0x4d, 0x43, 0x44, 0x43, 0x1b, 0x1f, 0xc, 0x58, 0x9f, 0x4c, 0x4e, 0x54, 0x53, 0x47, 0x1f, 0x42, 0x40, 0x4d, 0x4d, 0x4e, 0x53, 0x9f, ], [0x41, 0x44, 0x53, 0x51, 0x40, 0x58, 0x1f, 0x13, 0x47, 0x44, 0x1f, 0x40, 0x4d, 0x46, 0x54, 0x48, 0x52, 0xc7, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x8, 0x1f, 0x4a, 0x4d, 0x4e, 0x56, 0x1b, 0x1f, 0x18, 0x44, 0x52, 0x1d, 0x9f, 0x8, 0x5d, 0x4b, 0x4b, 0x1f, 0x4a, 0x44, 0x44, 0x4f, 0x1f, 0x4c, 0x58, 0x1f, 0x53, 0x44, 0x40, 0x51, 0xd2, 0x53, 0x48, 0x4b, 0x1f, 0x4b, 0x40, 0x53, 0x44, 0x51, 0x1b, 0x1f, 0x1, 0x54, 0x53, 0x1f, 0x4c, 0x58, 0x9f, 0x46, 0x51, 0x48, 0x44, 0x45, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4d, 0x44, 0x55, 0x44, 0x51, 0x9f, 0x46, 0x4e, 0x1b, 0x1f, 0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x16, 0x47, 0x4e, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x52, 0x1d, 0x1f, 0x2, 0x40, 0x4d, 0x1b, 0x9f, 0x16, 0x47, 0x4e, 0x1f, 0x53, 0x51, 0x48, 0x44, 0x52, 0x1d, 0x1f, 0x3, 0x4e, 0x44, 0x52, 0x1b, 0x9f, 0x16, 0x47, 0x4e, 0x1f, 0x4b, 0x4e, 0x55, 0x44, 0x52, 0x1d, 0x1f, 0xb, 0x48, 0x55, 0x44, 0x52, 0x1b, 0x9f, 0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x13, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x53, 0x53, 0x4b, 0x44, 0x1f, 0x50, 0x54, 0x44, 0x44, 0x4d, 0x9f, 0x40, 0x4b, 0x4b, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x44, 0x4d, 0x1f, 0x5, 0x4b, 0x44, 0x56, 0x9f, 0x47, 0x48, 0x52, 0x52, 0x48, 0x4d, 0x46, 0x1f, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x52, 0x44, 0x40, 0x1b, 0x1f, 0x13, 0x4e, 0x1f, 0x52, 0x53, 0x4e, 0x4f, 0x1f, 0x44, 0x40, 0x42, 0x47, 0x9f, 0x56, 0x40, 0x55, 0x44, 0x1f, 0x7, 0x44, 0x51, 0x1f, 0x42, 0x4b, 0x54, 0x53, 0x42, 0x47, 0x1f, 0x53, 0xce, 0x52, 0x40, 0x55, 0x44, 0x1f, 0x12, 0x47, 0x44, 0x1f, 0x55, 0x44, 0x4d, 0x53, 0x54, 0x51, 0x44, 0x43, 0x9f, 0x41, 0x51, 0x40, 0x55, 0x44, 0x4b, 0x58, 0x1b, 0x1f, 0x0, 0x52, 0x1f, 0x52, 0x47, 0x44, 0x9f, 0x40, 0x53, 0x53, 0x40, 0x42, 0x4a, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x44, 0x40, 0x9f, ], [0x48, 0x4d, 0x1f, 0x51, 0x40, 0x46, 0x44, 0x1f, 0x0, 0x9f, 0x47, 0x4e, 0x4b, 0x43, 0x44, 0x51, 0x4c, 0x40, 0x4d, 0x1f, 0x42, 0x40, 0x4c, 0x44, 0x9f, 0x4d, 0x48, 0x46, 0x47, 0x1f, 0x0, 0x4b, 0x4e, 0x4d, 0x46, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x52, 0x40, 0x4d, 0x43, 0x1f, 0x5, 0x48, 0x52, 0x47, 0x4d, 0x44, 0x53, 0x1f, 0x48, 0x4d, 0x9f, 0x47, 0x40, 0x4d, 0x43, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x52, 0x40, 0x56, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x50, 0x54, 0x44, 0x44, 0x4d, 0x1f, 0x4c, 0x48, 0x43, 0x52, 0x4a, 0x58, 0x1b, 0x1f, 0x7, 0x44, 0x9f, 0x52, 0x53, 0x40, 0x51, 0x44, 0x43, 0x1f, 0x40, 0x53, 0x1f, 0x47, 0x44, 0x51, 0x1f, 0x48, 0x4d, 0x9f, 0x56, 0x4e, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x5, 0x4e, 0x51, 0x1f, 0x4e, 0x45, 0x53, 0x44, 0x4d, 0x9f, ], [0x47, 0x44, 0x5d, 0x43, 0x1f, 0x41, 0x44, 0x44, 0x4d, 0x1f, 0x53, 0x4e, 0x4b, 0x43, 0x9f, 0x13, 0x47, 0x40, 0x53, 0x1f, 0x52, 0x54, 0x42, 0x47, 0x1f, 0x40, 0x52, 0x1f, 0x52, 0x47, 0x44, 0x9f, 0x2, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x4d, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x41, 0x44, 0x1f, 0x16, 0x47, 0xce, 0x47, 0x4e, 0x55, 0x44, 0x51, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1d, 0x9f, 0x41, 0x51, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x1b, 0x1f, 0x7, 0x44, 0x9f, 0x52, 0x40, 0x56, 0x1f, 0x47, 0x44, 0x51, 0x1f, 0x4f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x40, 0x4d, 0xc3, 0x50, 0x54, 0x48, 0x42, 0x4a, 0x4b, 0x58, 0x1f, 0x7, 0x44, 0x1f, 0x4b, 0x4e, 0x4e, 0x4a, 0x44, 0x43, 0x9f, 0x54, 0x4f, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x42, 0x4b, 0x48, 0x45, 0x45, 0x1f, 0x47, 0x44, 0x9f, ], [0x45, 0x40, 0x42, 0x44, 0x43, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x52, 0x40, 0x56, 0x1f, 0x40, 0x9f, 0x42, 0x40, 0x55, 0x44, 0x1f, 0x0, 0x41, 0x4e, 0x55, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x40, 0x55, 0x44, 0x1f, 0x8, 0x4d, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x47, 0x44, 0x51, 0x9f, 0x44, 0x46, 0x46, 0x52, 0x1f, 0x47, 0x44, 0x1f, 0x4f, 0x4b, 0x40, 0x42, 0x44, 0x43, 0x1b, 0x9f, 0x13, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x53, 0x53, 0x4b, 0x44, 0x1f, 0x50, 0x54, 0x44, 0x44, 0x4d, 0x9f, 0x40, 0x4b, 0x4b, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x44, 0x4d, 0x1f, 0x14, 0x4f, 0x4e, 0x4d, 0x9f, 0x47, 0x48, 0x52, 0x1f, 0x52, 0x47, 0x4e, 0x54, 0x4b, 0x43, 0x44, 0x51, 0x1f, 0x52, 0x53, 0x4e, 0x4e, 0xc3, 0x7, 0x44, 0x51, 0x1f, 0x44, 0x58, 0x44, 0x52, 0x1f, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x4b, 0x54, 0x44, 0x9f, ], [0x6, 0x4b, 0x4e, 0x56, 0x44, 0x43, 0x1f, 0x4e, 0x45, 0x1f, 0x47, 0x44, 0x51, 0x1f, 0x53, 0x51, 0x54, 0xc4, 0x14, 0x4d, 0x43, 0x58, 0x48, 0x4d, 0x46, 0x1f, 0x46, 0x51, 0x40, 0x53, 0x48, 0x53, 0x54, 0x43, 0x44, 0x9b, 0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x7, 0x40, 0x51, 0x4f, 0x44, 0x51, 0x1d, 0x1f, 0x53, 0x51, 0x44, 0x40, 0x53, 0x1f, 0x58, 0x4e, 0x54, 0xd1, 0x56, 0x4e, 0x51, 0x43, 0x52, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x42, 0x40, 0x51, 0x44, 0x9f, 0x5, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x4c, 0x40, 0x58, 0x1f, 0x42, 0x40, 0x54, 0x52, 0xc4, 0x49, 0x4e, 0x58, 0x1f, 0x4e, 0x51, 0x1f, 0x43, 0x44, 0x52, 0x4f, 0x40, 0x48, 0x51, 0x9f, 0x12, 0x48, 0x4d, 0x46, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x1f, 0x52, 0x4e, 0x4d, 0x46, 0x52, 0x1f, 0x4e, 0xc5, 0x47, 0x44, 0x40, 0x4b, 0x53, 0x47, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4b, 0x4e, 0x55, 0x44, 0x1f, 0xe, 0xc5, 0x43, 0x51, 0x40, 0x46, 0x4e, 0x4d, 0x52, 0x1f, 0x45, 0x4b, 0x40, 0x4c, 0x48, 0x4d, 0x46, 0x9f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x40, 0x41, 0x4e, 0x55, 0x44, 0x1b, 0x9f, ], [0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x13, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x4e, 0x4d, 0x4b, 0x58, 0x1f, 0x4e, 0x4d, 0xc4, 0x42, 0x40, 0x53, 0x42, 0x47, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x40, 0xd2, 0x2, 0x40, 0x53, 0x42, 0x47, 0x1c, 0x24, 0x24, 0x1d, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x9f, 0x52, 0x4f, 0x44, 0x42, 0x48, 0x45, 0x48, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x40, 0x9f, 0x42, 0x4e, 0x4d, 0x42, 0x44, 0x51, 0x4d, 0x1f, 0x45, 0x4e, 0x51, 0x1f, 0x4e, 0x4d, 0x44, 0x5d, 0x52, 0x9f, 0x52, 0x40, 0x45, 0x44, 0x53, 0x58, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x45, 0x40, 0x42, 0xc4, 0x4e, 0x45, 0x1f, 0x43, 0x40, 0x4d, 0x46, 0x44, 0x51, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x51, 0x44, 0x40, 0x4b, 0x1f, 0x40, 0x4d, 0x43, 0x9f, ], [0x48, 0x4c, 0x4c, 0x44, 0x43, 0x48, 0x40, 0x53, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4f, 0x51, 0x4e, 0x42, 0x44, 0x52, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x9f, 0x51, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x40, 0x4b, 0x1f, 0x4c, 0x48, 0x4d, 0x43, 0x1b, 0x1f, 0xe, 0x51, 0xd1, 0x56, 0x40, 0x52, 0x1f, 0x42, 0x51, 0x40, 0x59, 0x58, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x42, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x41, 0x44, 0x1f, 0x46, 0x51, 0x4e, 0x54, 0x4d, 0x43, 0x44, 0x43, 0x9b, 0x0, 0x4b, 0x4b, 0x1f, 0x47, 0x44, 0x1f, 0x47, 0x40, 0x43, 0x1f, 0x53, 0x4e, 0x1f, 0x43, 0x4e, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x40, 0x52, 0x4a, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x40, 0x52, 0x9f, 0x52, 0x4e, 0x4e, 0x4d, 0x1f, 0x40, 0x52, 0x1f, 0x47, 0x44, 0x1f, 0x43, 0x48, 0x43, 0x1d, 0x1f, 0x47, 0xc4, ], [0x56, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x4d, 0x4e, 0x1f, 0x4b, 0x4e, 0x4d, 0x46, 0x44, 0x51, 0x1f, 0x41, 0xc4, 0x42, 0x51, 0x40, 0x59, 0x58, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x53, 0x4e, 0x1f, 0x45, 0x4b, 0x58, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x4c, 0x48, 0x52, 0x52, 0x48, 0x4e, 0x4d, 0x52, 0x1b, 0x1f, 0xe, 0x51, 0x51, 0x9f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x41, 0x44, 0x1f, 0x42, 0x51, 0x40, 0x59, 0x58, 0x1f, 0x53, 0x4e, 0x9f, 0x45, 0x4b, 0x58, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x1f, 0x4c, 0x48, 0x52, 0x52, 0x48, 0x4e, 0x4d, 0x52, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x52, 0x40, 0x4d, 0x44, 0x1f, 0x48, 0x45, 0x1f, 0x47, 0x44, 0x9f, 0x43, 0x48, 0x43, 0x4d, 0x5d, 0x53, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x48, 0x45, 0x1f, 0x47, 0x44, 0x9f, ], [0x56, 0x40, 0x52, 0x1f, 0x52, 0x40, 0x4d, 0x44, 0x1f, 0x47, 0x44, 0x1f, 0x47, 0x40, 0x43, 0x1f, 0x53, 0xce, 0x45, 0x4b, 0x58, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1b, 0x1f, 0x8, 0x45, 0x1f, 0x47, 0x44, 0x9f, 0x45, 0x4b, 0x44, 0x56, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x47, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x42, 0x51, 0x40, 0x59, 0x58, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x43, 0x48, 0x43, 0x4d, 0x5d, 0x53, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x53, 0x4e, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x48, 0x45, 0x1f, 0x47, 0xc4, 0x43, 0x48, 0x43, 0x4d, 0x5d, 0x53, 0x1f, 0x56, 0x40, 0x4d, 0x53, 0x1f, 0x53, 0x4e, 0x1f, 0x47, 0x44, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x52, 0x40, 0x4d, 0x44, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x40, 0x43, 0x9f, 0x53, 0x4e, 0x1b, 0x1f, 0x1c, 0x7, 0x44, 0x4b, 0x4b, 0x44, 0x51, 0x1f, 0x9f, ]],
|
||||||
|
[[0x5d, 0x13, 0x47, 0x44, 0x58, 0x5d, 0x51, 0x44, 0x1f, 0x53, 0x51, 0x58, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0xce, 0x4a, 0x48, 0x4b, 0x4b, 0x1f, 0x4c, 0x44, 0x1d, 0x5d, 0x9f, 0x18, 0x4e, 0x52, 0x52, 0x40, 0x51, 0x48, 0x40, 0x4d, 0x1f, 0x53, 0x4e, 0x4b, 0x43, 0x1f, 0x47, 0x48, 0xcc, 0x42, 0x40, 0x4b, 0x4c, 0x4b, 0x58, 0x1b, 0x1f, 0x5d, 0xd, 0x4e, 0x1f, 0x4e, 0x4d, 0x44, 0x5d, 0x52, 0x9f, 0x53, 0x51, 0x58, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x4a, 0x48, 0x4b, 0x4b, 0x9f, 0x58, 0x4e, 0x54, 0x1d, 0x5d, 0x1f, 0x2, 0x4b, 0x44, 0x55, 0x48, 0x4d, 0x46, 0x44, 0x51, 0x9f, 0x42, 0x51, 0x48, 0x44, 0x43, 0x1b, 0x1f, 0x5d, 0x13, 0x47, 0x44, 0x4d, 0x1f, 0x56, 0x47, 0x58, 0x9f, 0x40, 0x51, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x52, 0x47, 0x4e, 0x4e, 0x53, 0x48, 0x4d, 0x46, 0x9f, ], [0x40, 0x53, 0x1f, 0x4c, 0x44, 0x1e, 0x5d, 0x1f, 0x18, 0x4e, 0x52, 0x52, 0x40, 0x51, 0x48, 0x40, 0x4d, 0x9f, 0x40, 0x52, 0x4a, 0x44, 0x43, 0x1b, 0x1f, 0x5d, 0x13, 0x47, 0x44, 0x58, 0x5d, 0x51, 0x44, 0x9f, 0x52, 0x47, 0x4e, 0x4e, 0x53, 0x48, 0x4d, 0x46, 0x1f, 0x40, 0x53, 0x9f, 0x44, 0x55, 0x44, 0x51, 0x58, 0x4e, 0x4d, 0x44, 0x1d, 0x5d, 0x9f, 0x2, 0x4b, 0x44, 0x55, 0x48, 0x4d, 0x46, 0x44, 0x51, 0x9f, 0x40, 0x4d, 0x52, 0x56, 0x44, 0x51, 0x44, 0x43, 0x1b, 0x1f, 0x5d, 0x13, 0x47, 0x44, 0x58, 0x5d, 0x51, 0xc4, 0x53, 0x51, 0x58, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x4a, 0x48, 0x4b, 0x4b, 0x9f, 0x44, 0x55, 0x44, 0x51, 0x58, 0x4e, 0x4d, 0x44, 0x1b, 0x5d, 0x1f, 0x0, 0x4d, 0x43, 0x9f, ], [0x56, 0x47, 0x40, 0x53, 0x1f, 0x43, 0x48, 0x45, 0x45, 0x44, 0x51, 0x44, 0x4d, 0x42, 0x44, 0x9f, 0x43, 0x4e, 0x44, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4c, 0x40, 0x4a, 0x44, 0x1e, 0x9f, 0x1c, 0x7, 0x44, 0x4b, 0x4b, 0x44, 0x51, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x18, 0x4e, 0x54, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x41, 0x51, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x48, 0xcd, 0x58, 0x4e, 0x54, 0x51, 0x1f, 0x47, 0x44, 0x40, 0x43, 0x1b, 0x1f, 0x18, 0x4e, 0x54, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x45, 0x44, 0x44, 0x53, 0x1f, 0x48, 0x4d, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x9f, 0x52, 0x47, 0x4e, 0x44, 0x52, 0x1b, 0x1f, 0x18, 0x4e, 0x54, 0x1f, 0x42, 0x40, 0x4d, 0x9f, 0x52, 0x53, 0x44, 0x44, 0x51, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x52, 0x44, 0x4b, 0x45, 0x1f, 0x40, 0x4d, 0xd8, 0x43, 0x48, 0x51, 0x44, 0x42, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x42, 0x47, 0x4e, 0x4e, 0x52, 0x44, 0x1b, 0x1f, 0x18, 0x4e, 0x54, 0x5d, 0x51, 0x44, 0x1f, 0x4e, 0x4d, 0x9f, 0x58, 0x4e, 0x54, 0x51, 0x1f, 0x4e, 0x56, 0x4d, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x58, 0x4e, 0x54, 0x9f, ], [0x4a, 0x4d, 0x4e, 0x56, 0x1f, 0x56, 0x47, 0x40, 0x53, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x4a, 0x4d, 0x4e, 0x56, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x18, 0xe, 0x14, 0x1f, 0x40, 0x51, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4e, 0x4d, 0x44, 0x1f, 0x56, 0x47, 0x4e, 0x5d, 0x4b, 0x4b, 0x9f, 0x43, 0x44, 0x42, 0x48, 0x43, 0x44, 0x1f, 0x56, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x53, 0x4e, 0x9f, 0x46, 0x4e, 0x1b, 0x1b, 0x1b, 0x1f, 0x1c, 0x12, 0x54, 0x44, 0x52, 0x52, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x16, 0x47, 0x44, 0x4d, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x9f, 0x44, 0x4b, 0x48, 0x4c, 0x48, 0x4d, 0x40, 0x53, 0x44, 0x43, 0x1f, 0x40, 0x4b, 0x4b, 0x9f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x48, 0x52, 0x9f, 0x48, 0x4c, 0x4f, 0x4e, 0x52, 0x52, 0x48, 0x41, 0x4b, 0x44, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x4d, 0x9f, 0x56, 0x47, 0x40, 0x53, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x51, 0x44, 0x4c, 0x40, 0x48, 0x4d, 0x52, 0x1d, 0x9f, 0x47, 0x4e, 0x56, 0x44, 0x55, 0x44, 0x51, 0x9f, 0x48, 0x4c, 0x4f, 0x51, 0x4e, 0x41, 0x40, 0x41, 0x4b, 0x44, 0x1d, 0x1f, 0x4c, 0x54, 0x52, 0x53, 0x9f, 0x41, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x53, 0x51, 0x54, 0x53, 0x47, 0x1b, 0x9f, ], [0x1c, 0x3, 0x4e, 0x58, 0x4b, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x5d, 0xc, 0x58, 0x1f, 0x4c, 0x48, 0x4d, 0x43, 0x1d, 0x5d, 0x1f, 0x47, 0x44, 0x9f, 0x52, 0x40, 0x48, 0x43, 0x1d, 0x1f, 0x5d, 0x51, 0x44, 0x41, 0x44, 0x4b, 0x52, 0x1f, 0x40, 0x53, 0x9f, 0x52, 0x53, 0x40, 0x46, 0x4d, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1b, 0x1f, 0x6, 0x48, 0x55, 0x44, 0x9f, 0x4c, 0x44, 0x1f, 0x4f, 0x51, 0x4e, 0x41, 0x4b, 0x44, 0x4c, 0x52, 0x1d, 0x1f, 0x46, 0x48, 0x55, 0x44, 0x9f, 0x4c, 0x44, 0x1f, 0x56, 0x4e, 0x51, 0x4a, 0x1d, 0x1f, 0x46, 0x48, 0x55, 0x44, 0x1f, 0x4c, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x4e, 0x52, 0x53, 0x1f, 0x40, 0x41, 0x52, 0x53, 0x51, 0x54, 0x52, 0x44, 0x9f, 0x42, 0x51, 0x58, 0x4f, 0x53, 0x4e, 0x46, 0x51, 0x40, 0x4c, 0x1f, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4c, 0x4e, 0x52, 0x53, 0x1f, 0x48, 0x4d, 0x53, 0x51, 0x48, 0x42, 0x40, 0x53, 0x44, 0x9f, ], [0x40, 0x4d, 0x40, 0x4b, 0x58, 0x52, 0x48, 0x52, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x8, 0x1f, 0x40, 0xcc, 0x48, 0x4d, 0x1f, 0x4c, 0x58, 0x1f, 0x4e, 0x56, 0x4d, 0x1f, 0x4f, 0x51, 0x4e, 0x4f, 0x44, 0x51, 0x9f, 0x40, 0x53, 0x4c, 0x4e, 0x52, 0x4f, 0x47, 0x44, 0x51, 0x44, 0x1b, 0x1f, 0x8, 0x1f, 0x42, 0x40, 0x4d, 0x9f, 0x43, 0x48, 0x52, 0x4f, 0x44, 0x4d, 0x52, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x4d, 0x1f, 0x56, 0x48, 0x53, 0xc7, 0x40, 0x51, 0x53, 0x48, 0x45, 0x48, 0x42, 0x48, 0x40, 0x4b, 0x9f, 0x52, 0x53, 0x48, 0x4c, 0x54, 0x4b, 0x40, 0x4d, 0x53, 0x52, 0x1b, 0x1f, 0x1, 0x54, 0x53, 0x1f, 0x8, 0x9f, 0x40, 0x41, 0x47, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x54, 0x4b, 0x4b, 0x9f, 0x51, 0x4e, 0x54, 0x53, 0x48, 0x4d, 0x44, 0x1f, 0x4e, 0x45, 0x9f, ], [0x44, 0x57, 0x48, 0x52, 0x53, 0x44, 0x4d, 0x42, 0x44, 0x1b, 0x1f, 0x8, 0x1f, 0x42, 0x51, 0x40, 0x55, 0xc4, 0x45, 0x4e, 0x51, 0x1f, 0x4c, 0x44, 0x4d, 0x53, 0x40, 0x4b, 0x9f, 0x44, 0x57, 0x40, 0x4b, 0x53, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1b, 0x1f, 0x13, 0x47, 0x40, 0x53, 0x9f, 0x48, 0x52, 0x1f, 0x56, 0x47, 0x58, 0x1f, 0x8, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x9f, 0x42, 0x47, 0x4e, 0x52, 0x44, 0x4d, 0x1f, 0x4c, 0x58, 0x1f, 0x4e, 0x56, 0x4d, 0x9f, 0x4f, 0x40, 0x51, 0x53, 0x48, 0x42, 0x54, 0x4b, 0x40, 0x51, 0x9f, 0x4f, 0x51, 0x4e, 0x45, 0x44, 0x52, 0x52, 0x48, 0x4e, 0x4d, 0x1d, 0x1f, 0x4e, 0x51, 0x9f, 0x51, 0x40, 0x53, 0x47, 0x44, 0x51, 0x1f, 0x42, 0x51, 0x44, 0x40, 0x53, 0x44, 0x43, 0x1f, 0x48, 0x53, 0x9d, ], [0x45, 0x4e, 0x51, 0x1f, 0x8, 0x1f, 0x40, 0x4c, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4e, 0x4d, 0x4b, 0x58, 0x9f, 0x4e, 0x4d, 0x44, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x1b, 0xdd, 0x1c, 0x3, 0x4e, 0x58, 0x4b, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0xb, 0x48, 0x45, 0x44, 0x1f, 0x48, 0x52, 0x1f, 0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x4b, 0xd8, 0x52, 0x53, 0x51, 0x40, 0x4d, 0x46, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x40, 0x4d, 0x9f, 0x40, 0x4d, 0x58, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x53, 0x47, 0xc4, 0x4c, 0x48, 0x4d, 0x43, 0x1f, 0x4e, 0x45, 0x1f, 0x4c, 0x40, 0x4d, 0x1f, 0x42, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x48, 0x4d, 0x55, 0x44, 0x4d, 0x53, 0x1b, 0x1f, 0x16, 0x44, 0x1f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x4d, 0x4e, 0x53, 0x1f, 0x43, 0x40, 0x51, 0x44, 0x1f, 0x53, 0x4e, 0x9f, 0x42, 0x4e, 0x4d, 0x42, 0x44, 0x48, 0x55, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x40, 0x51, 0x44, 0x9f, ], [0x51, 0x44, 0x40, 0x4b, 0x4b, 0x58, 0x1f, 0x4c, 0x44, 0x51, 0x44, 0x9f, 0x42, 0x4e, 0x4c, 0x4c, 0x4e, 0x4d, 0x4f, 0x4b, 0x40, 0x42, 0x44, 0x52, 0x1f, 0x4e, 0x45, 0x9f, 0x44, 0x57, 0x48, 0x52, 0x53, 0x44, 0x4d, 0x42, 0x44, 0x1b, 0x1f, 0x8, 0x45, 0x1f, 0x56, 0x44, 0x9f, 0x42, 0x4e, 0x54, 0x4b, 0x43, 0x1f, 0x45, 0x4b, 0x58, 0x1f, 0x4e, 0x54, 0x53, 0x1f, 0x4e, 0x45, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x48, 0x4d, 0x43, 0x4e, 0x56, 0x1f, 0x47, 0x40, 0x4d, 0x43, 0x9f, 0x48, 0x4d, 0x1f, 0x47, 0x40, 0x4d, 0x43, 0x1d, 0x1f, 0x47, 0x4e, 0x55, 0x44, 0x51, 0x9f, 0x4e, 0x55, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x46, 0x51, 0x44, 0x40, 0x53, 0x9f, 0x42, 0x48, 0x53, 0x58, 0x1d, 0x1f, 0x46, 0x44, 0x4d, 0x53, 0x4b, 0x58, 0x9f, ], [0x51, 0x44, 0x4c, 0x4e, 0x55, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x51, 0x4e, 0x4e, 0x45, 0x52, 0x1d, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4f, 0x44, 0x44, 0x4f, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0xd3, 0x53, 0x47, 0x44, 0x1f, 0x50, 0x54, 0x44, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x9f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x40, 0x51, 0x44, 0x1f, 0x46, 0x4e, 0x48, 0x4d, 0x46, 0x9f, 0x4e, 0x4d, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x53, 0x51, 0x40, 0x4d, 0x46, 0x44, 0x9f, 0x42, 0x4e, 0x48, 0x4d, 0x42, 0x48, 0x43, 0x44, 0x4d, 0x42, 0x44, 0x52, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4f, 0x4b, 0x40, 0x4d, 0x4d, 0x48, 0x4d, 0x46, 0x52, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x42, 0x51, 0x4e, 0x52, 0x52, 0x1c, 0x4f, 0x54, 0x51, 0x4f, 0x4e, 0x52, 0x44, 0x52, 0x1d, 0x9f, ], [0x53, 0x47, 0x44, 0x1f, 0x56, 0x4e, 0x4d, 0x43, 0x44, 0x51, 0x45, 0x54, 0x4b, 0x9f, 0x42, 0x47, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x44, 0x55, 0x44, 0x4d, 0x53, 0x52, 0x1d, 0x9f, 0x56, 0x4e, 0x51, 0x4a, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, 0x46, 0x44, 0x4d, 0x44, 0x51, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x52, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x4b, 0x44, 0x40, 0x43, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4c, 0x4e, 0x52, 0x53, 0x1f, 0x4e, 0x54, 0x53, 0x51, 0x44, 0x9f, 0x51, 0x44, 0x52, 0x54, 0x4b, 0x53, 0x52, 0x1d, 0x1f, 0x48, 0x53, 0x1f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x4c, 0x40, 0x4a, 0x44, 0x1f, 0x40, 0x4b, 0x4b, 0x1f, 0x45, 0x48, 0x42, 0x53, 0x48, 0x4e, 0x4d, 0x9f, ], [0x56, 0x48, 0x53, 0x47, 0x1f, 0x48, 0x53, 0x52, 0x9f, 0x42, 0x4e, 0x4d, 0x55, 0x44, 0x4d, 0x53, 0x48, 0x4e, 0x4d, 0x40, 0x4b, 0x48, 0x53, 0x48, 0x44, 0x52, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x45, 0x4e, 0x51, 0x44, 0x52, 0x44, 0x44, 0x4d, 0x9f, 0x42, 0x4e, 0x4d, 0x42, 0x4b, 0x54, 0x52, 0x48, 0x4e, 0x4d, 0x52, 0x1f, 0x4c, 0x4e, 0x52, 0x53, 0x9f, 0x52, 0x53, 0x40, 0x4b, 0x44, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x54, 0x4d, 0x4f, 0x51, 0x4e, 0x45, 0x48, 0x53, 0x40, 0x41, 0x4b, 0x44, 0x1b, 0x9f, 0x1c, 0x3, 0x4e, 0x58, 0x4b, 0x44, 0x1f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x13, 0x47, 0x44, 0x1f, 0x52, 0x53, 0x4e, 0x51, 0x58, 0x1f, 0x52, 0x4e, 0x1f, 0x45, 0x40, 0x51, 0x1b, 0x9f, 0x8, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x41, 0x44, 0x46, 0x48, 0x4d, 0x4d, 0x48, 0x4d, 0x46, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x14, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x9f, 0x42, 0x51, 0x44, 0x40, 0x53, 0x44, 0x43, 0x1b, 0x1f, 0x13, 0x47, 0x48, 0x52, 0x1f, 0x47, 0x40, 0x52, 0x9f, 0x4c, 0x40, 0x43, 0x44, 0x1f, 0x40, 0x1f, 0x4b, 0x4e, 0x53, 0x1f, 0x4e, 0x45, 0x9f, 0x4f, 0x44, 0x4e, 0x4f, 0x4b, 0x44, 0x1f, 0x55, 0x44, 0x51, 0x58, 0x1f, 0x40, 0x4d, 0x46, 0x51, 0x58, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x41, 0x44, 0x44, 0x4d, 0x1f, 0x56, 0x48, 0x43, 0x44, 0x4b, 0x58, 0x9f, 0x51, 0x44, 0x46, 0x40, 0x51, 0x43, 0x44, 0x43, 0x1f, 0x40, 0x52, 0x1f, 0x40, 0x1f, 0x41, 0x40, 0x43, 0x9f, ], [0x4c, 0x4e, 0x55, 0x44, 0x1b, 0x1f, 0x1c, 0x0, 0x43, 0x40, 0x4c, 0x52, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x5, 0x4e, 0x51, 0x1f, 0x48, 0x4d, 0x52, 0x53, 0x40, 0x4d, 0x42, 0x44, 0x1d, 0x1f, 0x4e, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4f, 0x4b, 0x40, 0x4d, 0x44, 0x53, 0x1f, 0x4, 0x40, 0x51, 0x53, 0x47, 0x1d, 0x9f, 0x4c, 0x40, 0x4d, 0x1f, 0x47, 0x40, 0x43, 0x1f, 0x40, 0x4b, 0x56, 0x40, 0x58, 0x52, 0x9f, 0x40, 0x52, 0x52, 0x54, 0x4c, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x47, 0x44, 0x9f, 0x56, 0x40, 0x52, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x48, 0x4d, 0x53, 0x44, 0x4b, 0x4b, 0x48, 0x46, 0x44, 0x4d, 0x53, 0x1f, 0x53, 0x47, 0x40, 0x4d, 0x9f, 0x43, 0x4e, 0x4b, 0x4f, 0x47, 0x48, 0x4d, 0x52, 0x1f, 0x41, 0x44, 0x42, 0x40, 0x54, 0x52, 0x44, 0x9f, 0x47, 0x44, 0x1f, 0x47, 0x40, 0x43, 0x1f, 0x40, 0x42, 0x47, 0x48, 0x44, 0x55, 0x44, 0x43, 0x1f, 0x52, 0xce, ], [0x4c, 0x54, 0x42, 0x47, 0x1c, 0x53, 0x47, 0x44, 0x1f, 0x56, 0x47, 0x44, 0x44, 0x4b, 0x1d, 0x9f, 0xd, 0x44, 0x56, 0x1f, 0x18, 0x4e, 0x51, 0x4a, 0x1d, 0x1f, 0x56, 0x40, 0x51, 0x52, 0x1f, 0x40, 0x4d, 0xc3, 0x52, 0x4e, 0x1f, 0x4e, 0x4d, 0x1c, 0x56, 0x47, 0x48, 0x4b, 0x52, 0x53, 0x1f, 0x40, 0x4b, 0x4b, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x4e, 0x4b, 0x4f, 0x47, 0x48, 0x4d, 0x52, 0x1f, 0x47, 0x40, 0x43, 0x9f, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x43, 0x4e, 0x4d, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x4c, 0x54, 0x42, 0xca, 0x40, 0x41, 0x4e, 0x54, 0x53, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x56, 0x40, 0x53, 0x44, 0xd1, 0x47, 0x40, 0x55, 0x48, 0x4d, 0x46, 0x1f, 0x40, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x9f, 0x53, 0x48, 0x4c, 0x44, 0x1b, 0x1f, 0x1, 0x54, 0x53, 0x9f, ], [0x42, 0x4e, 0x4d, 0x55, 0x44, 0x51, 0x52, 0x44, 0x4b, 0x58, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x43, 0x4e, 0x4b, 0x4f, 0x47, 0x48, 0x4d, 0x52, 0x1f, 0x47, 0x40, 0x43, 0x9f, 0x40, 0x4b, 0x56, 0x40, 0x58, 0x52, 0x1f, 0x41, 0x44, 0x4b, 0x48, 0x44, 0x55, 0x44, 0x43, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x45, 0x40, 0xd1, 0x4c, 0x4e, 0x51, 0x44, 0x1f, 0x48, 0x4d, 0x53, 0x44, 0x4b, 0x4b, 0x48, 0x46, 0x44, 0x4d, 0x53, 0x9f, 0x53, 0x47, 0x40, 0x4d, 0x1f, 0x4c, 0x40, 0x4d, 0x1b, 0x45, 0x4e, 0x51, 0x9f, 0x4f, 0x51, 0x44, 0x42, 0x48, 0x52, 0x44, 0x4b, 0x58, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x40, 0x4c, 0xc4, 0x51, 0x44, 0x40, 0x52, 0x4e, 0x4d, 0x52, 0x1b, 0x1f, 0x1c, 0x0, 0x43, 0x40, 0x4c, 0x52, 0x1f, 0x9f, ]],
|
||||||
|
[[0x8, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x4a, 0x4d, 0x4e, 0x56, 0x4d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x40, 0x51, 0x44, 0x1f, 0x40, 0x4d, 0x9f, 0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x1f, 0x4d, 0x54, 0x4c, 0x41, 0x44, 0x51, 0x1f, 0x4e, 0xc5, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x52, 0x1d, 0x1f, 0x52, 0x48, 0x4c, 0x4f, 0x4b, 0x58, 0x9f, 0x41, 0x44, 0x42, 0x40, 0x54, 0x52, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x48, 0x52, 0x9f, 0x40, 0x4d, 0x1f, 0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x1f, 0x40, 0x4c, 0x4e, 0x54, 0x4d, 0xd3, 0x4e, 0x45, 0x1f, 0x52, 0x4f, 0x40, 0x42, 0x44, 0x1f, 0x45, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x9f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x1f, 0x48, 0x4d, 0x1b, 0x1f, 0x7, 0x4e, 0x56, 0x44, 0x55, 0x44, 0x51, 0x9d, ], [0x4d, 0x4e, 0x53, 0x1f, 0x44, 0x55, 0x44, 0x51, 0x58, 0x1f, 0x4e, 0x4d, 0x44, 0x1f, 0x4e, 0x45, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x48, 0x52, 0x1f, 0x48, 0x4d, 0x47, 0x40, 0x41, 0x48, 0x53, 0x44, 0x43, 0x9b, 0x13, 0x47, 0x44, 0x51, 0x44, 0x45, 0x4e, 0x51, 0x44, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x9f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x41, 0x44, 0x1f, 0x40, 0x1f, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x9f, 0x4d, 0x54, 0x4c, 0x41, 0x44, 0x51, 0x1f, 0x4e, 0x45, 0x9f, 0x48, 0x4d, 0x47, 0x40, 0x41, 0x48, 0x53, 0x44, 0x43, 0x1f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x52, 0x1b, 0x9f, 0x0, 0x4d, 0x58, 0x1f, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x1f, 0x4d, 0x54, 0x4c, 0x41, 0x44, 0x51, 0x9f, 0x43, 0x48, 0x55, 0x48, 0x43, 0x44, 0x43, 0x1f, 0x41, 0x58, 0x9f, ], [0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x58, 0x1f, 0x48, 0x52, 0x1f, 0x40, 0x52, 0x9f, 0x4d, 0x44, 0x40, 0x51, 0x1f, 0x53, 0x4e, 0x1f, 0x4d, 0x4e, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x40, 0xd2, 0x4c, 0x40, 0x4a, 0x44, 0x52, 0x1f, 0x4d, 0x4e, 0x1f, 0x4e, 0x43, 0x43, 0x52, 0x1d, 0x1f, 0x52, 0x4e, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x40, 0x55, 0x44, 0x51, 0x40, 0x46, 0x44, 0x9f, 0x4f, 0x4e, 0x4f, 0x54, 0x4b, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x4b, 0x4b, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4f, 0x4b, 0x40, 0x4d, 0x44, 0x53, 0x52, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0xc4, 0x14, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x44, 0x1f, 0x42, 0x40, 0x4d, 0x1f, 0x41, 0x44, 0x9f, 0x52, 0x40, 0x48, 0x43, 0x1f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x1f, 0x59, 0x44, 0x51, 0x4e, 0x1b, 0x9f, ], [0x5, 0x51, 0x4e, 0x4c, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x48, 0x53, 0x9f, 0x45, 0x4e, 0x4b, 0x4b, 0x4e, 0x56, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4f, 0x4e, 0x4f, 0x54, 0x4b, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x47, 0x4e, 0x4b, 0x44, 0x1f, 0x14, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x44, 0x1f, 0x48, 0x52, 0x9f, 0x40, 0x4b, 0x52, 0x4e, 0x1f, 0x59, 0x44, 0x51, 0x4e, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x40, 0x4d, 0x58, 0x1f, 0x4f, 0x44, 0x4e, 0x4f, 0x4b, 0x44, 0x9f, 0x58, 0x4e, 0x54, 0x1f, 0x4c, 0x40, 0x58, 0x1f, 0x4c, 0x44, 0x44, 0x53, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x9f, 0x53, 0x48, 0x4c, 0x44, 0x1f, 0x53, 0x4e, 0x1f, 0x53, 0x48, 0x4c, 0x44, 0x1f, 0x40, 0x51, 0x44, 0x9f, ], [0x4c, 0x44, 0x51, 0x44, 0x4b, 0x58, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4f, 0x51, 0x4e, 0x43, 0x54, 0x42, 0x53, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x9f, 0x43, 0x44, 0x51, 0x40, 0x4d, 0x46, 0x44, 0x43, 0x9f, 0x48, 0x4c, 0x40, 0x46, 0x48, 0x4d, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1b, 0x9f, 0x1c, 0x0, 0x43, 0x40, 0x4c, 0x52, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x5, 0x40, 0x51, 0x1f, 0x4e, 0x55, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x48, 0x52, 0x53, 0xd8, 0x4c, 0x4e, 0x54, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x42, 0x4e, 0x4b, 0x43, 0x1f, 0x13, 0x4e, 0x9f, 0x43, 0x54, 0x4d, 0x46, 0x44, 0x4e, 0x4d, 0x52, 0x1f, 0x43, 0x44, 0x44, 0x4f, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x42, 0x40, 0x55, 0x44, 0x51, 0x4d, 0x52, 0x1f, 0x4e, 0x4b, 0x43, 0x1f, 0x16, 0x44, 0x9f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x40, 0x56, 0x40, 0x58, 0x1d, 0x1f, 0x44, 0x51, 0x44, 0x9f, 0x41, 0x51, 0x44, 0x40, 0x4a, 0x1f, 0x4e, 0x45, 0x1f, 0x43, 0x40, 0x58, 0x1d, 0x1f, 0x13, 0x4e, 0x9f, 0x52, 0x44, 0x44, 0x4a, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4f, 0x40, 0x4b, 0x44, 0x9f, 0x44, 0x4d, 0x42, 0x47, 0x40, 0x4d, 0x53, 0x44, 0x43, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x1b, 0x9f, ], [0x13, 0x47, 0x44, 0x1f, 0x43, 0x56, 0x40, 0x51, 0x55, 0x44, 0x52, 0x1f, 0x4e, 0x45, 0x9f, 0x58, 0x4e, 0x51, 0x44, 0x1f, 0x4c, 0x40, 0x43, 0x44, 0x1f, 0x4c, 0x48, 0x46, 0x47, 0x53, 0x58, 0x9f, 0x52, 0x4f, 0x44, 0x4b, 0x4b, 0x52, 0x1d, 0x1f, 0x16, 0x47, 0x48, 0x4b, 0x44, 0x9f, 0x47, 0x40, 0x4c, 0x4c, 0x44, 0x51, 0x52, 0x1f, 0x45, 0x44, 0x4b, 0x4b, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x9f, 0x51, 0x48, 0x4d, 0x46, 0x48, 0x4d, 0x46, 0x1f, 0x41, 0x44, 0x4b, 0x4b, 0x52, 0x1f, 0x8, 0x4d, 0x9f, 0x4f, 0x4b, 0x40, 0x42, 0x44, 0x52, 0x1f, 0x43, 0x44, 0x44, 0x4f, 0x1d, 0x1f, 0x56, 0x47, 0x44, 0x51, 0xc4, 0x43, 0x40, 0x51, 0x4a, 0x1f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x52, 0x4b, 0x44, 0x44, 0x4f, 0x9d, 0x8, 0x4d, 0x1f, 0x47, 0x4e, 0x4b, 0x4b, 0x4e, 0x56, 0x1f, 0x47, 0x40, 0x4b, 0x4b, 0x52, 0x9f, ], [0x41, 0x44, 0x4d, 0x44, 0x40, 0x53, 0x47, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x45, 0x44, 0x4b, 0x4b, 0x52, 0x9b, 0x5, 0x4e, 0x51, 0x1f, 0x40, 0x4d, 0x42, 0x48, 0x44, 0x4d, 0x53, 0x1f, 0x4a, 0x48, 0x4d, 0x46, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x44, 0x4b, 0x55, 0x48, 0x52, 0x47, 0x1f, 0x4b, 0x4e, 0x51, 0x43, 0x9f, 0x13, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x4c, 0x40, 0x4d, 0x58, 0x1f, 0x40, 0x9f, 0x46, 0x4b, 0x44, 0x40, 0x4c, 0x48, 0x4d, 0x46, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x44, 0x4d, 0x9f, 0x47, 0x4e, 0x40, 0x51, 0x43, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x1f, 0x52, 0x47, 0x40, 0x4f, 0x44, 0x43, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x56, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x53, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x42, 0x40, 0x54, 0x46, 0x47, 0x53, 0x9f, ], [0x13, 0x4e, 0x1f, 0x47, 0x48, 0x43, 0x44, 0x1f, 0x48, 0x4d, 0x1f, 0x46, 0x44, 0x4c, 0x52, 0x1f, 0x4e, 0xcd, 0x47, 0x48, 0x4b, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x52, 0x56, 0x4e, 0x51, 0x43, 0x1b, 0x1f, 0xe, 0x4d, 0x9f, 0x52, 0x48, 0x4b, 0x55, 0x44, 0x51, 0x1f, 0x4d, 0x44, 0x42, 0x4a, 0x4b, 0x40, 0x42, 0x44, 0x52, 0x9f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x52, 0x53, 0x51, 0x54, 0x4d, 0x46, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x45, 0x4b, 0x4e, 0x56, 0x44, 0x51, 0x48, 0x4d, 0x46, 0x1f, 0x52, 0x53, 0x40, 0x51, 0x52, 0x1d, 0x9f, 0x4e, 0x4d, 0x1f, 0x42, 0x51, 0x4e, 0x56, 0x4d, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x9f, 0x47, 0x54, 0x4d, 0x46, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x43, 0x51, 0x40, 0x46, 0x4e, 0x4d, 0x1c, 0x45, 0x48, 0x51, 0x44, 0x1d, 0x1f, 0x48, 0x4d, 0x9f, ], [0x53, 0x56, 0x48, 0x52, 0x53, 0x44, 0x43, 0x1f, 0x56, 0x48, 0x51, 0x44, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x9f, 0x4c, 0x44, 0x52, 0x47, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x9f, 0x4e, 0x45, 0x1f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x52, 0x54, 0x4d, 0x1b, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x5, 0x40, 0x51, 0x1f, 0x4e, 0x55, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x48, 0x52, 0x53, 0xd8, 0x4c, 0x4e, 0x54, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x42, 0x4e, 0x4b, 0x43, 0x1f, 0x13, 0x4e, 0x9f, 0x43, 0x54, 0x4d, 0x46, 0x44, 0x4e, 0x4d, 0x52, 0x1f, 0x43, 0x44, 0x44, 0x4f, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x42, 0x40, 0x55, 0x44, 0x51, 0x4d, 0x52, 0x1f, 0x4e, 0x4b, 0x43, 0x1f, 0x16, 0x44, 0x9f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x40, 0x56, 0x40, 0x58, 0x1d, 0x1f, 0x44, 0x51, 0x44, 0x9f, 0x41, 0x51, 0x44, 0x40, 0x4a, 0x1f, 0x4e, 0x45, 0x1f, 0x43, 0x40, 0x58, 0x1d, 0x1f, 0x13, 0x4e, 0x9f, 0x42, 0x4b, 0x40, 0x48, 0x4c, 0x1f, 0x4e, 0x54, 0x51, 0x9f, 0x4b, 0x4e, 0x4d, 0x46, 0x1c, 0x45, 0x4e, 0x51, 0x46, 0x4e, 0x53, 0x53, 0x44, 0x4d, 0x9f, ], [0x46, 0x4e, 0x4b, 0x43, 0x1b, 0x1f, 0x6, 0x4e, 0x41, 0x4b, 0x44, 0x53, 0x52, 0x1f, 0x53, 0x47, 0x44, 0xd8, 0x42, 0x40, 0x51, 0x55, 0x44, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x52, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x47, 0x40, 0x51, 0x4f, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x1d, 0x9f, 0x56, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x4d, 0x4e, 0x1f, 0x4c, 0x40, 0x4d, 0x9f, 0x43, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1f, 0x13, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x4b, 0x40, 0x58, 0x9f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x4b, 0x4e, 0x4d, 0x46, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x4c, 0x40, 0x4d, 0x58, 0x1f, 0x40, 0x1f, 0x52, 0x4e, 0x4d, 0x46, 0x1f, 0x16, 0x40, 0x52, 0x9f, ], [0x52, 0x54, 0x4d, 0x46, 0x1f, 0x54, 0x4d, 0x47, 0x44, 0x40, 0x51, 0x43, 0x1f, 0x41, 0x58, 0x9f, 0x4c, 0x44, 0x4d, 0x1f, 0x4e, 0x51, 0x1f, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x4f, 0x48, 0x4d, 0x44, 0x52, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x51, 0x4e, 0x40, 0x51, 0x48, 0x4d, 0xc6, 0x4e, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x47, 0x44, 0x48, 0x46, 0x47, 0x53, 0x1d, 0x1f, 0x13, 0x47, 0xc4, 0x56, 0x48, 0x4d, 0x43, 0x52, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x4c, 0x4e, 0x40, 0x4d, 0x48, 0x4d, 0xc6, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4d, 0x48, 0x46, 0x47, 0x53, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x45, 0x48, 0x51, 0x44, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x51, 0x44, 0x43, 0x1d, 0x1f, 0x48, 0x53, 0x9f, 0x45, 0x4b, 0x40, 0x4c, 0x48, 0x4d, 0x46, 0x1f, 0x52, 0x4f, 0x51, 0x44, 0x40, 0x43, 0x1b, 0x9f, ], [0x13, 0x47, 0x44, 0x1f, 0x53, 0x51, 0x44, 0x44, 0x52, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x9f, 0x53, 0x4e, 0x51, 0x42, 0x47, 0x44, 0x52, 0x1f, 0x41, 0x4b, 0x40, 0x59, 0x44, 0x43, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1b, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x13, 0x47, 0x44, 0x1f, 0x41, 0x44, 0x4b, 0x4b, 0x52, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x9f, 0x51, 0x48, 0x4d, 0x46, 0x48, 0x4d, 0x46, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x43, 0x40, 0x4b, 0x44, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x4c, 0x44, 0x4d, 0x9f, 0x4b, 0x4e, 0x4e, 0x4a, 0x44, 0x43, 0x1f, 0x54, 0x4f, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, 0x45, 0x40, 0x42, 0x44, 0x52, 0x1f, 0x4f, 0x40, 0x4b, 0x44, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x4d, 0x9f, 0x43, 0x51, 0x40, 0x46, 0x4e, 0x4d, 0x5d, 0x52, 0x1f, 0x48, 0x51, 0x44, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x45, 0x48, 0x44, 0x51, 0x42, 0x44, 0x1f, 0x53, 0x47, 0x40, 0x4d, 0x1f, 0x45, 0x48, 0x51, 0x44, 0x9f, 0xb, 0x40, 0x48, 0x43, 0x1f, 0x4b, 0x4e, 0x56, 0x1f, 0x53, 0x47, 0x44, 0x48, 0x51, 0x9f, ], [0x53, 0x4e, 0x56, 0x44, 0x51, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x4e, 0x54, 0x52, 0x44, 0x52, 0x9f, 0x45, 0x51, 0x40, 0x48, 0x4b, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x4c, 0x4e, 0x54, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x1f, 0x52, 0x4c, 0x4e, 0x4a, 0x44, 0x43, 0x9f, 0x41, 0x44, 0x4d, 0x44, 0x40, 0x53, 0x47, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1b, 0x9f, 0x13, 0x47, 0x44, 0x1f, 0x43, 0x56, 0x40, 0x51, 0x55, 0x44, 0x52, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x9f, 0x47, 0x44, 0x40, 0x51, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x53, 0x51, 0x40, 0x4c, 0x4f, 0x1f, 0x4e, 0xc5, 0x43, 0x4e, 0x4e, 0x4c, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x1f, 0x45, 0x4b, 0x44, 0x43, 0x9f, 0x53, 0x47, 0x44, 0x48, 0x51, 0x1f, 0x47, 0x40, 0x4b, 0x4b, 0x1d, 0x1f, 0x53, 0x4e, 0x9f, ], [0x43, 0x58, 0x48, 0x4d, 0x46, 0x1f, 0x45, 0x40, 0x4b, 0x4b, 0x1f, 0x1, 0x44, 0x4d, 0x44, 0x40, 0x53, 0xc7, 0x47, 0x48, 0x52, 0x1f, 0x45, 0x44, 0x44, 0x53, 0x1d, 0x1f, 0x41, 0x44, 0x4d, 0x44, 0x40, 0x53, 0x47, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1b, 0x1f, 0x5, 0x40, 0x51, 0x1f, 0x4e, 0x55, 0x44, 0xd1, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x48, 0x52, 0x53, 0x58, 0x9f, 0x4c, 0x4e, 0x54, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x46, 0x51, 0x48, 0x4c, 0x1f, 0x13, 0x4e, 0x9f, 0x43, 0x54, 0x4d, 0x46, 0x44, 0x4e, 0x4d, 0x52, 0x1f, 0x43, 0x44, 0x44, 0x4f, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x42, 0x40, 0x55, 0x44, 0x51, 0x4d, 0x52, 0x1f, 0x43, 0x48, 0x4c, 0x1f, 0x16, 0x44, 0x9f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x40, 0x56, 0x40, 0x58, 0x1d, 0x1f, 0x44, 0x51, 0x44, 0x9f, ], [0x41, 0x51, 0x44, 0x40, 0x4a, 0x1f, 0x4e, 0x45, 0x1f, 0x43, 0x40, 0x58, 0x1d, 0x1f, 0x13, 0x4e, 0x9f, 0x56, 0x48, 0x4d, 0x1f, 0x4e, 0x54, 0x51, 0x1f, 0x47, 0x40, 0x51, 0x4f, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x46, 0x4e, 0x4b, 0x43, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x47, 0x48, 0x4c, 0x1a, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x11, 0x4e, 0x40, 0x43, 0x52, 0x1f, 0x46, 0x4e, 0x1f, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x44, 0x55, 0x44, 0xd1, 0x4e, 0x4d, 0x1d, 0x1f, 0xe, 0x55, 0x44, 0x51, 0x1f, 0x51, 0x4e, 0x42, 0x4a, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x53, 0x51, 0x44, 0x44, 0x1d, 0x1f, 0x1, 0x58, 0x9f, 0x42, 0x40, 0x55, 0x44, 0x52, 0x1f, 0x56, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x4d, 0x44, 0x55, 0x44, 0x51, 0x9f, 0x52, 0x54, 0x4d, 0x1f, 0x47, 0x40, 0x52, 0x1f, 0x52, 0x47, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0x1, 0x58, 0x9f, 0x52, 0x53, 0x51, 0x44, 0x40, 0x4c, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4d, 0x44, 0x55, 0x44, 0xd1, 0x45, 0x48, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x44, 0x40, 0x1b, 0x1f, 0xe, 0x55, 0x44, 0xd1, 0x52, 0x4d, 0x4e, 0x56, 0x1f, 0x41, 0x58, 0x1f, 0x56, 0x48, 0x4d, 0x53, 0x44, 0x51, 0x9f, ], [0x52, 0x4e, 0x56, 0x4d, 0x1d, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4c, 0x44, 0x51, 0x51, 0x58, 0x1f, 0x45, 0x4b, 0x4e, 0x56, 0x44, 0x51, 0x52, 0x9f, 0x4e, 0x45, 0x1f, 0x9, 0x54, 0x4d, 0x44, 0x1d, 0x1f, 0xe, 0x55, 0x44, 0x51, 0x9f, 0x46, 0x51, 0x40, 0x52, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4e, 0x55, 0x44, 0x51, 0x9f, 0x52, 0x53, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x9f, 0x4c, 0x4e, 0x54, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4c, 0x4e, 0x4e, 0x4d, 0x1b, 0x1f, 0x11, 0x4e, 0x40, 0x43, 0x52, 0x1f, 0x46, 0x4e, 0x9f, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x4e, 0x4d, 0x1f, 0x14, 0x4d, 0x43, 0x44, 0xd1, ], [0x42, 0x4b, 0x4e, 0x54, 0x43, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x9f, 0x52, 0x53, 0x40, 0x51, 0x1d, 0x1f, 0x18, 0x44, 0x53, 0x1f, 0x45, 0x44, 0x44, 0x53, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x40, 0x4d, 0x43, 0x44, 0x51, 0x48, 0x4d, 0x46, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x46, 0x4e, 0x4d, 0x44, 0x1f, 0x13, 0x54, 0x51, 0x4d, 0x1f, 0x40, 0x53, 0x9f, 0x4b, 0x40, 0x52, 0x53, 0x1f, 0x53, 0x4e, 0x1f, 0x47, 0x4e, 0x4c, 0x44, 0x1f, 0x40, 0x45, 0x40, 0x51, 0x9b, 0x4, 0x58, 0x44, 0x52, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x45, 0x48, 0x51, 0x44, 0x1f, 0x40, 0x4d, 0xc3, 0x52, 0x56, 0x4e, 0x51, 0x43, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x52, 0x44, 0x44, 0x4d, 0x9f, 0x0, 0x4d, 0x43, 0x1f, 0x47, 0x4e, 0x51, 0x51, 0x4e, 0x51, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, ], [0x47, 0x40, 0x4b, 0x4b, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x52, 0x53, 0x4e, 0x4d, 0x44, 0x9f, 0xb, 0x4e, 0x4e, 0x4a, 0x1f, 0x40, 0x53, 0x1f, 0x4b, 0x40, 0x52, 0x53, 0x1f, 0x4e, 0x4d, 0x9f, 0x4c, 0x44, 0x40, 0x43, 0x4e, 0x56, 0x52, 0x1f, 0x46, 0x51, 0x44, 0x44, 0x4d, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x53, 0x51, 0x44, 0x44, 0x52, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x48, 0x4b, 0x4b, 0x52, 0x9f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x4b, 0x4e, 0x4d, 0x46, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x9f, 0x4a, 0x4d, 0x4e, 0x56, 0x4d, 0x1b, 0x1f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x13, 0x47, 0x51, 0x44, 0x44, 0x1f, 0x11, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4, 0x4b, 0x55, 0x44, 0x4d, 0x1c, 0x4a, 0x48, 0x4d, 0x46, 0x52, 0x9f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x4a, 0x58, 0x1d, 0x9f, 0x12, 0x44, 0x55, 0x44, 0x4d, 0x1f, 0x45, 0x4e, 0x51, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x3, 0x56, 0x40, 0x51, 0x45, 0x1c, 0x4b, 0x4e, 0x51, 0x43, 0x52, 0x1f, 0x48, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x48, 0x51, 0x1f, 0x47, 0x40, 0x4b, 0x4b, 0x52, 0x1f, 0x4e, 0x45, 0x9f, 0x52, 0x53, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0xd, 0x48, 0x4d, 0x44, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0xc, 0x4e, 0x51, 0x53, 0x40, 0x4b, 0x1f, 0xc, 0x44, 0x4d, 0x1f, 0x43, 0x4e, 0x4e, 0x4c, 0x44, 0x43, 0x9f, ], [0x53, 0x4e, 0x1f, 0x43, 0x48, 0x44, 0x1d, 0x1f, 0xe, 0x4d, 0x44, 0x1f, 0x45, 0x4e, 0x51, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x3, 0x40, 0x51, 0x4a, 0x1f, 0xb, 0x4e, 0x51, 0x43, 0x1f, 0x4e, 0x4d, 0x9f, 0x47, 0x48, 0x52, 0x1f, 0x43, 0x40, 0x51, 0x4a, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x4d, 0x44, 0x1f, 0x8, 0xcd, 0x53, 0x47, 0x44, 0x1f, 0xb, 0x40, 0x4d, 0x43, 0x1f, 0x4e, 0x45, 0x1f, 0xc, 0x4e, 0x51, 0x43, 0x4e, 0xd1, 0x56, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x12, 0x47, 0x40, 0x43, 0x4e, 0x56, 0x52, 0x9f, 0x4b, 0x48, 0x44, 0x1b, 0x1f, 0xe, 0x4d, 0x44, 0x1f, 0x11, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x9f, 0x51, 0x54, 0x4b, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x40, 0x4b, 0x4b, 0x1d, 0x1f, 0xe, 0x4d, 0xc4, 0x11, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x45, 0x48, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x4c, 0x9d, ], [0xe, 0x4d, 0x44, 0x1f, 0x11, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x41, 0x51, 0x48, 0x4d, 0x46, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x1f, 0x40, 0x4b, 0x4b, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x48, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x43, 0x40, 0x51, 0x4a, 0x4d, 0x44, 0x52, 0x52, 0x1f, 0x41, 0x48, 0x4d, 0x43, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x1d, 0x1f, 0x8, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0xb, 0x40, 0x4d, 0x43, 0x9f, 0x4e, 0x45, 0x1f, 0xc, 0x4e, 0x51, 0x43, 0x4e, 0x51, 0x1f, 0x56, 0x47, 0x44, 0x51, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x12, 0x47, 0x40, 0x43, 0x4e, 0x56, 0x52, 0x1f, 0x4b, 0x48, 0x44, 0x1b, 0x9f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x0, 0x4b, 0x4b, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x46, 0x4e, 0x4b, 0x43, 0x9f, 0x43, 0x4e, 0x44, 0x52, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x46, 0x4b, 0x48, 0x53, 0x53, 0x44, 0x51, 0x1d, 0x9f, 0xd, 0x4e, 0x53, 0x1f, 0x40, 0x4b, 0x4b, 0x1f, 0x53, 0x47, 0x4e, 0x52, 0x44, 0x1f, 0x56, 0x47, 0x4e, 0x9f, 0x56, 0x40, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x40, 0x51, 0x44, 0x1f, 0x4b, 0x4e, 0x52, 0x53, 0x1b, 0x9f, 0x13, 0x47, 0x44, 0x1f, 0x4e, 0x4b, 0x43, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x48, 0x52, 0x9f, 0x52, 0x53, 0x51, 0x4e, 0x4d, 0x46, 0x1f, 0x43, 0x4e, 0x44, 0x52, 0x1f, 0x4d, 0x4e, 0x53, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x44, 0x51, 0x1d, 0x1f, 0x3, 0x44, 0x44, 0x4f, 0x1f, 0x51, 0x4e, 0x4e, 0x53, 0xd2, 0x40, 0x51, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x51, 0x44, 0x40, 0x42, 0x47, 0x44, 0x43, 0x1f, 0x41, 0xd8, ], [0x53, 0x47, 0x44, 0x1f, 0x45, 0x51, 0x4e, 0x52, 0x53, 0x1b, 0x1f, 0x5, 0x51, 0x4e, 0x4c, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x40, 0x52, 0x47, 0x44, 0x52, 0x1f, 0x40, 0x1f, 0x45, 0x48, 0x51, 0x44, 0x9f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x1f, 0x56, 0x4e, 0x4a, 0x44, 0x4d, 0x1d, 0x1f, 0x0, 0x9f, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x52, 0x47, 0x40, 0x43, 0x4e, 0x56, 0x52, 0x1f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x9f, 0x52, 0x4f, 0x51, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0x11, 0x44, 0x4d, 0x44, 0x56, 0x44, 0x43, 0x9f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x1f, 0x41, 0x4b, 0x40, 0x43, 0x44, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x41, 0x51, 0x4e, 0x4a, 0x44, 0x4d, 0x1d, 0x9f, ], [0x13, 0x47, 0x44, 0x1f, 0x42, 0x51, 0x4e, 0x56, 0x4d, 0x4b, 0x44, 0x52, 0x52, 0x9f, 0x40, 0x46, 0x40, 0x48, 0x4d, 0x1f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x9f, 0x4a, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0x1c, 0x13, 0x4e, 0x4b, 0x4a, 0x48, 0x44, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x16, 0x47, 0x4e, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x52, 0x1d, 0x1f, 0x2, 0x40, 0x4d, 0x1b, 0x9f, 0x16, 0x47, 0x4e, 0x1f, 0x53, 0x51, 0x48, 0x44, 0x52, 0x1d, 0x1f, 0x3, 0x4e, 0x44, 0x52, 0x1b, 0x9f, 0x16, 0x47, 0x4e, 0x1f, 0x4b, 0x4e, 0x55, 0x44, 0x52, 0x1d, 0x1f, 0xb, 0x48, 0x55, 0x44, 0x52, 0x1b, 0x9f, 0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x6, 0x4e, 0x4d, 0x44, 0x1f, 0x40, 0x56, 0x40, 0x58, 0x1d, 0x1f, 0x46, 0x4e, 0x4d, 0x44, 0x9f, 0x40, 0x47, 0x44, 0x40, 0x43, 0x1d, 0x1f, 0x4, 0x42, 0x47, 0x4e, 0x44, 0x52, 0x1f, 0x51, 0x4e, 0x4b, 0xcb, 0x54, 0x4d, 0x40, 0x4d, 0x52, 0x56, 0x44, 0x51, 0x44, 0x43, 0x1b, 0x1f, 0x4, 0x4c, 0x4f, 0x53, 0x58, 0x9d, 0x4e, 0x4f, 0x44, 0x4d, 0x1d, 0x1f, 0x43, 0x54, 0x52, 0x53, 0x58, 0x1d, 0x1f, 0x43, 0x44, 0x40, 0x43, 0x9d, 0x16, 0x47, 0x58, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x40, 0x4b, 0x4b, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x16, 0x44, 0x58, 0x51, 0x45, 0x4e, 0x4b, 0x4a, 0x1f, 0x45, 0x4b, 0x44, 0x43, 0x1e, 0x9f, 0x16, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x43, 0x51, 0x40, 0x46, 0x4e, 0x4d, 0xd2, 0x46, 0x4e, 0x4d, 0x44, 0x1f, 0x53, 0x4e, 0x46, 0x44, 0x53, 0x47, 0x44, 0x51, 0x1e, 0x9f, ], [0xb, 0x44, 0x40, 0x55, 0x48, 0x4d, 0x46, 0x1f, 0x16, 0x44, 0x58, 0x51, 0x52, 0x1f, 0x53, 0x4e, 0x9f, 0x56, 0x48, 0x4d, 0x43, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x56, 0x44, 0x40, 0x53, 0x47, 0x44, 0x51, 0x1e, 0x9f, 0x12, 0x44, 0x53, 0x53, 0x48, 0x4d, 0x46, 0x1f, 0x47, 0x44, 0x51, 0x43, 0x41, 0x44, 0x40, 0x52, 0x53, 0xd2, 0x45, 0x51, 0x44, 0x44, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x44, 0x53, 0x47, 0x44, 0x51, 0x1e, 0x9f, 0x6, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0x4e, 0x54, 0x51, 0x9f, 0x52, 0x40, 0x45, 0x44, 0x46, 0x54, 0x40, 0x51, 0x43, 0x52, 0x1d, 0x1f, 0x46, 0x4e, 0x4d, 0x44, 0x1d, 0x9f, 0x41, 0x54, 0x53, 0x1f, 0x56, 0x47, 0x48, 0x53, 0x47, 0x44, 0x51, 0x1e, 0x1f, 0x7, 0x40, 0x55, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x45, 0x4b, 0x4e, 0x56, 0x4d, 0x1f, 0x53, 0x4e, 0x1f, 0x52, 0x4e, 0x4c, 0xc4, ], [0x4d, 0x44, 0x56, 0x1f, 0x16, 0x44, 0x58, 0x51, 0x1f, 0x16, 0x47, 0x44, 0x4d, 0x9f, 0x42, 0x51, 0x54, 0x44, 0x4b, 0x1f, 0x13, 0x47, 0x51, 0x44, 0x40, 0x43, 0x52, 0x1f, 0x52, 0x4e, 0x4c, 0xc4, 0x4e, 0x53, 0x47, 0x44, 0x51, 0x52, 0x1f, 0x45, 0x44, 0x40, 0x51, 0x1e, 0x1f, 0x0, 0x51, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x52, 0x1f, 0x40, 0x56, 0x40, 0x58, 0x9f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x47, 0x44, 0x51, 0x44, 0x1e, 0x1f, 0x16, 0x47, 0x58, 0x1d, 0x9f, 0x4e, 0x47, 0x1d, 0x1f, 0x56, 0x47, 0x58, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x44, 0x4c, 0x4f, 0x53, 0xd8, 0x16, 0x44, 0x58, 0x51, 0x1e, 0x1f, 0x1c, 0xc, 0x42, 0x2, 0x40, 0x45, 0x45, 0x51, 0x44, 0x58, 0x1f, 0x9f, 0x9f, ]],
|
||||||
|
[[0xc, 0x51, 0x1b, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0xc, 0x51, 0x52, 0x1b, 0x9f, 0x3, 0x54, 0x51, 0x52, 0x4b, 0x44, 0x58, 0x1d, 0x1f, 0x4e, 0x45, 0x1f, 0x4d, 0x54, 0x4c, 0x41, 0x44, 0xd1, 0x45, 0x4e, 0x54, 0x51, 0x1d, 0x1f, 0xf, 0x51, 0x48, 0x55, 0x44, 0x53, 0x9f, 0x3, 0x51, 0x48, 0x55, 0x44, 0x1d, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x4f, 0x51, 0x4e, 0x54, 0x43, 0x9f, 0x53, 0x4e, 0x1f, 0x52, 0x40, 0x58, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x9f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x4f, 0x44, 0x51, 0x45, 0x44, 0x42, 0x53, 0x4b, 0x58, 0x9f, 0x4d, 0x4e, 0x51, 0x4c, 0x40, 0x4b, 0x1d, 0x1f, 0x53, 0x47, 0x40, 0x4d, 0x4a, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x55, 0x44, 0x51, 0x58, 0x1f, 0x4c, 0x54, 0x42, 0x47, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x9f, ], [0x56, 0x44, 0x51, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4b, 0x40, 0x52, 0x53, 0x9f, 0x4f, 0x44, 0x4e, 0x4f, 0x4b, 0x44, 0x1f, 0x58, 0x4e, 0x54, 0x5d, 0x43, 0x9f, 0x44, 0x57, 0x4f, 0x44, 0x42, 0x53, 0x1f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x9f, 0x48, 0x4d, 0x55, 0x4e, 0x4b, 0x55, 0x44, 0x43, 0x1f, 0x48, 0x4d, 0x9f, 0x40, 0x4d, 0x58, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x52, 0x53, 0x51, 0x40, 0x4d, 0x46, 0x44, 0x9f, 0x4e, 0x51, 0x1f, 0x4c, 0x58, 0x52, 0x53, 0x44, 0x51, 0x48, 0x4e, 0x54, 0x52, 0x1d, 0x9f, 0x41, 0x44, 0x42, 0x40, 0x54, 0x52, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x58, 0x1f, 0x49, 0x54, 0x52, 0x53, 0x9f, 0x43, 0x48, 0x43, 0x4d, 0x5d, 0x53, 0x1f, 0x47, 0x4e, 0x4b, 0x43, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, ], [0x52, 0x54, 0x42, 0x47, 0x1f, 0x4d, 0x4e, 0x4d, 0x52, 0x44, 0x4d, 0x52, 0x44, 0x1b, 0x9f, 0x1c, 0x11, 0x4e, 0x56, 0x4b, 0x48, 0x4d, 0x46, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0xb, 0x4e, 0x55, 0x44, 0x1d, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x9f, 0x50, 0x54, 0x48, 0x42, 0x4a, 0x4b, 0x58, 0x1f, 0x40, 0x51, 0x51, 0x44, 0x52, 0x53, 0x52, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x46, 0x44, 0x4d, 0x53, 0x4b, 0x44, 0x1f, 0x47, 0x44, 0x40, 0x51, 0x53, 0x1d, 0x9f, 0x12, 0x44, 0x48, 0x59, 0x44, 0x43, 0x1f, 0x47, 0x48, 0x4c, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x4c, 0xd8, 0x41, 0x44, 0x40, 0x54, 0x53, 0x48, 0x45, 0x54, 0x4b, 0x1f, 0x45, 0x4e, 0x51, 0x4c, 0x9f, 0x13, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x40, 0x52, 0x1f, 0x53, 0x40, 0x4a, 0x44, 0x4d, 0x9f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x4c, 0x44, 0x1d, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x9f, 0x4c, 0x40, 0x4d, 0x4d, 0x44, 0x51, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x52, 0x53, 0x48, 0x4b, 0xcb, ], [0x46, 0x51, 0x48, 0x44, 0x55, 0x44, 0x52, 0x1f, 0x4c, 0x44, 0x1b, 0x1f, 0xb, 0x4e, 0x55, 0x44, 0x1d, 0x9f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x4f, 0x40, 0x51, 0x43, 0x4e, 0x4d, 0x52, 0x1f, 0x4d, 0x4e, 0x9f, 0x41, 0x44, 0x4b, 0x4e, 0x55, 0x44, 0x43, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x9f, 0x4b, 0x4e, 0x55, 0x48, 0x4d, 0x46, 0x1d, 0x1f, 0x53, 0x4e, 0x4e, 0x4a, 0x1f, 0x4c, 0x44, 0x1f, 0x52, 0xce, 0x52, 0x53, 0x51, 0x4e, 0x4d, 0x46, 0x4b, 0x58, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, 0x43, 0x44, 0x4b, 0x48, 0x46, 0x47, 0x53, 0x1f, 0x48, 0x4d, 0x1f, 0x47, 0x48, 0x4c, 0x9f, 0x13, 0x47, 0x40, 0x53, 0x1d, 0x1f, 0x40, 0x52, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x52, 0x44, 0x44, 0x1d, 0x9f, 0x48, 0x53, 0x1f, 0x52, 0x53, 0x48, 0x4b, 0x4b, 0x1f, 0x40, 0x41, 0x40, 0x4d, 0x43, 0x4e, 0x4d, 0x52, 0x9f, ], [0x4c, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x1b, 0x1b, 0x1b, 0x9f, 0x1c, 0x0, 0x4b, 0x48, 0x46, 0x47, 0x48, 0x44, 0x51, 0x48, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x8, 0x1f, 0x42, 0x40, 0x4d, 0x4d, 0x4e, 0x53, 0x1f, 0x44, 0x57, 0x4f, 0x51, 0x44, 0x52, 0x52, 0x9f, 0x48, 0x53, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x52, 0x54, 0x51, 0x44, 0x4b, 0x58, 0x1f, 0x58, 0x4e, 0xd4, 0x40, 0x4d, 0x43, 0x1f, 0x44, 0x55, 0x44, 0x51, 0x58, 0x41, 0x4e, 0x43, 0x58, 0x1f, 0x47, 0x40, 0x55, 0xc4, 0x40, 0x1f, 0x4d, 0x4e, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x9f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x48, 0x52, 0x1f, 0x4e, 0x51, 0x1f, 0x52, 0x47, 0x4e, 0x54, 0x4b, 0xc3, 0x41, 0x44, 0x1f, 0x40, 0x4d, 0x1f, 0x44, 0x57, 0x48, 0x52, 0x53, 0x44, 0x4d, 0x42, 0x44, 0x1f, 0x4e, 0xc5, 0x58, 0x4e, 0x54, 0x51, 0x52, 0x1f, 0x41, 0x44, 0x58, 0x4e, 0x4d, 0x43, 0x1f, 0x58, 0x4e, 0x54, 0x1b, 0x9f, 0x16, 0x47, 0x40, 0x53, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x54, 0x52, 0x44, 0x9f, ], [0x4e, 0x45, 0x1f, 0x4c, 0x58, 0x1f, 0x42, 0x51, 0x44, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1d, 0x1f, 0x48, 0xc5, 0x8, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x1f, 0x44, 0x4d, 0x53, 0x48, 0x51, 0x44, 0x4b, 0x58, 0x9f, 0x42, 0x4e, 0x4d, 0x53, 0x40, 0x48, 0x4d, 0x44, 0x43, 0x1f, 0x47, 0x44, 0x51, 0x44, 0x1e, 0x1f, 0xc, 0xd8, 0x46, 0x51, 0x44, 0x40, 0x53, 0x1f, 0x4c, 0x48, 0x52, 0x44, 0x51, 0x48, 0x44, 0x52, 0x1f, 0x48, 0x4d, 0x9f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x9f, 0x41, 0x44, 0x44, 0x4d, 0x1f, 0x7, 0x44, 0x40, 0x53, 0x47, 0x42, 0x4b, 0x48, 0x45, 0x45, 0x5d, 0x52, 0x9f, 0x4c, 0x48, 0x52, 0x44, 0x51, 0x48, 0x44, 0x52, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x8, 0x9f, 0x56, 0x40, 0x53, 0x42, 0x47, 0x44, 0x43, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x45, 0x44, 0x4b, 0x53, 0x9f, ], [0x44, 0x40, 0x42, 0x47, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x41, 0x44, 0x46, 0x48, 0x4d, 0x4d, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0x4c, 0x58, 0x9f, 0x46, 0x51, 0x44, 0x40, 0x53, 0x1f, 0x53, 0x47, 0x4e, 0x54, 0x46, 0x47, 0x53, 0x1f, 0x48, 0x4d, 0x9f, 0x4b, 0x48, 0x55, 0x48, 0x4d, 0x46, 0x1f, 0x48, 0x52, 0x1f, 0x47, 0x48, 0x4c, 0x52, 0x44, 0x4b, 0x45, 0x9b, 0x8, 0x45, 0x1f, 0x40, 0x4b, 0x4b, 0x1f, 0x44, 0x4b, 0x52, 0x44, 0x9f, 0x4f, 0x44, 0x51, 0x48, 0x52, 0x47, 0x44, 0x43, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x44, 0x9f, 0x51, 0x44, 0x4c, 0x40, 0x48, 0x4d, 0x44, 0x43, 0x1d, 0x1f, 0x8, 0x1f, 0x52, 0x47, 0x4e, 0x54, 0x4b, 0xc3, 0x52, 0x53, 0x48, 0x4b, 0x4b, 0x1f, 0x42, 0x4e, 0x4d, 0x53, 0x48, 0x4d, 0x54, 0x44, 0x1f, 0x53, 0x4e, 0x9f, ], [0x41, 0x44, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x48, 0x45, 0x1f, 0x40, 0x4b, 0x4b, 0x9f, 0x44, 0x4b, 0x52, 0x44, 0x1f, 0x51, 0x44, 0x4c, 0x40, 0x48, 0x4d, 0x44, 0x43, 0x1d, 0x1f, 0x40, 0x4d, 0xc3, 0x47, 0x44, 0x1f, 0x56, 0x44, 0x51, 0x44, 0x9f, 0x40, 0x4d, 0x4d, 0x48, 0x47, 0x48, 0x4b, 0x40, 0x53, 0x44, 0x43, 0x1d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x54, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x44, 0x1f, 0x56, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x53, 0x54, 0x51, 0x4d, 0x1f, 0x53, 0x4e, 0x1f, 0x40, 0x1f, 0x4c, 0x48, 0x46, 0x47, 0x53, 0x58, 0x9f, 0x52, 0x53, 0x51, 0x40, 0x4d, 0x46, 0x44, 0x51, 0x1b, 0x1f, 0x8, 0x1f, 0x52, 0x47, 0x4e, 0x54, 0x4b, 0xc3, 0x4d, 0x4e, 0x53, 0x1f, 0x52, 0x44, 0x44, 0x4c, 0x1f, 0x40, 0x1f, 0x4f, 0x40, 0x51, 0x53, 0x1f, 0x4e, 0xc5, ], [0x48, 0x53, 0x1b, 0x1f, 0x1c, 0x1, 0x51, 0x4e, 0x4d, 0x53, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x8, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x43, 0x51, 0x44, 0x40, 0x4c, 0x53, 0x1f, 0x48, 0x4d, 0x9f, 0x4c, 0x58, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x1d, 0x1f, 0x43, 0x51, 0x44, 0x40, 0x4c, 0x52, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x52, 0x53, 0x40, 0x58, 0x44, 0x43, 0x9f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x4c, 0x44, 0x1f, 0x44, 0x55, 0x44, 0x51, 0x9f, 0x40, 0x45, 0x53, 0x44, 0x51, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x42, 0x47, 0x40, 0x4d, 0x46, 0x44, 0xc3, 0x4c, 0x58, 0x1f, 0x48, 0x43, 0x44, 0x40, 0x52, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x58, 0x9f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x46, 0x4e, 0x4d, 0x44, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x1f, 0x4c, 0x44, 0x1d, 0x9f, ], [0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x56, 0x48, 0x4d, 0x44, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, 0x56, 0x40, 0x53, 0x44, 0x51, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x40, 0x4b, 0x53, 0x44, 0x51, 0x44, 0xc3, 0x53, 0x47, 0x44, 0x1f, 0x42, 0x4e, 0x4b, 0x4e, 0x51, 0x1f, 0x4e, 0x45, 0x1f, 0x4c, 0x58, 0x9f, 0x4c, 0x48, 0x4d, 0x43, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x48, 0x52, 0x9f, 0x4e, 0x4d, 0x44, 0x1b, 0x1f, 0x8, 0x5d, 0x4c, 0x1f, 0x46, 0x4e, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x9f, 0x53, 0x44, 0x4b, 0x4b, 0x1f, 0x48, 0x53, 0x1f, 0x1c, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x53, 0x40, 0x4a, 0xc4, 0x42, 0x40, 0x51, 0x44, 0x1f, 0x4d, 0x4e, 0x53, 0x1f, 0x53, 0x4e, 0x1f, 0x52, 0x4c, 0x48, 0x4b, 0x44, 0x9f, 0x40, 0x53, 0x1f, 0x40, 0x4d, 0x58, 0x1f, 0x4f, 0x40, 0x51, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x48, 0x53, 0x9b, ], [0x1c, 0x1, 0x51, 0x4e, 0x4d, 0x53, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x13, 0x47, 0x48, 0x52, 0x1f, 0x52, 0x53, 0x4e, 0x51, 0x58, 0x1f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x1f, 0x4c, 0x40, 0x4d, 0x1f, 0x53, 0x44, 0x40, 0x42, 0xc7, 0x47, 0x48, 0x52, 0x1f, 0x52, 0x4e, 0x4d, 0x1d, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x2, 0x51, 0x48, 0x52, 0x4f, 0x48, 0x4d, 0x1f, 0x2, 0x51, 0x48, 0x52, 0x4f, 0x48, 0x40, 0x4d, 0x9f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x4d, 0x44, 0x5d, 0x44, 0x51, 0x1f, 0x46, 0x4e, 0x1f, 0x41, 0x58, 0x9d, 0x5, 0x51, 0x4e, 0x4c, 0x1f, 0x53, 0x47, 0x48, 0x52, 0x1f, 0x43, 0x40, 0x58, 0x1f, 0x53, 0x4e, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x44, 0x4d, 0x43, 0x48, 0x4d, 0x46, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x1d, 0x1f, 0x1, 0x54, 0x53, 0x1f, 0x56, 0x44, 0x1f, 0x48, 0x4d, 0x9f, ], [0x48, 0x53, 0x1f, 0x52, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x9f, 0x51, 0x44, 0x4c, 0x44, 0x4c, 0x41, 0x44, 0x51, 0x44, 0x43, 0x1b, 0x1f, 0x16, 0x44, 0x9f, 0x45, 0x44, 0x56, 0x1d, 0x1f, 0x56, 0x44, 0x1f, 0x47, 0x40, 0x4f, 0x4f, 0x58, 0x1f, 0x45, 0x44, 0x56, 0x9d, 0x56, 0x44, 0x1f, 0x41, 0x40, 0x4d, 0x43, 0x1f, 0x4e, 0x45, 0x9f, 0x41, 0x51, 0x4e, 0x53, 0x47, 0x44, 0x51, 0x52, 0x1b, 0x1f, 0x5, 0x4e, 0x51, 0x1f, 0x47, 0x44, 0x9f, 0x53, 0x4e, 0x1c, 0x43, 0x40, 0x58, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x52, 0x47, 0x44, 0x43, 0x52, 0x9f, 0x47, 0x48, 0x52, 0x1f, 0x41, 0x4b, 0x4e, 0x4e, 0x43, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x4c, 0x44, 0x9f, 0x12, 0x47, 0x40, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x1f, 0x4c, 0x58, 0x9f, ], [0x41, 0x51, 0x4e, 0x53, 0x47, 0x44, 0x51, 0x1b, 0x9f, 0x1c, 0x12, 0x47, 0x40, 0x4a, 0x44, 0x52, 0x4f, 0x44, 0x40, 0x51, 0x44, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x7, 0x4e, 0x56, 0x44, 0x55, 0x44, 0x51, 0x1f, 0x4c, 0x44, 0x40, 0x4d, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x9f, 0x4b, 0x48, 0x45, 0x44, 0x1f, 0x48, 0x52, 0x1d, 0x1f, 0x4c, 0x44, 0x44, 0x53, 0x1f, 0x48, 0x53, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x1f, 0x48, 0x53, 0x1b, 0x1f, 0x3, 0x4e, 0x9f, 0x4d, 0x4e, 0x53, 0x1f, 0x52, 0x47, 0x54, 0x4d, 0x1f, 0x48, 0x53, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x42, 0x40, 0x4b, 0x4b, 0x1f, 0x48, 0x53, 0x1f, 0x47, 0x40, 0x51, 0x43, 0x9f, 0x4d, 0x40, 0x4c, 0x44, 0x52, 0x1b, 0x1f, 0x8, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x4d, 0x4e, 0x53, 0x9f, 0x52, 0x4e, 0x1f, 0x41, 0x40, 0x43, 0x1f, 0x40, 0x52, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x40, 0x51, 0x44, 0x9b, 0x8, 0x53, 0x1f, 0x4b, 0x4e, 0x4e, 0x4a, 0x52, 0x1f, 0x4f, 0x4e, 0x4e, 0x51, 0x44, 0x52, 0x53, 0x9f, ], [0x56, 0x47, 0x44, 0x4d, 0x1f, 0x58, 0x4e, 0x54, 0x1f, 0x40, 0x51, 0x44, 0x9f, 0x51, 0x48, 0x42, 0x47, 0x44, 0x52, 0x53, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x45, 0x40, 0x54, 0x4b, 0x53, 0x1c, 0x45, 0x48, 0x4d, 0x43, 0x44, 0x51, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x9f, 0x45, 0x48, 0x4d, 0x43, 0x1f, 0x45, 0x40, 0x54, 0x4b, 0x53, 0x52, 0x1f, 0x44, 0x55, 0x44, 0x4d, 0x9f, 0x48, 0x4d, 0x1f, 0x4f, 0x40, 0x51, 0x40, 0x43, 0x48, 0x52, 0x44, 0x1b, 0x1f, 0xb, 0x4e, 0x55, 0x44, 0x9f, 0x58, 0x4e, 0x54, 0x51, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x1d, 0x1f, 0x4f, 0x4e, 0x4e, 0x51, 0x1f, 0x40, 0xd2, 0x48, 0x53, 0x1f, 0x48, 0x52, 0x1b, 0x1f, 0x18, 0x4e, 0x54, 0x1f, 0x4c, 0x40, 0x58, 0x9f, 0x4f, 0x44, 0x51, 0x47, 0x40, 0x4f, 0x52, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x52, 0x4e, 0x4c, 0x44, 0x9f, ], [0x4f, 0x4b, 0x44, 0x40, 0x52, 0x40, 0x4d, 0x53, 0x1d, 0x9f, 0x53, 0x47, 0x51, 0x48, 0x4b, 0x4b, 0x48, 0x4d, 0x46, 0x1d, 0x9f, 0x46, 0x4b, 0x4e, 0x51, 0x48, 0x4e, 0x54, 0x52, 0x1f, 0x47, 0x4e, 0x54, 0x51, 0x52, 0x1d, 0x9f, 0x44, 0x55, 0x44, 0x4d, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x9f, 0x4f, 0x4e, 0x4e, 0x51, 0x47, 0x4e, 0x54, 0x52, 0x44, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x52, 0x44, 0x53, 0x53, 0x48, 0x4d, 0x46, 0x1f, 0x52, 0x54, 0x4d, 0x1f, 0x48, 0x52, 0x9f, 0x51, 0x44, 0x45, 0x4b, 0x44, 0x42, 0x53, 0x44, 0x43, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x1f, 0x53, 0x47, 0xc4, 0x56, 0x48, 0x4d, 0x43, 0x4e, 0x56, 0x52, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, ], [0x40, 0x4b, 0x4c, 0x52, 0x47, 0x4e, 0x54, 0x52, 0x44, 0x1f, 0x40, 0x52, 0x9f, 0x41, 0x51, 0x48, 0x46, 0x47, 0x53, 0x4b, 0x58, 0x1f, 0x40, 0x52, 0x1f, 0x45, 0x51, 0x4e, 0x4c, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x51, 0x48, 0x42, 0x47, 0x1f, 0x4c, 0x40, 0x4d, 0x5d, 0x52, 0x9f, 0x40, 0x41, 0x4e, 0x43, 0x44, 0x1b, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x4d, 0x4e, 0x56, 0x9f, 0x4c, 0x44, 0x4b, 0x53, 0x52, 0x1f, 0x41, 0x44, 0x45, 0x4e, 0x51, 0x44, 0x1f, 0x48, 0x53, 0x52, 0x9f, 0x43, 0x4e, 0x4e, 0x51, 0x1f, 0x40, 0x52, 0x1f, 0x44, 0x40, 0x51, 0x4b, 0x58, 0x1f, 0x48, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x52, 0x4f, 0x51, 0x48, 0x4d, 0x46, 0x1b, 0x1f, 0x8, 0x1f, 0x43, 0x4e, 0x9f, 0x4d, 0x4e, 0x53, 0x1f, 0x52, 0x44, 0x44, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x40, 0x9f, ], [0x50, 0x54, 0x48, 0x44, 0x53, 0x1f, 0x4c, 0x48, 0x4d, 0x43, 0x1f, 0x4c, 0x40, 0x58, 0x9f, 0x4b, 0x48, 0x55, 0x44, 0x1f, 0x40, 0x52, 0x9f, 0x42, 0x4e, 0x4d, 0x53, 0x44, 0x4d, 0x53, 0x44, 0x43, 0x4b, 0x58, 0x1f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x9d, 0x40, 0x4d, 0x43, 0x1f, 0x47, 0x40, 0x55, 0x44, 0x1f, 0x40, 0x52, 0x9f, 0x42, 0x47, 0x44, 0x44, 0x51, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x47, 0x4e, 0x54, 0x46, 0x47, 0x53, 0x52, 0x9d, 0x40, 0x52, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x1f, 0x4f, 0x40, 0x4b, 0x40, 0x42, 0x44, 0x1b, 0x9f, 0x1c, 0x13, 0x47, 0x4e, 0x51, 0x44, 0x40, 0x54, 0x1f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x16, 0x44, 0x1f, 0x4c, 0x54, 0x52, 0x53, 0x1f, 0x4b, 0x44, 0x40, 0x51, 0x4d, 0x1f, 0x53, 0x4e, 0x9f, 0x51, 0x44, 0x40, 0x56, 0x40, 0x4a, 0x44, 0x4d, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4a, 0x44, 0x44, 0x4f, 0x9f, 0x4e, 0x54, 0x51, 0x52, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1f, 0x40, 0x56, 0x40, 0x4a, 0x44, 0x1d, 0x9f, 0x4d, 0x4e, 0x53, 0x1f, 0x41, 0x58, 0x1f, 0x4c, 0x44, 0x42, 0x47, 0x40, 0x4d, 0x48, 0x42, 0x40, 0x4b, 0x9f, 0x40, 0x48, 0x43, 0x52, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x41, 0x58, 0x1f, 0x40, 0x4d, 0x9f, 0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x9f, 0x44, 0x57, 0x4f, 0x44, 0x42, 0x53, 0x40, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0xc4, 0x43, 0x40, 0x56, 0x4d, 0x1d, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x43, 0x4e, 0x44, 0x52, 0x9f, ], [0x4d, 0x4e, 0x53, 0x1f, 0x45, 0x4e, 0x51, 0x52, 0x40, 0x4a, 0x44, 0x1f, 0x54, 0x52, 0x9f, 0x44, 0x55, 0x44, 0x4d, 0x1f, 0x48, 0x4d, 0x1f, 0x4e, 0x54, 0x51, 0x9f, 0x52, 0x4e, 0x54, 0x4d, 0x43, 0x44, 0x52, 0x53, 0x1f, 0x52, 0x4b, 0x44, 0x44, 0x4f, 0x1b, 0x1f, 0x8, 0x9f, 0x4a, 0x4d, 0x4e, 0x56, 0x1f, 0x4e, 0x45, 0x1f, 0x4d, 0x4e, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x44, 0x4d, 0x42, 0x4e, 0x54, 0x51, 0x40, 0x46, 0x48, 0x4d, 0x46, 0x1f, 0x45, 0x40, 0x42, 0x53, 0x9f, 0x53, 0x47, 0x40, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x54, 0x4d, 0x50, 0x54, 0x44, 0x52, 0x53, 0x48, 0x4e, 0x4d, 0x40, 0x41, 0x4b, 0x44, 0x9f, 0x40, 0x41, 0x48, 0x4b, 0x48, 0x53, 0x58, 0x1f, 0x4e, 0x45, 0x1f, 0x4c, 0x40, 0x4d, 0x1f, 0x53, 0x4e, 0x9f, ], [0x44, 0x4b, 0x44, 0x55, 0x40, 0x53, 0x44, 0x1f, 0x47, 0x48, 0x52, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x9f, 0x41, 0x58, 0x1f, 0x40, 0x1f, 0x42, 0x4e, 0x4d, 0x52, 0x42, 0x48, 0x4e, 0x54, 0x52, 0x9f, 0x44, 0x4d, 0x43, 0x44, 0x40, 0x55, 0x4e, 0x54, 0x51, 0x1b, 0x1f, 0x8, 0x53, 0x1f, 0x48, 0x52, 0x9f, 0x52, 0x4e, 0x4c, 0x44, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x9f, 0x40, 0x41, 0x4b, 0x44, 0x1f, 0x53, 0x4e, 0x1f, 0x4f, 0x40, 0x48, 0x4d, 0x53, 0x1f, 0x40, 0x9f, 0x4f, 0x40, 0x51, 0x53, 0x48, 0x42, 0x54, 0x4b, 0x40, 0x51, 0x9f, 0x4f, 0x48, 0x42, 0x53, 0x54, 0x51, 0x44, 0x1d, 0x1f, 0x4e, 0x51, 0x1f, 0x53, 0x4e, 0x9f, 0x42, 0x40, 0x51, 0x55, 0x44, 0x1f, 0x40, 0x1f, 0x52, 0x53, 0x40, 0x53, 0x54, 0x44, 0x1d, 0x9f, ], [0x40, 0x4d, 0x43, 0x1f, 0x52, 0x4e, 0x1f, 0x53, 0x4e, 0x1f, 0x4c, 0x40, 0x4a, 0x44, 0x1f, 0x40, 0x9f, 0x45, 0x44, 0x56, 0x1f, 0x4e, 0x41, 0x49, 0x44, 0x42, 0x53, 0x52, 0x9f, 0x41, 0x44, 0x40, 0x54, 0x53, 0x48, 0x45, 0x54, 0x4b, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x1f, 0x48, 0x53, 0x9f, 0x48, 0x52, 0x1f, 0x45, 0x40, 0x51, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x46, 0x4b, 0x4e, 0x51, 0x48, 0x4e, 0x54, 0x52, 0x1f, 0x53, 0x4e, 0x1f, 0x42, 0x40, 0x51, 0x55, 0x44, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x4f, 0x40, 0x48, 0x4d, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x55, 0x44, 0x51, 0xd8, 0x40, 0x53, 0x4c, 0x4e, 0x52, 0x4f, 0x47, 0x44, 0x51, 0x44, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x4c, 0x44, 0x43, 0x48, 0x54, 0x4c, 0x1f, 0x53, 0x47, 0x51, 0x4e, 0x54, 0x46, 0x47, 0x9f, ], [0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x56, 0x44, 0x1f, 0x4b, 0x4e, 0x4e, 0x4a, 0x1d, 0x9f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x4c, 0x4e, 0x51, 0x40, 0x4b, 0x4b, 0x58, 0x1f, 0x56, 0x44, 0x9f, 0x42, 0x40, 0x4d, 0x1f, 0x43, 0x4e, 0x1b, 0x1f, 0x13, 0x4e, 0x1f, 0x40, 0x45, 0x45, 0x44, 0x42, 0x53, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x50, 0x54, 0x40, 0x4b, 0x48, 0x53, 0x58, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0xc4, 0x43, 0x40, 0x58, 0x1d, 0x1f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x47, 0x48, 0x46, 0x47, 0x44, 0x52, 0x53, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x51, 0x53, 0x52, 0x1b, 0x9f, 0x1c, 0x13, 0x47, 0x4e, 0x51, 0x44, 0x40, 0x54, 0x1f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x8, 0x45, 0x1f, 0x4e, 0x4d, 0x44, 0x1f, 0x40, 0x43, 0x55, 0x40, 0x4d, 0x42, 0x44, 0x52, 0x9f, 0x42, 0x4e, 0x4d, 0x45, 0x48, 0x43, 0x44, 0x4d, 0x53, 0x4b, 0x58, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0xc4, 0x43, 0x48, 0x51, 0x44, 0x42, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x4e, 0x45, 0x1f, 0x47, 0x48, 0x52, 0x9f, 0x43, 0x51, 0x44, 0x40, 0x4c, 0x52, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x44, 0x4d, 0x43, 0x44, 0x40, 0x55, 0x4e, 0x51, 0x52, 0x1f, 0x53, 0x4e, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x1f, 0x56, 0x47, 0x48, 0x42, 0x47, 0x1f, 0x47, 0x44, 0x9f, 0x47, 0x40, 0x52, 0x1f, 0x48, 0x4c, 0x40, 0x46, 0x48, 0x4d, 0x44, 0x43, 0x1d, 0x1f, 0x47, 0x44, 0x9f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4c, 0x44, 0x44, 0x53, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x1f, 0x40, 0x9f, ], [0x52, 0x54, 0x42, 0x42, 0x44, 0x52, 0x52, 0x1f, 0x54, 0x4d, 0x44, 0x57, 0x4f, 0x44, 0x42, 0x53, 0x44, 0xc3, 0x48, 0x4d, 0x1f, 0x42, 0x4e, 0x4c, 0x4c, 0x4e, 0x4d, 0x1f, 0x47, 0x4e, 0x54, 0x51, 0x52, 0x1b, 0x9f, 0x7, 0x44, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4f, 0x54, 0x53, 0x1f, 0x52, 0x4e, 0x4c, 0x44, 0x9f, 0x53, 0x47, 0x48, 0x4d, 0x46, 0x52, 0x1f, 0x41, 0x44, 0x47, 0x48, 0x4d, 0x43, 0x1d, 0x9f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4f, 0x40, 0x52, 0x52, 0x1f, 0x40, 0x4d, 0x9f, 0x48, 0x4d, 0x55, 0x48, 0x52, 0x48, 0x41, 0x4b, 0x44, 0x9f, 0x41, 0x4e, 0x54, 0x4d, 0x43, 0x40, 0x51, 0x58, 0x1b, 0x1f, 0xd, 0x44, 0x56, 0x1d, 0x9f, 0x54, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0x40, 0x4b, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, ], [0x4c, 0x4e, 0x51, 0x44, 0x1f, 0x4b, 0x48, 0x41, 0x44, 0x51, 0x40, 0x4b, 0x1f, 0x4b, 0x40, 0x56, 0x52, 0x9f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x41, 0x44, 0x46, 0x48, 0x4d, 0x1f, 0x53, 0x4e, 0x9f, 0x44, 0x52, 0x53, 0x40, 0x41, 0x4b, 0x48, 0x52, 0x47, 0x9f, 0x53, 0x47, 0x44, 0x4c, 0x52, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1f, 0x40, 0x51, 0x4e, 0x54, 0x4d, 0x43, 0x9f, 0x40, 0x4d, 0x43, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x48, 0x4d, 0x1f, 0x47, 0x48, 0x4c, 0x1d, 0x1f, 0x4e, 0xd1, 0x53, 0x47, 0x44, 0x1f, 0x4e, 0x4b, 0x43, 0x1f, 0x4b, 0x40, 0x56, 0x52, 0x1f, 0x41, 0x44, 0x9f, 0x44, 0x57, 0x4f, 0x40, 0x4d, 0x43, 0x44, 0x43, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x48, 0x4d, 0x53, 0x44, 0x51, 0x4f, 0x51, 0x44, 0x53, 0x44, 0x43, 0x1f, 0x48, 0x4d, 0x1f, 0x47, 0x48, 0xd2, ], [0x45, 0x40, 0x55, 0x4e, 0x51, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x1f, 0x4c, 0x4e, 0x51, 0x44, 0x9f, 0x4b, 0x48, 0x41, 0x44, 0x51, 0x40, 0x4b, 0x1f, 0x52, 0x44, 0x4d, 0x52, 0x44, 0x1d, 0x1f, 0x40, 0x4d, 0xc3, 0x47, 0x44, 0x1f, 0x56, 0x48, 0x4b, 0x4b, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, 0x53, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x42, 0x44, 0x4d, 0x52, 0x44, 0x1f, 0x4e, 0x45, 0x1f, 0x40, 0x9f, 0x47, 0x48, 0x46, 0x47, 0x44, 0x51, 0x1f, 0x4e, 0x51, 0x43, 0x44, 0x51, 0x1f, 0x4e, 0x45, 0x9f, 0x41, 0x44, 0x48, 0x4d, 0x46, 0x52, 0x1b, 0x1f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x8, 0x5d, 0x4c, 0x1f, 0x4d, 0x4e, 0x41, 0x4e, 0x43, 0x58, 0x1a, 0x1f, 0x16, 0x47, 0x4e, 0x9f, 0x40, 0x51, 0x44, 0x1f, 0x58, 0x4e, 0x54, 0x1e, 0x1f, 0x0, 0x51, 0x44, 0x1f, 0x58, 0x4e, 0x54, 0x9f, 0x4d, 0x4e, 0x41, 0x4e, 0x43, 0x58, 0x1d, 0x1f, 0x53, 0x4e, 0x4e, 0x1e, 0x1f, 0x13, 0x47, 0x44, 0x4d, 0x9f, 0x53, 0x47, 0x44, 0x51, 0x44, 0x5d, 0x52, 0x1f, 0x40, 0x1f, 0x4f, 0x40, 0x48, 0x51, 0x1f, 0x4e, 0x45, 0x9f, 0x54, 0x52, 0x1d, 0x1f, 0x43, 0x4e, 0x4d, 0x5d, 0x53, 0x1f, 0x53, 0x44, 0x4b, 0x4b, 0x1a, 0x9f, 0x13, 0x47, 0x44, 0x58, 0x5d, 0x43, 0x1f, 0x41, 0x40, 0x4d, 0x48, 0x52, 0x47, 0x1f, 0x54, 0x52, 0x1d, 0x9f, 0x58, 0x4e, 0x54, 0x1f, 0x4a, 0x4d, 0x4e, 0x56, 0x1b, 0x1f, 0x7, 0x4e, 0x56, 0x9f, 0x43, 0x51, 0x44, 0x40, 0x51, 0x58, 0x1f, 0x53, 0x4e, 0x1f, 0x41, 0x44, 0x9f, ], [0x52, 0x4e, 0x4c, 0x44, 0x41, 0x4e, 0x43, 0x58, 0x1a, 0x1f, 0x7, 0x4e, 0x56, 0x9f, 0x4f, 0x54, 0x41, 0x4b, 0x48, 0x42, 0x1d, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x40, 0x9f, 0x45, 0x51, 0x4e, 0x46, 0x1f, 0x13, 0x4e, 0x1f, 0x53, 0x44, 0x4b, 0x4b, 0x1f, 0x58, 0x4e, 0x54, 0x51, 0x9f, 0x4d, 0x40, 0x4c, 0x44, 0x1f, 0x53, 0x47, 0x44, 0x1f, 0x4b, 0x48, 0x55, 0x44, 0x4b, 0x4e, 0x4d, 0x46, 0x9f, 0x43, 0x40, 0x58, 0x1f, 0x13, 0x4e, 0x1f, 0x40, 0x4d, 0x1f, 0x40, 0x43, 0x4c, 0x48, 0x51, 0x48, 0x4d, 0xc6, 0x41, 0x4e, 0x46, 0x1a, 0x1f, 0x1c, 0x3, 0x48, 0x42, 0x4a, 0x48, 0x4d, 0x52, 0x4e, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x7, 0x4e, 0x56, 0x1f, 0x47, 0x40, 0x4f, 0x4f, 0x58, 0x1f, 0x48, 0x52, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x4b, 0x48, 0x53, 0x53, 0x4b, 0x44, 0x1f, 0x52, 0x53, 0x4e, 0x4d, 0x44, 0x1f, 0x13, 0x47, 0x40, 0x53, 0x9f, 0x51, 0x40, 0x4c, 0x41, 0x4b, 0x44, 0x52, 0x1f, 0x48, 0x4d, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x51, 0x4e, 0x40, 0x43, 0x1f, 0x40, 0x4b, 0x4e, 0x4d, 0x44, 0x1d, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x43, 0x4e, 0x44, 0x52, 0x4d, 0x5d, 0x53, 0x1f, 0x42, 0x40, 0x51, 0x44, 0x1f, 0x40, 0x41, 0x4e, 0x54, 0xd3, 0x42, 0x40, 0x51, 0x44, 0x44, 0x51, 0x52, 0x1d, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x44, 0x57, 0x48, 0x46, 0x44, 0x4d, 0x42, 0x48, 0x44, 0x52, 0x1f, 0x4d, 0x44, 0x55, 0x44, 0x51, 0x9f, 0x45, 0x44, 0x40, 0x51, 0x52, 0x1b, 0x1f, 0x16, 0x47, 0x4e, 0x52, 0x44, 0x1f, 0x42, 0x4e, 0x40, 0x53, 0x9f, ], [0x4e, 0x45, 0x1f, 0x44, 0x4b, 0x44, 0x4c, 0x44, 0x4d, 0x53, 0x40, 0x4b, 0x1f, 0x41, 0x51, 0x4e, 0x56, 0xcd, 0x0, 0x1f, 0x4f, 0x40, 0x52, 0x52, 0x48, 0x4d, 0x46, 0x1f, 0x54, 0x4d, 0x48, 0x55, 0x44, 0x51, 0x52, 0xc4, 0x4f, 0x54, 0x53, 0x1f, 0x4e, 0x4d, 0x1b, 0x1f, 0x0, 0x4d, 0x43, 0x9f, 0x48, 0x4d, 0x43, 0x44, 0x4f, 0x44, 0x4d, 0x43, 0x44, 0x4d, 0x53, 0x1f, 0x40, 0x52, 0x1f, 0x53, 0x47, 0xc4, 0x52, 0x54, 0x4d, 0x1d, 0x1f, 0x0, 0x52, 0x52, 0x4e, 0x42, 0x48, 0x40, 0x53, 0x44, 0x52, 0x1f, 0x4e, 0xd1, 0x46, 0x4b, 0x4e, 0x56, 0x52, 0x1f, 0x40, 0x4b, 0x4e, 0x4d, 0x44, 0x1d, 0x9f, 0x5, 0x54, 0x4b, 0x45, 0x48, 0x4b, 0x4b, 0x48, 0x4d, 0x46, 0x9f, 0x40, 0x41, 0x52, 0x4e, 0x4b, 0x54, 0x53, 0x44, 0x1f, 0x43, 0x44, 0x42, 0x51, 0x44, 0x44, 0x1f, 0x8, 0xcd, ], [0x42, 0x40, 0x52, 0x54, 0x40, 0x4b, 0x1f, 0x52, 0x48, 0x4c, 0x4f, 0x4b, 0x48, 0x42, 0x48, 0x53, 0x58, 0x9b, 0x1c, 0x3, 0x48, 0x42, 0x4a, 0x48, 0x4d, 0x52, 0x4e, 0x4d, 0x1f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, ]],
|
||||||
|
[[0x1, 0x44, 0x42, 0x40, 0x54, 0x52, 0x44, 0x1f, 0x8, 0x1f, 0x42, 0x4e, 0x54, 0x4b, 0x43, 0x9f, 0x4d, 0x4e, 0x53, 0x1f, 0x52, 0x53, 0x4e, 0x4f, 0x1f, 0x45, 0x4e, 0x51, 0x1f, 0x43, 0x44, 0x40, 0x53, 0xc7, 0x7, 0x44, 0x1f, 0x4a, 0x48, 0x4d, 0x43, 0x4b, 0x58, 0x1f, 0x52, 0x53, 0x4e, 0x4f, 0x4f, 0x44, 0x43, 0x9f, 0x45, 0x4e, 0x51, 0x1f, 0x4c, 0x44, 0x1b, 0x1f, 0x13, 0x47, 0x44, 0x9f, 0x42, 0x40, 0x51, 0x51, 0x48, 0x40, 0x46, 0x44, 0x1f, 0x47, 0x44, 0x4b, 0x43, 0x1f, 0x41, 0x54, 0x53, 0x9f, 0x49, 0x54, 0x52, 0x53, 0x1f, 0x4e, 0x54, 0x51, 0x52, 0x44, 0x4b, 0x55, 0x44, 0x52, 0x1f, 0x0, 0x4d, 0xc3, 0x48, 0x4c, 0x4c, 0x4e, 0x51, 0x53, 0x40, 0x4b, 0x48, 0x53, 0x58, 0x9f, 0x1c, 0x3, 0x48, 0x42, 0x4a, 0x48, 0x4d, 0x52, 0x4e, 0x4d, 0x1f, 0x9f, ]],
|
||||||
|
[[0x5, 0x4e, 0x51, 0x1d, 0x1f, 0x4b, 0x48, 0x4a, 0x44, 0x1f, 0x40, 0x4b, 0x4c, 0x4e, 0x52, 0x53, 0x9f, 0x44, 0x55, 0x44, 0x51, 0x58, 0x4e, 0x4d, 0x44, 0x1f, 0x44, 0x4b, 0x52, 0x44, 0x1f, 0x48, 0x4d, 0x9f, 0x4e, 0x54, 0x51, 0x1f, 0x42, 0x4e, 0x54, 0x4d, 0x53, 0x51, 0x58, 0x1d, 0x1f, 0x8, 0x9f, 0x52, 0x53, 0x40, 0x51, 0x53, 0x44, 0x43, 0x1f, 0x4e, 0x54, 0x53, 0x1f, 0x56, 0x48, 0x53, 0x47, 0x9f, 0x4c, 0x58, 0x1f, 0x52, 0x47, 0x40, 0x51, 0x44, 0x1f, 0x4e, 0x45, 0x9f, 0x4e, 0x4f, 0x53, 0x48, 0x4c, 0x48, 0x52, 0x4c, 0x1b, 0x1f, 0x8, 0x9f, 0x41, 0x44, 0x4b, 0x48, 0x44, 0x55, 0x44, 0x43, 0x1f, 0x48, 0x4d, 0x1f, 0x47, 0x40, 0x51, 0x43, 0x9f, 0x56, 0x4e, 0x51, 0x4a, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x4f, 0x51, 0x4e, 0x46, 0x51, 0x44, 0x52, 0x52, 0x9f, ], [0x40, 0x4d, 0x43, 0x1f, 0x40, 0x42, 0x53, 0x48, 0x4e, 0x4d, 0x1d, 0x1f, 0x41, 0x54, 0x53, 0x9f, 0x4d, 0x4e, 0x56, 0x1d, 0x1f, 0x40, 0x45, 0x53, 0x44, 0x51, 0x1f, 0x45, 0x48, 0x51, 0x52, 0x53, 0x9f, 0x41, 0x44, 0x48, 0x4d, 0x46, 0x1f, 0x5d, 0x45, 0x4e, 0x51, 0x5d, 0x9f, 0x52, 0x4e, 0x42, 0x48, 0x44, 0x53, 0x58, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x53, 0x47, 0x44, 0x4d, 0x9f, 0x5d, 0x40, 0x46, 0x40, 0x48, 0x4d, 0x52, 0x53, 0x5d, 0x1f, 0x48, 0x53, 0x1d, 0x1f, 0x8, 0x9f, 0x40, 0x52, 0x52, 0x48, 0x46, 0x4d, 0x1f, 0x4c, 0x58, 0x52, 0x44, 0x4b, 0x45, 0x1f, 0x4d, 0x4e, 0x9f, 0x51, 0x40, 0x4d, 0x4a, 0x1f, 0x4e, 0x51, 0x1f, 0x40, 0x4d, 0x58, 0x1f, 0x4b, 0x48, 0x4c, 0x48, 0x53, 0x9d, 0x40, 0x4d, 0x43, 0x1f, 0x52, 0x54, 0x42, 0x47, 0x1f, 0x40, 0x4d, 0x9f, ], [0x40, 0x53, 0x53, 0x48, 0x53, 0x54, 0x43, 0x44, 0x1f, 0x48, 0x52, 0x1f, 0x55, 0x44, 0x51, 0x58, 0x9f, 0x4c, 0x54, 0x42, 0x47, 0x1f, 0x40, 0x46, 0x40, 0x48, 0x4d, 0x52, 0x53, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x53, 0x51, 0x44, 0x4d, 0x43, 0x1f, 0x4e, 0x45, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x53, 0x48, 0x4c, 0x44, 0x52, 0x1b, 0x1f, 0x1, 0x54, 0x53, 0x1f, 0x4c, 0x58, 0x9f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x1f, 0x47, 0x40, 0x52, 0x1f, 0x41, 0x44, 0x42, 0x4e, 0x4c, 0x44, 0x9f, 0x4e, 0x4d, 0x44, 0x1f, 0x4e, 0x45, 0x1f, 0x48, 0x4d, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x44, 0x9f, 0x4f, 0x4e, 0x52, 0x52, 0x48, 0x41, 0x48, 0x4b, 0x48, 0x53, 0x48, 0x44, 0x52, 0x1b, 0x9f, 0x16, 0x47, 0x40, 0x53, 0x1f, 0x40, 0x1f, 0x4f, 0x47, 0x51, 0x40, 0x52, 0x44, 0x1f, 0x1c, 0x9f, ], [0x52, 0x53, 0x48, 0x4b, 0x4b, 0x1f, 0x48, 0x53, 0x5d, 0x52, 0x1f, 0x40, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x9f, 0x4f, 0x47, 0x51, 0x40, 0x52, 0x44, 0x1f, 0x40, 0x4d, 0x43, 0x1f, 0x40, 0x1f, 0x46, 0x4e, 0x4e, 0x43, 0x9f, 0x55, 0x48, 0x44, 0x56, 0x1f, 0x4e, 0x45, 0x1f, 0x4b, 0x48, 0x45, 0x44, 0x1d, 0x1f, 0x40, 0x4d, 0x43, 0x9f, 0x40, 0x1f, 0x4c, 0x40, 0x4d, 0x1f, 0x52, 0x47, 0x4e, 0x54, 0x4b, 0x43, 0x4d, 0x5d, 0x53, 0x9f, 0x40, 0x42, 0x42, 0x44, 0x4f, 0x53, 0x1f, 0x40, 0x4d, 0x58, 0x1f, 0x4e, 0x53, 0x47, 0x44, 0x51, 0x1b, 0x9f, 0x53, 0x47, 0x40, 0x53, 0x1f, 0x4c, 0x54, 0x42, 0x47, 0x1f, 0x8, 0x5d, 0x55, 0x44, 0x9f, 0x4b, 0x44, 0x40, 0x51, 0x4d, 0x44, 0x43, 0x9f, 0x54, 0x4d, 0x43, 0x44, 0x51, 0x46, 0x51, 0x4e, 0x54, 0x4d, 0x43, 0x1b, 0x1f, 0x14, 0x4d, 0x53, 0x48, 0xcb, ], [0x52, 0x4e, 0x4c, 0x44, 0x1f, 0x46, 0x40, 0x4d, 0x46, 0x1f, 0x52, 0x54, 0x42, 0x42, 0x44, 0x44, 0x43, 0xd2, 0x48, 0x4d, 0x1f, 0x4f, 0x54, 0x53, 0x53, 0x48, 0x4d, 0x46, 0x1f, 0x53, 0x47, 0x44, 0x9f, 0x56, 0x4e, 0x51, 0x4b, 0x43, 0x1f, 0x48, 0x4d, 0x1f, 0x40, 0x1f, 0x52, 0x53, 0x51, 0x40, 0x48, 0x53, 0x9f, 0x49, 0x40, 0x42, 0x4a, 0x44, 0x53, 0x1d, 0x1f, 0x48, 0x53, 0x52, 0x9f, 0x43, 0x44, 0x45, 0x48, 0x4d, 0x48, 0x53, 0x48, 0x4e, 0x4d, 0x1f, 0x48, 0x52, 0x9f, 0x4f, 0x4e, 0x52, 0x52, 0x48, 0x41, 0x48, 0x4b, 0x48, 0x53, 0x58, 0x1b, 0x9f, 0x1c, 0x4, 0x4b, 0x4b, 0x48, 0x52, 0x4e, 0x4d, 0x1f, 0x9f, 0x9f, ]],
|
||||||
|
]
|
|
@ -0,0 +1,364 @@
|
||||||
|
# Level Definitions
|
||||||
|
yoshis_house = "Yoshi's House"
|
||||||
|
yoshis_house_tile = "Yoshi's House - Tile"
|
||||||
|
|
||||||
|
yoshis_island_1_exit_1 = "Yoshi's Island 1 - Normal Exit"
|
||||||
|
yoshis_island_1_dragon = "Yoshi's Island 1 - Dragon Coins"
|
||||||
|
yoshis_island_2_exit_1 = "Yoshi's Island 2 - Normal Exit"
|
||||||
|
yoshis_island_2_dragon = "Yoshi's Island 2 - Dragon Coins"
|
||||||
|
yoshis_island_3_exit_1 = "Yoshi's Island 3 - Normal Exit"
|
||||||
|
yoshis_island_3_dragon = "Yoshi's Island 3 - Dragon Coins"
|
||||||
|
yoshis_island_4_exit_1 = "Yoshi's Island 4 - Normal Exit"
|
||||||
|
yoshis_island_4_dragon = "Yoshi's Island 4 - Dragon Coins"
|
||||||
|
yoshis_island_castle = "#1 Iggy's Castle - Normal Exit"
|
||||||
|
yoshis_island_koopaling = "#1 Iggy's Castle - Boss"
|
||||||
|
|
||||||
|
yellow_switch_palace = "Yellow Switch Palace"
|
||||||
|
|
||||||
|
donut_plains_1_exit_1 = "Donut Plains 1 - Normal Exit"
|
||||||
|
donut_plains_1_exit_2 = "Donut Plains 1 - Secret Exit"
|
||||||
|
donut_plains_1_dragon = "Donut Plains 1 - Dragon Coins"
|
||||||
|
donut_plains_2_exit_1 = "Donut Plains 2 - Normal Exit"
|
||||||
|
donut_plains_2_exit_2 = "Donut Plains 2 - Secret Exit"
|
||||||
|
donut_plains_2_dragon = "Donut Plains 2 - Dragon Coins"
|
||||||
|
donut_plains_3_exit_1 = "Donut Plains 3 - Normal Exit"
|
||||||
|
donut_plains_3_dragon = "Donut Plains 3 - Dragon Coins"
|
||||||
|
donut_plains_4_exit_1 = "Donut Plains 4 - Normal Exit"
|
||||||
|
donut_plains_4_dragon = "Donut Plains 4 - Dragon Coins"
|
||||||
|
donut_secret_1_exit_1 = "Donut Secret 1 - Normal Exit"
|
||||||
|
donut_secret_1_exit_2 = "Donut Secret 1 - Secret Exit"
|
||||||
|
donut_secret_1_dragon = "Donut Secret 1 - Dragon Coins"
|
||||||
|
donut_secret_2_exit_1 = "Donut Secret 2 - Normal Exit"
|
||||||
|
donut_secret_2_dragon = "Donut Secret 2 - Dragon Coins"
|
||||||
|
donut_ghost_house_exit_1 = "Donut Ghost House - Normal Exit"
|
||||||
|
donut_ghost_house_exit_2 = "Donut Ghost House - Secret Exit"
|
||||||
|
donut_secret_house_exit_1 = "Donut Secret House - Normal Exit"
|
||||||
|
donut_secret_house_exit_2 = "Donut Secret House - Secret Exit"
|
||||||
|
donut_plains_castle = "#2 Morton's Castle - Normal Exit"
|
||||||
|
donut_plains_koopaling = "#2 Morton's Castle - Boss"
|
||||||
|
|
||||||
|
green_switch_palace = "Green Switch Palace"
|
||||||
|
|
||||||
|
vanilla_dome_1_exit_1 = "Vanilla Dome 1 - Normal Exit"
|
||||||
|
vanilla_dome_1_exit_2 = "Vanilla Dome 1 - Secret Exit"
|
||||||
|
vanilla_dome_1_dragon = "Vanilla Dome 1 - Dragon Coins"
|
||||||
|
vanilla_dome_2_exit_1 = "Vanilla Dome 2 - Normal Exit"
|
||||||
|
vanilla_dome_2_exit_2 = "Vanilla Dome 2 - Secret Exit"
|
||||||
|
vanilla_dome_2_dragon = "Vanilla Dome 2 - Dragon Coins"
|
||||||
|
vanilla_dome_3_exit_1 = "Vanilla Dome 3 - Normal Exit"
|
||||||
|
vanilla_dome_3_dragon = "Vanilla Dome 3 - Dragon Coins"
|
||||||
|
vanilla_dome_4_exit_1 = "Vanilla Dome 4 - Normal Exit"
|
||||||
|
vanilla_dome_4_dragon = "Vanilla Dome 4 - Dragon Coins"
|
||||||
|
vanilla_secret_1_exit_1 = "Vanilla Secret 1 - Normal Exit"
|
||||||
|
vanilla_secret_1_exit_2 = "Vanilla Secret 1 - Secret Exit"
|
||||||
|
vanilla_secret_1_dragon = "Vanilla Secret 1 - Dragon Coins"
|
||||||
|
vanilla_secret_2_exit_1 = "Vanilla Secret 2 - Normal Exit"
|
||||||
|
vanilla_secret_2_dragon = "Vanilla Secret 2 - Dragon Coins"
|
||||||
|
vanilla_secret_3_exit_1 = "Vanilla Secret 3 - Normal Exit"
|
||||||
|
vanilla_secret_3_dragon = "Vanilla Secret 3 - Dragon Coins"
|
||||||
|
vanilla_ghost_house_exit_1 = "Vanilla Ghost House - Normal Exit"
|
||||||
|
vanilla_ghost_house_dragon = "Vanilla Ghost House - Dragon Coins"
|
||||||
|
vanilla_fortress = "Vanilla Fortress - Normal Exit"
|
||||||
|
vanilla_reznor = "Vanilla Fortress - Boss"
|
||||||
|
vanilla_dome_castle = "#3 Lemmy's Castle - Normal Exit"
|
||||||
|
vanilla_dome_koopaling = "#3 Lemmy's Castle - Boss"
|
||||||
|
|
||||||
|
red_switch_palace = "Red Switch Palace"
|
||||||
|
|
||||||
|
butter_bridge_1_exit_1 = "Butter Bridge 1 - Normal Exit"
|
||||||
|
butter_bridge_1_dragon = "Butter Bridge 1 - Dragon Coins"
|
||||||
|
butter_bridge_2_exit_1 = "Butter Bridge 2 - Normal Exit"
|
||||||
|
butter_bridge_2_dragon = "Butter Bridge 2 - Dragon Coins"
|
||||||
|
cheese_bridge_exit_1 = "Cheese Bridge - Normal Exit"
|
||||||
|
cheese_bridge_exit_2 = "Cheese Bridge - Secret Exit"
|
||||||
|
cheese_bridge_dragon = "Cheese Bridge - Dragon Coins"
|
||||||
|
cookie_mountain_exit_1 = "Cookie Mountain - Normal Exit"
|
||||||
|
cookie_mountain_dragon = "Cookie Mountain - Dragon Coins"
|
||||||
|
soda_lake_exit_1 = "Soda Lake - Normal Exit"
|
||||||
|
soda_lake_dragon = "Soda Lake - Dragon Coins"
|
||||||
|
twin_bridges_castle = "#4 Ludwig's Castle - Normal Exit"
|
||||||
|
twin_bridges_koopaling = "#4 Ludwig's Castle - Boss"
|
||||||
|
|
||||||
|
forest_of_illusion_1_exit_1 = "Forest of Illusion 1 - Normal Exit"
|
||||||
|
forest_of_illusion_1_exit_2 = "Forest of Illusion 1 - Secret Exit"
|
||||||
|
forest_of_illusion_2_exit_1 = "Forest of Illusion 2 - Normal Exit"
|
||||||
|
forest_of_illusion_2_exit_2 = "Forest of Illusion 2 - Secret Exit"
|
||||||
|
forest_of_illusion_2_dragon = "Forest of Illusion 2 - Dragon Coins"
|
||||||
|
forest_of_illusion_3_exit_1 = "Forest of Illusion 3 - Normal Exit"
|
||||||
|
forest_of_illusion_3_exit_2 = "Forest of Illusion 3 - Secret Exit"
|
||||||
|
forest_of_illusion_3_dragon = "Forest of Illusion 3 - Dragon Coins"
|
||||||
|
forest_of_illusion_4_exit_1 = "Forest of Illusion 4 - Normal Exit"
|
||||||
|
forest_of_illusion_4_exit_2 = "Forest of Illusion 4 - Secret Exit"
|
||||||
|
forest_of_illusion_4_dragon = "Forest of Illusion 4 - Dragon Coins"
|
||||||
|
forest_ghost_house_exit_1 = "Forest Ghost House - Normal Exit"
|
||||||
|
forest_ghost_house_exit_2 = "Forest Ghost House - Secret Exit"
|
||||||
|
forest_ghost_house_dragon = "Forest Ghost House - Dragon Coins"
|
||||||
|
forest_secret_exit_1 = "Forest Secret - Normal Exit"
|
||||||
|
forest_secret_dragon = "Forest Secret - Dragon Coins"
|
||||||
|
forest_fortress = "Forest Fortress - Normal Exit"
|
||||||
|
forest_reznor = "Forest Fortress - Boss"
|
||||||
|
forest_castle = "#5 Roy's Castle - Normal Exit"
|
||||||
|
forest_castle_dragon = "#5 Roy's Castle - Dragon Coins"
|
||||||
|
forest_koopaling = "#5 Roy's Castle - Boss"
|
||||||
|
|
||||||
|
blue_switch_palace = "Blue Switch Palace"
|
||||||
|
|
||||||
|
chocolate_island_1_exit_1 = "Chocolate Island 1 - Normal Exit"
|
||||||
|
chocolate_island_1_dragon = "Chocolate Island 1 - Dragon Coins"
|
||||||
|
chocolate_island_2_exit_1 = "Chocolate Island 2 - Normal Exit"
|
||||||
|
chocolate_island_2_exit_2 = "Chocolate Island 2 - Secret Exit"
|
||||||
|
chocolate_island_2_dragon = "Chocolate Island 2 - Dragon Coins"
|
||||||
|
chocolate_island_3_exit_1 = "Chocolate Island 3 - Normal Exit"
|
||||||
|
chocolate_island_3_exit_2 = "Chocolate Island 3 - Secret Exit"
|
||||||
|
chocolate_island_3_dragon = "Chocolate Island 3 - Dragon Coins"
|
||||||
|
chocolate_island_4_exit_1 = "Chocolate Island 4 - Normal Exit"
|
||||||
|
chocolate_island_4_dragon = "Chocolate Island 4 - Dragon Coins"
|
||||||
|
chocolate_island_5_exit_1 = "Chocolate Island 5 - Normal Exit"
|
||||||
|
chocolate_island_5_dragon = "Chocolate Island 5 - Dragon Coins"
|
||||||
|
chocolate_ghost_house_exit_1 = "Choco-Ghost House - Normal Exit"
|
||||||
|
chocolate_secret_exit_1 = "Chocolate Secret - Normal Exit"
|
||||||
|
chocolate_fortress = "Chocolate Fortress - Normal Exit"
|
||||||
|
chocolate_reznor = "Chocolate Fortress Defeat"
|
||||||
|
chocolate_castle = "#6 Wendy's Castle - Normal Exit"
|
||||||
|
chocolate_koopaling = "#6 Wendy's Castle - Boss"
|
||||||
|
|
||||||
|
sunken_ghost_ship = "Sunken Ghost Ship - Normal Exit"
|
||||||
|
sunken_ghost_ship_dragon = "Sunken Ghost Ship - Dragon Coins"
|
||||||
|
|
||||||
|
valley_of_bowser_1_exit_1 = "Valley of Bowser 1 - Normal Exit"
|
||||||
|
valley_of_bowser_1_dragon = "Valley of Bowser 1 - Dragon Coins"
|
||||||
|
valley_of_bowser_2_exit_1 = "Valley of Bowser 2 - Normal Exit"
|
||||||
|
valley_of_bowser_2_exit_2 = "Valley of Bowser 2 - Secret Exit"
|
||||||
|
valley_of_bowser_2_dragon = "Valley of Bowser 2 - Dragon Coins"
|
||||||
|
valley_of_bowser_3_exit_1 = "Valley of Bowser 3 - Normal Exit"
|
||||||
|
valley_of_bowser_3_dragon = "Valley of Bowser 3 - Dragon Coins"
|
||||||
|
valley_of_bowser_4_exit_1 = "Valley of Bowser 4 - Normal Exit"
|
||||||
|
valley_of_bowser_4_exit_2 = "Valley of Bowser 4 - Secret Exit"
|
||||||
|
valley_ghost_house_exit_1 = "Valley Ghost House - Normal Exit"
|
||||||
|
valley_ghost_house_exit_2 = "Valley Ghost House - Secret Exit"
|
||||||
|
valley_ghost_house_dragon = "Valley Ghost House - Dragon Coins"
|
||||||
|
valley_fortress = "Valley Fortress - Normal Exit"
|
||||||
|
valley_reznor = "Valley Fortress - Boss"
|
||||||
|
valley_castle = "#7 Larry's Castle - Normal Exit"
|
||||||
|
valley_castle_dragon = "#7 Larry's Castle - Dragon Coins"
|
||||||
|
valley_koopaling = "#7 Larry's Castle - Boss"
|
||||||
|
|
||||||
|
front_door = "Front Door"
|
||||||
|
back_door = "Back Door"
|
||||||
|
bowser = "Bowser"
|
||||||
|
|
||||||
|
star_road_1_exit_1 = "Star Road 1 - Normal Exit"
|
||||||
|
star_road_1_exit_2 = "Star Road 1 - Secret Exit"
|
||||||
|
star_road_1_dragon = "Star Road 1 - Dragon Coins"
|
||||||
|
star_road_2_exit_1 = "Star Road 2 - Normal Exit"
|
||||||
|
star_road_2_exit_2 = "Star Road 2 - Secret Exit"
|
||||||
|
star_road_3_exit_1 = "Star Road 3 - Normal Exit"
|
||||||
|
star_road_3_exit_2 = "Star Road 3 - Secret Exit"
|
||||||
|
star_road_4_exit_1 = "Star Road 4 - Normal Exit"
|
||||||
|
star_road_4_exit_2 = "Star Road 4 - Secret Exit"
|
||||||
|
star_road_5_exit_1 = "Star Road 5 - Normal Exit"
|
||||||
|
star_road_5_exit_2 = "Star Road 5 - Secret Exit"
|
||||||
|
|
||||||
|
special_zone_1_exit_1 = "Gnarly - Normal Exit"
|
||||||
|
special_zone_1_dragon = "Gnarly - Dragon Coins"
|
||||||
|
special_zone_2_exit_1 = "Tubular - Normal Exit"
|
||||||
|
special_zone_2_dragon = "Tubular - Dragon Coins"
|
||||||
|
special_zone_3_exit_1 = "Way Cool - Normal Exit"
|
||||||
|
special_zone_3_dragon = "Way Cool - Dragon Coins"
|
||||||
|
special_zone_4_exit_1 = "Awesome - Normal Exit"
|
||||||
|
special_zone_4_dragon = "Awesome - Dragon Coins"
|
||||||
|
special_zone_5_exit_1 = "Groovy - Normal Exit"
|
||||||
|
special_zone_5_dragon = "Groovy - Dragon Coins"
|
||||||
|
special_zone_6_exit_1 = "Mondo - Normal Exit"
|
||||||
|
special_zone_6_dragon = "Mondo - Dragon Coins"
|
||||||
|
special_zone_7_exit_1 = "Outrageous - Normal Exit"
|
||||||
|
special_zone_7_dragon = "Outrageous - Dragon Coins"
|
||||||
|
special_zone_8_exit_1 = "Funky - Normal Exit"
|
||||||
|
special_zone_8_dragon = "Funky - Dragon Coins"
|
||||||
|
|
||||||
|
|
||||||
|
# Region Definitions
|
||||||
|
menu_region = "Menu"
|
||||||
|
|
||||||
|
yoshis_island_region = "Yoshi's Island"
|
||||||
|
donut_plains_region = "Donut Plains"
|
||||||
|
vanilla_dome_region = "Vanilla Dome"
|
||||||
|
twin_bridges_region = "Twin Bridges"
|
||||||
|
forest_of_illusion_region = "Forest of Illusion"
|
||||||
|
chocolate_island_region = "Chocolate Island"
|
||||||
|
valley_of_bowser_region = "Valley of Bowser"
|
||||||
|
star_road_region = "Star Road"
|
||||||
|
special_zone_region = "Special Zone"
|
||||||
|
|
||||||
|
yoshis_island_1_tile = "Yoshi's Island 1 - Tile"
|
||||||
|
yoshis_island_1_region = "Yoshi's Island 1"
|
||||||
|
yoshis_island_2_tile = "Yoshi's Island 2 - Tile"
|
||||||
|
yoshis_island_2_region = "Yoshi's Island 2"
|
||||||
|
yoshis_island_3_tile = "Yoshi's Island 3 - Tile"
|
||||||
|
yoshis_island_3_region = "Yoshi's Island 3"
|
||||||
|
yoshis_island_4_tile = "Yoshi's Island 4 - Tile"
|
||||||
|
yoshis_island_4_region = "Yoshi's Island 4"
|
||||||
|
yoshis_island_castle_tile = "#1 Iggy's Castle - Tile"
|
||||||
|
yoshis_island_castle_region = "#1 Iggy's Castle"
|
||||||
|
|
||||||
|
yellow_switch_palace_tile = "Yellow Switch Palace - Tile"
|
||||||
|
|
||||||
|
donut_plains_1_tile = "Donut Plains 1 - Tile"
|
||||||
|
donut_plains_1_region = "Donut Plains 1"
|
||||||
|
donut_plains_2_tile = "Donut Plains 2 - Tile"
|
||||||
|
donut_plains_2_region = "Donut Plains 2"
|
||||||
|
donut_plains_3_tile = "Donut Plains 3 - Tile"
|
||||||
|
donut_plains_3_region = "Donut Plains 3"
|
||||||
|
donut_plains_4_tile = "Donut Plains 4 - Tile"
|
||||||
|
donut_plains_4_region = "Donut Plains 4"
|
||||||
|
donut_secret_1_tile = "Donut Secret 1 - Tile"
|
||||||
|
donut_secret_1_region = "Donut Secret 1"
|
||||||
|
donut_secret_2_tile = "Donut Secret 2 - Tile"
|
||||||
|
donut_secret_2_region = "Donut Secret 2"
|
||||||
|
donut_ghost_house_tile = "Donut Ghost House - Tile"
|
||||||
|
donut_ghost_house_region = "Donut Ghost House"
|
||||||
|
donut_secret_house_tile = "Donut Secret House - Tile"
|
||||||
|
donut_secret_house_region = "Donut Secret House"
|
||||||
|
donut_plains_castle_tile = "#2 Morton's Castle - Tile"
|
||||||
|
donut_plains_castle_region = "#2 Morton's Castle"
|
||||||
|
donut_plains_top_secret = "Top Secret Area"
|
||||||
|
donut_plains_top_secret_tile = "Top Secret Area - Tile"
|
||||||
|
donut_plains_star_road = "Donut Plains - Star Road"
|
||||||
|
|
||||||
|
green_switch_palace_tile = "Green Switch Palace - Tile"
|
||||||
|
|
||||||
|
vanilla_dome_1_tile = "Vanilla Dome 1 - Tile"
|
||||||
|
vanilla_dome_1_region = "Vanilla Dome 1"
|
||||||
|
vanilla_dome_2_tile = "Vanilla Dome 2 - Tile"
|
||||||
|
vanilla_dome_2_region = "Vanilla Dome 2"
|
||||||
|
vanilla_dome_3_tile = "Vanilla Dome 3 - Tile"
|
||||||
|
vanilla_dome_3_region = "Vanilla Dome 3"
|
||||||
|
vanilla_dome_4_tile = "Vanilla Dome 4 - Tile"
|
||||||
|
vanilla_dome_4_region = "Vanilla Dome 4"
|
||||||
|
vanilla_secret_1_tile = "Vanilla Secret 1 - Tile"
|
||||||
|
vanilla_secret_1_region = "Vanilla Secret 1"
|
||||||
|
vanilla_secret_2_tile = "Vanilla Secret 2 - Tile"
|
||||||
|
vanilla_secret_2_region = "Vanilla Secret 2"
|
||||||
|
vanilla_secret_3_tile = "Vanilla Secret 3 - Tile"
|
||||||
|
vanilla_secret_3_region = "Vanilla Secret 3"
|
||||||
|
vanilla_ghost_house_tile = "Vanilla Ghost House - Tile"
|
||||||
|
vanilla_ghost_house_region = "Vanilla Ghost House"
|
||||||
|
vanilla_fortress_tile = "Vanilla Fortress - Tile"
|
||||||
|
vanilla_fortress_region = "Vanilla Fortress"
|
||||||
|
vanilla_dome_castle_tile = "#3 Lemmy's Castle - Tile"
|
||||||
|
vanilla_dome_castle_region = "#3 Lemmy's Castle"
|
||||||
|
vanilla_dome_star_road = "Vanilla Dome - Star Road"
|
||||||
|
|
||||||
|
red_switch_palace_tile = "Red Switch Palace - Tile"
|
||||||
|
|
||||||
|
butter_bridge_1_tile = "Butter Bridge 1 - Tile"
|
||||||
|
butter_bridge_1_region = "Butter Bridge 1"
|
||||||
|
butter_bridge_2_tile = "Butter Bridge 2 - Tile"
|
||||||
|
butter_bridge_2_region = "Butter Bridge 2"
|
||||||
|
cheese_bridge_tile = "Cheese Bridge - Tile"
|
||||||
|
cheese_bridge_region = "Cheese Bridge"
|
||||||
|
cookie_mountain_tile = "Cookie Mountain - Tile"
|
||||||
|
cookie_mountain_region = "Cookie Mountain"
|
||||||
|
soda_lake_tile = "Soda Lake - Tile"
|
||||||
|
soda_lake_region = "Soda Lake"
|
||||||
|
twin_bridges_castle_tile = "#4 Ludwig's Castle - Tile"
|
||||||
|
twin_bridges_castle_region = "#4 Ludwig's Castle"
|
||||||
|
twin_bridges_star_road = "Twin Bridges - Star Road"
|
||||||
|
|
||||||
|
forest_of_illusion_1_tile = "Forest of Illusion 1 - Tile"
|
||||||
|
forest_of_illusion_1_region = "Forest of Illusion 1"
|
||||||
|
forest_of_illusion_2_tile = "Forest of Illusion 2 - Tile"
|
||||||
|
forest_of_illusion_2_region = "Forest of Illusion 2"
|
||||||
|
forest_of_illusion_3_tile = "Forest of Illusion 3 - Tile"
|
||||||
|
forest_of_illusion_3_region = "Forest of Illusion 3"
|
||||||
|
forest_of_illusion_4_tile = "Forest of Illusion 4 - Tile"
|
||||||
|
forest_of_illusion_4_region = "Forest of Illusion 4"
|
||||||
|
forest_ghost_house_tile = "Forest Ghost House - Tile"
|
||||||
|
forest_ghost_house_region = "Forest Ghost House"
|
||||||
|
forest_secret_tile = "Forest Secret - Tile"
|
||||||
|
forest_secret_region = "Forest Secret"
|
||||||
|
forest_fortress_tile = "Forest Fortress - Tile"
|
||||||
|
forest_fortress_region = "Forest Fortress"
|
||||||
|
forest_castle_tile = "#5 Roy's Castle - Tile"
|
||||||
|
forest_castle_region = "#5 Roy's Castle"
|
||||||
|
forest_star_road = "Forest of Illusion - Star Road"
|
||||||
|
|
||||||
|
blue_switch_palace_tile = "Blue Switch Palace - Tile"
|
||||||
|
|
||||||
|
chocolate_island_1_tile = "Chocolate Island 1 - Tile"
|
||||||
|
chocolate_island_1_region = "Chocolate Island 1"
|
||||||
|
chocolate_island_2_tile = "Chocolate Island 2 - Tile"
|
||||||
|
chocolate_island_2_region = "Chocolate Island 2"
|
||||||
|
chocolate_island_3_tile = "Chocolate Island 3 - Tile"
|
||||||
|
chocolate_island_3_region = "Chocolate Island 3"
|
||||||
|
chocolate_island_4_tile = "Chocolate Island 4 - Tile"
|
||||||
|
chocolate_island_4_region = "Chocolate Island 4"
|
||||||
|
chocolate_island_5_tile = "Chocolate Island 5 - Tile"
|
||||||
|
chocolate_island_5_region = "Chocolate Island 5"
|
||||||
|
chocolate_ghost_house_tile = "Choco-Ghost House - Tile"
|
||||||
|
chocolate_ghost_house_region = "Choco-Ghost House"
|
||||||
|
chocolate_secret_tile = "Chocolate Secret - Tile"
|
||||||
|
chocolate_secret_region = "Chocolate Secret"
|
||||||
|
chocolate_fortress_tile = "Chocolate Fortress - Tile"
|
||||||
|
chocolate_fortress_region = "Chocolate Fortress"
|
||||||
|
chocolate_castle_tile = "#6 Wendy's Castle - Tile"
|
||||||
|
chocolate_castle_region = "#6 Wendy's Castle"
|
||||||
|
|
||||||
|
sunken_ghost_ship_tile = "Sunken Ghost Ship - Tile"
|
||||||
|
sunken_ghost_ship_region = "Sunken Ghost Ship"
|
||||||
|
|
||||||
|
valley_of_bowser_1_tile = "Valley of Bowser 1 - Tile"
|
||||||
|
valley_of_bowser_1_region = "Valley of Bowser 1"
|
||||||
|
valley_of_bowser_2_tile = "Valley of Bowser 2 - Tile"
|
||||||
|
valley_of_bowser_2_region = "Valley of Bowser 2"
|
||||||
|
valley_of_bowser_3_tile = "Valley of Bowser 3 - Tile"
|
||||||
|
valley_of_bowser_3_region = "Valley of Bowser 3"
|
||||||
|
valley_of_bowser_4_tile = "Valley of Bowser 4 - Tile"
|
||||||
|
valley_of_bowser_4_region = "Valley of Bowser 4"
|
||||||
|
valley_ghost_house_tile = "Valley Ghost House - Tile"
|
||||||
|
valley_ghost_house_region = "Valley Ghost House"
|
||||||
|
valley_fortress_tile = "Valley Fortress - Tile"
|
||||||
|
valley_fortress_region = "Valley Fortress"
|
||||||
|
valley_castle_tile = "#7 Larry's Castle - Tile"
|
||||||
|
valley_castle_region = "#7 Larry's Castle"
|
||||||
|
valley_star_road = "Valley of Bowser - Star Road"
|
||||||
|
|
||||||
|
front_door_tile = "Front Door - Tile"
|
||||||
|
back_door_tile = "Back Door - Tile"
|
||||||
|
bowser_region = "Bowser - Region"
|
||||||
|
|
||||||
|
star_road_donut = "Star Road - Donut Plains"
|
||||||
|
star_road_1_tile = "Star Road 1 - Tile"
|
||||||
|
star_road_1_region = "Star Road 1"
|
||||||
|
star_road_vanilla = "Star Road - Vanilla Dome"
|
||||||
|
star_road_2_tile = "Star Road 2 - Tile"
|
||||||
|
star_road_2_region = "Star Road 2"
|
||||||
|
star_road_twin_bridges = "Star Road - Twin Bridges"
|
||||||
|
star_road_3_tile = "Star Road 3 - Tile"
|
||||||
|
star_road_3_region = "Star Road 3"
|
||||||
|
star_road_forest = "Star Road - Forest of Illusion"
|
||||||
|
star_road_4_tile = "Star Road 4 - Tile"
|
||||||
|
star_road_4_region = "Star Road 4"
|
||||||
|
star_road_valley = "Star Road - Valley of Bowser"
|
||||||
|
star_road_5_tile = "Star Road 5 - Tile"
|
||||||
|
star_road_5_region = "Star Road 5"
|
||||||
|
star_road_special = "Star Road - Special Zone"
|
||||||
|
|
||||||
|
special_star_road = "Special Zone - Star Road"
|
||||||
|
special_zone_1_tile = "Gnarly - Tile"
|
||||||
|
special_zone_1_region = "Gnarly"
|
||||||
|
special_zone_2_tile = "Tubular - Tile"
|
||||||
|
special_zone_2_region = "Tubular"
|
||||||
|
special_zone_3_tile = "Way Cool - Tile"
|
||||||
|
special_zone_3_region = "Way Cool"
|
||||||
|
special_zone_4_tile = "Awesome - Tile"
|
||||||
|
special_zone_4_region = "Awesome"
|
||||||
|
special_zone_5_tile = "Groovy - Tile"
|
||||||
|
special_zone_5_region = "Groovy"
|
||||||
|
special_zone_6_tile = "Mondo - Tile"
|
||||||
|
special_zone_6_region = "Mondo"
|
||||||
|
special_zone_7_tile = "Outrageous - Tile"
|
||||||
|
special_zone_7_region = "Outrageous"
|
||||||
|
special_zone_8_tile = "Funky - Tile"
|
||||||
|
special_zone_8_region = "Funky"
|
||||||
|
special_complete = "Special Zone - Star Road - Complete"
|
|
@ -0,0 +1,140 @@
|
||||||
|
|
||||||
|
from BaseClasses import MultiWorld
|
||||||
|
|
||||||
|
import math
|
||||||
|
|
||||||
|
|
||||||
|
text_mapping = {
|
||||||
|
"A": 0x00, "B": 0x01, "C": 0x02, "D": 0x03, "E": 0x04, "F": 0x05, "G": 0x06, "H": 0x07, "I": 0x08, "J": 0x09,
|
||||||
|
"K": 0x0A, "L": 0x0B, "M": 0x0C, "N": 0x0D, "O": 0x0E, "P": 0x0F, "Q": 0x10, "R": 0x11, "S": 0x12, "T": 0x13,
|
||||||
|
"U": 0x14, "V": 0x15, "W": 0x16, "X": 0x17, "Y": 0x18, "Z": 0x19,
|
||||||
|
|
||||||
|
"!": 0x1A, ".": 0x1B, "-": 0x1C, ",": 0x1D, "?": 0x1E, " ": 0x1F,
|
||||||
|
|
||||||
|
"0": 0x22, "1": 0x23, "2": 0x24, "3": 0x25, "4": 0x26, "5": 0x27, "6": 0x28, "7": 0x29, "8": 0x2A, "9": 0x2B,
|
||||||
|
|
||||||
|
"a": 0x40, "b": 0x41, "c": 0x42, "d": 0x43, "e": 0x44, "f": 0x45, "g": 0x46, "h": 0x47, "i": 0x48, "j": 0x49,
|
||||||
|
"k": 0x4A, "l": 0x4B, "m": 0x4C, "n": 0x4D, "o": 0x4E, "p": 0x4F, "q": 0x50, "r": 0x51, "s": 0x52, "t": 0x53,
|
||||||
|
"u": 0x54, "v": 0x55, "w": 0x56, "x": 0x57, "y": 0x58, "z": 0x59,
|
||||||
|
|
||||||
|
"#": 0x5A, "(": 0x5B, ")": 0x5C, "'": 0x5D
|
||||||
|
}
|
||||||
|
|
||||||
|
title_text_mapping = {
|
||||||
|
"A": [0x0A, 0x38], "B": [0x0B, 0x38], "C": [0x0C, 0x38], "D": [0x0D, 0x38], "E": [0x0E, 0x38],
|
||||||
|
"F": [0x0F, 0x38], "G": [0x10, 0x38], "H": [0x11, 0x38], "I": [0x12, 0x38], "J": [0x13, 0x38],
|
||||||
|
"K": [0x14, 0x38], "L": [0x15, 0x38], "M": [0x16, 0x38], "N": [0x17, 0x38], "O": [0x18, 0x38],
|
||||||
|
"P": [0x19, 0x38], "Q": [0x1A, 0x38], "R": [0x1B, 0x38], "S": [0x1C, 0x38], "T": [0x1D, 0x38],
|
||||||
|
"U": [0x1E, 0x38], "V": [0x1F, 0x38], "W": [0x20, 0x38], "X": [0x21, 0x38], "Y": [0x22, 0x38],
|
||||||
|
"Z": [0x23, 0x38], " ": [0xFC, 0x38], ".": [0x24, 0x38],
|
||||||
|
"0": [0x00, 0x38], "1": [0x01, 0x38], "2": [0x02, 0x38], "3": [0x03, 0x38], "4": [0x04, 0x38],
|
||||||
|
"5": [0x05, 0x38], "6": [0x06, 0x38], "7": [0x07, 0x38], "8": [0x08, 0x38], "9": [0x09, 0x38],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def string_to_bytes(input_string):
|
||||||
|
out_array = bytearray()
|
||||||
|
for letter in input_string:
|
||||||
|
out_array.append(text_mapping[letter] if letter in text_mapping else text_mapping["."])
|
||||||
|
|
||||||
|
return out_array
|
||||||
|
|
||||||
|
|
||||||
|
def generate_text_box(input_string):
|
||||||
|
out_bytes = bytearray()
|
||||||
|
box_line_count = 0
|
||||||
|
box_line_chr_count = 0
|
||||||
|
for word in input_string.split():
|
||||||
|
if box_line_chr_count + len(word) > 18:
|
||||||
|
out_bytes[-1] += 0x80
|
||||||
|
box_line_count += 1
|
||||||
|
box_line_chr_count = 0
|
||||||
|
|
||||||
|
out_bytes.extend(string_to_bytes(word))
|
||||||
|
box_line_chr_count += len(word)
|
||||||
|
|
||||||
|
if box_line_chr_count < 18:
|
||||||
|
box_line_chr_count += 1
|
||||||
|
out_bytes.append(0x1F)
|
||||||
|
|
||||||
|
for i in range(box_line_count, 8):
|
||||||
|
out_bytes.append(0x9F)
|
||||||
|
|
||||||
|
return out_bytes
|
||||||
|
|
||||||
|
|
||||||
|
def generate_goal_text(world: MultiWorld, player: int):
|
||||||
|
out_array = bytearray()
|
||||||
|
if world.goal[player] == "yoshi_egg_hunt":
|
||||||
|
required_yoshi_eggs = max(math.floor(
|
||||||
|
world.number_of_yoshi_eggs[player].value * (world.percentage_of_yoshi_eggs[player].value / 100.0)), 1)
|
||||||
|
out_array += bytearray([0x9F, 0x9F])
|
||||||
|
out_array += string_to_bytes(" You must acquire")
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += string_to_bytes(f' {required_yoshi_eggs:02} Yoshi Eggs,')
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += string_to_bytes("then return here.")
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += bytearray([0x9F, 0x9F, 0x9F])
|
||||||
|
else:
|
||||||
|
bosses_required = world.bosses_required[player].value
|
||||||
|
out_array += bytearray([0x9F, 0x9F])
|
||||||
|
out_array += string_to_bytes(" You must defeat")
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += string_to_bytes(f' {bosses_required:02} Bosses,')
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += string_to_bytes("then defeat Bowser")
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += bytearray([0x9F, 0x9F, 0x9F])
|
||||||
|
|
||||||
|
return out_array
|
||||||
|
|
||||||
|
|
||||||
|
def generate_received_text(item_name: str, player_name: str):
|
||||||
|
out_array = bytearray()
|
||||||
|
|
||||||
|
item_name = item_name[:18]
|
||||||
|
player_name = player_name[:18]
|
||||||
|
|
||||||
|
item_buffer = max(0, math.floor((18 - len(item_name)) / 2))
|
||||||
|
player_buffer = max(0, math.floor((18 - len(player_name)) / 2))
|
||||||
|
|
||||||
|
out_array += bytearray([0x9F, 0x9F])
|
||||||
|
out_array += string_to_bytes(" Received")
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += bytearray([0x1F] * item_buffer)
|
||||||
|
out_array += string_to_bytes(item_name)
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += string_to_bytes(" from")
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += bytearray([0x1F] * player_buffer)
|
||||||
|
out_array += string_to_bytes(player_name)
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += bytearray([0x9F, 0x9F])
|
||||||
|
|
||||||
|
return out_array
|
||||||
|
|
||||||
|
|
||||||
|
def generate_sent_text(item_name: str, player_name: str):
|
||||||
|
out_array = bytearray()
|
||||||
|
|
||||||
|
item_name = item_name[:18]
|
||||||
|
player_name = player_name[:18]
|
||||||
|
|
||||||
|
item_buffer = max(0, math.floor((18 - len(item_name)) / 2))
|
||||||
|
player_buffer = max(0, math.floor((18 - len(player_name)) / 2))
|
||||||
|
|
||||||
|
out_array += bytearray([0x9F, 0x9F])
|
||||||
|
out_array += string_to_bytes(" Sent")
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += bytearray([0x1F] * item_buffer)
|
||||||
|
out_array += string_to_bytes(item_name)
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += string_to_bytes(" to")
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += bytearray([0x1F] * player_buffer)
|
||||||
|
out_array += string_to_bytes(player_name)
|
||||||
|
out_array[-1] += 0x80
|
||||||
|
out_array += bytearray([0x9F, 0x9F])
|
||||||
|
|
||||||
|
return out_array
|
|
@ -0,0 +1,236 @@
|
||||||
|
import typing
|
||||||
|
|
||||||
|
from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionList
|
||||||
|
|
||||||
|
|
||||||
|
class Goal(Choice):
|
||||||
|
"""
|
||||||
|
Determines the goal of the seed
|
||||||
|
Bowser: Defeat Koopalings, reach Bowser's Castle and defeat Bowser
|
||||||
|
Yoshi Egg Hunt: Find a certain number of Yoshi Eggs
|
||||||
|
"""
|
||||||
|
display_name = "Goal"
|
||||||
|
option_bowser = 0
|
||||||
|
option_yoshi_egg_hunt = 1
|
||||||
|
default = 0
|
||||||
|
|
||||||
|
|
||||||
|
class BossesRequired(Range):
|
||||||
|
"""
|
||||||
|
How many Bosses (Koopalings or Reznor) must be defeated in order to defeat Bowser
|
||||||
|
"""
|
||||||
|
display_name = "Bosses Required"
|
||||||
|
range_start = 0
|
||||||
|
range_end = 11
|
||||||
|
default = 7
|
||||||
|
|
||||||
|
|
||||||
|
class NumberOfYoshiEggs(Range):
|
||||||
|
"""
|
||||||
|
How many Yoshi Eggs are in the pool for Yoshi Egg Hunt
|
||||||
|
"""
|
||||||
|
display_name = "Total Number of Yoshi Eggs"
|
||||||
|
range_start = 1
|
||||||
|
range_end = 80
|
||||||
|
default = 50
|
||||||
|
|
||||||
|
|
||||||
|
class PercentageOfYoshiEggs(Range):
|
||||||
|
"""
|
||||||
|
What Percentage of Yoshi Eggs are required to finish Yoshi Egg Hunt
|
||||||
|
"""
|
||||||
|
display_name = "Required Percentage of Yoshi Eggs"
|
||||||
|
range_start = 1
|
||||||
|
range_end = 100
|
||||||
|
default = 100
|
||||||
|
|
||||||
|
|
||||||
|
class DragonCoinChecks(Toggle):
|
||||||
|
"""
|
||||||
|
Whether collecting 5 Dragon Coins in each level will grant a check
|
||||||
|
"""
|
||||||
|
display_name = "Dragon Coin Checks"
|
||||||
|
|
||||||
|
|
||||||
|
class BowserCastleDoors(Choice):
|
||||||
|
"""
|
||||||
|
How the doors of Bowser's Castle behave
|
||||||
|
Vanilla: Front and Back Doors behave as vanilla
|
||||||
|
Fast: Both doors behave as the Back Door
|
||||||
|
Slow: Both doors behave as the Front Door
|
||||||
|
"Front Door" requires beating all 8 Rooms
|
||||||
|
"Back Door" only requires going through the dark hallway to Bowser
|
||||||
|
"""
|
||||||
|
display_name = "Bowser Castle Doors"
|
||||||
|
option_vanilla = 0
|
||||||
|
option_fast = 1
|
||||||
|
option_slow = 2
|
||||||
|
default = 0
|
||||||
|
|
||||||
|
|
||||||
|
class LevelShuffle(Toggle):
|
||||||
|
"""
|
||||||
|
Whether levels are shuffled
|
||||||
|
"""
|
||||||
|
display_name = "Level Shuffle"
|
||||||
|
|
||||||
|
|
||||||
|
class SwapDonutGhostHouseExits(Toggle):
|
||||||
|
"""
|
||||||
|
If enabled, this option will swap which overworld direction the two exits of the level at the Donut Ghost House overworld tile go:
|
||||||
|
False: Normal Exit goes up, Secret Exit goes right.
|
||||||
|
True: Normal Exit goes right, Secret Exit goes up.
|
||||||
|
"""
|
||||||
|
display_name = "Swap Donut GH Exits"
|
||||||
|
|
||||||
|
|
||||||
|
class DisplaySentItemPopups(Choice):
|
||||||
|
"""
|
||||||
|
What messages to display in-game for items sent
|
||||||
|
"""
|
||||||
|
display_name = "Display Sent Item Popups"
|
||||||
|
option_none = 0
|
||||||
|
option_all = 1
|
||||||
|
default = 1
|
||||||
|
|
||||||
|
|
||||||
|
class DisplayReceivedItemPopups(Choice):
|
||||||
|
"""
|
||||||
|
What messages to display in-game for items received
|
||||||
|
"""
|
||||||
|
display_name = "Display Received Item Popups"
|
||||||
|
option_none = 0
|
||||||
|
option_all = 1
|
||||||
|
option_progression = 2
|
||||||
|
default = 2
|
||||||
|
|
||||||
|
|
||||||
|
class TrapFillPercentage(Range):
|
||||||
|
"""
|
||||||
|
Replace a percentage of junk items in the item pool with random traps
|
||||||
|
"""
|
||||||
|
display_name = "Trap Fill Percentage"
|
||||||
|
range_start = 0
|
||||||
|
range_end = 100
|
||||||
|
default = 0
|
||||||
|
|
||||||
|
|
||||||
|
class BaseTrapWeight(Choice):
|
||||||
|
"""
|
||||||
|
Base Class for Trap Weights
|
||||||
|
"""
|
||||||
|
option_none = 0
|
||||||
|
option_low = 1
|
||||||
|
option_medium = 2
|
||||||
|
option_high = 4
|
||||||
|
default = 2
|
||||||
|
|
||||||
|
|
||||||
|
class IceTrapWeight(BaseTrapWeight):
|
||||||
|
"""
|
||||||
|
Likelihood of a receiving a trap which causes the level to become slippery
|
||||||
|
"""
|
||||||
|
display_name = "Ice Trap Weight"
|
||||||
|
|
||||||
|
|
||||||
|
class StunTrapWeight(BaseTrapWeight):
|
||||||
|
"""
|
||||||
|
Likelihood of a receiving a trap which briefly stuns Mario
|
||||||
|
"""
|
||||||
|
display_name = "Stun Trap Weight"
|
||||||
|
|
||||||
|
|
||||||
|
class LiteratureTrapWeight(BaseTrapWeight):
|
||||||
|
"""
|
||||||
|
Likelihood of a receiving a trap which causes the player to read literature
|
||||||
|
"""
|
||||||
|
display_name = "Literature Trap Weight"
|
||||||
|
|
||||||
|
|
||||||
|
class Autosave(DefaultOnToggle):
|
||||||
|
"""
|
||||||
|
Whether a save prompt will appear after every level
|
||||||
|
"""
|
||||||
|
display_name = "Autosave"
|
||||||
|
|
||||||
|
|
||||||
|
class MusicShuffle(Choice):
|
||||||
|
"""
|
||||||
|
Music shuffle type
|
||||||
|
None: No Music is shuffled
|
||||||
|
Consistent: Each music track is consistently shuffled throughout the game
|
||||||
|
Full: Each individual level has a random music track
|
||||||
|
Singularity: The entire game uses one song for overworld and one song for levels
|
||||||
|
"""
|
||||||
|
display_name = "Music Shuffle"
|
||||||
|
option_none = 0
|
||||||
|
option_consistent = 1
|
||||||
|
option_full = 2
|
||||||
|
option_singularity = 3
|
||||||
|
default = 0
|
||||||
|
|
||||||
|
|
||||||
|
class MarioPalette(Choice):
|
||||||
|
"""
|
||||||
|
Mario palette color
|
||||||
|
"""
|
||||||
|
display_name = "Mario Palette"
|
||||||
|
option_mario = 0
|
||||||
|
option_luigi = 1
|
||||||
|
option_wario = 2
|
||||||
|
option_waluigi = 3
|
||||||
|
option_geno = 4
|
||||||
|
option_princess = 5
|
||||||
|
option_dark = 6
|
||||||
|
option_sponge = 7
|
||||||
|
default = 0
|
||||||
|
|
||||||
|
|
||||||
|
class ForegroundPaletteShuffle(Toggle):
|
||||||
|
"""
|
||||||
|
Whether to shuffle level foreground palettes
|
||||||
|
"""
|
||||||
|
display_name = "Foreground Palette Shuffle"
|
||||||
|
|
||||||
|
|
||||||
|
class BackgroundPaletteShuffle(Toggle):
|
||||||
|
"""
|
||||||
|
Whether to shuffle level background palettes
|
||||||
|
"""
|
||||||
|
display_name = "Background Palette Shuffle"
|
||||||
|
|
||||||
|
|
||||||
|
class StartingLifeCount(Range):
|
||||||
|
"""
|
||||||
|
How many extra lives to start the game with
|
||||||
|
"""
|
||||||
|
display_name = "Starting Life Count"
|
||||||
|
range_start = 1
|
||||||
|
range_end = 99
|
||||||
|
default = 5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
smw_options: typing.Dict[str, type(Option)] = {
|
||||||
|
"death_link": DeathLink,
|
||||||
|
"goal": Goal,
|
||||||
|
"bosses_required": BossesRequired,
|
||||||
|
"number_of_yoshi_eggs": NumberOfYoshiEggs,
|
||||||
|
"percentage_of_yoshi_eggs": PercentageOfYoshiEggs,
|
||||||
|
"dragon_coin_checks": DragonCoinChecks,
|
||||||
|
"bowser_castle_doors": BowserCastleDoors,
|
||||||
|
"level_shuffle": LevelShuffle,
|
||||||
|
"swap_donut_gh_exits": SwapDonutGhostHouseExits,
|
||||||
|
#"display_sent_item_popups": DisplaySentItemPopups,
|
||||||
|
"display_received_item_popups": DisplayReceivedItemPopups,
|
||||||
|
"trap_fill_percentage": TrapFillPercentage,
|
||||||
|
"ice_trap_weight": IceTrapWeight,
|
||||||
|
"stun_trap_weight": StunTrapWeight,
|
||||||
|
"literature_trap_weight": LiteratureTrapWeight,
|
||||||
|
"autosave": Autosave,
|
||||||
|
"music_shuffle": MusicShuffle,
|
||||||
|
"mario_palette": MarioPalette,
|
||||||
|
"foreground_palette_shuffle": ForegroundPaletteShuffle,
|
||||||
|
"background_palette_shuffle": BackgroundPaletteShuffle,
|
||||||
|
"starting_life_count": StartingLifeCount,
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,846 @@
|
||||||
|
import Utils
|
||||||
|
from Patch import read_rom, APDeltaPatch
|
||||||
|
from .Aesthetics import generate_shuffled_header_data
|
||||||
|
from .Locations import lookup_id_to_name, all_locations
|
||||||
|
from .Levels import level_info_dict, full_level_list, submap_level_list, location_id_to_level_id
|
||||||
|
from .Names.TextBox import generate_goal_text, title_text_mapping, generate_text_box
|
||||||
|
|
||||||
|
USHASH = 'cdd3c8c37322978ca8669b34bc89c804'
|
||||||
|
ROM_PLAYER_LIMIT = 65535
|
||||||
|
|
||||||
|
import hashlib
|
||||||
|
import os
|
||||||
|
import math
|
||||||
|
|
||||||
|
|
||||||
|
ability_rom_data = {
|
||||||
|
0xBC0003: [[0x1F2C, 0x7]], # Run 0x80
|
||||||
|
0xBC0004: [[0x1F2C, 0x6]], # Carry 0x40
|
||||||
|
0xBC0005: [[0x1F2C, 0x2]], # Swim 0x04
|
||||||
|
0xBC0006: [[0x1F2C, 0x3]], # Spin Jump 0x08
|
||||||
|
0xBC0007: [[0x1F2C, 0x5]], # Climb 0x20
|
||||||
|
0xBC0008: [[0x1F2C, 0x1]], # Yoshi 0x02
|
||||||
|
0xBC0009: [[0x1F2C, 0x4]], # P-Switch 0x10
|
||||||
|
#0xBC000A: [[]]
|
||||||
|
0xBC000B: [[0x1F2D, 0x3]], # P-Balloon 0x08
|
||||||
|
0xBC000D: [[0x1F2D, 0x4]], # Super Star 0x10
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
item_rom_data = {
|
||||||
|
0xBC0001: [0x18E4, 0x1], # 1-Up Mushroom
|
||||||
|
|
||||||
|
0xBC0002: [0x1F24, 0x1, 0x1F], # Yoshi Egg
|
||||||
|
0xBC0012: [0x1F26, 0x1, 0x09], # Boss Token
|
||||||
|
|
||||||
|
0xBC000E: [0x1F28, 0x1, 0x1C], # Yellow Switch Palace
|
||||||
|
0xBC000F: [0x1F27, 0x1, 0x1C], # Green Switch Palace
|
||||||
|
0xBC0010: [0x1F2A, 0x1, 0x1C], # Red Switch Palace
|
||||||
|
0xBC0011: [0x1F29, 0x1, 0x1C], # Blue Switch Palace
|
||||||
|
|
||||||
|
0xBC0013: [0x0086, 0x1, 0x0E], # Ice Trap
|
||||||
|
0xBC0014: [0x18BD, 0x7F, 0x18], # Stun Trap
|
||||||
|
}
|
||||||
|
|
||||||
|
music_rom_data = [
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
level_music_ids = [
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class SMWDeltaPatch(APDeltaPatch):
|
||||||
|
hash = USHASH
|
||||||
|
game = "Super Mario World"
|
||||||
|
patch_file_ending = ".apsmw"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_source_data(cls) -> bytes:
|
||||||
|
return get_base_rom_bytes()
|
||||||
|
|
||||||
|
|
||||||
|
class LocalRom:
|
||||||
|
|
||||||
|
def __init__(self, file, patch=True, vanillaRom=None, name=None, hash=None):
|
||||||
|
self.name = name
|
||||||
|
self.hash = hash
|
||||||
|
self.orig_buffer = None
|
||||||
|
|
||||||
|
with open(file, 'rb') as stream:
|
||||||
|
self.buffer = read_rom(stream)
|
||||||
|
|
||||||
|
def read_bit(self, address: int, bit_number: int) -> bool:
|
||||||
|
bitflag = (1 << bit_number)
|
||||||
|
return ((self.buffer[address] & bitflag) != 0)
|
||||||
|
|
||||||
|
def read_byte(self, address: int) -> int:
|
||||||
|
return self.buffer[address]
|
||||||
|
|
||||||
|
def read_bytes(self, startaddress: int, length: int) -> bytes:
|
||||||
|
return self.buffer[startaddress:startaddress + length]
|
||||||
|
|
||||||
|
def write_byte(self, address: int, value: int):
|
||||||
|
self.buffer[address] = value
|
||||||
|
|
||||||
|
def write_bytes(self, startaddress: int, values):
|
||||||
|
self.buffer[startaddress:startaddress + len(values)] = values
|
||||||
|
|
||||||
|
def write_to_file(self, file):
|
||||||
|
with open(file, 'wb') as outfile:
|
||||||
|
outfile.write(self.buffer)
|
||||||
|
|
||||||
|
def read_from_file(self, file):
|
||||||
|
with open(file, 'rb') as stream:
|
||||||
|
self.buffer = bytearray(stream.read())
|
||||||
|
|
||||||
|
|
||||||
|
def handle_ability_code(rom):
|
||||||
|
# Lock Abilities
|
||||||
|
|
||||||
|
#rom.write_byte(0xC581, 0x01) # No Stars
|
||||||
|
#rom.write_byte(0x62E6, 0x01) # No Star Music
|
||||||
|
#rom.write_byte(0xC300, 0x01) # No P-Balloons
|
||||||
|
#rom.write_byte(0xC305, 0x01) # No P-Balloons
|
||||||
|
|
||||||
|
# Run
|
||||||
|
rom.write_bytes(0x5977, bytearray([0x22, 0x10, 0xBA, 0x03])) # JSL $03BA10
|
||||||
|
rom.write_bytes(0x597B, bytearray([0xEA] * 0x04))
|
||||||
|
|
||||||
|
RUN_SUB_ADDR = 0x01BA10
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x00, bytearray([0xDA])) # PHX
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x01, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x02, bytearray([0x90, 0x03])) # BCC +0x03
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x04, bytearray([0xC8])) # INY
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x05, bytearray([0xA9, 0x70])) # LDA #70
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x07, bytearray([0xAA])) # TAX
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x08, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x0B, bytearray([0x89, 0x80])) # BIT #80
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x0D, bytearray([0xF0, 0x04])) # BEQ +0x04
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x0F, bytearray([0x8A])) # TXA
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x10, bytearray([0x8D, 0xE4, 0x13])) # STA $13E4
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x13, bytearray([0x8A])) # TXA
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x14, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x15, bytearray([0xFA])) # PLX
|
||||||
|
rom.write_bytes(RUN_SUB_ADDR + 0x16, bytearray([0x6B])) # RTL
|
||||||
|
# End Run
|
||||||
|
|
||||||
|
# Purple Block Carry
|
||||||
|
rom.write_bytes(0x726F, bytearray([0x22, 0x28, 0xBA, 0x03])) # JSL $03BA28
|
||||||
|
rom.write_bytes(0x7273, bytearray([0xEA] * 0x02))
|
||||||
|
|
||||||
|
PURPLE_BLOCK_CARRY_SUB_ADDR = 0x01BA28
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x04, bytearray([0x89, 0x40])) # BIT #40
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x06, bytearray([0xF0, 0x09])) # BEQ +0x09
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x09, bytearray([0xAD, 0x8F, 0x14])) # LDA $148F
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x0C, bytearray([0x0D, 0x7A, 0x18])) # ORA $187A
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x0F, bytearray([0x80, 0x03])) # BRA +0x03
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x11, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x12, bytearray([0xA9, 0x01])) # LDA #01
|
||||||
|
rom.write_bytes(PURPLE_BLOCK_CARRY_SUB_ADDR + 0x14, bytearray([0x6B])) # RTL
|
||||||
|
# End Purple Block Carry
|
||||||
|
|
||||||
|
# Springboard Carry
|
||||||
|
rom.write_bytes(0xE6DA, bytearray([0x22, 0x40, 0xBA, 0x03])) # JSL $03BA40
|
||||||
|
rom.write_bytes(0xE6DE, bytearray([0xEA] * 0x04))
|
||||||
|
|
||||||
|
SPRINGBOARD_CARRY_SUB_ADDR = 0x01BA40
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x00, bytearray([0x48])) # PHA
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x01, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x02, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x05, bytearray([0x89, 0x40])) # BIT #40
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x07, bytearray([0xF0, 0x08])) # BEQ +0x08
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x09, bytearray([0xA9, 0x0B])) # LDA #0B
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x0B, bytearray([0x9D, 0xC8, 0x14])) # STA $14C8, X
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x0E, bytearray([0x9E, 0x02, 0x16])) # STZ $1602, X
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x11, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x12, bytearray([0x68])) # PLA
|
||||||
|
rom.write_bytes(SPRINGBOARD_CARRY_SUB_ADDR + 0x13, bytearray([0x6B])) # RTL
|
||||||
|
# End Springboard Carry
|
||||||
|
|
||||||
|
# Shell Carry
|
||||||
|
rom.write_bytes(0xAA66, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(0xAA69, bytearray([0x89, 0x40])) # BIT #40
|
||||||
|
rom.write_bytes(0xAA6B, bytearray([0xF0, 0x07])) # BEQ +0x07
|
||||||
|
rom.write_bytes(0xAA6D, bytearray([0x22, 0x60, 0xBA, 0x03])) # JSL $03BA60
|
||||||
|
rom.write_bytes(0xAA71, bytearray([0xEA] * 0x02))
|
||||||
|
|
||||||
|
SHELL_CARRY_SUB_ADDR = 0x01BA60
|
||||||
|
rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x01, bytearray([0xA9, 0x0B])) # LDA #0B
|
||||||
|
rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x03, bytearray([0x9D, 0xC8, 0x14])) # STA $14C8, X
|
||||||
|
rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x06, bytearray([0xEE, 0x70, 0x14])) # INC $1470
|
||||||
|
rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x09, bytearray([0xA9, 0x0B])) # LDA #08
|
||||||
|
rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x0B, bytearray([0x8D, 0x98, 0x14])) # STA $1498
|
||||||
|
rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x0E, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SHELL_CARRY_SUB_ADDR + 0x0F, bytearray([0x6B])) # RTL
|
||||||
|
# End Shell Carry
|
||||||
|
|
||||||
|
# Yoshi Carry
|
||||||
|
rom.write_bytes(0xF309, bytearray([0x22, 0x70, 0xBA, 0x03])) # JSL $03BA70
|
||||||
|
rom.write_bytes(0xF30D, bytearray([0xEA] * 0x06))
|
||||||
|
|
||||||
|
YOSHI_CARRY_SUB_ADDR = 0x01BA70
|
||||||
|
rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x04, bytearray([0x89, 0x40])) # BIT #40
|
||||||
|
rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x06, bytearray([0xF0, 0x0A])) # BEQ +0x0A
|
||||||
|
rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x08, bytearray([0xA9, 0x12])) # LDA #12
|
||||||
|
rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x0A, bytearray([0x8D, 0xA3, 0x14])) # STA $14A3
|
||||||
|
rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x0D, bytearray([0xA9, 0x21])) # LDA #21
|
||||||
|
rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x0F, bytearray([0x8D, 0xFC, 0x1D])) # STA $1DFC
|
||||||
|
rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x12, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(YOSHI_CARRY_SUB_ADDR + 0x13, bytearray([0x6B])) # RTL
|
||||||
|
# End Yoshi Carry
|
||||||
|
|
||||||
|
# Climb
|
||||||
|
rom.write_bytes(0x4D72, bytearray([0x5C, 0x88, 0xBA, 0x03])) # JML $03BA88
|
||||||
|
rom.write_bytes(0x4D76, bytearray([0xEA] * 0x03))
|
||||||
|
|
||||||
|
CLIMB_SUB_ADDR = 0x01BA88
|
||||||
|
rom.write_bytes(CLIMB_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(CLIMB_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(CLIMB_SUB_ADDR + 0x04, bytearray([0x89, 0x20])) # BIT #20
|
||||||
|
rom.write_bytes(CLIMB_SUB_ADDR + 0x06, bytearray([0xF0, 0x09])) # BEQ +0x09
|
||||||
|
rom.write_bytes(CLIMB_SUB_ADDR + 0x08, bytearray([0xA5, 0x8B])) # LDA $8B
|
||||||
|
rom.write_bytes(CLIMB_SUB_ADDR + 0x0A, bytearray([0x85, 0x74])) # STA $74
|
||||||
|
rom.write_bytes(CLIMB_SUB_ADDR + 0x0C, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(CLIMB_SUB_ADDR + 0x0D, bytearray([0x5C, 0x17, 0xDB, 0x00])) # JML $00DB17
|
||||||
|
rom.write_bytes(CLIMB_SUB_ADDR + 0x11, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(CLIMB_SUB_ADDR + 0x12, bytearray([0x5C, 0x76, 0xCD, 0x00])) # JML $00CD76
|
||||||
|
# End Climb
|
||||||
|
|
||||||
|
# P-Switch
|
||||||
|
rom.write_bytes(0xAB1A, bytearray([0x22, 0xA0, 0xBA, 0x03])) # JSL $03BAA0
|
||||||
|
rom.write_bytes(0xAB1E, bytearray([0xEA] * 0x01))
|
||||||
|
|
||||||
|
P_SWITCH_SUB_ADDR = 0x01BAA0
|
||||||
|
rom.write_bytes(P_SWITCH_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(P_SWITCH_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(P_SWITCH_SUB_ADDR + 0x04, bytearray([0x89, 0x10])) # BIT #10
|
||||||
|
rom.write_bytes(P_SWITCH_SUB_ADDR + 0x06, bytearray([0xF0, 0x04])) # BEQ +0x04
|
||||||
|
rom.write_bytes(P_SWITCH_SUB_ADDR + 0x08, bytearray([0xA9, 0xB0])) # LDA #B0
|
||||||
|
rom.write_bytes(P_SWITCH_SUB_ADDR + 0x0A, bytearray([0x80, 0x02])) # BRA +0x02
|
||||||
|
rom.write_bytes(P_SWITCH_SUB_ADDR + 0x0C, bytearray([0xA9, 0x01])) # LDA #01
|
||||||
|
rom.write_bytes(P_SWITCH_SUB_ADDR + 0x0E, bytearray([0x99, 0xAD, 0x14])) # STA $14AD
|
||||||
|
rom.write_bytes(P_SWITCH_SUB_ADDR + 0x11, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(P_SWITCH_SUB_ADDR + 0x12, bytearray([0x6B])) # RTL
|
||||||
|
# End P-Switch
|
||||||
|
|
||||||
|
# Spin Jump
|
||||||
|
rom.write_bytes(0x5645, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(0x5648, bytearray([0x89, 0x08])) # BIT #08
|
||||||
|
rom.write_bytes(0x564A, bytearray([0xF0, 0x12])) # BEQ +0x12
|
||||||
|
rom.write_bytes(0x564C, bytearray([0x22, 0xB8, 0xBA, 0x03])) # JSL $03BAB8
|
||||||
|
|
||||||
|
SPIN_JUMP_SUB_ADDR = 0x01BAB8
|
||||||
|
rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x01, bytearray([0x1A])) # INC
|
||||||
|
rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x02, bytearray([0x8D, 0x0D, 0x14])) # STA $140D
|
||||||
|
rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x05, bytearray([0xA9, 0x04])) # LDA #04
|
||||||
|
rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x07, bytearray([0x8D, 0xFC, 0x1D])) # STA $1DFC
|
||||||
|
rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x0A, bytearray([0xA4, 0x76])) # LDY #76
|
||||||
|
rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x0C, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SPIN_JUMP_SUB_ADDR + 0x0D, bytearray([0x6B])) # RTL
|
||||||
|
# End Spin Jump
|
||||||
|
|
||||||
|
# Spin Jump from Water
|
||||||
|
rom.write_bytes(0x6A89, bytearray([0x22, 0xF8, 0xBB, 0x03])) # JSL $03BBF8
|
||||||
|
rom.write_bytes(0x6A8D, bytearray([0xEA] * 0x05))
|
||||||
|
|
||||||
|
SPIN_JUMP_WATER_SUB_ADDR = 0x01BBF8
|
||||||
|
rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x04, bytearray([0x89, 0x08])) # BIT #08
|
||||||
|
rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x06, bytearray([0xF0, 0x09])) # BEQ +0x09
|
||||||
|
rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x08, bytearray([0x1A])) # INC
|
||||||
|
rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x09, bytearray([0x8D, 0x0D, 0x14])) # STA $140D
|
||||||
|
rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x0C, bytearray([0xA9, 0x04])) # LDA #04
|
||||||
|
rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x0E, bytearray([0x8D, 0xFC, 0x1D])) # STA $1DFC
|
||||||
|
rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x11, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SPIN_JUMP_WATER_SUB_ADDR + 0x12, bytearray([0x6B])) # RTL
|
||||||
|
# End Spin Jump from Water
|
||||||
|
|
||||||
|
# Spin Jump from Springboard
|
||||||
|
rom.write_bytes(0xE693, bytearray([0x22, 0x0C, 0xBC, 0x03])) # JSL $03BC0C
|
||||||
|
rom.write_bytes(0xE697, bytearray([0xEA] * 0x01))
|
||||||
|
|
||||||
|
SPIN_JUMP_SPRING_SUB_ADDR = 0x01BC0C
|
||||||
|
rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x04, bytearray([0x89, 0x08])) # BIT #08
|
||||||
|
rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x06, bytearray([0xF0, 0x05])) # BEQ +0x05
|
||||||
|
rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x08, bytearray([0xA9, 0x01])) # LDA #01
|
||||||
|
rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x0A, bytearray([0x8D, 0x0D, 0x14])) # STA $140D
|
||||||
|
rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x0D, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SPIN_JUMP_SPRING_SUB_ADDR + 0x0E, bytearray([0x6B])) # RTL
|
||||||
|
# End Spin Jump from Springboard
|
||||||
|
|
||||||
|
# Swim
|
||||||
|
rom.write_bytes(0x5A25, bytearray([0x22, 0xC8, 0xBA, 0x03])) # JSL $03BAC8
|
||||||
|
rom.write_bytes(0x5A29, bytearray([0xEA] * 0x04))
|
||||||
|
|
||||||
|
SWIM_SUB_ADDR = 0x01BAC8
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x00, bytearray([0x48])) # PHA
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x01, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x02, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x05, bytearray([0x89, 0x04])) # BIT #04
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x07, bytearray([0xF0, 0x0C])) # BEQ +0x0C
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x09, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x0A, bytearray([0x68])) # PLA
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x0B, bytearray([0xDD, 0x84, 0xD9])) # CMP $D489, X
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x0E, bytearray([0xB0, 0x03])) # BCS +0x03
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x10, bytearray([0xBD, 0x84, 0xD9])) # LDA $D489, X
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x13, bytearray([0x80, 0x0A])) # BRA +0x0A
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x15, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x16, bytearray([0x68])) # PLA
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x17, bytearray([0xDD, 0xBE, 0xDE])) # CMP $DEBE, X
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x1A, bytearray([0xB0, 0x03])) # BCS +0x03
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x1C, bytearray([0xBD, 0xBE, 0xDE])) # LDA $DEBE, X
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x1F, bytearray([0x6B])) # RTL
|
||||||
|
# End Swim
|
||||||
|
|
||||||
|
# Item Swim
|
||||||
|
rom.write_bytes(0x59D7, bytearray([0x22, 0xE8, 0xBA, 0x03])) # JSL $03BAE8
|
||||||
|
rom.write_bytes(0x59DB, bytearray([0xEA] * 0x02))
|
||||||
|
|
||||||
|
SWIM_SUB_ADDR = 0x01BAE8
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x00, bytearray([0x48])) # PHA
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x01, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x02, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x05, bytearray([0x89, 0x04])) # BIT #04
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x07, bytearray([0xF0, 0x0A])) # BEQ +0x0A
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x09, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x0A, bytearray([0x68])) # PLA
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x0B, bytearray([0xC9, 0xF0])) # CMP #F0
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x0D, bytearray([0xB0, 0x02])) # BCS +0x02
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x0F, bytearray([0xA9, 0xF0])) # LDA #F0
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x11, bytearray([0x80, 0x08])) # BRA +0x08
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x13, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x14, bytearray([0x68])) # PLA
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x15, bytearray([0xC9, 0xFF])) # CMP #FF
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x17, bytearray([0xB0, 0x02])) # BCS +0x02
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x19, bytearray([0xA9, 0x00])) # LDA #00
|
||||||
|
rom.write_bytes(SWIM_SUB_ADDR + 0x1B, bytearray([0x6B])) # RTL
|
||||||
|
# End Item Swim
|
||||||
|
|
||||||
|
# Yoshi
|
||||||
|
rom.write_bytes(0x109FB, bytearray([0x22, 0x08, 0xBB, 0x03])) # JSL $03BB08
|
||||||
|
rom.write_bytes(0x109FF, bytearray([0xEA] * 0x02))
|
||||||
|
|
||||||
|
YOSHI_SUB_ADDR = 0x01BB08
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x01, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x04, bytearray([0x89, 0x02])) # BIT #02
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x06, bytearray([0xF0, 0x06])) # BEQ +0x06
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x09, bytearray([0xB9, 0xA1, 0x88])) # LDA $88A1, Y
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x0C, bytearray([0x80, 0x04])) # BRA +0x04
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x0E, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x0F, bytearray([0xB9, 0xA2, 0x88])) # LDA $88A2, Y
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x12, bytearray([0x9D, 0x1C, 0x15])) # STA $151C, X
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x15, bytearray([0x6B])) # RTL
|
||||||
|
# End Yoshi
|
||||||
|
|
||||||
|
# Baby Yoshi
|
||||||
|
rom.write_bytes(0xA2B8, bytearray([0x22, 0x20, 0xBB, 0x03])) # JSL $03BB20
|
||||||
|
rom.write_bytes(0xA2BC, bytearray([0xEA] * 0x01))
|
||||||
|
|
||||||
|
YOSHI_SUB_ADDR = 0x01BB20
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x01, bytearray([0x9C, 0x1E, 0x14])) # STZ $141E
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x04, bytearray([0xAD, 0x2C, 0x1F])) # LDA $1F2C
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x07, bytearray([0x89, 0x02])) # BIT #02
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x09, bytearray([0xF0, 0x05])) # BEQ +0x05
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x0B, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x0C, bytearray([0xA9, 0x35])) # LDA #35
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x0E, bytearray([0x80, 0x03])) # BRA +0x03
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x10, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x11, bytearray([0xA9, 0x70])) # LDA #70
|
||||||
|
rom.write_bytes(YOSHI_SUB_ADDR + 0x13, bytearray([0x6B])) # RTL
|
||||||
|
# End Baby Yoshi
|
||||||
|
|
||||||
|
# Midway Gate
|
||||||
|
rom.write_bytes(0x72E4, bytearray([0x22, 0x38, 0xBB, 0x03])) # JSL $03BB38
|
||||||
|
|
||||||
|
MIDWAY_GATE_SUB_ADDR = 0x01BB38
|
||||||
|
rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
|
||||||
|
rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x04, bytearray([0x89, 0x01])) # BIT #01
|
||||||
|
rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x06, bytearray([0xF0, 0x07])) # BEQ +0x07
|
||||||
|
rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x09, bytearray([0xA9, 0x01])) # LDA #01
|
||||||
|
rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x0B, bytearray([0x85, 0x19])) # STA $19
|
||||||
|
rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x0D, bytearray([0x80, 0x01])) # BRA +0x01
|
||||||
|
rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x0F, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(MIDWAY_GATE_SUB_ADDR + 0x10, bytearray([0x6B])) # RTL
|
||||||
|
# End Midway Gate
|
||||||
|
|
||||||
|
# Mushroom
|
||||||
|
rom.write_bytes(0x5156, bytearray([0x22, 0x50, 0xBB, 0x03])) # JSL $03BB50
|
||||||
|
rom.write_bytes(0x515A, bytearray([0xEA] * 0x04))
|
||||||
|
|
||||||
|
MUSHROOM_SUB_ADDR = 0x01BB50
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x04, bytearray([0x89, 0x01])) # BIT #01
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x06, bytearray([0xF0, 0x05])) # BEQ +0x05
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x09, bytearray([0xE6, 0x19])) # INC $19
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x0B, bytearray([0x80, 0x01])) # BRA +0x01
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x0D, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x0E, bytearray([0xA9, 0x00])) # LDA #00
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x10, bytearray([0x85, 0x71])) # STA $72
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x12, bytearray([0x64, 0x9D])) # STZ $9D
|
||||||
|
rom.write_bytes(MUSHROOM_SUB_ADDR + 0x14, bytearray([0x6B])) # RTL
|
||||||
|
# End Mushroom
|
||||||
|
|
||||||
|
# Take Damage
|
||||||
|
rom.write_bytes(0x5142, bytearray([0x22, 0x65, 0xBB, 0x03])) # JSL $03BB65
|
||||||
|
rom.write_bytes(0x5146, bytearray([0x60] * 0x01)) # RTS
|
||||||
|
|
||||||
|
DAMAGE_SUB_ADDR = 0x01BB65
|
||||||
|
rom.write_bytes(DAMAGE_SUB_ADDR + 0x00, bytearray([0x8D, 0x97, 0x14])) # STA $1497
|
||||||
|
rom.write_bytes(DAMAGE_SUB_ADDR + 0x03, bytearray([0x80, 0xF4])) # BRA -0x0C
|
||||||
|
# End Take Damage
|
||||||
|
|
||||||
|
# Fire Flower Cycle
|
||||||
|
rom.write_bytes(0x5187, bytearray([0x22, 0x6A, 0xBB, 0x03])) # JSL $03BB6A
|
||||||
|
rom.write_bytes(0x518B, bytearray([0x60] * 0x01)) # RTS
|
||||||
|
|
||||||
|
PALETTE_CYCLE_SUB_ADDR = 0x01BB6A
|
||||||
|
rom.write_bytes(PALETTE_CYCLE_SUB_ADDR + 0x00, bytearray([0xCE, 0x9B, 0x14])) # DEC $149B
|
||||||
|
rom.write_bytes(PALETTE_CYCLE_SUB_ADDR + 0x03, bytearray([0xF0, 0xEF])) # BEQ -0x11
|
||||||
|
rom.write_bytes(PALETTE_CYCLE_SUB_ADDR + 0x05, bytearray([0x6B])) # RTL
|
||||||
|
# End Fire Flower Cycle
|
||||||
|
|
||||||
|
# Pipe Exit
|
||||||
|
rom.write_bytes(0x526D, bytearray([0x22, 0x70, 0xBB, 0x03])) # JSL $03BB70
|
||||||
|
rom.write_bytes(0x5271, bytearray([0x60, 0xEA] * 0x01)) # RTS, NOP
|
||||||
|
|
||||||
|
PIPE_EXIT_SUB_ADDR = 0x01BB70
|
||||||
|
rom.write_bytes(PIPE_EXIT_SUB_ADDR + 0x00, bytearray([0x9C, 0x19, 0x14])) # STZ $1419
|
||||||
|
rom.write_bytes(PIPE_EXIT_SUB_ADDR + 0x03, bytearray([0xA9, 0x00])) # LDA #00
|
||||||
|
rom.write_bytes(PIPE_EXIT_SUB_ADDR + 0x05, bytearray([0x85, 0x71])) # STA $72
|
||||||
|
rom.write_bytes(PIPE_EXIT_SUB_ADDR + 0x07, bytearray([0x64, 0x9D])) # STZ $9D
|
||||||
|
rom.write_bytes(PIPE_EXIT_SUB_ADDR + 0x09, bytearray([0x6B])) # RTL
|
||||||
|
# End Pipe Exit
|
||||||
|
|
||||||
|
# Cape Transform
|
||||||
|
rom.write_bytes(0x5168, bytearray([0x22, 0x7A, 0xBB, 0x03])) # JSL $03BB7A
|
||||||
|
rom.write_bytes(0x516C, bytearray([0xEA] * 0x01)) # RTS, NOP
|
||||||
|
rom.write_bytes(0x516D, bytearray([0xF0, 0xD1])) # BEQ -0x2F
|
||||||
|
|
||||||
|
CAPE_TRANSFORM_SUB_ADDR = 0x01BB7A
|
||||||
|
rom.write_bytes(CAPE_TRANSFORM_SUB_ADDR + 0x00, bytearray([0xA5, 0x19])) # LDA $19
|
||||||
|
rom.write_bytes(CAPE_TRANSFORM_SUB_ADDR + 0x02, bytearray([0x4A])) # LSR
|
||||||
|
rom.write_bytes(CAPE_TRANSFORM_SUB_ADDR + 0x03, bytearray([0xD0, 0xDF])) # BNE -0x21
|
||||||
|
rom.write_bytes(CAPE_TRANSFORM_SUB_ADDR + 0x05, bytearray([0x6B])) # RTL
|
||||||
|
# End Cape Transform
|
||||||
|
|
||||||
|
# Fire Flower
|
||||||
|
rom.write_bytes(0xC5F7, bytearray([0x22, 0x80, 0xBB, 0x03])) # JSL $03BB80
|
||||||
|
|
||||||
|
FIRE_FLOWER_SUB_ADDR = 0x01BB80
|
||||||
|
rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
|
||||||
|
rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x04, bytearray([0x89, 0x02])) # BIT #02
|
||||||
|
rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x06, bytearray([0xF0, 0x07])) # BEQ +0x07
|
||||||
|
rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x09, bytearray([0xA9, 0x03])) # LDA #03
|
||||||
|
rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x0B, bytearray([0x85, 0x19])) # STA $19
|
||||||
|
rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x0D, bytearray([0x80, 0x01])) # BRA +0x01
|
||||||
|
rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x0F, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(FIRE_FLOWER_SUB_ADDR + 0x10, bytearray([0x6B])) # RTL
|
||||||
|
# End Fire Flower
|
||||||
|
|
||||||
|
# Cape
|
||||||
|
rom.write_bytes(0xC598, bytearray([0x22, 0x91, 0xBB, 0x03])) # JSL $03BB91
|
||||||
|
|
||||||
|
CAPE_SUB_ADDR = 0x01BB91
|
||||||
|
rom.write_bytes(CAPE_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(CAPE_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
|
||||||
|
rom.write_bytes(CAPE_SUB_ADDR + 0x04, bytearray([0x89, 0x04])) # BIT #04
|
||||||
|
rom.write_bytes(CAPE_SUB_ADDR + 0x06, bytearray([0xF0, 0x07])) # BEQ +0x07
|
||||||
|
rom.write_bytes(CAPE_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(CAPE_SUB_ADDR + 0x09, bytearray([0xA9, 0x02])) # LDA #02
|
||||||
|
rom.write_bytes(CAPE_SUB_ADDR + 0x0B, bytearray([0x85, 0x19])) # STA $19
|
||||||
|
rom.write_bytes(CAPE_SUB_ADDR + 0x0D, bytearray([0x80, 0x01])) # BRA +0x01
|
||||||
|
rom.write_bytes(CAPE_SUB_ADDR + 0x0F, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(CAPE_SUB_ADDR + 0x10, bytearray([0x6B])) # RTL
|
||||||
|
# End Cape
|
||||||
|
|
||||||
|
# P-Balloon
|
||||||
|
rom.write_bytes(0xC2FF, bytearray([0x22, 0xA2, 0xBB, 0x03])) # JSL $03BBA2
|
||||||
|
rom.write_bytes(0xC303, bytearray([0xEA] * 0x06))
|
||||||
|
|
||||||
|
P_BALLOON_SUB_ADDR = 0x01BBA2
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x04, bytearray([0x89, 0x08])) # BIT #08
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x06, bytearray([0xF0, 0x0D])) # BEQ +0x0D
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x09, bytearray([0xA9, 0x09])) # LDA #09
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x0B, bytearray([0x8D, 0xF3, 0x13])) # STA $13F3
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x0E, bytearray([0xA9, 0xFF])) # LDA #FF
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x10, bytearray([0x8D, 0x91, 0x18])) # STA $1891
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x13, bytearray([0x80, 0x0B])) # BRA +0x0B
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x15, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x16, bytearray([0xA9, 0x01])) # LDA #01
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x18, bytearray([0x8D, 0xF3, 0x13])) # STA $13F3
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x1B, bytearray([0xA9, 0x01])) # LDA #01
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x1D, bytearray([0x8D, 0x91, 0x18])) # STA $1891
|
||||||
|
rom.write_bytes(P_BALLOON_SUB_ADDR + 0x20, bytearray([0x6B])) # RTL
|
||||||
|
# End P-Balloon
|
||||||
|
|
||||||
|
# Star
|
||||||
|
rom.write_bytes(0xC580, bytearray([0x22, 0xC8, 0xBB, 0x03])) # JSL $03BBC8
|
||||||
|
rom.write_bytes(0xC584, bytearray([0xEA] * 0x01))
|
||||||
|
|
||||||
|
STAR_SUB_ADDR = 0x01BBC8
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x04, bytearray([0x89, 0x10])) # BIT #10
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x06, bytearray([0xF0, 0x08])) # BEQ +0x08
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x09, bytearray([0xA9, 0xFF])) # LDA #FF
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x0B, bytearray([0x8D, 0x90, 0x14])) # STA $1490
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x0E, bytearray([0x80, 0x06])) # BRA +0x06
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x10, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x11, bytearray([0xA9, 0x01])) # LDA #01
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x13, bytearray([0x8D, 0x90, 0x14])) # STA $1490
|
||||||
|
rom.write_bytes(STAR_SUB_ADDR + 0x16, bytearray([0x6B])) # RTL
|
||||||
|
# End Star
|
||||||
|
|
||||||
|
# Star Timer
|
||||||
|
rom.write_bytes(0x62E3, bytearray([0x22, 0xE0, 0xBB, 0x03])) # JSL $03BBE0
|
||||||
|
|
||||||
|
STAR_TIMER_SUB_ADDR = 0x01BBE0
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x01, bytearray([0xAD, 0x2D, 0x1F])) # LDA $1F2D
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x04, bytearray([0x89, 0x10])) # BIT #10
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x06, bytearray([0xF0, 0x07])) # BEQ +0x07
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x09, bytearray([0xA5, 0x13])) # LDA $13
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x0B, bytearray([0xC0, 0x1E])) # CPY #1E
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x0D, bytearray([0x80, 0x05])) # BRA +0x05
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x0F, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x10, bytearray([0xA5, 0x13])) # LDA $13
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x12, bytearray([0xC0, 0x01])) # CPY #01
|
||||||
|
rom.write_bytes(STAR_TIMER_SUB_ADDR + 0x14, bytearray([0x6B])) # RTL
|
||||||
|
# End Star Timer
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def handle_yoshi_box(rom):
|
||||||
|
|
||||||
|
rom.write_bytes(0xEC3D, bytearray([0xEA] * 0x03)) # NOP Lines that cause Yoshi Rescue Box normally
|
||||||
|
|
||||||
|
rom.write_bytes(0x2B20F, bytearray([0x20, 0x60, 0xDC])) # JSR $05DC60
|
||||||
|
|
||||||
|
YOSHI_BOX_SUB_ADDR = 0x02DC60
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x01, bytearray([0xAD, 0x26, 0x14])) # LDA $1426
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x04, bytearray([0xC9, 0x03])) # CMP #03
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x06, bytearray([0xF0, 0x06])) # BEQ +0x06
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x09, bytearray([0xB9, 0xD9, 0xA5])) # LDA $A5B9, Y
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x0C, bytearray([0x80, 0x08])) # BRA +0x08
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x0E, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x0F, bytearray([0xDA])) # PHX
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x10, bytearray([0xBB])) # TYX
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x11, bytearray([0xBF, 0x00, 0xC2, 0x7E])) # LDA $7EC200, X
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x15, bytearray([0xFA])) # PLX
|
||||||
|
rom.write_bytes(YOSHI_BOX_SUB_ADDR + 0x16, bytearray([0x60])) # RTS
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def handle_bowser_damage(rom):
|
||||||
|
|
||||||
|
rom.write_bytes(0x1A509, bytearray([0x20, 0x50, 0xBC])) # JSR $03BC50
|
||||||
|
|
||||||
|
BOWSER_BALLS_SUB_ADDR = 0x01BC50
|
||||||
|
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x01, bytearray([0xAD, 0x48, 0x0F])) # LDA $F48
|
||||||
|
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x04, bytearray([0xCF, 0xA1, 0xBF, 0x03])) # CMP $03BFA1
|
||||||
|
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x08, bytearray([0x90, 0x06])) # BCC +0x06
|
||||||
|
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0A, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0B, bytearray([0xEE, 0xB8, 0x14])) # INC $14B8
|
||||||
|
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x0E, bytearray([0x80, 0x01])) # BRA +0x01
|
||||||
|
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x10, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(BOWSER_BALLS_SUB_ADDR + 0x11, bytearray([0x60])) # RTS
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
def handle_level_shuffle(rom, active_level_dict):
|
||||||
|
rom.write_bytes(0x37600, bytearray([0x00] * 0x800)) # Duplicate Level Table
|
||||||
|
|
||||||
|
rom.write_bytes(0x2D89C, bytearray([0x00, 0xF6, 0x06])) # Level Load Pointer
|
||||||
|
rom.write_bytes(0x20F46, bytearray([0x00, 0xF6, 0x06])) # Mid Gate Pointer
|
||||||
|
rom.write_bytes(0x20E7B, bytearray([0x00, 0xF6, 0x06])) # Level Name Pointer
|
||||||
|
rom.write_bytes(0x21543, bytearray([0x00, 0xF6, 0x06])) # Also Level Name Pointer?
|
||||||
|
rom.write_bytes(0x20F64, bytearray([0x00, 0xF6, 0x06])) # Level Beaten Pointer
|
||||||
|
|
||||||
|
### Fix Translevel Check
|
||||||
|
rom.write_bytes(0x2D8AE, bytearray([0x20, 0x00, 0xDD])) # JSR $DD00
|
||||||
|
rom.write_bytes(0x2D8B1, bytearray([0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA])) # NOP NOP NOP NOP NOP
|
||||||
|
|
||||||
|
rom.write_bytes(0x2D7CB, bytearray([0x20, 0x00, 0xDD])) # JSR $DD00
|
||||||
|
rom.write_bytes(0x2D7CE, bytearray([0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA])) # NOP NOP NOP NOP NOP
|
||||||
|
|
||||||
|
rom.write_bytes(0x2DD00, bytearray([0xDA])) # PHX
|
||||||
|
rom.write_bytes(0x2DD01, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(0x2DD02, bytearray([0xE2, 0x30])) # SEP #30
|
||||||
|
rom.write_bytes(0x2DD04, bytearray([0xAE, 0xBF, 0x13])) # LDX $13BF
|
||||||
|
rom.write_bytes(0x2DD07, bytearray([0xE0, 0x25])) # CPX #25
|
||||||
|
rom.write_bytes(0x2DD09, bytearray([0x90, 0x04])) # BCC $DD0F
|
||||||
|
rom.write_bytes(0x2DD0B, bytearray([0xA2, 0x01])) # LDX #01
|
||||||
|
rom.write_bytes(0x2DD0D, bytearray([0x80, 0x02])) # BRA $DD11
|
||||||
|
rom.write_bytes(0x2DD0F, bytearray([0xA2, 0x00])) # LDX #00
|
||||||
|
rom.write_bytes(0x2DD11, bytearray([0x86, 0x0F])) # STX $0F
|
||||||
|
rom.write_bytes(0x2DD13, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(0x2DD14, bytearray([0xFA])) # PLX
|
||||||
|
rom.write_bytes(0x2DD15, bytearray([0x60])) # RTS
|
||||||
|
### End Fix Translevel Check
|
||||||
|
|
||||||
|
### Fix Snake Blocks
|
||||||
|
rom.write_bytes(0x192FB, bytearray([0x20, 0x1D, 0xBC])) # JSR $03BC1D
|
||||||
|
|
||||||
|
SNAKE_BLOCKS_SUB_ADDR = 0x01BC1D
|
||||||
|
rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x01, bytearray([0xAD, 0xBF, 0x13])) # LDA $13BF
|
||||||
|
rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x04, bytearray([0xC9, 0x20])) # CMP #20
|
||||||
|
rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x06, bytearray([0xF0, 0x05])) # BEQ +0x05
|
||||||
|
rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x08, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x09, bytearray([0xA9, 0x01])) # LDA #01
|
||||||
|
rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x0B, bytearray([0x80, 0x03])) # BRA +0x03
|
||||||
|
rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x0D, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x0E, bytearray([0xA9, 0x00])) # LDA #00
|
||||||
|
rom.write_bytes(SNAKE_BLOCKS_SUB_ADDR + 0x10, bytearray([0x60])) # RTS
|
||||||
|
### End Fix Snake Blocks
|
||||||
|
|
||||||
|
for level_id, level_data in level_info_dict.items():
|
||||||
|
if level_id not in active_level_dict.keys():
|
||||||
|
continue
|
||||||
|
|
||||||
|
tile_id = active_level_dict[level_id]
|
||||||
|
tile_data = level_info_dict[tile_id]
|
||||||
|
|
||||||
|
if level_id > 0x80:
|
||||||
|
level_id = level_id - 0x50
|
||||||
|
|
||||||
|
rom.write_byte(tile_data.levelIDAddress, level_id)
|
||||||
|
rom.write_byte(0x2D608 + level_id, tile_data.eventIDValue)
|
||||||
|
|
||||||
|
for level_id, tile_id in active_level_dict.items():
|
||||||
|
rom.write_byte(0x37F70 + level_id, tile_id)
|
||||||
|
|
||||||
|
|
||||||
|
def handle_collected_paths(rom):
|
||||||
|
rom.write_bytes(0x1F5B, bytearray([0x22, 0x30, 0xBC, 0x03])) # JSL $03BC30
|
||||||
|
rom.write_bytes(0x1F5F, bytearray([0xEA] * 0x02))
|
||||||
|
|
||||||
|
COLLECTED_PATHS_SUB_ADDR = 0x01BC30
|
||||||
|
rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x00, bytearray([0x08])) # PHP
|
||||||
|
rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x01, bytearray([0xAD, 0x00, 0x01])) # LDA $0100
|
||||||
|
rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x04, bytearray([0xC9, 0x0B])) # CMP #0B
|
||||||
|
rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x06, bytearray([0xD0, 0x04])) # BNE +0x04
|
||||||
|
rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x08, bytearray([0x22, 0xAD, 0xDA, 0x04])) # JSL $04DAAD
|
||||||
|
rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x0C, bytearray([0x28])) # PLP
|
||||||
|
rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x0D, bytearray([0xEE, 0x00, 0x01])) # INC $0100
|
||||||
|
rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x10, bytearray([0xAD, 0xAF, 0x0D])) # LDA $0DAF
|
||||||
|
rom.write_bytes(COLLECTED_PATHS_SUB_ADDR + 0x13, bytearray([0x6B])) # RTL
|
||||||
|
|
||||||
|
|
||||||
|
def handle_music_shuffle(rom, world, player):
|
||||||
|
from .Aesthetics import generate_shuffled_level_music, generate_shuffled_ow_music, level_music_address_data, ow_music_address_data
|
||||||
|
|
||||||
|
shuffled_level_music = generate_shuffled_level_music(world, player)
|
||||||
|
for i in range(len(shuffled_level_music)):
|
||||||
|
rom.write_byte(level_music_address_data[i], shuffled_level_music[i])
|
||||||
|
|
||||||
|
shuffled_ow_music = generate_shuffled_ow_music(world, player)
|
||||||
|
for i in range(len(shuffled_ow_music)):
|
||||||
|
for addr in ow_music_address_data[i]:
|
||||||
|
rom.write_byte(addr, shuffled_ow_music[i])
|
||||||
|
|
||||||
|
|
||||||
|
def handle_mario_palette(rom, world, player):
|
||||||
|
from .Aesthetics import mario_palettes, fire_mario_palettes, ow_mario_palettes
|
||||||
|
|
||||||
|
chosen_palette = world.mario_palette[player].value
|
||||||
|
|
||||||
|
rom.write_bytes(0x32C8, bytes(mario_palettes[chosen_palette]))
|
||||||
|
rom.write_bytes(0x32F0, bytes(fire_mario_palettes[chosen_palette]))
|
||||||
|
rom.write_bytes(0x359C, bytes(ow_mario_palettes[chosen_palette]))
|
||||||
|
|
||||||
|
|
||||||
|
def handle_swap_donut_gh_exits(rom):
|
||||||
|
rom.write_bytes(0x2567C, bytes([0xC0]))
|
||||||
|
rom.write_bytes(0x25873, bytes([0xA9]))
|
||||||
|
rom.write_bytes(0x25875, bytes([0x85]))
|
||||||
|
rom.write_bytes(0x25954, bytes([0x92]))
|
||||||
|
rom.write_bytes(0x25956, bytes([0x0A]))
|
||||||
|
rom.write_bytes(0x25E31, bytes([0x00, 0x00, 0xD8, 0x04, 0x24, 0x00, 0x98, 0x04, 0x48, 0x00, 0xD8, 0x03, 0x6C, 0x00, 0x56, 0x03,
|
||||||
|
0x90, 0x00, 0x56, 0x03, 0xB4, 0x00, 0x56, 0x03, 0x10, 0x05, 0x18, 0x05, 0x28, 0x09, 0x24, 0x05,
|
||||||
|
0x38, 0x0B, 0x14, 0x07, 0xEC, 0x09, 0x12, 0x05, 0xF0, 0x09, 0xD2, 0x04, 0xF4, 0x09, 0x92, 0x04]))
|
||||||
|
rom.write_bytes(0x26371, bytes([0x32]))
|
||||||
|
|
||||||
|
|
||||||
|
def patch_rom(world, rom, player, active_level_dict):
|
||||||
|
local_random = world.slot_seeds[player]
|
||||||
|
|
||||||
|
goal_text = generate_goal_text(world, player)
|
||||||
|
|
||||||
|
rom.write_bytes(0x2A6E2, goal_text)
|
||||||
|
rom.write_byte(0x2B1D8, 0x80)
|
||||||
|
|
||||||
|
intro_text = generate_text_box("Bowser has stolen all of Mario's abilities. Can you help Mario travel across Dinosaur land to get them back and save the Princess from him?")
|
||||||
|
rom.write_bytes(0x2A5D9, intro_text)
|
||||||
|
|
||||||
|
# Force all 8 Bowser's Castle Rooms
|
||||||
|
rom.write_byte(0x3A680, 0xD4)
|
||||||
|
rom.write_byte(0x3A684, 0xD4)
|
||||||
|
rom.write_byte(0x3A688, 0xD4)
|
||||||
|
rom.write_byte(0x3A68C, 0xD4)
|
||||||
|
rom.write_byte(0x3A705, 0xD3)
|
||||||
|
rom.write_byte(0x3A763, 0xD2)
|
||||||
|
rom.write_byte(0x3A800, 0xD1)
|
||||||
|
rom.write_byte(0x3A83D, 0xCF)
|
||||||
|
rom.write_byte(0x3A932, 0xCE)
|
||||||
|
rom.write_byte(0x3A9E1, 0xCD)
|
||||||
|
rom.write_byte(0x3AA75, 0xCC)
|
||||||
|
|
||||||
|
# Prevent Title Screen Deaths
|
||||||
|
rom.write_byte(0x1C6A, 0x80)
|
||||||
|
|
||||||
|
# Title Screen Text
|
||||||
|
player_name_bytes = bytearray()
|
||||||
|
player_name = world.get_player_name(player)
|
||||||
|
for i in range(16):
|
||||||
|
char = " "
|
||||||
|
if i < len(player_name):
|
||||||
|
char = world.get_player_name(player)[i]
|
||||||
|
upper_char = char.upper()
|
||||||
|
if upper_char not in title_text_mapping:
|
||||||
|
for byte in title_text_mapping["."]:
|
||||||
|
player_name_bytes.append(byte)
|
||||||
|
else:
|
||||||
|
for byte in title_text_mapping[upper_char]:
|
||||||
|
player_name_bytes.append(byte)
|
||||||
|
|
||||||
|
rom.write_bytes(0x2B7F1, player_name_bytes) # MARIO A
|
||||||
|
rom.write_bytes(0x2B726, player_name_bytes) # MARIO A
|
||||||
|
|
||||||
|
rom.write_bytes(0x2B815, bytearray([0xFC, 0x38] * 0x10)) # MARIO B
|
||||||
|
rom.write_bytes(0x2B74A, bytearray([0xFC, 0x38] * 0x10)) # MARIO B
|
||||||
|
rom.write_bytes(0x2B839, bytearray([0x71, 0x31, 0x74, 0x31, 0x2D, 0x31, 0x84, 0x30,
|
||||||
|
0x82, 0x30, 0x6F, 0x31, 0x73, 0x31, 0x70, 0x31,
|
||||||
|
0x71, 0x31, 0x75, 0x31, 0x83, 0x30, 0xFC, 0x38,
|
||||||
|
0xFC, 0x38, 0xFC, 0x38, 0xFC, 0x38, 0xFC, 0x38])) # MARIO C
|
||||||
|
rom.write_bytes(0x2B76E, bytearray([0xFC, 0x38] * 0x10)) # MARIO C
|
||||||
|
rom.write_bytes(0x2B79E, bytearray([0xFC, 0x38] * 0x05)) # EMPTY
|
||||||
|
rom.write_bytes(0x2B7AE, bytearray([0xFC, 0x38] * 0x05)) # EMPTY
|
||||||
|
rom.write_bytes(0x2B8A8, bytearray([0xFC, 0x38] * 0x0D)) # 2 PLAYER GAME
|
||||||
|
|
||||||
|
rom.write_bytes(0x2B85D, bytearray([0xFC, 0x38] * 0x0A)) # ERASE
|
||||||
|
|
||||||
|
rom.write_bytes(0x2B88E, bytearray([0x2C, 0x31, 0x73, 0x31, 0x75, 0x31, 0x82, 0x30, 0x30, 0x31, 0xFC, 0x38, 0x31, 0x31, 0x73, 0x31,
|
||||||
|
0x73, 0x31, 0x7C, 0x30, 0xFC, 0x38, 0xFC, 0x38, 0xFC, 0x38])) # 1 Player Game
|
||||||
|
|
||||||
|
rom.write_bytes(0x2B6D7, bytearray([0xFC, 0x38, 0xFC, 0x38, 0x16, 0x38, 0x18, 0x38, 0x0D, 0x38, 0xFC, 0x38, 0x0B, 0x38, 0x22, 0x38,
|
||||||
|
0xFC, 0x38, 0x19, 0x38, 0x18, 0x38, 0x1B, 0x38, 0x22, 0x38, 0x10, 0x38, 0x18, 0x38, 0x17, 0x38,
|
||||||
|
0x0E, 0x38, 0xFC, 0x38, 0xFC, 0x38])) # Mod by PoryGone
|
||||||
|
|
||||||
|
# Title Options
|
||||||
|
rom.write_bytes(0x1E6A, bytearray([0x01]))
|
||||||
|
rom.write_bytes(0x1E6C, bytearray([0x01]))
|
||||||
|
rom.write_bytes(0x1E6E, bytearray([0x01]))
|
||||||
|
|
||||||
|
# Always allow Start+Select
|
||||||
|
rom.write_bytes(0x2267, bytearray([0xEA, 0xEA]))
|
||||||
|
|
||||||
|
# Always bring up save prompt on beating a level
|
||||||
|
if world.autosave[player]:
|
||||||
|
rom.write_bytes(0x20F93, bytearray([0x00]))
|
||||||
|
|
||||||
|
# Starting Life Count
|
||||||
|
rom.write_bytes(0x1E25, bytearray([world.starting_life_count[player].value - 1]))
|
||||||
|
|
||||||
|
# Repurpose Bonus Stars counter for Boss Token or Yoshi Eggs
|
||||||
|
rom.write_bytes(0x3F1AA, bytearray([0x00] * 0x20))
|
||||||
|
rom.write_bytes(0x20F9F, bytearray([0xEA] * 0x3B))
|
||||||
|
|
||||||
|
# Prevent Switch Palaces setting the Switch Palace flags
|
||||||
|
rom.write_bytes(0x6EC9A, bytearray([0xEA, 0xEA]))
|
||||||
|
rom.write_bytes(0x6EB1, bytearray([0xEA, 0xEA]))
|
||||||
|
rom.write_bytes(0x6EB4, bytearray([0xEA, 0xEA, 0xEA]))
|
||||||
|
|
||||||
|
handle_ability_code(rom)
|
||||||
|
|
||||||
|
handle_yoshi_box(rom)
|
||||||
|
handle_bowser_damage(rom)
|
||||||
|
|
||||||
|
handle_collected_paths(rom)
|
||||||
|
|
||||||
|
# Handle Level Shuffle
|
||||||
|
handle_level_shuffle(rom, active_level_dict)
|
||||||
|
|
||||||
|
# Handle Music Shuffle
|
||||||
|
if world.music_shuffle[player] != "none":
|
||||||
|
handle_music_shuffle(rom, world, player)
|
||||||
|
|
||||||
|
generate_shuffled_header_data(rom, world, player)
|
||||||
|
|
||||||
|
if world.swap_donut_gh_exits[player]:
|
||||||
|
handle_swap_donut_gh_exits(rom)
|
||||||
|
|
||||||
|
handle_mario_palette(rom, world, player)
|
||||||
|
|
||||||
|
# Store all relevant option results in ROM
|
||||||
|
rom.write_byte(0x01BFA0, world.goal[player].value)
|
||||||
|
rom.write_byte(0x01BFA1, world.bosses_required[player].value)
|
||||||
|
required_yoshi_eggs = max(math.floor(
|
||||||
|
world.number_of_yoshi_eggs[player].value * (world.percentage_of_yoshi_eggs[player].value / 100.0)), 1)
|
||||||
|
rom.write_byte(0x01BFA2, required_yoshi_eggs)
|
||||||
|
#rom.write_byte(0x01BFA3, world.display_sent_item_popups[player].value)
|
||||||
|
rom.write_byte(0x01BFA4, world.display_received_item_popups[player].value)
|
||||||
|
rom.write_byte(0x01BFA5, world.death_link[player].value)
|
||||||
|
rom.write_byte(0x01BFA6, world.dragon_coin_checks[player].value)
|
||||||
|
rom.write_byte(0x01BFA7, world.swap_donut_gh_exits[player].value)
|
||||||
|
|
||||||
|
|
||||||
|
from Main import __version__
|
||||||
|
rom.name = bytearray(f'SMW{__version__.replace(".", "")[0:3]}_{player}_{world.seed:11}\0', 'utf8')[:21]
|
||||||
|
rom.name.extend([0] * (21 - len(rom.name)))
|
||||||
|
rom.write_bytes(0x7FC0, rom.name)
|
||||||
|
|
||||||
|
|
||||||
|
def get_base_rom_bytes(file_name: str = "") -> bytes:
|
||||||
|
base_rom_bytes = getattr(get_base_rom_bytes, "base_rom_bytes", None)
|
||||||
|
if not base_rom_bytes:
|
||||||
|
file_name = get_base_rom_path(file_name)
|
||||||
|
base_rom_bytes = bytes(read_rom(open(file_name, "rb")))
|
||||||
|
|
||||||
|
basemd5 = hashlib.md5()
|
||||||
|
basemd5.update(base_rom_bytes)
|
||||||
|
if USHASH != basemd5.hexdigest():
|
||||||
|
raise Exception('Supplied Base Rom does not match known MD5 for US(1.0) release. '
|
||||||
|
'Get the correct game and version, then dump it')
|
||||||
|
get_base_rom_bytes.base_rom_bytes = base_rom_bytes
|
||||||
|
return base_rom_bytes
|
||||||
|
|
||||||
|
def get_base_rom_path(file_name: str = "") -> str:
|
||||||
|
options = Utils.get_options()
|
||||||
|
if not file_name:
|
||||||
|
file_name = options["smw_options"]["rom_file"]
|
||||||
|
if not os.path.exists(file_name):
|
||||||
|
file_name = Utils.local_path(file_name)
|
||||||
|
return file_name
|
|
@ -0,0 +1,20 @@
|
||||||
|
import math
|
||||||
|
|
||||||
|
from BaseClasses import MultiWorld
|
||||||
|
from .Names import LocationName, ItemName
|
||||||
|
from ..AutoWorld import LogicMixin
|
||||||
|
from ..generic.Rules import add_rule, set_rule
|
||||||
|
|
||||||
|
|
||||||
|
def set_rules(world: MultiWorld, player: int):
|
||||||
|
|
||||||
|
if world.goal[player] == "yoshi_egg_hunt":
|
||||||
|
required_yoshi_eggs = max(math.floor(
|
||||||
|
world.number_of_yoshi_eggs[player].value * (world.percentage_of_yoshi_eggs[player].value / 100.0)), 1)
|
||||||
|
|
||||||
|
add_rule(world.get_location(LocationName.yoshis_house, player),
|
||||||
|
lambda state: state.has(ItemName.yoshi_egg, player, required_yoshi_eggs))
|
||||||
|
else:
|
||||||
|
add_rule(world.get_location(LocationName.bowser, player), lambda state: state.has(ItemName.mario_carry, player))
|
||||||
|
|
||||||
|
world.completion_condition[player] = lambda state: state.has(ItemName.victory, player)
|
|
@ -0,0 +1,253 @@
|
||||||
|
import os
|
||||||
|
import typing
|
||||||
|
import math
|
||||||
|
import threading
|
||||||
|
|
||||||
|
from BaseClasses import Item, MultiWorld, Tutorial, ItemClassification
|
||||||
|
from .Items import SMWItem, ItemData, item_table
|
||||||
|
from .Locations import SMWLocation, all_locations, setup_locations
|
||||||
|
from .Options import smw_options
|
||||||
|
from .Regions import create_regions, connect_regions
|
||||||
|
from .Levels import full_level_list, generate_level_list, location_id_to_level_id
|
||||||
|
from .Rules import set_rules
|
||||||
|
from ..generic.Rules import add_rule
|
||||||
|
from .Names import ItemName, LocationName
|
||||||
|
from ..AutoWorld import WebWorld, World
|
||||||
|
from .Rom import LocalRom, patch_rom, get_base_rom_path, SMWDeltaPatch
|
||||||
|
import Patch
|
||||||
|
|
||||||
|
|
||||||
|
class SMWWeb(WebWorld):
|
||||||
|
theme = "grass"
|
||||||
|
|
||||||
|
setup_en = Tutorial(
|
||||||
|
"Multiworld Setup Guide",
|
||||||
|
"A guide to setting up the Super Mario World randomizer connected to an Archipelago Multiworld.",
|
||||||
|
"English",
|
||||||
|
"setup_en.md",
|
||||||
|
"setup/en",
|
||||||
|
["PoryGone"]
|
||||||
|
)
|
||||||
|
|
||||||
|
tutorials = [setup_en]
|
||||||
|
|
||||||
|
|
||||||
|
class SMWWorld(World):
|
||||||
|
"""
|
||||||
|
Super Mario World is an action platforming game.
|
||||||
|
The Princess has been kidnapped by Bowser again, but Mario has somehow
|
||||||
|
lost all of his abilities. Can he get them back in time to save the Princess?
|
||||||
|
"""
|
||||||
|
game: str = "Super Mario World"
|
||||||
|
option_definitions = smw_options
|
||||||
|
topology_present = False
|
||||||
|
data_version = 1
|
||||||
|
required_client_version = (0, 3, 5)
|
||||||
|
|
||||||
|
item_name_to_id = {name: data.code for name, data in item_table.items()}
|
||||||
|
location_name_to_id = all_locations
|
||||||
|
|
||||||
|
active_level_dict: typing.Dict[int,int]
|
||||||
|
web = SMWWeb()
|
||||||
|
|
||||||
|
def __init__(self, world: MultiWorld, player: int):
|
||||||
|
self.rom_name_available_event = threading.Event()
|
||||||
|
super().__init__(world, player)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def stage_assert_generate(cls, world):
|
||||||
|
rom_file = get_base_rom_path()
|
||||||
|
if not os.path.exists(rom_file):
|
||||||
|
raise FileNotFoundError(rom_file)
|
||||||
|
|
||||||
|
def _get_slot_data(self):
|
||||||
|
return {
|
||||||
|
#"death_link": self.world.death_link[self.player].value,
|
||||||
|
"active_levels": self.active_level_dict,
|
||||||
|
}
|
||||||
|
|
||||||
|
def _create_items(self, name: str):
|
||||||
|
data = item_table[name]
|
||||||
|
return [self.create_item(name)] * data.quantity
|
||||||
|
|
||||||
|
def fill_slot_data(self) -> dict:
|
||||||
|
slot_data = self._get_slot_data()
|
||||||
|
for option_name in smw_options:
|
||||||
|
option = getattr(self.world, option_name)[self.player]
|
||||||
|
slot_data[option_name] = option.value
|
||||||
|
|
||||||
|
return slot_data
|
||||||
|
|
||||||
|
def generate_basic(self):
|
||||||
|
itempool: typing.List[SMWItem] = []
|
||||||
|
|
||||||
|
self.active_level_dict = dict(zip(generate_level_list(self.world, self.player), full_level_list))
|
||||||
|
self.topology_present = self.world.level_shuffle[self.player]
|
||||||
|
|
||||||
|
connect_regions(self.world, self.player, self.active_level_dict)
|
||||||
|
|
||||||
|
# Add Boss Token amount requirements for Worlds
|
||||||
|
add_rule(self.world.get_region(LocationName.donut_plains_1_tile, self.player).entrances[0], lambda state: state.has(ItemName.koopaling, self.player, 1))
|
||||||
|
add_rule(self.world.get_region(LocationName.vanilla_dome_1_tile, self.player).entrances[0], lambda state: state.has(ItemName.koopaling, self.player, 2))
|
||||||
|
add_rule(self.world.get_region(LocationName.forest_of_illusion_1_tile, self.player).entrances[0], lambda state: state.has(ItemName.koopaling, self.player, 4))
|
||||||
|
add_rule(self.world.get_region(LocationName.chocolate_island_1_tile, self.player).entrances[0], lambda state: state.has(ItemName.koopaling, self.player, 5))
|
||||||
|
add_rule(self.world.get_region(LocationName.valley_of_bowser_1_tile, self.player).entrances[0], lambda state: state.has(ItemName.koopaling, self.player, 6))
|
||||||
|
|
||||||
|
total_required_locations = 96
|
||||||
|
if self.world.dragon_coin_checks[self.player]:
|
||||||
|
total_required_locations += 49
|
||||||
|
|
||||||
|
itempool += [self.create_item(ItemName.mario_run)]
|
||||||
|
itempool += [self.create_item(ItemName.mario_carry)]
|
||||||
|
itempool += [self.create_item(ItemName.mario_swim)]
|
||||||
|
itempool += [self.create_item(ItemName.mario_spin_jump)]
|
||||||
|
itempool += [self.create_item(ItemName.mario_climb)]
|
||||||
|
itempool += [self.create_item(ItemName.yoshi_activate)]
|
||||||
|
itempool += [self.create_item(ItemName.p_switch)]
|
||||||
|
itempool += [self.create_item(ItemName.p_balloon)]
|
||||||
|
itempool += [self.create_item(ItemName.super_star_active)]
|
||||||
|
itempool += [self.create_item(ItemName.progressive_powerup)] * 3
|
||||||
|
itempool += [self.create_item(ItemName.yellow_switch_palace)]
|
||||||
|
itempool += [self.create_item(ItemName.green_switch_palace)]
|
||||||
|
itempool += [self.create_item(ItemName.red_switch_palace)]
|
||||||
|
itempool += [self.create_item(ItemName.blue_switch_palace)]
|
||||||
|
|
||||||
|
if self.world.goal[self.player] == "yoshi_egg_hunt":
|
||||||
|
itempool += [self.create_item(ItemName.yoshi_egg)] * self.world.number_of_yoshi_eggs[self.player]
|
||||||
|
self.world.get_location(LocationName.yoshis_house, self.player).place_locked_item(self.create_item(ItemName.victory))
|
||||||
|
else:
|
||||||
|
self.world.get_location(LocationName.bowser, self.player).place_locked_item(self.create_item(ItemName.victory))
|
||||||
|
|
||||||
|
junk_count = total_required_locations - len(itempool)
|
||||||
|
trap_weights = []
|
||||||
|
trap_weights += ([ItemName.ice_trap] * self.world.ice_trap_weight[self.player].value)
|
||||||
|
trap_weights += ([ItemName.stun_trap] * self.world.stun_trap_weight[self.player].value)
|
||||||
|
trap_weights += ([ItemName.literature_trap] * self.world.literature_trap_weight[self.player].value)
|
||||||
|
trap_count = 0 if (len(trap_weights) == 0) else math.ceil(junk_count * (self.world.trap_fill_percentage[self.player].value / 100.0))
|
||||||
|
junk_count -= trap_count
|
||||||
|
|
||||||
|
trap_pool = []
|
||||||
|
for i in range(trap_count):
|
||||||
|
trap_item = self.world.random.choice(trap_weights)
|
||||||
|
trap_pool += [self.create_item(trap_item)]
|
||||||
|
|
||||||
|
itempool += trap_pool
|
||||||
|
|
||||||
|
itempool += [self.create_item(ItemName.one_up_mushroom)] * junk_count
|
||||||
|
|
||||||
|
boss_location_names = [LocationName.yoshis_island_koopaling, LocationName.donut_plains_koopaling, LocationName.vanilla_dome_koopaling,
|
||||||
|
LocationName.twin_bridges_koopaling, LocationName.forest_koopaling, LocationName.chocolate_koopaling,
|
||||||
|
LocationName.valley_koopaling, LocationName.vanilla_reznor, LocationName.forest_reznor, LocationName.chocolate_reznor, LocationName.valley_reznor]
|
||||||
|
|
||||||
|
for location_name in boss_location_names:
|
||||||
|
self.world.get_location(location_name, self.player).place_locked_item(self.create_item(ItemName.koopaling))
|
||||||
|
|
||||||
|
self.world.itempool += itempool
|
||||||
|
|
||||||
|
|
||||||
|
def generate_output(self, output_directory: str):
|
||||||
|
try:
|
||||||
|
world = self.world
|
||||||
|
player = self.player
|
||||||
|
|
||||||
|
rom = LocalRom(get_base_rom_path())
|
||||||
|
patch_rom(self.world, rom, self.player, self.active_level_dict)
|
||||||
|
|
||||||
|
outfilepname = f'_P{player}'
|
||||||
|
outfilepname += f"_{world.player_name[player].replace(' ', '_')}" \
|
||||||
|
if world.player_name[player] != 'Player%d' % player else ''
|
||||||
|
|
||||||
|
rompath = os.path.join(output_directory, f'AP_{world.seed_name}{outfilepname}.sfc')
|
||||||
|
rom.write_to_file(rompath)
|
||||||
|
self.rom_name = rom.name
|
||||||
|
|
||||||
|
patch = SMWDeltaPatch(os.path.splitext(rompath)[0]+SMWDeltaPatch.patch_file_ending, player=player,
|
||||||
|
player_name=world.player_name[player], patched_path=rompath)
|
||||||
|
patch.write()
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
finally:
|
||||||
|
if os.path.exists(rompath):
|
||||||
|
os.unlink(rompath)
|
||||||
|
self.rom_name_available_event.set() # make sure threading continues and errors are collected
|
||||||
|
|
||||||
|
def modify_multidata(self, multidata: dict):
|
||||||
|
import base64
|
||||||
|
# wait for self.rom_name to be available.
|
||||||
|
self.rom_name_available_event.wait()
|
||||||
|
rom_name = getattr(self, "rom_name", None)
|
||||||
|
# we skip in case of error, so that the original error in the output thread is the one that gets raised
|
||||||
|
if rom_name:
|
||||||
|
new_name = base64.b64encode(bytes(self.rom_name)).decode()
|
||||||
|
multidata["connect_names"][new_name] = multidata["connect_names"][self.world.player_name[self.player]]
|
||||||
|
|
||||||
|
def extend_hint_information(self, hint_data: typing.Dict[int, typing.Dict[int, str]]):
|
||||||
|
if self.topology_present:
|
||||||
|
world_names = [
|
||||||
|
LocationName.yoshis_island_region,
|
||||||
|
LocationName.donut_plains_region,
|
||||||
|
LocationName.vanilla_dome_region,
|
||||||
|
LocationName.twin_bridges_region,
|
||||||
|
LocationName.forest_of_illusion_region,
|
||||||
|
LocationName.chocolate_island_region,
|
||||||
|
LocationName.valley_of_bowser_region,
|
||||||
|
LocationName.star_road_region,
|
||||||
|
LocationName.special_zone_region,
|
||||||
|
]
|
||||||
|
world_cutoffs = [
|
||||||
|
0x07,
|
||||||
|
0x13,
|
||||||
|
0x1F,
|
||||||
|
0x26,
|
||||||
|
0x30,
|
||||||
|
0x39,
|
||||||
|
0x44,
|
||||||
|
0x4F,
|
||||||
|
0x59
|
||||||
|
]
|
||||||
|
er_hint_data = {}
|
||||||
|
for loc_name, level_data in location_id_to_level_id.items():
|
||||||
|
level_id = level_data[0]
|
||||||
|
|
||||||
|
if level_id not in self.active_level_dict:
|
||||||
|
continue
|
||||||
|
|
||||||
|
keys_list = list(self.active_level_dict.keys())
|
||||||
|
level_index = keys_list.index(level_id)
|
||||||
|
for i in range(len(world_cutoffs)):
|
||||||
|
if level_index >= world_cutoffs[i]:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if self.world.dragon_coin_checks[self.player].value == 0 and "Dragon Coins" in loc_name:
|
||||||
|
continue
|
||||||
|
|
||||||
|
location = self.world.get_location(loc_name, self.player)
|
||||||
|
er_hint_data[location.address] = world_names[i]
|
||||||
|
break
|
||||||
|
|
||||||
|
hint_data[self.player] = er_hint_data
|
||||||
|
|
||||||
|
def create_regions(self):
|
||||||
|
location_table = setup_locations(self.world, self.player)
|
||||||
|
create_regions(self.world, self.player, location_table)
|
||||||
|
|
||||||
|
def create_item(self, name: str, force_non_progression=False) -> Item:
|
||||||
|
data = item_table[name]
|
||||||
|
|
||||||
|
if force_non_progression:
|
||||||
|
classification = ItemClassification.filler
|
||||||
|
elif name == ItemName.yoshi_egg:
|
||||||
|
classification = ItemClassification.progression_skip_balancing
|
||||||
|
elif data.progression:
|
||||||
|
classification = ItemClassification.progression
|
||||||
|
elif data.trap:
|
||||||
|
classification = ItemClassification.trap
|
||||||
|
else:
|
||||||
|
classification = ItemClassification.filler
|
||||||
|
|
||||||
|
created_item = SMWItem(name, classification, data.code, self.player)
|
||||||
|
|
||||||
|
return created_item
|
||||||
|
|
||||||
|
def set_rules(self):
|
||||||
|
set_rules(self.world, self.player)
|
|
@ -0,0 +1,43 @@
|
||||||
|
# Super Mario World
|
||||||
|
|
||||||
|
## Where is the settings page?
|
||||||
|
|
||||||
|
The [player settings page for this game](../player-settings) contains all the options you need to configure and export a config file.
|
||||||
|
|
||||||
|
## What does randomization do to this game?
|
||||||
|
|
||||||
|
Mario's basic abilities are removed, and placed into the item pool as items that any player can find. This includes:
|
||||||
|
- Carry
|
||||||
|
- Climb
|
||||||
|
- Run
|
||||||
|
- P-Switch
|
||||||
|
- Swim
|
||||||
|
- Spin Jump
|
||||||
|
- Yoshi
|
||||||
|
|
||||||
|
Additionally, the ability to use powerups (Mushrooms, Fire Flowers, Capes, Stars, and P-Balloons) are shuffled into the item pool, as are the Four Switch Palaces.
|
||||||
|
|
||||||
|
## What is the goal of Super Mario World when randomized?
|
||||||
|
|
||||||
|
There are two goals which can be chosen:
|
||||||
|
- `Bowser`: Reach Bowser's Castle and defeat Bowser, after defeating a certain number of bosses.
|
||||||
|
- `Yoshi Egg Hunt`: Collect a certain number of Yoshi Eggs, then return to Yoshi's House
|
||||||
|
|
||||||
|
## What items and locations get shuffled?
|
||||||
|
|
||||||
|
Each unique level exit awards a location check. Optionally, collecting five Dragon Coins in each level can also award a location check.
|
||||||
|
Mario's various abilities and powerups as described above are placed into the item pool.
|
||||||
|
If the player is playing Yoshi Egg Hunt, a certain number of Yoshi Eggs will be placed into the item pool.
|
||||||
|
Any additional items that are needed to fill out the item pool with be 1-Up Mushrooms.
|
||||||
|
|
||||||
|
## Which items can be in another player's world?
|
||||||
|
|
||||||
|
Any shuffled item can be in other players' worlds.
|
||||||
|
|
||||||
|
## What does another world's item look like in Super Mario World
|
||||||
|
|
||||||
|
Items do not have an appearance in Super Mario World.
|
||||||
|
|
||||||
|
## When the player receives an item, what happens?
|
||||||
|
|
||||||
|
The player can choose to receive a text box in-game when they receive an item. Regardless of that choice, items will be queued, and granted when the player next enters a level.
|
|
@ -0,0 +1,149 @@
|
||||||
|
# Super Mario World Randomizer Setup Guide
|
||||||
|
|
||||||
|
## Required Software
|
||||||
|
|
||||||
|
- [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases). Make sure to check the box for `SNI Client - Super Mario World Patch Setup`
|
||||||
|
|
||||||
|
|
||||||
|
- Hardware or software capable of loading and playing SNES ROM files
|
||||||
|
- An emulator capable of connecting to SNI such as:
|
||||||
|
- snes9x-rr from: [snes9x rr](https://github.com/gocha/snes9x-rr/releases),
|
||||||
|
- BizHawk from: [BizHawk Website](http://tasvideos.org/BizHawk.html)
|
||||||
|
- RetroArch 1.10.3 or newer from: [RetroArch Website](https://retroarch.com?page=platforms). Or,
|
||||||
|
- An SD2SNES, FXPak Pro ([FXPak Pro Store Page](https://krikzz.com/store/home/54-fxpak-pro.html)), or other
|
||||||
|
compatible hardware
|
||||||
|
- Your legally obtained Super Mario World ROM file, probably named `Super Mario World (USA).sfc`
|
||||||
|
|
||||||
|
## Installation Procedures
|
||||||
|
|
||||||
|
### Windows Setup
|
||||||
|
|
||||||
|
1. During the installation of Archipelago, you will have been asked to install the SNI Client. If you did not do this,
|
||||||
|
or you are on an older version, you may run the installer again to install the SNI Client.
|
||||||
|
2. During setup, you will be asked to locate your base ROM file. This is your Super Mario World ROM file.
|
||||||
|
3. If you are using an emulator, you should assign your Lua capable emulator as your default program for launching ROM
|
||||||
|
files.
|
||||||
|
1. Extract your emulator's folder to your Desktop, or somewhere you will remember.
|
||||||
|
2. Right-click on a ROM file and select **Open with...**
|
||||||
|
3. Check the box next to **Always use this app to open .sfc files**
|
||||||
|
4. Scroll to the bottom of the list and click the grey text **Look for another App on this PC**
|
||||||
|
5. Browse for your emulator's `.exe` file and click **Open**. This file should be located inside the folder you
|
||||||
|
extracted in step one.
|
||||||
|
|
||||||
|
## Create a Config (.yaml) File
|
||||||
|
|
||||||
|
### What is a config file and why do I need one?
|
||||||
|
|
||||||
|
See the guide on setting up a basic YAML at the Archipelago setup
|
||||||
|
guide: [Basic Multiworld Setup Guide](/tutorial/Archipelago/setup/en)
|
||||||
|
|
||||||
|
### Where do I get a config file?
|
||||||
|
|
||||||
|
The Player Settings page on the website allows you to configure your personal settings and export a config file from
|
||||||
|
them. Player settings page: [Super Mario World Player Settings Page](/games/Super%20Mario%20World/player-settings)
|
||||||
|
|
||||||
|
### Verifying your config file
|
||||||
|
|
||||||
|
If you would like to validate your config file to make sure it works, you may do so on the YAML Validator page. YAML
|
||||||
|
validator page: [YAML Validation page](/mysterycheck)
|
||||||
|
|
||||||
|
## Joining a MultiWorld Game
|
||||||
|
|
||||||
|
### Obtain your patch file and create your ROM
|
||||||
|
|
||||||
|
When you join a multiworld game, you will be asked to provide your config file to whomever is hosting. Once that is done,
|
||||||
|
the host will provide you with either a link to download your patch file, or with a zip file containing everyone's patch
|
||||||
|
files. Your patch file should have a `.apsmw` extension.
|
||||||
|
|
||||||
|
Put your patch file on your desktop or somewhere convenient, and double click it. This should automatically launch the
|
||||||
|
client, and will also create your ROM in the same place as your patch file.
|
||||||
|
|
||||||
|
### Connect to the client
|
||||||
|
|
||||||
|
#### With an emulator
|
||||||
|
|
||||||
|
When the client launched automatically, SNI should have also automatically launched in the background. If this is its
|
||||||
|
first time launching, you may be prompted to allow it to communicate through the Windows Firewall.
|
||||||
|
|
||||||
|
##### snes9x-rr
|
||||||
|
|
||||||
|
1. Load your ROM file if it hasn't already been loaded.
|
||||||
|
2. Click on the File menu and hover on **Lua Scripting**
|
||||||
|
3. Click on **New Lua Script Window...**
|
||||||
|
4. In the new window, click **Browse...**
|
||||||
|
5. Select the connector lua file included with your client
|
||||||
|
- Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
|
||||||
|
emulator is 64-bit or 32-bit.
|
||||||
|
6. If you see an error while loading the script that states `socket.dll missing` or similar, navigate to the folder of
|
||||||
|
the lua you are using in your file explorer and copy the `socket.dll` to the base folder of your snes9x install.
|
||||||
|
|
||||||
|
##### BizHawk
|
||||||
|
|
||||||
|
1. Ensure you have the BSNES core loaded. You may do this by clicking on the Tools menu in BizHawk and following these
|
||||||
|
menu options:
|
||||||
|
`Config --> Cores --> SNES --> BSNES`
|
||||||
|
Once you have changed the loaded core, you must restart BizHawk.
|
||||||
|
2. Load your ROM file if it hasn't already been loaded.
|
||||||
|
3. Click on the Tools menu and click on **Lua Console**
|
||||||
|
4. Click the button to open a new Lua script.
|
||||||
|
5. Select the `Connector.lua` file included with your client
|
||||||
|
- Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
|
||||||
|
emulator is 64-bit or 32-bit. Please note the most recent versions of BizHawk are 64-bit only.
|
||||||
|
|
||||||
|
##### RetroArch 1.10.3 or newer
|
||||||
|
|
||||||
|
You only have to do these steps once. Note, RetroArch 1.9.x will not work as it is older than 1.10.3.
|
||||||
|
|
||||||
|
1. Enter the RetroArch main menu screen.
|
||||||
|
2. Go to Settings --> User Interface. Set "Show Advanced Settings" to ON.
|
||||||
|
3. Go to Settings --> Network. Set "Network Commands" to ON. (It is found below Request Device 16.) Leave the default
|
||||||
|
Network Command Port at 55355.
|
||||||
|
|
||||||
|

|
||||||
|
4. Go to Main Menu --> Online Updater --> Core Downloader. Scroll down and select "Nintendo - SNES / SFC (bsnes-mercury
|
||||||
|
Performance)".
|
||||||
|
|
||||||
|
When loading a ROM, be sure to select a **bsnes-mercury** core. These are the only cores that allow external tools to
|
||||||
|
read ROM data.
|
||||||
|
|
||||||
|
#### With hardware
|
||||||
|
|
||||||
|
This guide assumes you have downloaded the correct firmware for your device. If you have not done so already, please do
|
||||||
|
this now. SD2SNES and FXPak Pro users may download the appropriate firmware on the SD2SNES releases page. SD2SNES
|
||||||
|
releases page: [SD2SNES Releases Page](https://github.com/RedGuyyyy/sd2snes/releases)
|
||||||
|
|
||||||
|
Other hardware may find helpful information on the usb2snes platforms
|
||||||
|
page: [usb2snes Supported Platforms Page](http://usb2snes.com/#supported-platforms)
|
||||||
|
|
||||||
|
1. Close your emulator, which may have auto-launched.
|
||||||
|
2. Power on your device and load the ROM.
|
||||||
|
|
||||||
|
### Connect to the Archipelago Server
|
||||||
|
|
||||||
|
The patch file which launched your client should have automatically connected you to the AP Server. There are a few
|
||||||
|
reasons this may not happen however, including if the game is hosted on the website but was generated elsewhere. If the
|
||||||
|
client window shows "Server Status: Not Connected", simply ask the host for the address of the server, and copy/paste it
|
||||||
|
into the "Server" input field then press enter.
|
||||||
|
|
||||||
|
The client will attempt to reconnect to the new server address, and should momentarily show "Server Status: Connected".
|
||||||
|
|
||||||
|
### Play the game
|
||||||
|
|
||||||
|
When the client shows both SNES Device and Server as connected, you're ready to begin playing. Congratulations on
|
||||||
|
successfully joining a multiworld game!
|
||||||
|
|
||||||
|
## Hosting a MultiWorld game
|
||||||
|
|
||||||
|
The recommended way to host a game is to use our hosting service. The process is relatively simple:
|
||||||
|
|
||||||
|
1. Collect config files from your players.
|
||||||
|
2. Create a zip file containing your players' config files.
|
||||||
|
3. Upload that zip file to the Generate page above.
|
||||||
|
- Generate page: [WebHost Seed Generation Page](/generate)
|
||||||
|
4. Wait a moment while the seed is generated.
|
||||||
|
5. When the seed is generated, you will be redirected to a "Seed Info" page.
|
||||||
|
6. Click "Create New Room". This will take you to the server page. Provide the link to this page to your players, so
|
||||||
|
they may download their patch files from there.
|
||||||
|
7. Note that a link to a MultiWorld Tracker is at the top of the room page. The tracker shows the progress of all
|
||||||
|
players in the game. Any observers may also be given the link to this page.
|
||||||
|
8. Once all players have joined, you may begin playing.
|
Loading…
Reference in New Issue