562 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			562 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | COUNT = 0xFB | ||
|  | NAME = [ | ||
|  |     "ARROW", | ||
|  |     "BOOMERANG", | ||
|  |     "BOMB", | ||
|  |     "HOOKSHOT_CHAIN", | ||
|  |     "HOOKSHOT_HIT", | ||
|  |     "LIFTABLE_ROCK", | ||
|  |     "PUSHED_BLOCK", | ||
|  |     "CHEST_WITH_ITEM", | ||
|  |     "MAGIC_POWDER_SPRINKLE", | ||
|  |     "OCTOROCK", | ||
|  |     "OCTOROCK_ROCK", | ||
|  |     "MOBLIN", | ||
|  |     "MOBLIN_ARROW", | ||
|  |     "TEKTITE", | ||
|  |     "LEEVER", | ||
|  |     "ARMOS_STATUE", | ||
|  |     "HIDING_GHINI", | ||
|  |     "GIANT_GHINI", | ||
|  |     "GHINI", | ||
|  |     "BROKEN_HEART_CONTAINER", | ||
|  |     "MOBLIN_SWORD", | ||
|  |     "ANTI_FAIRY", | ||
|  |     "SPARK_COUNTER_CLOCKWISE", | ||
|  |     "SPARK_CLOCKWISE", | ||
|  |     "POLS_VOICE", | ||
|  |     "KEESE", | ||
|  |     "STALFOS_AGGRESSIVE", | ||
|  |     "GEL", | ||
|  |     "MINI_GEL", | ||
|  |     "DISABLED", | ||
|  |     "STALFOS_EVASIVE", | ||
|  |     "GIBDO", | ||
|  |     "HARDHAT_BEETLE", | ||
|  |     "WIZROBE", | ||
|  |     "WIZROBE_PROJECTILE", | ||
|  |     "LIKE_LIKE", | ||
|  |     "IRON_MASK", | ||
|  |     "SMALL_EXPLOSION_ENEMY", | ||
|  |     "SMALL_EXPLOSION_ENEMY_2", | ||
|  |     "SPIKE_TRAP", | ||
|  |     "MIMIC", | ||
|  |     "MINI_MOLDORM", | ||
|  |     "LASER", | ||
|  |     "LASER_BEAM", | ||
|  |     "SPIKED_BEETLE", | ||
|  |     "DROPPABLE_HEART", | ||
|  |     "DROPPABLE_RUPEE", | ||
|  |     "DROPPABLE_FAIRY", | ||
|  |     "KEY_DROP_POINT", | ||
|  |     "SWORD", | ||
|  |     "32", | ||
|  |     "PIECE_OF_POWER", | ||
|  |     "GUARDIAN_ACORN", | ||
|  |     "HEART_PIECE", | ||
|  |     "HEART_CONTAINER", | ||
|  |     "DROPPABLE_ARROWS", | ||
|  |     "DROPPABLE_BOMBS", | ||
|  |     "INSTRUMENT_OF_THE_SIRENS", | ||
|  |     "SLEEPY_TOADSTOOL", | ||
|  |     "DROPPABLE_MAGIC_POWDER", | ||
|  |     "HIDING_SLIME_KEY", | ||
|  |     "DROPPABLE_SECRET_SEASHELL", | ||
|  |     "MARIN", | ||
|  |     "RACOON", | ||
|  |     "WITCH", | ||
|  |     "OWL_EVENT", | ||
|  |     "OWL_STATUE", | ||
|  |     "SEASHELL_MANSION_TREES", | ||
|  |     "YARNA_TALKING_BONES", | ||
|  |     "BOULDERS", | ||
|  |     "MOVING_BLOCK_LEFT_TOP", | ||
|  |     "MOVING_BLOCK_LEFT_BOTTOM", | ||
|  |     "MOVING_BLOCK_BOTTOM_LEFT", | ||
|  |     "MOVING_BLOCK_BOTTOM_RIGHT", | ||
|  |     "COLOR_DUNGEON_BOOK", | ||
|  |     "POT", | ||
|  |     "DISABLED", | ||
|  |     "SHOP_OWNER", | ||
|  |     "4D", | ||
|  |     "TRENDY_GAME_OWNER", | ||
|  |     "BOO_BUDDY", | ||
|  |     "KNIGHT", | ||
|  |     "TRACTOR_DEVICE", | ||
|  |     "TRACTOR_DEVICE_REVERSE", | ||
|  |     "FISHERMAN_FISHING_GAME", | ||
|  |     "BOUNCING_BOMBITE", | ||
|  |     "TIMER_BOMBITE", | ||
|  |     "PAIRODD", | ||
|  |     "PAIRODD_PROJECTILE", | ||
|  |     "MOLDORM", | ||
|  |     "FACADE", | ||
|  |     "SLIME_EYE", | ||
|  |     "GENIE", | ||
|  |     "SLIME_EEL", | ||
|  |     "GHOMA", | ||
|  |     "MASTER_STALFOS", | ||
|  |     "DODONGO_SNAKE", | ||
|  |     "WARP", | ||
|  |     "HOT_HEAD", | ||
|  |     "EVIL_EAGLE", | ||
|  |     "SOUTH_FACE_SHRINE_DOOR", | ||
|  |     "ANGLER_FISH", | ||
|  |     "CRYSTAL_SWITCH", | ||
|  |     "67", | ||
|  |     "68", | ||
|  |     "MOVING_BLOCK_MOVER", | ||
|  |     "RAFT_RAFT_OWNER", | ||
|  |     "TEXT_DEBUGGER", | ||
|  |     "CUCCO", | ||
|  |     "BOW_WOW", | ||
|  |     "BUTTERFLY", | ||
|  |     "DOG", | ||
|  |     "KID_70", | ||
|  |     "KID_71", | ||
|  |     "KID_72", | ||
|  |     "KID_73", | ||
|  |     "PAPAHLS_WIFE", | ||
|  |     "GRANDMA_ULRIRA", | ||
|  |     "MR_WRITE", | ||
|  |     "GRANDPA_ULRIRA", | ||
|  |     "YIP_YIP", | ||
|  |     "MADAM_MEOWMEOW", | ||
|  |     "CROW", | ||
|  |     "CRAZY_TRACY", | ||
|  |     "GIANT_GOPONGA_FLOWER", | ||
|  |     "GOPONGA_FLOWER_PROJECTILE", | ||
|  |     "GOPONGA_FLOWER", | ||
|  |     "TURTLE_ROCK_HEAD", | ||
|  |     "TELEPHONE", | ||
|  |     "ROLLING_BONES", | ||
|  |     "ROLLING_BONES_BAR", | ||
|  |     "DREAM_SHRINE_BED", | ||
|  |     "BIG_FAIRY", | ||
|  |     "MR_WRITES_BIRD", | ||
|  |     "FLOATING_ITEM", | ||
|  |     "DESERT_LANMOLA", | ||
|  |     "ARMOS_KNIGHT", | ||
|  |     "HINOX", | ||
|  |     "TILE_GLINT_SHOWN", | ||
|  |     "TILE_GLINT_HIDDEN", | ||
|  |     "8C", | ||
|  |     "8D", | ||
|  |     "CUE_BALL", | ||
|  |     "MASKED_MIMIC_GORIYA", | ||
|  |     "THREE_OF_A_KIND", | ||
|  |     "ANTI_KIRBY", | ||
|  |     "SMASHER", | ||
|  |     "MAD_BOMBER", | ||
|  |     "KANALET_BOMBABLE_WALL", | ||
|  |     "RICHARD", | ||
|  |     "RICHARD_FROG", | ||
|  |     "DIVE_SPOT", | ||
|  |     "HORSE_PIECE", | ||
|  |     "WATER_TEKTITE", | ||
|  |     "FLYING_TILES", | ||
|  |     "HIDING_GEL", | ||
|  |     "STAR", | ||
|  |     "LIFTABLE_STATUE", | ||
|  |     "FIREBALL_SHOOTER", | ||
|  |     "GOOMBA", | ||
|  |     "PEAHAT", | ||
|  |     "SNAKE", | ||
|  |     "PIRANHA_PLANT", | ||
|  |     "SIDE_VIEW_PLATFORM_HORIZONTAL", | ||
|  |     "SIDE_VIEW_PLATFORM_VERTICAL", | ||
|  |     "SIDE_VIEW_PLATFORM", | ||
|  |     "SIDE_VIEW_WEIGHTS", | ||
|  |     "SMASHABLE_PILLAR", | ||
|  |     "WRECKING_BALL", | ||
|  |     "BLOOPER", | ||
|  |     "CHEEP_CHEEP_HORIZONTAL", | ||
|  |     "CHEEP_CHEEP_VERTICAL", | ||
|  |     "CHEEP_CHEEP_JUMPING", | ||
|  |     "KIKI_THE_MONKEY", | ||
|  |     "WINGED_OCTOROK", | ||
|  |     "TRADING_ITEM", | ||
|  |     "PINCER", | ||
|  |     "HOLE_FILLER", | ||
|  |     "BEETLE_SPAWNER", | ||
|  |     "HONEYCOMB", | ||
|  |     "TARIN", | ||
|  |     "BEAR", | ||
|  |     "PAPAHL", | ||
|  |     "MERMAID", | ||
|  |     "FISHERMAN_UNDER_BRIDGE", | ||
|  |     "BUZZ_BLOB", | ||
|  |     "BOMBER", | ||
|  |     "BUSH_CRAWLER", | ||
|  |     "GRIM_CREEPER", | ||
|  |     "VIRE", | ||
|  |     "BLAINO", | ||
|  |     "ZOMBIE", | ||
|  |     "MAZE_SIGNPOST", | ||
|  |     "MARIN_AT_THE_SHORE", | ||
|  |     "MARIN_AT_TAL_TAL_HEIGHTS", | ||
|  |     "MAMU_AND_FROGS", | ||
|  |     "WALRUS", | ||
|  |     "URCHIN", | ||
|  |     "SAND_CRAB", | ||
|  |     "MANBO_AND_FISHES", | ||
|  |     "BUNNY_CALLING_MARIN", | ||
|  |     "MUSICAL_NOTE", | ||
|  |     "MAD_BATTER", | ||
|  |     "ZORA", | ||
|  |     "FISH", | ||
|  |     "BANANAS_SCHULE_SALE", | ||
|  |     "MERMAID_STATUE", | ||
|  |     "SEASHELL_MANSION", | ||
|  |     "ANIMAL_D0", | ||
|  |     "ANIMAL_D1", | ||
|  |     "ANIMAL_D2", | ||
|  |     "BUNNY_D3", | ||
|  |     "GHOST", | ||
|  |     "ROOSTER", | ||
|  |     "SIDE_VIEW_POT", | ||
|  |     "THWIMP", | ||
|  |     "THWOMP", | ||
|  |     "THWOMP_RAMMABLE", | ||
|  |     "PODOBOO", | ||
|  |     "GIANT_BUBBLE", | ||
|  |     "FLYING_ROOSTER_EVENTS", | ||
|  |     "BOOK", | ||
|  |     "EGG_SONG_EVENT", | ||
|  |     "SWORD_BEAM", | ||
|  |     "MONKEY", | ||
|  |     "WITCH_RAT", | ||
|  |     "FLAME_SHOOTER", | ||
|  |     "POKEY", | ||
|  |     "MOBLIN_KING", | ||
|  |     "FLOATING_ITEM_2", | ||
|  |     "FINAL_NIGHTMARE", | ||
|  |     "KANALET_CASTLE_GATE_SWITCH", | ||
|  |     "ENDING_OWL_STAIR_CLIMBING", | ||
|  |     "COLOR_SHELL_RED", | ||
|  |     "COLOR_SHELL_GREEN", | ||
|  |     "COLOR_SHELL_BLUE", | ||
|  |     "COLOR_GHOUL_RED", | ||
|  |     "COLOR_GHOUL_GREEN", | ||
|  |     "COLOR_GHOUL_BLUE", | ||
|  |     "ROTOSWITCH_RED", | ||
|  |     "ROTOSWITCH_YELLOW", | ||
|  |     "ROTOSWITCH_BLUE", | ||
|  |     "FLYING_HOPPER_BOMBS", | ||
|  |     "HOPPER", | ||
|  |     "AVALAUNCH", | ||
|  |     "BOUNCING_BOULDER", | ||
|  |     "COLOR_GUARDIAN_BLUE", | ||
|  |     "COLOR_GUARDIAN_RED", | ||
|  |     "GIANT_BUZZ_BLOB", | ||
|  |     "HARDHIT_BEETLE", | ||
|  |     "PHOTOGRAPHER", | ||
|  | ] | ||
|  | 
 | ||
