LADX: Improve icon guesses for foreign items (#2201)
* synonyms to new file, many added * handle singular rupee * remove redundant map and compass entries * automatic pluralization * add guardian acorn and piece of power * move phrases to ItemIconGuessing.py * organize, comment * fix tab spacing * fix * add tunic and noita synonyms * remove triangle instrument synonym * reorganize, add some matches * add tunic lucky up Co-authored-by: Scipio Wright <scipiowright@gmail.com> * Update worlds/ladx/ItemIconGuessing.py Co-authored-by: Scipio Wright <scipiowright@gmail.com> * handle camelCase and single rupee * add indicate_progression option Adds alternative system for foreign item icons that simply indicates whether or not the item is a progression item. * improve splitting drops some more characters, and also dont bother with rejoined stuff in name_cache because our splitting is better * the witness stuff * forbid more * remove boost and surge * Update worlds/ladx/ItemIconGuessing.py Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> * match by game name look at the name of the foreign game and only use game-specific entries for that game * show message for all key drops * updates from async test * vi suggestions * Adding FNAFW suggestions from @lolz1190 (#40) * Adding FNAFW suggestions from @lolz1190 * missing comma --------- Co-authored-by: threeandthreee <a.l.nordstrom@gmail.com> --------- Co-authored-by: Scipio Wright <scipiowright@gmail.com> Co-authored-by: NewSoupVi <57900059+NewSoupVi@users.noreply.github.com> Co-authored-by: palex00 <32203971+palex00@users.noreply.github.com>
This commit is contained in:
		
							parent
							
								
									8d9454ea3b
								
							
						
					
					
						commit
						ccea6bcf51
					
				| 
						 | 
				
			
			@ -0,0 +1,531 @@
 | 
			
		|||
BLOCKED_ASSOCIATIONS = [
 | 
			
		||||
    # MAX_ARROWS_UPGRADE, MAX_BOMBS_UPGRADE, MAX_POWDER_UPGRADE
 | 
			
		||||
    # arrows and bombs will be matched to arrow and bomb respectively through pluralization
 | 
			
		||||
    "ARROWS",
 | 
			
		||||
    "BOMBS",
 | 
			
		||||
    "MAX",
 | 
			
		||||
    "UPGRADE",
 | 
			
		||||
 | 
			
		||||
    "TAIL",     # TAIL_KEY
 | 
			
		||||
    "ANGLER",   # ANGLER_KEY
 | 
			
		||||
    "FACE",     # FACE_KEY
 | 
			
		||||
    "BIRD",     # BIRD_KEY
 | 
			
		||||
    "SLIME",    # SLIME_KEY
 | 
			
		||||
    "NIGHTMARE",# NIGHTMARE_KEY
 | 
			
		||||
 | 
			
		||||
    "BLUE",     # BLUE_TUNIC
 | 
			
		||||
    "RED",      # RED_TUNIC
 | 
			
		||||
 | 
			
		||||
    "TRADING",  # TRADING_ITEM_*
 | 
			
		||||
    "ITEM",     # TRADING_ITEM_*
 | 
			
		||||
 | 
			
		||||
    "BAD",      # BAD_HEART_CONTAINER
 | 
			
		||||
    "GOLD",     # GOLD_LEAF
 | 
			
		||||
    "MAGIC",    # MAGIC_POWDER, MAGIC_ROD
 | 
			
		||||
    "MESSAGE",  # MESSAGE (Master Stalfos' Message)
 | 
			
		||||
    "PEGASUS",  # PEGASUS_BOOTS
 | 
			
		||||
    "PIECE",    # HEART_PIECE, PIECE_OF_POWER
 | 
			
		||||
    "POWER",    # POWER_BRACELET, PIECE_OF_POWER
 | 
			
		||||
    "SINGLE",   # SINGLE_ARROW
 | 
			
		||||
    "STONE",    # STONE_BEAK
 | 
			
		||||
 | 
			
		||||
    "BEAK1",
 | 
			
		||||
    "BEAK2",
 | 
			
		||||
    "BEAK3",
 | 
			
		||||
    "BEAK4",
 | 
			
		||||
    "BEAK5",
 | 
			
		||||
    "BEAK6",
 | 
			
		||||
    "BEAK7",
 | 
			
		||||
    "BEAK8",
 | 
			
		||||
 | 
			
		||||
    "COMPASS1",
 | 
			
		||||
    "COMPASS2",
 | 
			
		||||
    "COMPASS3",
 | 
			
		||||
    "COMPASS4",
 | 
			
		||||
    "COMPASS5",
 | 
			
		||||
    "COMPASS6",
 | 
			
		||||
    "COMPASS7",
 | 
			
		||||
    "COMPASS8",
 | 
			
		||||
 | 
			
		||||
    "MAP1",
 | 
			
		||||
    "MAP2",
 | 
			
		||||
    "MAP3",
 | 
			
		||||
    "MAP4",
 | 
			
		||||
    "MAP5",
 | 
			
		||||
    "MAP6",
 | 
			
		||||
    "MAP7",
 | 
			
		||||
    "MAP8",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
# Single word synonyms for Link's Awakening items, for generic matching.
 | 
			
		||||
SYNONYMS = {
 | 
			
		||||
    # POWER_BRACELET
 | 
			
		||||
    'ANKLET': 'POWER_BRACELET',
 | 
			
		||||
    'ARMLET': 'POWER_BRACELET',
 | 
			
		||||
    'BAND': 'POWER_BRACELET',
 | 
			
		||||
    'BANGLE': 'POWER_BRACELET',
 | 
			
		||||
    'BRACER': 'POWER_BRACELET',
 | 
			
		||||
    'CARRY': 'POWER_BRACELET',
 | 
			
		||||
    'CIRCLET': 'POWER_BRACELET',
 | 
			
		||||
    'CROISSANT': 'POWER_BRACELET',
 | 
			
		||||
    'GAUNTLET': 'POWER_BRACELET',
 | 
			
		||||
    'GLOVE': 'POWER_BRACELET',
 | 
			
		||||
    'RING': 'POWER_BRACELET',
 | 
			
		||||
    'STRENGTH': 'POWER_BRACELET',
 | 
			
		||||
 | 
			
		||||
    # SHIELD
 | 
			
		||||
    'AEGIS': 'SHIELD',
 | 
			
		||||
    'BUCKLER': 'SHIELD',
 | 
			
		||||
    'SHLD': 'SHIELD',
 | 
			
		||||
 | 
			
		||||
    # BOW
 | 
			
		||||
    'BALLISTA': 'BOW',
 | 
			
		||||
 | 
			
		||||
    # HOOKSHOT
 | 
			
		||||
    'GRAPPLE': 'HOOKSHOT',
 | 
			
		||||
    'GRAPPLING': 'HOOKSHOT',
 | 
			
		||||
    'ROPE': 'HOOKSHOT',
 | 
			
		||||
 | 
			
		||||
    # MAGIC_ROD
 | 
			
		||||
    'BEAM': 'MAGIC_ROD',
 | 
			
		||||
    'CANE': 'MAGIC_ROD',
 | 
			
		||||
    'STAFF': 'MAGIC_ROD',
 | 
			
		||||
    'WAND': 'MAGIC_ROD',
 | 
			
		||||
 | 
			
		||||
    # PEGASUS_BOOTS
 | 
			
		||||
    'BOOT': 'PEGASUS_BOOTS',
 | 
			
		||||
    'GREAVES': 'PEGASUS_BOOTS',
 | 
			
		||||
    'RUN': 'PEGASUS_BOOTS',
 | 
			
		||||
    'SHOE': 'PEGASUS_BOOTS',
 | 
			
		||||
    'SPEED': 'PEGASUS_BOOTS',
 | 
			
		||||
 | 
			
		||||
    # OCARINA
 | 
			
		||||
    'FLUTE': 'OCARINA',
 | 
			
		||||
    'RECORDER': 'OCARINA',
 | 
			
		||||
 | 
			
		||||
    # FEATHER
 | 
			
		||||
    'JUMP': 'FEATHER',
 | 
			
		||||
    'PLUME': 'FEATHER',
 | 
			
		||||
    'WING': 'FEATHER',
 | 
			
		||||
 | 
			
		||||
    # SHOVEL
 | 
			
		||||
    'DIG': 'SHOVEL',
 | 
			
		||||
 | 
			
		||||
    # MAGIC_POWDER
 | 
			
		||||
    'BAG': 'MAGIC_POWDER',
 | 
			
		||||
    'CASE': 'MAGIC_POWDER',
 | 
			
		||||
    'DUST': 'MAGIC_POWDER',
 | 
			
		||||
    'POUCH': 'MAGIC_POWDER',
 | 
			
		||||
    'SACK': 'MAGIC_POWDER',
 | 
			
		||||
 | 
			
		||||
    # BOMB
 | 
			
		||||
    'BLAST': 'BOMB',
 | 
			
		||||
    'BOMBCHU': 'BOMB',
 | 
			
		||||
    'FIRECRACKER': 'BOMB',
 | 
			
		||||
    'TNT': 'BOMB',
 | 
			
		||||
 | 
			
		||||
    # SWORD
 | 
			
		||||
    'BLADE': 'SWORD',
 | 
			
		||||
    'CUT': 'SWORD',
 | 
			
		||||
    'DAGGER': 'SWORD',
 | 
			
		||||
    'DIRK': 'SWORD',
 | 
			
		||||
    'EDGE': 'SWORD',
 | 
			
		||||
    'EPEE': 'SWORD',
 | 
			
		||||
    'EXCALIBUR': 'SWORD',
 | 
			
		||||
    'FALCHION': 'SWORD',
 | 
			
		||||
    'KATANA': 'SWORD',
 | 
			
		||||
    'KNIFE': 'SWORD',
 | 
			
		||||
    'MACHETE': 'SWORD',
 | 
			
		||||
    'MASAMUNE': 'SWORD',
 | 
			
		||||
    'MURASAME': 'SWORD',
 | 
			
		||||
    'SABER': 'SWORD',
 | 
			
		||||
    'SABRE': 'SWORD',
 | 
			
		||||
    'SCIMITAR': 'SWORD',
 | 
			
		||||
    'SLASH': 'SWORD',
 | 
			
		||||
 | 
			
		||||
    # FLIPPERS
 | 
			
		||||
    'FLIPPER': 'FLIPPERS',
 | 
			
		||||
    'SWIM': 'FLIPPERS',
 | 
			
		||||
 | 
			
		||||
    # MEDICINE
 | 
			
		||||
    'BOTTLE': 'MEDICINE',
 | 
			
		||||
    'FLASK': 'MEDICINE',
 | 
			
		||||
    'LEMONADE': 'MEDICINE',
 | 
			
		||||
    'POTION': 'MEDICINE',
 | 
			
		||||
    'TEA': 'MEDICINE',
 | 
			
		||||
 | 
			
		||||
    # TAIL_KEY
 | 
			
		||||
 | 
			
		||||
    # ANGLER_KEY
 | 
			
		||||
 | 
			
		||||
    # FACE_KEY
 | 
			
		||||
 | 
			
		||||
    # BIRD_KEY
 | 
			
		||||
 | 
			
		||||
    # SLIME_KEY
 | 
			
		||||
 | 
			
		||||
    # GOLD_LEAF
 | 
			
		||||
    'HERB': 'GOLD_LEAF',
 | 
			
		||||
 | 
			
		||||
    # RUPEES_20
 | 
			
		||||
    'COIN': 'RUPEES_20',
 | 
			
		||||
    'MONEY': 'RUPEES_20',
 | 
			
		||||
    'RUPEE': 'RUPEES_20',
 | 
			
		||||
 | 
			
		||||
    # RUPEES_50
 | 
			
		||||
 | 
			
		||||
    # RUPEES_100
 | 
			
		||||
 | 
			
		||||
    # RUPEES_200
 | 
			
		||||
 | 
			
		||||
    # RUPEES_500
 | 
			
		||||
    'GEM': 'RUPEES_500',
 | 
			
		||||
    'JEWEL': 'RUPEES_500',
 | 
			
		||||
 | 
			
		||||
    # SEASHELL
 | 
			
		||||
    'CARAPACE': 'SEASHELL',
 | 
			
		||||
    'CONCH': 'SEASHELL',
 | 
			
		||||
    'SHELL': 'SEASHELL',
 | 
			
		||||
 | 
			
		||||
    # MESSAGE (master stalfos message)
 | 
			
		||||
    'NOTHING': 'MESSAGE',
 | 
			
		||||
    'TRAP': 'MESSAGE',
 | 
			
		||||
 | 
			
		||||
    # BOOMERANG
 | 
			
		||||
    'BOOMER': 'BOOMERANG',
 | 
			
		||||
 | 
			
		||||
    # HEART_PIECE
 | 
			
		||||
 | 
			
		||||
    # BOWWOW
 | 
			
		||||
    'BEAST': 'BOWWOW',
 | 
			
		||||
    'PET': 'BOWWOW',
 | 
			
		||||
 | 
			
		||||
    # ARROWS_10
 | 
			
		||||
 | 
			
		||||
    # SINGLE_ARROW
 | 
			
		||||
    'MISSILE': 'SINGLE_ARROW',
 | 
			
		||||
    'QUIVER': 'SINGLE_ARROW',
 | 
			
		||||
 | 
			
		||||
    # ROOSTER
 | 
			
		||||
    'BIRD': 'ROOSTER',
 | 
			
		||||
    'CHICKEN': 'ROOSTER',
 | 
			
		||||
    'CUCCO': 'ROOSTER',
 | 
			
		||||
    'FLY': 'ROOSTER',
 | 
			
		||||
    'GRIFFIN': 'ROOSTER',
 | 
			
		||||
    'GRYPHON': 'ROOSTER',
 | 
			
		||||
 | 
			
		||||
    # MAX_POWDER_UPGRADE
 | 
			
		||||
 | 
			
		||||
    # MAX_BOMBS_UPGRADE
 | 
			
		||||
 | 
			
		||||
    # MAX_ARROWS_UPGRADE
 | 
			
		||||
 | 
			
		||||
    # RED_TUNIC
 | 
			
		||||
 | 
			
		||||
    # BLUE_TUNIC
 | 
			
		||||
    'ARMOR': 'BLUE_TUNIC',
 | 
			
		||||
    'MAIL': 'BLUE_TUNIC',
 | 
			
		||||
    'SUIT': 'BLUE_TUNIC',
 | 
			
		||||
 | 
			
		||||
    # HEART_CONTAINER
 | 
			
		||||
    'TANK': 'HEART_CONTAINER',
 | 
			
		||||
 | 
			
		||||
    # TOADSTOOL
 | 
			
		||||
    'FUNGAL': 'TOADSTOOL',
 | 
			
		||||
    'FUNGUS': 'TOADSTOOL',
 | 
			
		||||
    'MUSHROOM': 'TOADSTOOL',
 | 
			
		||||
    'SHROOM': 'TOADSTOOL',
 | 
			
		||||
 | 
			
		||||
    # GUARDIAN_ACORN
 | 
			
		||||
    'NUT': 'GUARDIAN_ACORN',
 | 
			
		||||
    'SEED': 'GUARDIAN_ACORN',
 | 
			
		||||
 | 
			
		||||
    # KEY
 | 
			
		||||
    'DOOR': 'KEY',
 | 
			
		||||
    'GATE': 'KEY',
 | 
			
		||||
    'KEY': 'KEY', # Without this, foreign keys show up as nightmare keys
 | 
			
		||||
    'LOCK': 'KEY',
 | 
			
		||||
    'PANEL': 'KEY',
 | 
			
		||||
    'UNLOCK': 'KEY',
 | 
			
		||||
 | 
			
		||||
    # NIGHTMARE_KEY
 | 
			
		||||
 | 
			
		||||
    # MAP
 | 
			
		||||
 | 
			
		||||
    # COMPASS
 | 
			
		||||
 | 
			
		||||
    # STONE_BEAK
 | 
			
		||||
    'FOSSIL': 'STONE_BEAK',
 | 
			
		||||
    'RELIC': 'STONE_BEAK',
 | 
			
		||||
 | 
			
		||||
    # SONG1
 | 
			
		||||
    'BOLERO': 'SONG1',
 | 
			
		||||
    'LULLABY': 'SONG1',
 | 
			
		||||
    'MELODY': 'SONG1',
 | 
			
		||||
    'MINUET': 'SONG1',
 | 
			
		||||
    'NOCTURNE': 'SONG1',
 | 
			
		||||
    'PRELUDE': 'SONG1',
 | 
			
		||||
    'REQUIEM': 'SONG1',
 | 
			
		||||
    'SERENADE': 'SONG1',
 | 
			
		||||
    'SONG': 'SONG1',
 | 
			
		||||
 | 
			
		||||
    # SONG2
 | 
			
		||||
    'FISH': 'SONG2',
 | 
			
		||||
    'SURF': 'SONG2',
 | 
			
		||||
 | 
			
		||||
    # SONG3
 | 
			
		||||
    'FROG': 'SONG3',
 | 
			
		||||
 | 
			
		||||
    # INSTRUMENT1
 | 
			
		||||
    'CELLO': 'INSTRUMENT1',
 | 
			
		||||
    'GUITAR': 'INSTRUMENT1',
 | 
			
		||||
    'LUTE': 'INSTRUMENT1',
 | 
			
		||||
    'VIOLIN': 'INSTRUMENT1',
 | 
			
		||||
 | 
			
		||||
    # INSTRUMENT2
 | 
			
		||||
    'HORN': 'INSTRUMENT2',
 | 
			
		||||
 | 
			
		||||
    # INSTRUMENT3
 | 
			
		||||
    'BELL': 'INSTRUMENT3',
 | 
			
		||||
    'CHIME': 'INSTRUMENT3',
 | 
			
		||||
 | 
			
		||||
    # INSTRUMENT4
 | 
			
		||||
    'HARP': 'INSTRUMENT4',
 | 
			
		||||
    'KANTELE': 'INSTRUMENT4',
 | 
			
		||||
 | 
			
		||||
    # INSTRUMENT5
 | 
			
		||||
    'MARIMBA': 'INSTRUMENT5',
 | 
			
		||||
    'XYLOPHONE': 'INSTRUMENT5',
 | 
			
		||||
 | 
			
		||||
    # INSTRUMENT6 (triangle)
 | 
			
		||||
 | 
			
		||||
    # INSTRUMENT7
 | 
			
		||||
    'KEYBOARD': 'INSTRUMENT7',
 | 
			
		||||
    'ORGAN': 'INSTRUMENT7',
 | 
			
		||||
    'PIANO': 'INSTRUMENT7',
 | 
			
		||||
 | 
			
		||||
    # INSTRUMENT8
 | 
			
		||||
    'DRUM': 'INSTRUMENT8',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_YOSHI_DOLL
 | 
			
		||||
    'DINOSAUR': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
    'DRAGON': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
    'TOY': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_RIBBON
 | 
			
		||||
    'HAIRBAND': 'TRADING_ITEM_RIBBON',
 | 
			
		||||
    'HAIRPIN': 'TRADING_ITEM_RIBBON',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_DOG_FOOD
 | 
			
		||||
    'CAN': 'TRADING_ITEM_DOG_FOOD',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_BANANAS
 | 
			
		||||
    'BANANA': 'TRADING_ITEM_BANANAS',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_STICK
 | 
			
		||||
    'BRANCH': 'TRADING_ITEM_STICK',
 | 
			
		||||
    'TWIG': 'TRADING_ITEM_STICK',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_HONEYCOMB
 | 
			
		||||
    'BEEHIVE': 'TRADING_ITEM_HONEYCOMB',
 | 
			
		||||
    'HIVE': 'TRADING_ITEM_HONEYCOMB',
 | 
			
		||||
    'HONEY': 'TRADING_ITEM_HONEYCOMB',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_PINEAPPLE
 | 
			
		||||
    'FOOD': 'TRADING_ITEM_PINEAPPLE',
 | 
			
		||||
    'FRUIT': 'TRADING_ITEM_PINEAPPLE',
 | 
			
		||||
    'GOURD': 'TRADING_ITEM_PINEAPPLE',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_HIBISCUS
 | 
			
		||||
    'FLOWER': 'TRADING_ITEM_HIBISCUS',
 | 
			
		||||
    'PETAL': 'TRADING_ITEM_HIBISCUS',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_LETTER
 | 
			
		||||
    'CARD': 'TRADING_ITEM_LETTER',
 | 
			
		||||
    'MESSAGE': 'TRADING_ITEM_LETTER',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_BROOM
 | 
			
		||||
    'SWEEP': 'TRADING_ITEM_BROOM',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_FISHING_HOOK
 | 
			
		||||
    'CLAW': 'TRADING_ITEM_FISHING_HOOK',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_NECKLACE
 | 
			
		||||
    'AMULET': 'TRADING_ITEM_NECKLACE',
 | 
			
		||||
    'BEADS': 'TRADING_ITEM_NECKLACE',
 | 
			
		||||
    'PEARLS': 'TRADING_ITEM_NECKLACE',
 | 
			
		||||
    'PENDANT': 'TRADING_ITEM_NECKLACE',
 | 
			
		||||
    'ROSARY': 'TRADING_ITEM_NECKLACE',
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_SCALE
 | 
			
		||||
 | 
			
		||||
    # TRADING_ITEM_MAGNIFYING_GLASS
 | 
			
		||||
    'FINDER': 'TRADING_ITEM_MAGNIFYING_GLASS',
 | 
			
		||||
    'LENS': 'TRADING_ITEM_MAGNIFYING_GLASS',
 | 
			
		||||
    'MIRROR': 'TRADING_ITEM_MAGNIFYING_GLASS',
 | 
			
		||||
    'SCOPE': 'TRADING_ITEM_MAGNIFYING_GLASS',
 | 
			
		||||
    'XRAY': 'TRADING_ITEM_MAGNIFYING_GLASS',
 | 
			
		||||
 | 
			
		||||
    # PIECE_OF_POWER
 | 
			
		||||
    'TRIANGLE': 'PIECE_OF_POWER',
 | 
			
		||||
    'POWER': 'PIECE_OF_POWER',
 | 
			
		||||
    'TRIFORCE': 'PIECE_OF_POWER',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# For generic multi-word matches.
 | 
			
		||||
PHRASES = {
 | 
			
		||||
    'BIG KEY': 'NIGHTMARE_KEY',
 | 
			
		||||
    'BOSS KEY': 'NIGHTMARE_KEY',
 | 
			
		||||
    'HEART PIECE': 'HEART_PIECE',
 | 
			
		||||
    'PIECE OF HEART': 'HEART_PIECE',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# All following will only be used to match items for the specific game.
 | 
			
		||||
# Item names will be uppercased when comparing.
 | 
			
		||||
# Can be multi-word.
 | 
			
		||||
GAME_SPECIFIC_PHRASES = {
 | 
			
		||||
    'Final Fantasy': {
 | 
			
		||||
        'OXYALE': 'MEDICINE',
 | 
			
		||||
        'VORPAL': 'SWORD',
 | 
			
		||||
        'XCALBER': 'SWORD',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'The Legend of Zelda': {
 | 
			
		||||
        'WATER OF LIFE': 'MEDICINE',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'The Legend of Zelda - Oracle of Seasons': {
 | 
			
		||||
        'RARE PEACH STONE': 'HEART_PIECE',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'Noita': {
 | 
			
		||||
        'ALL-SEEING EYE': 'TRADING_ITEM_MAGNIFYING_GLASS',  # lets you find secrets
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'Ocarina of Time': {
 | 
			
		||||
        'COJIRO': 'ROOSTER',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'SMZ3': {
 | 
			
		||||
        'BIGKEY': 'NIGHTMARE_KEY',
 | 
			
		||||
        'BYRNA': 'MAGIC_ROD',
 | 
			
		||||
        'HEARTPIECE': 'HEART_PIECE',
 | 
			
		||||
        'POWERBOMB': 'BOMB',
 | 
			
		||||
        'SOMARIA': 'MAGIC_ROD',
 | 
			
		||||
        'SUPER': 'SINGLE_ARROW',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'Sonic Adventure 2 Battle': {
 | 
			
		||||
        'CHAOS EMERALD': 'PIECE_OF_POWER',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'Super Mario 64': {
 | 
			
		||||
        'POWER STAR': 'PIECE_OF_POWER',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'Super Mario World': {
 | 
			
		||||
        'P-BALLOON': 'FEATHER',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'Super Metroid': {
 | 
			
		||||
        'POWER BOMB': 'BOMB',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'The Witness': {
 | 
			
		||||
        'BONK': 'BOMB',
 | 
			
		||||
        'BUNKER LASER': 'INSTRUMENT4',
 | 
			
		||||
        'DESERT LASER': 'INSTRUMENT5',
 | 
			
		||||
        'JUNGLE LASER': 'INSTRUMENT4',
 | 
			
		||||
        'KEEP LASER': 'INSTRUMENT7',
 | 
			
		||||
        'MONASTERY LASER': 'INSTRUMENT1',
 | 
			
		||||
        'POWER SURGE': 'BOMB',
 | 
			
		||||
        'PUZZLE SKIP': 'GOLD_LEAF',
 | 
			
		||||
        'QUARRY LASER': 'INSTRUMENT8',
 | 
			
		||||
        'SHADOWS LASER': 'INSTRUMENT1',
 | 
			
		||||
        'SHORTCUTS': 'KEY',
 | 
			
		||||
        'SLOWNESS': 'BOMB',
 | 
			
		||||
        'SWAMP LASER': 'INSTRUMENT2',
 | 
			
		||||
        'SYMMETRY LASER': 'INSTRUMENT6',
 | 
			
		||||
        'TOWN LASER': 'INSTRUMENT3',
 | 
			
		||||
        'TREEHOUSE LASER': 'INSTRUMENT2',
 | 
			
		||||
        'WATER PUMPS': 'KEY',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'TUNIC': {
 | 
			
		||||
        "AURA'S GEM": 'SHIELD',  # card that enhances the shield
 | 
			
		||||
        'DUSTY': 'TRADING_ITEM_BROOM',  # a broom
 | 
			
		||||
        'HERO RELIC - HP': 'TRADING_ITEM_HIBISCUS',
 | 
			
		||||
        'HERO RELIC - MP': 'TOADSTOOL',
 | 
			
		||||
        'HERO RELIC - SP': 'FEATHER',
 | 
			
		||||
        'HP BERRY': 'GUARDIAN_ACORN',
 | 
			
		||||
        'HP OFFERING': 'TRADING_ITEM_HIBISCUS',  # a flower
 | 
			
		||||
        'LUCKY CUP': 'HEART_CONTAINER',  # card with a heart on it
 | 
			
		||||
        'INVERTED ASH': 'MEDICINE',  # card with a potion on it
 | 
			
		||||
        'MAGIC ORB': 'HOOKSHOT',
 | 
			
		||||
        'MP BERRY': 'GUARDIAN_ACORN',
 | 
			
		||||
        'MP OFFERING': 'TOADSTOOL',  # a mushroom
 | 
			
		||||
        'QUESTAGON': 'PIECE_OF_POWER',  # triforce piece equivalent
 | 
			
		||||
        'SP OFFERING': 'FEATHER',  # a feather
 | 
			
		||||
        'SPRING FALLS': 'TRADING_ITEM_HIBISCUS',  # a flower
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    'FNaFW': {
 | 
			
		||||
        'Freddy': 'TRADING_ITEM_YOSHI_DOLL', # all of these are animatronics, aka dolls.
 | 
			
		||||
        'Bonnie': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Chica': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Foxy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Toy Bonnie': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Toy Chica': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Toy Freddy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Mangle': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Balloon Boy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'JJ': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Phantom Freddy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Phantom BB': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Phantom Chica': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Phantom Mangle': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Withered Foxy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Phantom Foxy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Withered Chica': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Withered Freddy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Withered Bonnie': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Shadow Freddy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Marionette': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Phantom Marionette': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Golden Freddy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Paperpals': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Nightmare Freddy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Nightmare Bonnie': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Nightmare Chica': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Nightmare Foxy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Endo 01': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Endo 02': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Plushtrap': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Endoplush': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Springtrap': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'RWQFSFASXC': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Crying Child': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Funtime Foxy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Nightmare Fredbear': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Nightmare': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Fredbear': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Spring Bonnie': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Jack-O-Chica': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Nightmare BB': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Coffee': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Jack-O-Bonnie': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Purpleguy': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Nightmarionne': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Mr. Chipper': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Animdude': 'TRADING_ITEM_YOSHI_DOLL',
 | 
			
		||||
        'Progressive Endoskeleton': 'BLUE_TUNIC', # basically armor you wear to give you more defense
 | 
			
		||||
        '25 Tokens': 'RUPEES_20', # money
 | 
			
		||||
        '50 Tokens': 'RUPEES_50',
 | 
			
		||||
        '100 Tokens': 'RUPEES_100',
 | 
			
		||||
        '250 Tokens': 'RUPEES_200',
 | 
			
		||||
        '500 Tokens': 'RUPEES_500',
 | 
			
		||||
        '1000 Tokens': 'RUPEES_500',
 | 
			
		||||
        '2500 Tokens': 'RUPEES_500',
 | 
			
		||||
        '5000 Tokens': 'RUPEES_500',
 | 
			
		||||
    },
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -98,6 +98,7 @@ class ItemName:
 | 
			
		|||
    HEART_CONTAINER = "Heart Container"
 | 
			
		||||
    BAD_HEART_CONTAINER = "Bad Heart Container"
 | 
			
		||||
    TOADSTOOL = "Toadstool"
 | 
			
		||||
    GUARDIAN_ACORN = "Guardian Acorn"
 | 
			
		||||
    KEY = "Key"
 | 
			
		||||
    KEY1 = "Small Key (Tail Cave)"
 | 
			
		||||
    KEY2 = "Small Key (Bottle Grotto)"
 | 
			
		||||
| 
						 | 
				
			
			@ -173,6 +174,7 @@ class ItemName:
 | 
			
		|||
    TRADING_ITEM_NECKLACE = "Necklace"
 | 
			
		||||
    TRADING_ITEM_SCALE = "Scale"
 | 
			
		||||
    TRADING_ITEM_MAGNIFYING_GLASS = "Magnifying Glass"
 | 
			
		||||
    PIECE_OF_POWER = "Piece Of Power"
 | 
			
		||||
 | 
			
		||||
trade_item_prog = ItemClassification.progression
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -219,6 +221,7 @@ links_awakening_items = [
 | 
			
		|||
    ItemData(ItemName.HEART_CONTAINER, "HEART_CONTAINER", ItemClassification.useful),
 | 
			
		||||
    #ItemData(ItemName.BAD_HEART_CONTAINER, "BAD_HEART_CONTAINER", ItemClassification.trap),
 | 
			
		||||
    ItemData(ItemName.TOADSTOOL, "TOADSTOOL", ItemClassification.progression),
 | 
			
		||||
    ItemData(ItemName.GUARDIAN_ACORN, "GUARDIAN_ACORN", ItemClassification.filler),
 | 
			
		||||
    DungeonItemData(ItemName.KEY, "KEY", ItemClassification.progression),
 | 
			
		||||
    DungeonItemData(ItemName.KEY1, "KEY1", ItemClassification.progression),
 | 
			
		||||
    DungeonItemData(ItemName.KEY2, "KEY2", ItemClassification.progression),
 | 
			
		||||
| 
						 | 
				
			
			@ -293,7 +296,8 @@ links_awakening_items = [
 | 
			
		|||
    TradeItemData(ItemName.TRADING_ITEM_FISHING_HOOK, "TRADING_ITEM_FISHING_HOOK", trade_item_prog, "Grandma (Animal Village)"),
 | 
			
		||||
    TradeItemData(ItemName.TRADING_ITEM_NECKLACE, "TRADING_ITEM_NECKLACE", trade_item_prog, "Fisher (Martha's Bay)"),
 | 
			
		||||
    TradeItemData(ItemName.TRADING_ITEM_SCALE, "TRADING_ITEM_SCALE", trade_item_prog, "Mermaid (Martha's Bay)"),
 | 
			
		||||
    TradeItemData(ItemName.TRADING_ITEM_MAGNIFYING_GLASS, "TRADING_ITEM_MAGNIFYING_GLASS", trade_item_prog, "Mermaid Statue (Martha's Bay)")
 | 
			
		||||
    TradeItemData(ItemName.TRADING_ITEM_MAGNIFYING_GLASS, "TRADING_ITEM_MAGNIFYING_GLASS", trade_item_prog, "Mermaid Statue (Martha's Bay)"),
 | 
			
		||||
    ItemData(ItemName.PIECE_OF_POWER, "PIECE_OF_POWER", ItemClassification.filler),
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
ladxr_item_to_la_item_name = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,6 +87,8 @@ CHEST_ITEMS = {
 | 
			
		|||
 | 
			
		||||
    TOADSTOOL: 0x50,
 | 
			
		||||
 | 
			
		||||
    GUARDIAN_ACORN: 0x51,
 | 
			
		||||
 | 
			
		||||
    HEART_PIECE: 0x80,
 | 
			
		||||
    BOWWOW: 0x81,
 | 
			
		||||
    ARROWS_10: 0x82,
 | 
			
		||||
| 
						 | 
				
			
			@ -128,4 +130,6 @@ CHEST_ITEMS = {
 | 
			
		|||
    TRADING_ITEM_NECKLACE: 0xA2,
 | 
			
		||||
    TRADING_ITEM_SCALE: 0xA3,
 | 
			
		||||
    TRADING_ITEM_MAGNIFYING_GLASS: 0xA4,
 | 
			
		||||
 | 
			
		||||
    PIECE_OF_POWER: 0xA5,
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,6 +44,8 @@ BAD_HEART_CONTAINER = "BAD_HEART_CONTAINER"
 | 
			
		|||
 | 
			
		||||
TOADSTOOL = "TOADSTOOL"
 | 
			
		||||
 | 
			
		||||
GUARDIAN_ACORN = "GUARDIAN_ACORN"
 | 
			
		||||
 | 
			
		||||
KEY = "KEY"
 | 
			
		||||
KEY1 = "KEY1"
 | 
			
		||||
KEY2 = "KEY2"
 | 
			
		||||
| 
						 | 
				
			
			@ -124,3 +126,5 @@ TRADING_ITEM_FISHING_HOOK = "TRADING_ITEM_FISHING_HOOK"
 | 
			
		|||
TRADING_ITEM_NECKLACE = "TRADING_ITEM_NECKLACE"
 | 
			
		||||
TRADING_ITEM_SCALE = "TRADING_ITEM_SCALE"
 | 
			
		||||
TRADING_ITEM_MAGNIFYING_GLASS = "TRADING_ITEM_MAGNIFYING_GLASS"
 | 
			
		||||
 | 
			
		||||
PIECE_OF_POWER = "PIECE_OF_POWER"
 | 
			
		||||
| 
						 | 
				
			
			@ -835,6 +835,7 @@ ItemSpriteTable:
 | 
			
		|||
    db $46, $1C        ; NIGHTMARE_KEY8
 | 
			
		||||
    db $46, $1C        ; NIGHTMARE_KEY9
 | 
			
		||||
    db $4C, $1C        ; Toadstool
 | 
			
		||||
    db $AE, $14        ; Guardian Acorn
 | 
			
		||||
 | 
			
		||||
LargeItemSpriteTable:
 | 
			
		||||
    db $AC, $02, $AC, $22 ; heart piece
 | 
			
		||||
| 
						 | 
				
			
			@ -874,6 +875,7 @@ LargeItemSpriteTable:
 | 
			
		|||
    db $D8, $0D, $DA, $0D ; TradeItem12
 | 
			
		||||
    db $DC, $0D, $DE, $0D ; TradeItem13
 | 
			
		||||
    db $E0, $0D, $E2, $0D ; TradeItem14
 | 
			
		||||
    db $14, $42, $14, $62 ; Piece Of Power
 | 
			
		||||
 | 
			
		||||
ItemMessageTable:
 | 
			
		||||
    db $90, $3D, $89, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $D9, $A2
 | 
			
		||||
| 
						 | 
				
			
			@ -888,7 +890,7 @@ ItemMessageTable:
 | 
			
		|||
    ; $80
 | 
			
		||||
    db $4F, $C8, $CA, $CB, $E2, $E3, $E4, $CC, $CD, $2A, $2B, $C9, $C9, $C9, $C9, $C9
 | 
			
		||||
    db $C9, $C9, $C9, $C9, $C9, $C9, $B8, $44, $C9, $C9, $C9, $C9, $C9, $C9, $C9, $C9
 | 
			
		||||
    db $C9, $C9, $C9, $C9, $9D
 | 
			
		||||
    db $C9, $C9, $C9, $C9, $9D, $C9
 | 
			
		||||
 | 
			
		||||
RenderDroppedKey:
 | 
			
		||||
    ;TODO: See EntityInitKeyDropPoint for a few special cases to unload.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -170,7 +170,7 @@ ItemNamePointers:
 | 
			
		|||
    dw ItemNameNightmareKey8
 | 
			
		||||
    dw ItemNameNightmareKey9
 | 
			
		||||
    dw ItemNameToadstool
 | 
			
		||||
    dw ItemNameNone ; 0x51
 | 
			
		||||
    dw ItemNameGuardianAcorn
 | 
			
		||||
    dw ItemNameNone ; 0x52
 | 
			
		||||
    dw ItemNameNone ; 0x53
 | 
			
		||||
    dw ItemNameNone ; 0x54
 | 
			
		||||
| 
						 | 
				
			
			@ -254,6 +254,7 @@ ItemNamePointers:
 | 
			
		|||
    dw ItemTradeQuest12
 | 
			
		||||
    dw ItemTradeQuest13
 | 
			
		||||
    dw ItemTradeQuest14
 | 
			
		||||
    dw ItemPieceOfPower
 | 
			
		||||
 | 
			
		||||
ItemNameNone:
 | 
			
		||||
    db m"NONE", $ff
 | 
			
		||||
| 
						 | 
				
			
			@ -418,6 +419,8 @@ ItemNameNightmareKey9:
 | 
			
		|||
    db m"Got the {NIGHTMARE_KEY9}", $ff
 | 
			
		||||
ItemNameToadstool:
 | 
			
		||||
    db m"Got the {TOADSTOOL}", $ff
 | 
			
		||||
ItemNameGuardianAcorn:
 | 
			
		||||
    db m"Got a Guardian Acorn", $ff
 | 
			
		||||
 | 
			
		||||
ItemNameHeartPiece:
 | 
			
		||||
    db m"Got the {HEART_PIECE}", $ff
 | 
			
		||||
| 
						 | 
				
			
			@ -496,5 +499,8 @@ ItemTradeQuest13:
 | 
			
		|||
    db m"You've got the Scale", $ff
 | 
			
		||||
ItemTradeQuest14:
 | 
			
		||||
    db m"You've got the Magnifying Lens", $ff
 | 
			
		||||
 
 | 
			
		||||
ItemPieceOfPower:
 | 
			
		||||
    db m"You've got a Piece of Power", $ff
 | 
			
		||||
 | 
			
		||||
MultiNamePointers:
 | 
			
		||||
| 
						 | 
				
			
			@ -24,14 +24,10 @@ notSpecialSideView:
 | 
			
		|||
        ld   a, $06 ; giveItemMultiworld
 | 
			
		||||
        rst  8
 | 
			
		||||
        
 | 
			
		||||
        ldh  a, [$F1] ; Load active sprite variant to see if this is just a normal small key
 | 
			
		||||
        cp   $1A
 | 
			
		||||
        jr   z, isAKey
 | 
			
		||||
        
 | 
			
		||||
        ;Show message (if not a key)
 | 
			
		||||
        ;Show message
 | 
			
		||||
        ld   a, $0A ; showMessageMultiworld
 | 
			
		||||
        rst  8
 | 
			
		||||
isAKey:
 | 
			
		||||
 | 
			
		||||
        ret
 | 
			
		||||
    """))
 | 
			
		||||
    rom.patch(0x03, 0x24B7, "3E", "3E")  # sanity check
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -505,6 +505,19 @@ class InGameHints(DefaultOnToggle):
 | 
			
		|||
    display_name = "In-game Hints"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ForeignItemIcons(Choice):
 | 
			
		||||
    """
 | 
			
		||||
    Choose how to display foreign items.
 | 
			
		||||
    [Guess By Name] Foreign items can look like any Link's Awakening item.
 | 
			
		||||
    [Indicate Progression] Foreign items are either a Piece of Power (progression) or Guardian Acorn (non-progression).
 | 
			
		||||
    """
 | 
			
		||||
    display_name = "Foreign Item Icons"
 | 
			
		||||
    option_guess_by_name = 0
 | 
			
		||||
    option_indicate_progression = 1
 | 
			
		||||
    default = option_guess_by_name
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ladx_option_groups = [
 | 
			
		||||
    OptionGroup("Goal Options", [
 | 
			
		||||
        Goal,
 | 
			
		||||
| 
						 | 
				
			
			@ -537,6 +550,7 @@ ladx_option_groups = [
 | 
			
		|||
        LinkPalette,
 | 
			
		||||
        Palette,
 | 
			
		||||
        TextShuffle,
 | 
			
		||||
        ForeignItemIcons,
 | 
			
		||||
        APTitleScreen,
 | 
			
		||||
        GfxMod,
 | 
			
		||||
        Music,
 | 
			
		||||
| 
						 | 
				
			
			@ -571,6 +585,7 @@ class LinksAwakeningOptions(PerGameCommonOptions):
 | 
			
		|||
    gfxmod: GfxMod
 | 
			
		||||
    palette: Palette
 | 
			
		||||
    text_shuffle: TextShuffle
 | 
			
		||||
    foreign_item_icons: ForeignItemIcons
 | 
			
		||||
    shuffle_nightmare_keys: ShuffleNightmareKeys
 | 
			
		||||
    shuffle_small_keys: ShuffleSmallKeys
 | 
			
		||||
    shuffle_maps: ShuffleMaps
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@ import os
 | 
			
		|||
import pkgutil
 | 
			
		||||
import tempfile
 | 
			
		||||
import typing
 | 
			
		||||
import re
 | 
			
		||||
 | 
			
		||||
import bsdiff4
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -12,6 +13,7 @@ from BaseClasses import Entrance, Item, ItemClassification, Location, Tutorial,
 | 
			
		|||
from Fill import fill_restrictive
 | 
			
		||||
from worlds.AutoWorld import WebWorld, World
 | 
			
		||||
from .Common import *
 | 
			
		||||
from . import ItemIconGuessing
 | 
			
		||||
from .Items import (DungeonItemData, DungeonItemType, ItemName, LinksAwakeningItem, TradeItemData,
 | 
			
		||||
                    ladxr_item_to_la_item_name, links_awakening_items, links_awakening_items_by_name,
 | 
			
		||||
                    links_awakening_item_name_groups)
 | 
			
		||||
| 
						 | 
				
			
			@ -380,66 +382,36 @@ class LinksAwakeningWorld(World):
 | 
			
		|||
 | 
			
		||||
    name_cache = {}
 | 
			
		||||
    # Tries to associate an icon from another game with an icon we have
 | 
			
		||||
    def guess_icon_for_other_world(self, other):
 | 
			
		||||
    def guess_icon_for_other_world(self, foreign_item):
 | 
			
		||||
        if not self.name_cache:
 | 
			
		||||
            forbidden = [
 | 
			
		||||
                "TRADING",
 | 
			
		||||
                "ITEM",
 | 
			
		||||
                "BAD",
 | 
			
		||||
                "SINGLE",
 | 
			
		||||
                "UPGRADE",
 | 
			
		||||
                "BLUE",
 | 
			
		||||
                "RED",
 | 
			
		||||
                "NOTHING",
 | 
			
		||||
                "MESSAGE",
 | 
			
		||||
            ]
 | 
			
		||||
            for item in ladxr_item_to_la_item_name.keys():
 | 
			
		||||
                self.name_cache[item] = item
 | 
			
		||||
                splits = item.split("_")
 | 
			
		||||
                self.name_cache["".join(splits)] = item
 | 
			
		||||
                if 'RUPEES' in splits:
 | 
			
		||||
                    self.name_cache["".join(reversed(splits))] = item
 | 
			
		||||
                    
 | 
			
		||||
                for word in item.split("_"):
 | 
			
		||||
                    if word not in forbidden and not word.isnumeric():
 | 
			
		||||
                    if word not in ItemIconGuessing.BLOCKED_ASSOCIATIONS and not word.isnumeric():
 | 
			
		||||
                        self.name_cache[word] = item
 | 
			
		||||
            others = {
 | 
			
		||||
                'KEY': 'KEY',
 | 
			
		||||
                'COMPASS': 'COMPASS',
 | 
			
		||||
                'BIGKEY': 'NIGHTMARE_KEY',
 | 
			
		||||
                'MAP': 'MAP',
 | 
			
		||||
                'FLUTE': 'OCARINA',
 | 
			
		||||
                'SONG': 'OCARINA',
 | 
			
		||||
                'MUSHROOM': 'TOADSTOOL',
 | 
			
		||||
                'GLOVE': 'POWER_BRACELET',
 | 
			
		||||
                'BOOT': 'PEGASUS_BOOTS',
 | 
			
		||||
                'SHOE': 'PEGASUS_BOOTS',
 | 
			
		||||
                'SHOES': 'PEGASUS_BOOTS',
 | 
			
		||||
                'SANCTUARYHEARTCONTAINER': 'HEART_CONTAINER',
 | 
			
		||||
                'BOSSHEARTCONTAINER': 'HEART_CONTAINER',
 | 
			
		||||
                'HEARTCONTAINER': 'HEART_CONTAINER',
 | 
			
		||||
                'ENERGYTANK': 'HEART_CONTAINER',
 | 
			
		||||
                'MISSILE': 'SINGLE_ARROW',
 | 
			
		||||
                'BOMBS': 'BOMB',
 | 
			
		||||
                'BLUEBOOMERANG': 'BOOMERANG',
 | 
			
		||||
                'MAGICMIRROR': 'TRADING_ITEM_MAGNIFYING_GLASS',
 | 
			
		||||
                'MIRROR': 'TRADING_ITEM_MAGNIFYING_GLASS',
 | 
			
		||||
                'MESSAGE': 'TRADING_ITEM_LETTER',
 | 
			
		||||
                # TODO: Also use AP item name
 | 
			
		||||
            }
 | 
			
		||||
            for name in others.values():
 | 
			
		||||
            for name in ItemIconGuessing.SYNONYMS.values():
 | 
			
		||||
                assert name in self.name_cache, name
 | 
			
		||||
                assert name in CHEST_ITEMS, name
 | 
			
		||||
            self.name_cache.update(others)
 | 
			
		||||
            
 | 
			
		||||
        
 | 
			
		||||
        uppered = other.upper()
 | 
			
		||||
        if "BIG KEY" in uppered:
 | 
			
		||||
            return 'NIGHTMARE_KEY'
 | 
			
		||||
        possibles = other.upper().split(" ")
 | 
			
		||||
        rejoined = "".join(possibles)
 | 
			
		||||
        if rejoined in self.name_cache:
 | 
			
		||||
            return self.name_cache[rejoined]
 | 
			
		||||
            self.name_cache.update(ItemIconGuessing.SYNONYMS)
 | 
			
		||||
            pluralizations = {k + "S": v for k, v in self.name_cache.items()}
 | 
			
		||||
            self.name_cache = pluralizations | self.name_cache
 | 
			
		||||
 | 
			
		||||
        uppered = foreign_item.name.upper()
 | 
			
		||||
        foreign_game = self.multiworld.game[foreign_item.player]
 | 
			
		||||
        phrases = ItemIconGuessing.PHRASES.copy()
 | 
			
		||||
        if foreign_game in ItemIconGuessing.GAME_SPECIFIC_PHRASES:
 | 
			
		||||
            phrases.update(ItemIconGuessing.GAME_SPECIFIC_PHRASES[foreign_game])
 | 
			
		||||
 | 
			
		||||
        for phrase, icon in phrases.items():
 | 
			
		||||
            if phrase in uppered:
 | 
			
		||||
                return icon
 | 
			
		||||
        # pattern for breaking down camelCase, also separates out digits
 | 
			
		||||
        pattern = re.compile(r"(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[a-zA-Z])(?=\d)")
 | 
			
		||||
        possibles = pattern.sub(' ', foreign_item.name).upper()
 | 
			
		||||
        for ch in "[]()_":
 | 
			
		||||
            possibles = possibles.replace(ch, " ")
 | 
			
		||||
        possibles = possibles.split()
 | 
			
		||||
        for name in possibles:
 | 
			
		||||
            if name in self.name_cache:
 | 
			
		||||
                return self.name_cache[name]
 | 
			
		||||
| 
						 | 
				
			
			@ -465,8 +437,15 @@ class LinksAwakeningWorld(World):
 | 
			
		|||
 | 
			
		||||
                    # If the item name contains "sword", use a sword icon, etc
 | 
			
		||||
                    # Otherwise, use a cute letter as the icon
 | 
			
		||||
                    elif self.options.foreign_item_icons == 'guess_by_name':
 | 
			
		||||
                        loc.ladxr_item.item = self.guess_icon_for_other_world(loc.item)
 | 
			
		||||
                        loc.ladxr_item.custom_item_name = loc.item.name
 | 
			
		||||
 | 
			
		||||
                    else:
 | 
			
		||||
                        loc.ladxr_item.item = self.guess_icon_for_other_world(loc.item.name)
 | 
			
		||||
                        if loc.item.advancement:
 | 
			
		||||
                            loc.ladxr_item.item = 'PIECE_OF_POWER'
 | 
			
		||||
                        else:
 | 
			
		||||
                            loc.ladxr_item.item = 'GUARDIAN_ACORN'
 | 
			
		||||
                        loc.ladxr_item.custom_item_name = loc.item.name
 | 
			
		||||
 | 
			
		||||
                    if loc.item:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue