pokeemerald-expansion/migration_scripts/frlg_metatile_behavior_converter.py
2026-01-28 17:41:12 +01:00

544 lines
18 KiB
Python

import os
import struct
import glob
# 1. Update these tables to fit your project:
# FRLG_BEHAVIORS, EMERALD_BEHAVIORS and FRLG_TO_EMERALD
# 2. Change the ATTRIBUTES_PATH
# Example:
# .
# |-- <script folder>
# |-- frlg_metatile_behavior_converter.py
# |-- frlg_tilesets
# |-- primary
# |-- building
# |-- metatile_attributes.bin
# |-- ...
# |-- secondary
# |-- cave
# |-- metatile_attributes.bin
# |-- ...
#
# in this case:
# ATTRIBUTES_PATH = "frlg_tilesets/**/**/metatile_attributes.bin"
# 3. Run the script in the script folder:
# python frlg_metatile_behavior_converter.py
# CHANGE THIS
ATTRIBUTES_PATH = "path/to/metatile_attributes.bin"
FRLG_BEHAVIORS = {
0x00: 'MB_FRLG_NORMAL',
0x01: 'MB_FRLG_UNUSED_01',
0x02: 'MB_FRLG_TALL_GRASS',
0x08: 'MB_FRLG_CAVE',
0x0A: 'MB_FRLG_RUNNING_DISALLOWED',
0x0B: 'MB_FRLG_INDOOR_ENCOUNTER',
0x0C: 'MB_FRLG_MOUNTAIN_TOP',
0x10: 'MB_FRLG_POND_WATER',
0x11: 'MB_FRLG_FAST_WATER',
0x12: 'MB_FRLG_DEEP_WATER',
0x13: 'MB_FRLG_WATERFALL',
0x15: 'MB_FRLG_OCEAN_WATER',
0x16: 'MB_FRLG_PUDDLE',
0x17: 'MB_FRLG_SHALLOW_WATER',
0x19: 'MB_FRLG_UNDERWATER_BLOCKED_ABOVE',
0x1A: 'MB_FRLG_UNUSED_WATER',
0x1B: 'MB_FRLG_CYCLING_ROAD_WATER',
0x20: 'MB_FRLG_STRENGTH_BUTTON',
0x21: 'MB_FRLG_SAND',
0x22: 'MB_FRLG_SEAWEED',
0x23: 'MB_FRLG_ICE',
0x26: 'MB_FRLG_THIN_ICE',
0x27: 'MB_FRLG_CRACKED_ICE',
0x28: 'MB_FRLG_HOT_SPRINGS',
0x2A: 'MB_FRLG_ROCK_STAIRS',
0x2B: 'MB_FRLG_SAND_CAVE',
0x30: 'MB_FRLG_IMPASSABLE_EAST',
0x31: 'MB_FRLG_IMPASSABLE_WEST',
0x32: 'MB_FRLG_IMPASSABLE_NORTH',
0x33: 'MB_FRLG_IMPASSABLE_SOUTH',
0x34: 'MB_FRLG_IMPASSABLE_NORTHEAST',
0x35: 'MB_FRLG_IMPASSABLE_NORTHWEST',
0x36: 'MB_FRLG_IMPASSABLE_SOUTHEAST',
0x37: 'MB_FRLG_IMPASSABLE_SOUTHWEST',
0x38: 'MB_FRLG_JUMP_EAST',
0x39: 'MB_FRLG_JUMP_WEST',
0x3A: 'MB_FRLG_JUMP_NORTH',
0x3B: 'MB_FRLG_JUMP_SOUTH',
0x40: 'MB_FRLG_WALK_EAST',
0x41: 'MB_FRLG_WALK_WEST',
0x42: 'MB_FRLG_WALK_NORTH',
0x43: 'MB_FRLG_WALK_SOUTH',
0x44: 'MB_FRLG_SLIDE_EAST',
0x45: 'MB_FRLG_SLIDE_WEST',
0x46: 'MB_FRLG_SLIDE_NORTH',
0x47: 'MB_FRLG_SLIDE_SOUTH',
0x48: 'MB_FRLG_TRICK_HOUSE_PUZZLE_8_FLOOR',
0x50: 'MB_FRLG_EASTWARD_CURRENT',
0x51: 'MB_FRLG_WESTWARD_CURRENT',
0x52: 'MB_FRLG_NORTHWARD_CURRENT',
0x53: 'MB_FRLG_SOUTHWARD_CURRENT',
0x54: 'MB_FRLG_SPIN_RIGHT',
0x55: 'MB_FRLG_SPIN_LEFT',
0x56: 'MB_FRLG_SPIN_UP',
0x57: 'MB_FRLG_SPIN_DOWN',
0x58: 'MB_FRLG_STOP_SPINNING',
0x60: 'MB_FRLG_CAVE_DOOR',
0x61: 'MB_FRLG_LADDER',
0x62: 'MB_FRLG_EAST_ARROW_WARP',
0x63: 'MB_FRLG_WEST_ARROW_WARP',
0x64: 'MB_FRLG_NORTH_ARROW_WARP',
0x65: 'MB_FRLG_SOUTH_ARROW_WARP',
0x66: 'MB_FRLG_FALL_WARP',
0x67: 'MB_FRLG_REGULAR_WARP',
0x68: 'MB_FRLG_LAVARIDGE_1F_WARP',
0x69: 'MB_FRLG_WARP_DOOR',
0x6A: 'MB_FRLG_UP_ESCALATOR',
0x6B: 'MB_FRLG_DOWN_ESCALATOR',
0x6C: 'MB_FRLG_UP_RIGHT_STAIR_WARP',
0x6D: 'MB_FRLG_UP_LEFT_STAIR_WARP',
0x6E: 'MB_FRLG_DOWN_RIGHT_STAIR_WARP',
0x6F: 'MB_FRLG_DOWN_LEFT_STAIR_WARP',
0x71: 'MB_FRLG_UNION_ROOM_WARP',
0x80: 'MB_FRLG_COUNTER',
0x81: 'MB_FRLG_BOOKSHELF',
0x82: 'MB_FRLG_POKEMART_SHELF',
0x83: 'MB_FRLG_PC',
0x84: 'MB_FRLG_SIGNPOST',
0x85: 'MB_FRLG_REGION_MAP',
0x86: 'MB_FRLG_TELEVISION',
0x87: 'MB_FRLG_POKEMON_CENTER_SIGN',
0x88: 'MB_FRLG_POKEMART_SIGN',
0x89: 'MB_FRLG_CABINET',
0x8A: 'MB_FRLG_KITCHEN',
0x8B: 'MB_FRLG_DRESSER',
0x8C: 'MB_FRLG_SNACKS',
0x8D: 'MB_FRLG_CABLE_CLUB_WIRELESS_MONITOR',
0x8E: 'MB_FRLG_BATTLE_RECORDS',
0x8F: 'MB_FRLG_QUESTIONNAIRE',
0x90: 'MB_FRLG_FOOD',
0x91: 'MB_FRLG_INDIGO_PLATEAU_SIGN_1',
0x92: 'MB_FRLG_INDIGO_PLATEAU_SIGN_2',
0x93: 'MB_FRLG_BLUEPRINTS',
0x94: 'MB_FRLG_PAINTING',
0x95: 'MB_FRLG_POWER_PLANT_MACHINE',
0x96: 'MB_FRLG_TELEPHONE',
0x97: 'MB_FRLG_COMPUTER',
0x98: 'MB_FRLG_ADVERTISING_POSTER',
0x99: 'MB_FRLG_FOOD_SMELLS_TASTY',
0x9A: 'MB_FRLG_TRASH_BIN',
0x9B: 'MB_FRLG_CUP',
0x9C: 'MB_FRLG_PORTHOLE',
0x9D: 'MB_FRLG_WINDOW',
0x9E: 'MB_FRLG_BLINKING_LIGHTS',
0x9F: 'MB_FRLG_NEATLY_LINED_UP_TOOLS',
0xA0: 'MB_FRLG_IMPRESSIVE_MACHINE',
0xA1: 'MB_FRLG_VIDEO_GAME',
0xA2: 'MB_FRLG_BURGLARY',
0xA3: 'MB_FRLG_TRAINER_TOWER_MONITOR',
0xD0: 'MB_FRLG_CYCLING_ROAD_PULL_DOWN',
0xD1: 'MB_FRLG_CYCLING_ROAD_PULL_DOWN_GRASS',
}
EMERALD_BEHAVIORS = {
'MB_NORMAL': 0,
'MB_SECRET_BASE_WALL': 1,
'MB_TALL_GRASS': 2,
'MB_LONG_GRASS': 3,
'MB_UNUSED_04': 4,
'MB_UNUSED_05': 5,
'MB_DEEP_SAND': 6,
'MB_SHORT_GRASS': 7,
'MB_CAVE': 8,
'MB_LONG_GRASS_SOUTH_EDGE': 9,
'MB_NO_RUNNING': 10,
'MB_INDOOR_ENCOUNTER': 11,
'MB_MOUNTAIN_TOP': 12,
'MB_BATTLE_PYRAMID_WARP': 13,
'MB_MOSSDEEP_GYM_WARP': 14,
'MB_MT_PYRE_HOLE': 15,
'MB_POND_WATER': 16,
'MB_INTERIOR_DEEP_WATER': 17,
'MB_DEEP_WATER': 18,
'MB_WATERFALL': 19,
'MB_SOOTOPOLIS_DEEP_WATER': 20,
'MB_OCEAN_WATER': 21,
'MB_PUDDLE': 22,
'MB_SHALLOW_WATER': 23,
'MB_UNUSED_SOOTOPOLIS_DEEP_WATER': 24,
'MB_NO_SURFACING': 25,
'MB_UNUSED_SOOTOPOLIS_DEEP_WATER_2': 26,
'MB_STAIRS_OUTSIDE_ABANDONED_SHIP': 27,
'MB_SHOAL_CAVE_ENTRANCE': 28,
'MB_SIGNPOST': 29,
'MB_POKEMON_CENTER_SIGN': 30,
'MB_POKEMART_SIGN': 31,
'MB_ICE': 32,
'MB_SAND': 33,
'MB_SEAWEED': 34,
'MB_STRENGTH_BUTTON': 35,
'MB_ASHGRASS': 36,
'MB_FOOTPRINTS': 37,
'MB_THIN_ICE': 38,
'MB_CRACKED_ICE': 39,
'MB_HOT_SPRINGS': 40,
'MB_LAVARIDGE_GYM_B1F_WARP': 41,
'MB_SEAWEED_NO_SURFACING': 42,
'MB_REFLECTION_UNDER_BRIDGE': 43,
'MB_FAST_WATER': 44,
'MB_CYCLING_ROAD_WATER': 45,
'MB_UNUSED_2E': 46,
'MB_UNUSED_2F': 47,
'MB_IMPASSABLE_EAST': 48,
'MB_IMPASSABLE_WEST': 49,
'MB_IMPASSABLE_NORTH': 50,
'MB_IMPASSABLE_SOUTH': 51,
'MB_IMPASSABLE_NORTHEAST': 52,
'MB_IMPASSABLE_NORTHWEST': 53,
'MB_IMPASSABLE_SOUTHEAST': 54,
'MB_IMPASSABLE_SOUTHWEST': 55,
'MB_JUMP_EAST': 56,
'MB_JUMP_WEST': 57,
'MB_JUMP_NORTH': 58,
'MB_JUMP_SOUTH': 59,
'MB_JUMP_NORTHEAST': 60,
'MB_JUMP_NORTHWEST': 61,
'MB_JUMP_SOUTHEAST': 62,
'MB_JUMP_SOUTHWEST': 63,
'MB_WALK_EAST': 64,
'MB_WALK_WEST': 65,
'MB_WALK_NORTH': 66,
'MB_WALK_SOUTH': 67,
'MB_SLIDE_EAST': 68,
'MB_SLIDE_WEST': 69,
'MB_SLIDE_NORTH': 70,
'MB_SLIDE_SOUTH': 71,
'MB_TRICK_HOUSE_PUZZLE_8_FLOOR': 72,
'MB_SIDEWAYS_STAIRS_RIGHT_SIDE': 73,
'MB_SIDEWAYS_STAIRS_LEFT_SIDE': 74,
'MB_SIDEWAYS_STAIRS_RIGHT_SIDE_TOP': 75,
'MB_SIDEWAYS_STAIRS_LEFT_SIDE_TOP': 76,
'MB_SIDEWAYS_STAIRS_RIGHT_SIDE_BOTTOM': 77,
'MB_SIDEWAYS_STAIRS_LEFT_SIDE_BOTTOM': 78,
'MB_ROCK_STAIRS': 79,
'MB_EASTWARD_CURRENT': 80,
'MB_WESTWARD_CURRENT': 81,
'MB_NORTHWARD_CURRENT': 82,
'MB_SOUTHWARD_CURRENT': 83,
'MB_SPIN_RIGHT': 84,
'MB_SPIN_LEFT': 85,
'MB_SPIN_UP': 86,
'MB_SPIN_DOWN': 87,
'MB_STOP_SPINNING': 88,
'MB_CABINET': 89,
'MB_KITCHEN': 90,
'MB_DRESSER': 91,
'MB_SNACKS': 92,
'MB_CABLE_CLUB_WIRELESS_MONITOR': 93,
'MB_BATTLE_RECORDS': 94,
'MB_FOOD': 95,
'MB_NON_ANIMATED_DOOR': 96,
'MB_LADDER': 97,
'MB_EAST_ARROW_WARP': 98,
'MB_WEST_ARROW_WARP': 99,
'MB_NORTH_ARROW_WARP': 100,
'MB_SOUTH_ARROW_WARP': 101,
'MB_CRACKED_FLOOR_HOLE': 102,
'MB_AQUA_HIDEOUT_WARP': 103,
'MB_LAVARIDGE_GYM_1F_WARP': 104,
'MB_ANIMATED_DOOR': 105,
'MB_UP_ESCALATOR': 106,
'MB_DOWN_ESCALATOR': 107,
'MB_WATER_DOOR': 108,
'MB_WATER_SOUTH_ARROW_WARP': 109,
'MB_DEEP_SOUTH_WARP': 110,
'MB_UNUSED_6F': 111,
'MB_BRIDGE_OVER_OCEAN': 112,
'MB_BRIDGE_OVER_POND_LOW': 113,
'MB_BRIDGE_OVER_POND_MED': 114,
'MB_BRIDGE_OVER_POND_HIGH': 115,
'MB_PACIFIDLOG_VERTICAL_LOG_TOP': 116,
'MB_PACIFIDLOG_VERTICAL_LOG_BOTTOM': 117,
'MB_PACIFIDLOG_HORIZONTAL_LOG_LEFT': 118,
'MB_PACIFIDLOG_HORIZONTAL_LOG_RIGHT': 119,
'MB_FORTREE_BRIDGE': 120,
'MB_UNUSED_79': 121,
'MB_BRIDGE_OVER_POND_MED_EDGE_1': 122,
'MB_BRIDGE_OVER_POND_MED_EDGE_2': 123,
'MB_BRIDGE_OVER_POND_HIGH_EDGE_1': 124,
'MB_BRIDGE_OVER_POND_HIGH_EDGE_2': 125,
'MB_UNUSED_BRIDGE': 126,
'MB_BIKE_BRIDGE_OVER_BARRIER': 127,
'MB_COUNTER': 128,
'MB_UNUSED_81': 129,
'MB_UNUSED_82': 130,
'MB_PC': 131,
'MB_CABLE_BOX_RESULTS_1': 132,
'MB_REGION_MAP': 133,
'MB_TELEVISION': 134,
'MB_POKEBLOCK_FEEDER': 135,
'MB_UNUSED_88': 136,
'MB_SLOT_MACHINE': 137,
'MB_ROULETTE': 138,
'MB_CLOSED_SOOTOPOLIS_DOOR': 139,
'MB_TRICK_HOUSE_PUZZLE_DOOR': 140,
'MB_PETALBURG_GYM_DOOR': 141,
'MB_RUNNING_SHOES_INSTRUCTION': 142,
'MB_QUESTIONNAIRE': 143,
'MB_SECRET_BASE_SPOT_RED_CAVE': 144,
'MB_SECRET_BASE_SPOT_RED_CAVE_OPEN': 145,
'MB_SECRET_BASE_SPOT_BROWN_CAVE': 146,
'MB_SECRET_BASE_SPOT_BROWN_CAVE_OPEN': 147,
'MB_SECRET_BASE_SPOT_YELLOW_CAVE': 148,
'MB_SECRET_BASE_SPOT_YELLOW_CAVE_OPEN': 149,
'MB_SECRET_BASE_SPOT_TREE_LEFT': 150,
'MB_SECRET_BASE_SPOT_TREE_LEFT_OPEN': 151,
'MB_SECRET_BASE_SPOT_SHRUB': 152,
'MB_SECRET_BASE_SPOT_SHRUB_OPEN': 153,
'MB_SECRET_BASE_SPOT_BLUE_CAVE': 154,
'MB_SECRET_BASE_SPOT_BLUE_CAVE_OPEN': 155,
'MB_SECRET_BASE_SPOT_TREE_RIGHT': 156,
'MB_SECRET_BASE_SPOT_TREE_RIGHT_OPEN': 157,
'MB_UNUSED_9E': 158,
'MB_UNUSED_9F': 159,
'MB_BERRY_TREE_SOIL': 160,
'MB_INDIGO_PLATEAU_SIGN_1': 161,
'MB_INDIGO_PLATEAU_SIGN_2': 162,
'MB_BLUEPRINTS': 163,
'MB_PAINTING': 164,
'MB_POWER_PLANT_MACHINE': 165,
'MB_TELEPHONE': 166,
'MB_COMPUTER': 167,
'MB_ADVERTISING_POSTER': 168,
'MB_FOOD_SMELLS_TASTY': 169,
'MB_PORTHOLE': 170,
'MB_WINDOW': 171,
'MB_CUP': 172,
'MB_BLINKING_LIGHTS': 173,
'MB_NEATLY_LINED_UP_TOOLS': 174,
'MB_IMPRESSIVE_MACHINE': 175,
'MB_SECRET_BASE_PC': 176,
'MB_SECRET_BASE_REGISTER_PC': 177,
'MB_SECRET_BASE_SCENERY': 178,
'MB_SECRET_BASE_TRAINER_SPOT': 179,
'MB_SECRET_BASE_DECORATION': 180,
'MB_HOLDS_SMALL_DECORATION': 181,
'MB_UNUSED_B6': 182,
'MB_SECRET_BASE_NORTH_WALL': 183,
'MB_SECRET_BASE_BALLOON': 184,
'MB_SECRET_BASE_IMPASSABLE': 185,
'MB_SECRET_BASE_GLITTER_MAT': 186,
'MB_SECRET_BASE_JUMP_MAT': 187,
'MB_SECRET_BASE_SPIN_MAT': 188,
'MB_SECRET_BASE_SOUND_MAT': 189,
'MB_SECRET_BASE_BREAKABLE_DOOR': 190,
'MB_SECRET_BASE_SAND_ORNAMENT': 191,
'MB_IMPASSABLE_SOUTH_AND_NORTH': 192,
'MB_IMPASSABLE_WEST_AND_EAST': 193,
'MB_SECRET_BASE_HOLE': 194,
'MB_HOLDS_LARGE_DECORATION': 195,
'MB_SECRET_BASE_TV_SHIELD': 196,
'MB_PLAYER_ROOM_PC_ON': 197,
'MB_SECRET_BASE_DECORATION_BASE': 198,
'MB_SECRET_BASE_POSTER': 199,
'MB_CYCLING_ROAD_PULL_DOWN': 200,
'MB_CYCLING_ROAD_PULL_DOWN_GRASS': 201,
'MB_VIDEO_GAME': 202,
'MB_BURGLARY': 203,
'MB_TRAINER_TOWER_MONITOR': 204,
'MB_UNUSED_CD': 205,
'MB_UNUSED_CE': 206,
'MB_UNUSED_CF': 207,
'MB_MUDDY_SLOPE': 208,
'MB_BUMPY_SLOPE': 209,
'MB_CRACKED_FLOOR': 210,
'MB_ISOLATED_VERTICAL_RAIL': 211,
'MB_ISOLATED_HORIZONTAL_RAIL': 212,
'MB_VERTICAL_RAIL': 213,
'MB_HORIZONTAL_RAIL': 214,
'MB_UNUSED_D7': 215,
'MB_UNUSED_D8': 216,
'MB_UNUSED_D9': 217,
'MB_UNUSED_DA': 218,
'MB_UNUSED_DB': 219,
'MB_UNUSED_DC': 220,
'MB_UNUSED_DD': 221,
'MB_UNUSED_DE': 222,
'MB_UNUSED_DF': 223,
'MB_PICTURE_BOOK_SHELF': 224,
'MB_BOOKSHELF': 225,
'MB_POKEMON_CENTER_BOOKSHELF': 226,
'MB_VASE': 227,
'MB_TRASH_CAN': 228,
'MB_SHOP_SHELF': 229,
'MB_BLUEPRINT': 230,
'MB_CABLE_BOX_RESULTS_2': 231,
'MB_WIRELESS_BOX_RESULTS': 232,
'MB_TRAINER_HILL_TIMER': 233,
'MB_SKY_PILLAR_CLOSED_DOOR': 234,
'MB_UP_RIGHT_STAIR_WARP': 235,
'MB_UP_LEFT_STAIR_WARP': 236,
'MB_DOWN_RIGHT_STAIR_WARP': 237,
'MB_DOWN_LEFT_STAIR_WARP': 238,
'MB_ROCK_CLIMB': 239,
}
FRLG_TO_EMERALD = {
'MB_FRLG_NORMAL': 'MB_NORMAL',
'MB_FRLG_UNUSED_01': 'MB_SECRET_BASE_WALL',
'MB_FRLG_TALL_GRASS': 'MB_TALL_GRASS',
'MB_FRLG_CAVE': 'MB_CAVE',
'MB_FRLG_RUNNING_DISALLOWED': 'MB_NO_RUNNING',
'MB_FRLG_INDOOR_ENCOUNTER': 'MB_INDOOR_ENCOUNTER',
'MB_FRLG_MOUNTAIN_TOP': 'MB_MOUNTAIN_TOP',
'MB_FRLG_POND_WATER': 'MB_POND_WATER',
'MB_FRLG_FAST_WATER': 'MB_FAST_WATER',
'MB_FRLG_DEEP_WATER': 'MB_DEEP_WATER',
'MB_FRLG_WATERFALL': 'MB_WATERFALL',
'MB_FRLG_OCEAN_WATER': 'MB_OCEAN_WATER',
'MB_FRLG_PUDDLE': 'MB_PUDDLE',
'MB_FRLG_SHALLOW_WATER': 'MB_SHALLOW_WATER',
'MB_FRLG_UNDERWATER_BLOCKED_ABOVE': 'MB_NO_SURFACING',
'MB_FRLG_UNUSED_WATER': 'MB_UNUSED_SOOTOPOLIS_DEEP_WATER_2',
'MB_FRLG_CYCLING_ROAD_WATER': 'MB_CYCLING_ROAD_WATER',
'MB_FRLG_STRENGTH_BUTTON': 'MB_STRENGTH_BUTTON',
'MB_FRLG_SAND': 'MB_SAND',
'MB_FRLG_SEAWEED': 'MB_SEAWEED',
'MB_FRLG_ICE': 'MB_ICE',
'MB_FRLG_THIN_ICE': 'MB_THIN_ICE',
'MB_FRLG_CRACKED_ICE': 'MB_CRACKED_ICE',
'MB_FRLG_HOT_SPRINGS': 'MB_HOT_SPRINGS',
'MB_FRLG_ROCK_STAIRS': 'MB_ROCK_STAIRS',
'MB_FRLG_SAND_CAVE': 'MB_NORMAL',
'MB_FRLG_IMPASSABLE_EAST': 'MB_IMPASSABLE_EAST',
'MB_FRLG_IMPASSABLE_WEST': 'MB_IMPASSABLE_WEST',
'MB_FRLG_IMPASSABLE_NORTH': 'MB_IMPASSABLE_NORTH',
'MB_FRLG_IMPASSABLE_SOUTH': 'MB_IMPASSABLE_SOUTH',
'MB_FRLG_IMPASSABLE_NORTHEAST': 'MB_IMPASSABLE_NORTHEAST',
'MB_FRLG_IMPASSABLE_NORTHWEST': 'MB_IMPASSABLE_NORTHWEST',
'MB_FRLG_IMPASSABLE_SOUTHEAST': 'MB_IMPASSABLE_SOUTHEAST',
'MB_FRLG_IMPASSABLE_SOUTHWEST': 'MB_IMPASSABLE_SOUTHWEST',
'MB_FRLG_JUMP_EAST': 'MB_JUMP_EAST',
'MB_FRLG_JUMP_WEST': 'MB_JUMP_WEST',
'MB_FRLG_JUMP_NORTH': 'MB_JUMP_NORTH',
'MB_FRLG_JUMP_SOUTH': 'MB_JUMP_SOUTH',
'MB_FRLG_WALK_EAST': 'MB_WALK_EAST',
'MB_FRLG_WALK_WEST': 'MB_WALK_WEST',
'MB_FRLG_WALK_NORTH': 'MB_WALK_NORTH',
'MB_FRLG_WALK_SOUTH': 'MB_WALK_SOUTH',
'MB_FRLG_SLIDE_EAST': 'MB_SLIDE_EAST',
'MB_FRLG_SLIDE_WEST': 'MB_SLIDE_WEST',
'MB_FRLG_SLIDE_NORTH': 'MB_SLIDE_NORTH',
'MB_FRLG_SLIDE_SOUTH': 'MB_SLIDE_SOUTH',
'MB_FRLG_TRICK_HOUSE_PUZZLE_8_FLOOR': 'MB_TRICK_HOUSE_PUZZLE_8_FLOOR',
'MB_FRLG_EASTWARD_CURRENT': 'MB_EASTWARD_CURRENT',
'MB_FRLG_WESTWARD_CURRENT': 'MB_WESTWARD_CURRENT',
'MB_FRLG_NORTHWARD_CURRENT': 'MB_NORTHWARD_CURRENT',
'MB_FRLG_SOUTHWARD_CURRENT': 'MB_SOUTHWARD_CURRENT',
'MB_FRLG_SPIN_RIGHT': 'MB_SPIN_RIGHT',
'MB_FRLG_SPIN_LEFT': 'MB_SPIN_LEFT',
'MB_FRLG_SPIN_UP': 'MB_SPIN_UP',
'MB_FRLG_SPIN_DOWN': 'MB_SPIN_DOWN',
'MB_FRLG_STOP_SPINNING': 'MB_STOP_SPINNING',
'MB_FRLG_CAVE_DOOR': 'MB_NON_ANIMATED_DOOR',
'MB_FRLG_LADDER': 'MB_LADDER',
'MB_FRLG_EAST_ARROW_WARP': 'MB_EAST_ARROW_WARP',
'MB_FRLG_WEST_ARROW_WARP': 'MB_WEST_ARROW_WARP',
'MB_FRLG_NORTH_ARROW_WARP': 'MB_NORTH_ARROW_WARP',
'MB_FRLG_SOUTH_ARROW_WARP': 'MB_SOUTH_ARROW_WARP',
'MB_FRLG_FALL_WARP': 'MB_MT_PYRE_HOLE',
'MB_FRLG_REGULAR_WARP': 'MB_AQUA_HIDEOUT_WARP',
'MB_FRLG_LAVARIDGE_1F_WARP': 'MB_LAVARIDGE_GYM_1F_WARP',
'MB_FRLG_WARP_DOOR': 'MB_ANIMATED_DOOR',
'MB_FRLG_UP_ESCALATOR': 'MB_UP_ESCALATOR',
'MB_FRLG_DOWN_ESCALATOR': 'MB_DOWN_ESCALATOR',
'MB_FRLG_UP_RIGHT_STAIR_WARP': 'MB_UP_RIGHT_STAIR_WARP',
'MB_FRLG_UP_LEFT_STAIR_WARP': 'MB_UP_LEFT_STAIR_WARP',
'MB_FRLG_DOWN_RIGHT_STAIR_WARP': 'MB_DOWN_RIGHT_STAIR_WARP',
'MB_FRLG_DOWN_LEFT_STAIR_WARP': 'MB_DOWN_LEFT_STAIR_WARP',
'MB_FRLG_UNION_ROOM_WARP': 'MB_BRIDGE_OVER_OCEAN',
'MB_FRLG_COUNTER': 'MB_COUNTER',
'MB_FRLG_BOOKSHELF': 'MB_BOOKSHELF',
'MB_FRLG_POKEMART_SHELF': 'MB_POKEMON_CENTER_BOOKSHELF',
'MB_FRLG_PC': 'MB_PC',
'MB_FRLG_SIGNPOST': 'MB_SIGNPOST',
'MB_FRLG_REGION_MAP': 'MB_REGION_MAP',
'MB_FRLG_TELEVISION': 'MB_TELEVISION',
'MB_FRLG_POKEMON_CENTER_SIGN': 'MB_POKEMON_CENTER_SIGN',
'MB_FRLG_POKEMART_SIGN': 'MB_POKEMART_SIGN',
'MB_FRLG_CABINET': 'MB_CABINET',
'MB_FRLG_KITCHEN': 'MB_KITCHEN',
'MB_FRLG_DRESSER': 'MB_DRESSER',
'MB_FRLG_SNACKS': 'MB_SNACKS',
'MB_FRLG_CABLE_CLUB_WIRELESS_MONITOR': 'MB_CABLE_CLUB_WIRELESS_MONITOR',
'MB_FRLG_BATTLE_RECORDS': 'MB_BATTLE_RECORDS',
'MB_FRLG_QUESTIONNAIRE': 'MB_QUESTIONNAIRE',
'MB_FRLG_FOOD': 'MB_FOOD',
'MB_FRLG_INDIGO_PLATEAU_SIGN_1': 'MB_INDIGO_PLATEAU_SIGN_1',
'MB_FRLG_INDIGO_PLATEAU_SIGN_2': 'MB_INDIGO_PLATEAU_SIGN_2',
'MB_FRLG_BLUEPRINTS': 'MB_BLUEPRINTS',
'MB_FRLG_PAINTING': 'MB_PAINTING',
'MB_FRLG_POWER_PLANT_MACHINE': 'MB_POWER_PLANT_MACHINE',
'MB_FRLG_TELEPHONE': 'MB_TELEPHONE',
'MB_FRLG_COMPUTER': 'MB_COMPUTER',
'MB_FRLG_ADVERTISING_POSTER': 'MB_ADVERTISING_POSTER',
'MB_FRLG_FOOD_SMELLS_TASTY': 'MB_FOOD_SMELLS_TASTY',
'MB_FRLG_TRASH_BIN': 'MB_TRASH_CAN',
'MB_FRLG_CUP': 'MB_CUP',
'MB_FRLG_PORTHOLE': 'MB_PORTHOLE',
'MB_FRLG_WINDOW': 'MB_WINDOW',
'MB_FRLG_BLINKING_LIGHTS': 'MB_BLINKING_LIGHTS',
'MB_FRLG_NEATLY_LINED_UP_TOOLS': 'MB_NEATLY_LINED_UP_TOOLS',
'MB_FRLG_IMPRESSIVE_MACHINE': 'MB_IMPRESSIVE_MACHINE',
'MB_FRLG_VIDEO_GAME': 'MB_VIDEO_GAME',
'MB_FRLG_BURGLARY': 'MB_BURGLARY',
'MB_FRLG_TRAINER_TOWER_MONITOR': 'MB_TRAINER_TOWER_MONITOR',
'MB_FRLG_CYCLING_ROAD_PULL_DOWN': 'MB_CYCLING_ROAD_PULL_DOWN',
'MB_FRLG_CYCLING_ROAD_PULL_DOWN_GRASS': 'MB_CYCLING_ROAD_PULL_DOWN_GRASS',
}
BEHAVIOR_MASK = 0x000001ff
def process_metatile_attribute_data(old_data):
new_data = []
ctr = 0
result = {}
for value in old_data:
frlg_behavior = value & BEHAVIOR_MASK
if frlg_behavior not in FRLG_BEHAVIORS:
print(f'Unknown behavior: {frlg_behavior}. Keeping same value.')
emerald_behavior = frlg_behavior
else:
emerald_behavior = EMERALD_BEHAVIORS[FRLG_TO_EMERALD[FRLG_BEHAVIORS[frlg_behavior]]]
new_value = emerald_behavior | (value & ~BEHAVIOR_MASK)
new_data.append(new_value)
return new_data
def read_attribute_bin(file_path):
with open(file_path, "rb") as f:
data = f.read()
return list(struct.unpack("<" + "I" * (len(data) // 4), data))
def write_attribute_bin(file_path, new_data):
with open(file_path, "wb") as f:
f.write(struct.pack("<" + "I" * len(new_data), *new_data))
def process_metatile_attribute_files():
for file in glob.glob(ATTRIBUTES_PATH):
print(f"Processing {file}...")
old_data = read_attribute_bin(file)
new_data = process_metatile_attribute_data(old_data)
write_attribute_bin(file, new_data)
if __name__ == "__main__":
process_metatile_attribute_files()