|  | def _moblinSpriteData(room): | ||
|  |     if room.room in (0x002, 0x013): # Tal tal heights exception | ||
|  |         return (2, 0x9C)  # Hooded stalfos | ||
|  |     if room.room < 0x100: | ||
|  |         x = room.room & 0x0F | ||
|  |         y = (room.room >> 4) & 0x0F | ||
|  |         if x < 0x04: # Left side is woods and mountain moblins | ||
|  |             return (2, 0x7C) # Moblin | ||
|  |         if 0x08 <= x <= 0x0B and 4 <= y <= 0x07: # Castle | ||
|  |             return (2, 0x92)  # Knight | ||
|  |         # Everything else is pigs | ||
|  |         return (2, 0x83) # Pig | ||
|  |     elif room.room < 0x1DF: # Dungeons contain hooded stalfos | ||
|  |         return (2, 0x9C)  # Hooded stalfos | ||
|  |     elif room.room < 0x200: # Caves contain moblins | ||
|  |         return (2, 0x7C)  # Moblin | ||
|  |     elif room.room < 0x276: # Dungeons contain hooded stalfos | ||
|  |         return (2, 0x9C)  # Hooded stalfos | ||
|  |     elif room.room < 0x300: # Caves contain moblins | ||
|  |         x = room.room & 0x0F | ||
|  |         y = (room.room >> 4) & 0x0F | ||
|  |         if 2 <= x <= 6 and 0x0C <= y <= 0x0D: # Castle indoors | ||
|  |             return (2, 0x92)  # Knight | ||
|  |         return (2, 0x7C)  # Moblin | ||
|  |     else: # Dungeon contains hooded stalfos | ||
|  |         return (2, 0x9C)  # Hooded stalfos | ||
|  | 
 | ||
