 ed721dd0c1
			
		
	
	ed721dd0c1
	
	
	
		
			
			* magnifying lens changes
https://github.com/daid/LADXR/pull/156
* restore enemy visibility in mermaid statue cave
https://github.com/daid/LADXR/pull/155
* mermaid statue scale bugfix
https://github.com/daid/LADXR/pull/163
* restore vanilla map when rooster is an item
https://github.com/daid/LADXR/pull/132
* fix
* fixes to magnifying lens changes
* load marin singing even if you have marin date
4feb3099a3
* Revert "load marin singing even if you have marin date"
This reverts commit a7a546ed3f7a2b9c9bcb095984cc64319a4f7855.
* always patch tradequest
not upstream, but included in this PR because it touches the same parts of the code. https://discord.com/channels/731205301247803413/1227373762412937347
* marin date fix
* fix logic
		
	
		
			
				
	
	
		
			90 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from .itemInfo import ItemInfo
 | |
| from .constants import *
 | |
| from ..assembler import ASM
 | |
| from ..utils import formatText
 | |
| 
 | |
| 
 | |
| class BoomerangGuy(ItemInfo):
 | |
|     OPTIONS = [BOOMERANG, HOOKSHOT, MAGIC_ROD, PEGASUS_BOOTS, FEATHER, SHOVEL]
 | |
| 
 | |
|     def __init__(self):
 | |
|         super().__init__(0x1F5)
 | |
|         self.setting = 'trade'
 | |
| 
 | |
|     def configure(self, options):
 | |
|         self.MULTIWORLD = False
 | |
| 
 | |
|         self.setting = options.boomerang
 | |
|         if self.setting == 'gift':
 | |
|             self.MULTIWORLD = True
 | |
| 
 | |
|     # Cannot trade:
 | |
|     # SWORD, BOMB, SHIELD, POWER_BRACELET, OCARINA, MAGIC_POWDER, BOW
 | |
|     # Checks for these are at $46A2, and potentially we could remove those.
 | |
|     # But SHIELD, BOMB and MAGIC_POWDER would most likely break things.
 | |
|     # SWORD and POWER_BRACELET would most likely introduce the lv0 shield/bracelet issue
 | |
|     def patch(self, rom, option, *, multiworld=None):
 | |
|         if self.setting == 'trade':
 | |
|             inv = INVENTORY_MAP[option]
 | |
|             # Patch the check if you traded back the boomerang (so traded twice)
 | |
|             rom.patch(0x19, 0x063F, ASM("cp $0D"), ASM("cp $%s" % (inv)))
 | |
|             # Item to give by "default" (aka, boomerang)
 | |
|             rom.patch(0x19, 0x06C1, ASM("ld a, $0D"), ASM("ld a, $%s" % (inv)))
 | |
|             # Check if inventory slot is boomerang to give back item in this slot
 | |
|             rom.patch(0x19, 0x06FC, ASM("cp $0D"), ASM("cp $%s" % (inv)))
 | |
|             # Put the boomerang ID in the inventory of the boomerang guy (aka, traded back)
 | |
|             rom.patch(0x19, 0x0710, ASM("ld a, $0D"), ASM("ld a, $%s" % (inv)))
 | |
| 
 | |
|             rom.texts[0x222] = formatText("Okay, let's do it!")
 | |
|             rom.texts[0x224] = formatText("You got the {%s} in exchange for the item you had." % (option))
 | |
|             rom.texts[0x225] = formatText("Give me back my {%s}, I beg you! I'll return the item you gave me" % (option), ask="Okay Not Now")
 | |
|             rom.texts[0x226] = formatText("The item came back to you. You returned the other item.")
 | |
|         else:
 | |
|             # Patch the inventory trade to give an specific item instead
 | |
|             rom.texts[0x221] = formatText("I found a good item washed up on the beach... Want to have it?", ask="Okay No")
 | |
|             rom.patch(0x19, 0x069C, 0x06C6, ASM("""
 | |
|                 ; Mark trade as done
 | |
|                 ld a, $06
 | |
|                 ld [$DB7D], a
 | |
| 
 | |
|                 ld a, [$472B]
 | |
|                 ldh [$F1], a
 | |
|                 ld a, $06
 | |
|                 rst 8
 | |
|                 
 | |
|                 ld a, $0D
 | |
|             """), fill_nop=True)
 | |
|             # Show the right item above link
 | |
|             rom.patch(0x19, 0x0786, 0x0793, ASM("""
 | |
|                 ld a, [$472B]
 | |
|                 ldh [$F1], a
 | |
|                 ld a, $01
 | |
|                 rst 8
 | |
|             """), fill_nop=True)
 | |
|             # Give the proper message for this item
 | |
|             rom.patch(0x19, 0x075A, 0x076A, ASM("""
 | |
|                 ld a, [$472B]
 | |
|                 ldh [$F1], a
 | |
|                 ld a, $0A
 | |
|                 rst 8
 | |
|             """), fill_nop=True)
 | |
|             rom.patch(0x19, 0x072B, "00", "%02X" % (CHEST_ITEMS[option]))
 | |
| 
 | |
|             # Ignore the trade back.
 | |
|             rom.texts[0x225] = formatText("It's a secret to everybody.")
 | |
|             rom.patch(0x19, 0x0668, ASM("ld a, [$DB7D]"), ASM("ret"), fill_nop=True)
 | |
| 
 | |
|             if multiworld is not None:
 | |
|                 rom.banks[0x3E][0x3300 + self.room] = multiworld
 | |
| 
 | |
|     def read(self, rom):
 | |
|         if rom.banks[0x19][0x06C5] == 0x00:
 | |
|             for k, v in CHEST_ITEMS.items():
 | |
|                 if v == rom.banks[0x19][0x072B]:
 | |
|                     return k
 | |
|         else:
 | |
|             for k, v in INVENTORY_MAP.items():
 | |
|                 if int(v, 16) == rom.banks[0x19][0x0640]:
 | |
|                     return k
 | |
|         raise ValueError()
 |