|  | _CAVES_B_ROOMS = {0x2B6, 0x2B7, 0x2B8, 0x2B9, 0x285, 0x286, 0x2FD, 0x2F3, 0x2ED, 0x2EE, 0x2EA, 0x2EB, 0x2EC, 0x287, 0x2F1, 0x2F2, 0x2FE, 0x2EF, 0x2BA, 0x2BB, 0x2BC, 0x28D, 0x2F9, 0x2FA, 0x280, 0x281, 0x282, 0x283, 0x284, 0x28C, 0x288, 0x28A, 0x290, 0x291, 0x292, 0x28E, 0x29A, 0x289, 0x28B, 0x297, 0x293, 0x294, 0x295, 0x296, 0x2AB, 0x2AC, 0x298, 0x27A, 0x27B, 0x2E6, 0x2E7, 0x2BD, 0x27C, 0x27D, 0x27E, 0x2F6, 0x2F7, 0x2DE, 0x2DF} | ||
|  | 
 | ||
|  | # For each entity, which sprite slot is used and which value should be used. | ||
|  | SPRITE_DATA = { | ||
|  |     0x09: (2, 0xE3), # OCTOROCK | ||
|  |     0x0B: _moblinSpriteData, # MOBLIN | ||
|  |     0x0D: (1, 0x87), # TEKTITE | ||
|  |     0x0E: (1, 0x81), # LEEVER | ||
|  |     0x0F: (2, 0x78), # ARMOS_STATUE | ||
|  |     0x10: (1, 0x42), # HIDING_GHINI | ||
|  |     0x11: (2, 0x8A), # GIANT_GHINI | ||
|  |     0x12: (1, 0x42), # GHINI | ||
|  |     0x14: _moblinSpriteData, # MOBLIN_SWORD | ||
|  |     0x15: (1, 0x91), # ANTI_FAIRY | ||
|  |     0x16: (1, {0x91, 0x65}), # SPARK_COUNTER_CLOCKWISE | ||
|  |     0x17: (1, {0x91, 0x65}), # SPARK_CLOCKWISE | ||
|  |     0x18: (3, 0x93), # POLS_VOICE | ||
|  |     0x19: lambda room: (2, 0x90) if room.room in _CAVES_B_ROOMS else (0, 0x90), # KEESE | ||
|  |     0x1A: (0, {0x90, 0x77}), # STALFOS_AGGRESSIVE | ||
|  |     0x1B: None,      # GEL | ||
|  |     0x1C: (1, 0x91), # MINI_GEL | ||
|  |     0x1E: (0, {0x90, 0x77}), # STALFOS_EVASIVE | ||
|  |     0x1F: lambda room: (0, 0x77) if 0x230 <= room.room <= 0x26B else (0, 0x90, 3, 0x93), # GIBDO | ||
|  |     0x20: lambda room: (2, 0x90) if room.room in _CAVES_B_ROOMS else (0, 0x90), # HARDHAT_BEETLE | ||
|  |     0x21: (2, 0x95), # WIZROBE | ||
|  |     0x23: (3, 0x93), # LIKE_LIKE | ||
|  |     0x24: (2, 0x94, 3, 0x9F), # IRON_MASK | ||
|  |     0x27: (1, 0x91), # SPIKE_TRAP | ||
|  |     0x28: (2, 0x96), # MIMIC | ||
|  |     0x29: (3, 0x98), # MINI_MOLDORM | ||
|  |     0x2A: (3, 0x99), # LASER | ||
|  |     0x2C: lambda room: (2, 0x9B) if 0x15E <= room.room <= 0x17F else (3, 0x9B), # SPIKED_BEETLE | ||
|  |     0x2D: None,      # DROPPABLE_HEART | ||
|  |     0x2E: None,      # DROPPABLE_RUPEE | ||
|  |     0x2F: None,      # DROPPABLE_FAIRY | ||
|  |     0x30: None,      # KEY_DROP_POINT | ||
|  |     0x31: None,      # SWORD | ||
|  |     0x35: None,      # HEART_PIECE | ||
|  |     0x37: None,      # DROPPABLE_ARROWS | ||
|  |     0x38: None,      # DROPPABLE_BOMBS | ||
|  |     0x39: (2, 0x4F), # INSTRUMENT_OF_THE_SIRENS | ||
|  |     0x3A: (1, 0x8E), # SLEEPY_TOADSTOOL | ||
|  |     0x3B: None,      # DROPPABLE_MAGIC_POWDER | ||
|  |     0x3C: None,      # HIDING_SLIME_KEY | ||
|  |     0x3D: None,      # DROPPABLE_SECRET_SEASHELL | ||
|  |     0x3E: lambda room: (0, 0x8D, 2, 0x8F) if room.room == 0x2A3 else (2, 0xE6), # MARIN | ||
|  |     0x3F: lambda room: (1, 0x8E, 3, 0x6A) if room.room == 0x2A3 else (1, 0x6C, 3, 0xC8), # RACOON | ||
|  |     0x40: (2, 0xA3), # WITCH | ||
|  |     0x41: None,      # OWL_EVENT | ||
|  |     0x42: lambda room: (1, 0xD5) if room.room == 0x26F else (1, 0x91), # OWL_STATUE | ||
|  |     0x43: None,      # SEASHELL_MANSION_TREES | ||
|  |     0x44: None,      # YARNA_TALKING_BONES | ||
|  |     0x45: (1, 0x44), # BOULDERS | ||
|  |     0x46: None,      # MOVING_BLOCK_LEFT_TOP | ||
|  |     0x47: None,      # MOVING_BLOCK_LEFT_BOTTOM | ||
|  |     0x48: None,      # MOVING_BLOCK_BOTTOM_LEFT | ||
|  |     0x49: None,      # MOVING_BLOCK_BOTTOM_RIGHT | ||
|  |     0x4A: (1, 0xd5), # COLOR_DUNGEON_BOOK | ||
|  |     0x4C: None,      # Used by Bingo board, otherwise unused. | ||
|  |     0x4D: (2, 0x88, 3, 0xC7), # SHOP_OWNER | ||
|  |     0x4F: (2, 0x84, 3, 0x89), # TRENDY_GAME_OWNER | ||
|  |     0x50: (2, 0x97), # BOO_BUDDY | ||
|  |     0x51: (3, 0x9A), # KNIGHT | ||
|  |     0x52: lambda room: (3, {0x7b, 0xa6}) if 0x120 <= room.room <= 0x13F else (0, {0x7b, 0xa6}), # TRACTOR_DEVICE | ||
|  |     0x53: lambda room: (3, {0x7b, 0xa6}) if 0x120 <= room.room <= 0x13F else (0, {0x7b, 0xa6}), # TRACTOR_DEVICE_REVERSE | ||
|  |     0x54: lambda room: (0, 0xA0, 1, 0xA1) if room.room == 0x2B1 else (3, 0x4e), # FISHERMAN_FISHING_GAME | ||
|  |     0x55: (3, 0x9d), # BOUNCING_BOMBITE | ||
|  |     0x56: (3, 0x9d), # TIMER_BOMBITE | ||
|  |     0x57: (3, 0x9e), # PAIRODD | ||
|  |     0x59: (2, 0xb0, 3, 0xb1), # MOLDORM | ||
|  |     0x5A: (0, 0x66, 2, 0xb2, 3, 0xb3), # FACADE | ||
|  |     0x5B: (2, 0xb4, 3, 0xb5), # SLIME_EYE | ||
|  |     0x5C: (2, 0xb6, 3, 0xb7), # GENIE | ||
|  |     0x5D: (2, 0xb8, 3, 0xb9), # SLIME_EEL | ||
|  |     0x5E: (2, 0xa8), # GHOMA | ||
|  |     0x5F: (2, 0x62, 3, 0x63), # MASTER_STALFOS | ||
|  |     0x60: lambda room: (3, 0xaa) if 0x230 <= room.room <= 0x26B else (2, 0xaa), # DODONGO_SNAKE | ||
|  |     0x61: None,      # WARP | ||
|  |     0x62: (2, 0xba, 3, 0xbb), # HOT_HEAD | ||
|  |     0x63: (0, 0xbc, 1, 0xbd, 2, 0xbe, 3, 0xbf), # EVIL_EAGLE | ||
|  |     0x65: (0, 0xac, 1, 0xad, 2, 0xae, 3, 0xaf), # ANGLER_FISH | ||
|  |     0x66: (1, 0x91), # CRYSTAL_SWITCH | ||
|  |     0x69: (0, 0x66), # MOVING_BLOCK_MOVER | ||
|  |     0x6A: lambda room: (1, 0x87, 2, 0x84) if room.room >= 0x100 else (1, 0x87), # RAFT_RAFT_OWNER | ||
|  |     0x6C: None,      # CUCCU | ||
|  |     0x6D: (3, 0xA4), # BOW_WOW | ||
|  |     0x6E: (1, {0xE5, 0xC4}), # BUTTERFLY | ||
|  |     0x6F: (1, 0xE5), # DOG | ||
|  |     0x70: (3, 0xE7), # KID_70 | ||
|  |     0x71: (3, 0xE7), # KID_71 | ||
|  |     0x72: (3, 0xE7), # KID_72 | ||
|  |     0x73: (3, 0xDC), # KID_73 | ||
|  |     0x74: (2, 0x45), # PAPAHLS_WIFE | ||
|  |     0x75: (2, 0x43), # GRANDMA_ULRIRA | ||
|  |     0x76: lambda room: (3, 0x74) if room.room == 0x2D9 else (3, 0x4b), # MR_WRITE | ||
|  |     0x77: (3, 0x46), # GRANDPA_ULRIRA | ||
|  |     0x78: (3, 0x48), # YIP_YIP | ||
|  |     0x79: (2, 0x47), # MADAM_MEOWMEOW | ||
|  |     0x7A: lambda room: (1, 0xC6) if room.room < 0x040 else (1, 0x42), # CROW | ||
|  |     0x7B: (2, 0x49), # CRAZY_TRACY | ||
|  |     0x7C: (3, 0x40), # GIANT_GOPONGA_FLOWER | ||
|  |     0x7E: (1, 0x4A), # GOPONGA_FLOWER | ||
|  |     0x7F: (3, 0x41), # TURTLE_ROCK_HEAD | ||
|  |     0x80: (1, 0x4C), # TELEPHONE | ||
|  |     0x81: lambda room: (3, 0xAB) if 0x230 <= room.room <= 0x26B else (2, 0xAB), # ROLLING_BONES (sometimes in slot 3?) | ||
|  |     0x82: lambda room: (3, 0xAB) if 0x230 <= room.room <= 0x26B else (2, 0xAB), # ROLLING_BONES_BAR (sometimes in slot 3?) | ||
|  |     0x83: (1, 0x8D), # DREAM_SHRINE_BED | ||
|  |     0x84: (1, 0x4D), # BIG_FAIRY | ||
|  |     0x85: (2, 0x4C), # MR_WRITES_BIRD | ||
|  |     0x86: None,      # FLOATING_ITEM | ||
|  |     0x87: (3, 0x52), # DESERT_LANMOLA | ||
|  |     0x88: (3, 0x53), # ARMOS_KNIGHT | ||
|  |     0x89: (2, 0x54), # HINOX | ||
|  |     0x8A: None,      # TILE_GLINT_SHOWN | ||
|  |     0x8B: None,      # TILE_GLINT_HIDDEN | ||
|  |     0x8E: (2, 0x56), # CUE_BALL | ||
|  |     0x8F: lambda room: (2, 0x86) if room.room == 0x1F5 else (2, 0x58), # MASKED_MIMIC_GORIYA | ||
|  |     0x90: (3, 0x59), # THREE_OF_A_KIND | ||
|  |     0x91: (2, 0x55), # ANTI_KIRBY | ||
|  |     0x92: (2, 0x57), # SMASHER | ||
|  |     0x93: (3, 0x5A), # MAD_BOMBER | ||
|  |     0x94: (2, 0x92), # KANALET_BOMBABLE_WALL | ||
|  |     0x95: (1, 0x5b), # RICHARD | ||
|  |     0x96: (2, 0x5c), # RICHARD_FROG | ||
|  |     0x97: None,      # DIVE_SPOT | ||
|  |     0x98: (2, 0x5e), # HORSE_PIECE | ||
|  |     0x99: (3, 0x60), # WATER_TEKTITE | ||
|  |     0x9A: lambda room: (0, 0x66) if 0x200 <= room.room <= 0x22F else (0, 0xa6), # FLYING_TILES | ||
|  |     0x9B: None,      # HIDING_GEL | ||
|  |     0x9C: (3, 0x60), # STAR | ||
|  |     0x9D: (0, 0xa6), # LIFTABLE_STATUE | ||
|  |     0x9E: None,      # FIREBALL_SHOOTER | ||
|  |     0x9F: (0, 0x5f), # GOOMBA | ||
|  |     0xA0: (0, {0x5f, 0x68}), # PEAHAT | ||
|  |     0xA1: (0, {0x5f, 0x7b}), # SNAKE | ||
|  |     0xA2: (3, 0x64), # PIRANHA_PLANT | ||
|  |     0xA3: (1, 0x65), # SIDE_VIEW_PLATFORM_HORIZONTAL | ||
|  |     0xA4: (1, 0x65), # SIDE_VIEW_PLATFORM_VERTICAL | ||
|  |     0xA5: (1, 0x65), # SIDE_VIEW_PLATFORM | ||
|  |     0xA6: (1, 0x65), # SIDE_VIEW_WEIGHTS | ||
|  |     0xA7: (0, 0x66), # SMASHABLE_PILLAR | ||
|  |     0xA9: (2, 0x5d), # BLOOPER | ||
|  |     0xAA: (2, 0x5d), # CHEEP_CHEEP_HORIZONTAL | ||
|  |     0xAB: (2, 0x5d), # CHEEP_CHEEP_VERTICAL | ||
|  |     0xAC: (2, 0x5d), # CHEEP_CHEEP_JUMPING | ||
|  |     0xAD: (3, 0x67), # KIKI_THE_MONKEY | ||
|  |     0xAE: (1, 0xE3), # WINGED_OCTOROCK | ||
|  |     0xAF: None,      # TRADING_ITEM | ||
|  |     0xB0: (2, 0x8B), # PINCER | ||
|  |     0xB1: (0, 0x7b), # HOLE_FILLER (or 0x77) | ||
|  |     0xB2: (3, 0x8C), # BEETLE_SPAWNER | ||
|  |     0xB3: (3, 0x6B), # HONEYCOMB | ||
|  |     0xB4: (1, 0x6C), # TARIN | ||
|  |     0xB5: (3, 0x69), # BEAR | ||
|  |     0xB6: (3, 0x6D), # PAPAHL | ||
|  |     0xB7: (3, 0x71), # MERMAID | ||
|  |     0xB8: (1, 0xa1, 2, 0x75, 3, 0x4e), # FISHERMAN_UNDER_BRIDGE | ||
|  |     0xB9: (2, 0x79), # BUZZ_BLOB | ||
|  |     0xBA: (3, 0x76), # BOMBER | ||
|  |     0xBB: (3, 0x76), # BUSH_CRAWLER | ||
|  |     0xBC: (2, 0xa9), # GRIM_CREEPER | ||
|  |     0xBD: (2, 0x7a), # VIRE | ||
|  |     0xBE: (2, 0xa7), # BLAINO | ||
|  |     0xBF: (2, 0x82), # ZOMBIE | ||
|  |     0xC0: None,      # MAZE_SIGNPOST | ||
|  |     0xC1: (2, 0x8F), # MARIN_AT_THE_SHORE | ||
|  |     0xC2: (1, 0x6C, 2, 0x8F), # MARIN_AT_TAL_TAL_HEIGHTS | ||
|  |     0xC3: (1, 0x7d, 2, 0x7e, 3, 0x7F), # MAMU_AND_FROGS | ||
|  |     0xC4: (2, 0x6E, 3, 0x6F), # WALRUS | ||
|  |     0xC5: (1, 0x81), # URCHIN | ||
|  |     0xC6: (1, 0x81), # SAND_CRAB | ||
|  |     0xC7: (0, 0xC0, 1, 0xc1, 2, 0xc2, 3, 0xc3), # MANBO_AND_FISHES | ||
|  |     0xCA: (3, 0xc7), # MAD_BATTER | ||
|  |     0xCB: (1, 0x61), # ZORA | ||
|  |     0xCC: (1, 0x4A), # FISH | ||
|  |     0xCD: lambda room: (1, 0xCC, 2, 0xCD, 3, 0xCE) if room.room == 0x2DD else (1, 0xD1, 2, 0xD2, 3, 0x6A) if room.room == 0x2FE else (3, 0xD4), # BANANAS_SCHULE_SALE | ||
|  |     0xCE: (3, 0x73), # MERMAID_STATUE | ||
|  |     0xCF: (1, 0xC9, 2, 0xCA, 3, 0xCB), # SEASHELL_MANSION | ||
|  |     0xD0: (1, 0xC4), # ANIMAL_D0 | ||
|  |     0xD1: (3, 0xCF), # ANIMAL_D1 | ||
|  |     0xD2: (3, 0xCF), # ANIMAL_D2 | ||
|  |     0xD3: (1, 0xC4), # BUNNY_D3 | ||
|  |     0xD6: (1, 0x65), # SIDE_VIEW_POT | ||
|  |     0xD7: (1, 0x65), # THWIMP | ||
|  |     0xD8: (2, 0xDA, 3, 0xDB), # THWOMP | ||
|  |     0xD9: (1, 0xD9), # THWOMP_RAMMABLE | ||
|  |     0xDA: (3, 0x64), # PODOBOO | ||
|  |     0xDB: (2, 0xDA), # GIANT_BUBBLE | ||
|  |     0xDC: lambda room: (0, 0xDD, 2, 0xDE) if room.room == 0x1E4 else (2, 0xD3, 3, 0xDD) if room.room == 0x29F else (3, 0xDC),      # FLYING_ROOSTER_EVENTS | ||
|  |     0xDD: (1, 0xD5), # BOOK | ||
|  |     0xDE: None,      # EGG_SONG_EVENT | ||
|  |     0xE0: (3, 0xD4), # MONKEY | ||
|  |     0xE1: (1, 0xDF), # WITCH_RAT | ||
|  |     0xE2: (3, 0xF4), # FLAME_SHOOTER | ||
|  |     0xE3: (3, 0x8C), # POKEY | ||
|  |     0xE4: (1, 0x80, 3, 0xA5), # MOBLIN_KING | ||
|  |     0xE5: None,      # FLOATING_ITEM_2 | ||
|  |     0xE6: (0, 0xe8, 1, 0xe9, 2, 0xea, 3, 0xeb), # FINAL_NIGHTMARE | ||
|  |     0xE7: None,      # KANALET_CASTLE_GATE_SWITCH | ||
|  |     0xE9: (0, 0x04, 1, 0x05), # COLOR_SHELL_RED | ||
|  |     0xEA: (0, 0x04, 1, 0x05), # COLOR_SHELL_GREEN | ||
|  |     0xEB: (0, 0x04, 1, 0x05), # COLOR_SHELL_BLUE | ||
|  |     0xEC: (2, 0x06), # COLOR_GHOUL_RED | ||
|  |     0xED: (2, 0x06), # COLOR_GHOUL_GREEN | ||
|  |     0xEE: (2, 0x06), # COLOR_GHOUL_BLUE | ||
|  |     0xEF: (3, 0x07), # ROTOSWITCH_RED | ||
|  |     0xF0: (3, 0x07), # ROTOSWITCH_YELLOW | ||
|  |     0xF1: (3, 0x07), # ROTOSWITCH_BLUE | ||
|  |     0xF2: (3, 0x07), # FLYING_HOPPER_BOMBS | ||
|  |     0xF3: (3, 0x07), # HOPPER | ||
|  |     0xF4: (0, 0x08, 1, 0x09, 2, 0x0A), # AVALAUNCH | ||
|  |     0xF6: (0, 0x0E), # COLOR_GUARDIAN_BLUE | ||
|  |     0xF7: (0, 0x0E), # COLOR_GUARDIAN_BLUE | ||
|  |     0xF8: (0, 0x0B, 1, 0x0C, 3, 0x0D), # GIANT_BUZZ_BLOB | ||
|  |     0xF9: (0, 0x11, 2, 0x10), # HARDHIT_BEETLE | ||
|  |     0xFA: lambda room: (0, 0x44) if room.room == 0x2F5 else None, # PHOTOGRAPHER | ||
|  | } | ||
|  | 
 | ||
|  | assert len(NAME) == COUNT | ||
|  | 
 | ||
|  | 
 | ||
|  | class Entity: | ||
|  |     def __init__(self, index): | ||
|  |         self.index = index | ||
|  |         self.group = None | ||
|  |         self.physics_flags = None | ||
|  |         self.bowwow_eat_flag = None | ||
|  | 
 | ||
|  | 
 | ||
|  | class Group: | ||
|  |     def __init__(self, index): | ||
|  |         self.index = index | ||
|  |         self.health = None | ||
|  |         self.link_damage = None | ||
|  | 
 | ||
|  | 
 | ||
|  | class EntityData: | ||
|  |     def __init__(self, rom): | ||
|  |         groups = rom.banks[0x03][0x01F6:0x01F6+COUNT] | ||
|  |         group_count = max(groups) + 1 | ||
|  |         group_damage_type = rom.banks[0x03][0x03EC:0x03EC+group_count*16] | ||
|  |         damage_per_damage_type = rom.banks[0x03][0x073C:0x073C+8*16] | ||
|  | 
 | ||
|  |         self.entities = [] | ||
|  |         self.groups = [] | ||
|  |         for n in range(group_count): | ||
|  |             g = Group(n) | ||
|  |             g.health = rom.banks[0x03][0x07BC+n] | ||
|  |             g.link_damage = rom.banks[0x03][0x07F1+n] | ||
|  |             self.groups.append(g) | ||
|  |         for n in range(COUNT): | ||
|  |             e = Entity(n) | ||
|  |             e.group = self.groups[groups[n]] | ||
|  |             e.physics_flags = rom.banks[0x03][0x0000 + n] | ||
|  |             e.bowwow_eat_flag = rom.banks[0x14][0x1218+n] | ||
|  |             self.entities.append(e) | ||
|  | 
 | ||
|  |         #print(sum(bowwow_eatable)) | ||
|  |         #for n in range(COUNT): | ||
|  |         #    if bowwow_eatable[n]: | ||
|  |         #        print(hex(n), NAME[n]) | ||
|  |         for n in range(group_count): | ||
|  |             entities = list(map(lambda data: NAME[data[0]], filter(lambda data: data[1] == n, enumerate(groups)))) | ||
|  |             #print(hex(n), damage_to_link[n], entities) | ||
|  |             dmg = bytearray() | ||
|  |             for m in range(16): | ||
|  |                 dmg.append(damage_per_damage_type[m*8+group_damage_type[n*16+m]]) | ||
|  |             import binascii | ||
|  |             #print(binascii.hexlify(group_damage_type[n*16:n*16+16])) | ||
|  |             #print(binascii.hexlify(dmg)) | ||
|  | 
 | ||
|  | 
 | ||
|  | if __name__ == "__main__": | ||
|  |     from rom import ROM | ||
|  |     import sys | ||
|  |     rom = ROM(sys.argv[1]) | ||
|  |     ed = EntityData(rom) | ||
|  |     for e in ed.entities: | ||
|  |         print(NAME[e.index], e.bowwow_eat_flag) |