 81a239325d
			
		
	
	81a239325d
	
	
	
		
			
			Adds Link's Awakening: DX. Fully imports and forks LADXR, with permission - https://github.com/daid/LADXR
		
			
				
	
	
		
			153 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from ..assembler import ASM
 | |
| 
 | |
| 
 | |
| def fixShop(rom):
 | |
|     # Move shield visuals to the 2nd slot, and arrow to 3th slot
 | |
|     rom.patch(0x04, 0x3732 + 22, "986A027FB2B098AC01BAB1", "9867027FB2B098A801BAB1")
 | |
|     rom.patch(0x04, 0x3732 + 55, "986302B1B07F98A4010A09", "986B02B1B07F98AC010A09")
 | |
| 
 | |
|     # Just use a fixed location in memory to store which inventory we give.
 | |
|     rom.patch(0x04, 0x37C5, "0708", "0802")
 | |
| 
 | |
|     # Patch the code that decides which shop to show.
 | |
|     rom.patch(0x04, 0x3839, 0x388E, ASM("""
 | |
|         push bc
 | |
|         jr skipSubRoutine
 | |
| 
 | |
| checkInventory:
 | |
|         ld hl, $DB00 ; inventory
 | |
|         ld c, INV_SIZE
 | |
| loop:
 | |
|         cp [hl]
 | |
|         ret z
 | |
|         inc hl
 | |
|         dec c
 | |
|         jr nz, loop
 | |
|         and a
 | |
|         ret
 | |
| 
 | |
| skipSubRoutine:
 | |
|         ; Set the shop table to all nothing.
 | |
|         ld   hl, $C505
 | |
|         xor  a
 | |
|         ldi  [hl], a
 | |
|         ldi  [hl], a
 | |
|         ldi  [hl], a
 | |
|         ldi  [hl], a
 | |
|         ld   de, $C505
 | |
|         
 | |
|         ; Check if we want to load a key item into the shop.
 | |
|         ldh  a, [$F8]
 | |
|         bit  4, a
 | |
|         jr   nz, checkForSecondKeyItem
 | |
|         ld   a, $01
 | |
|         ld   [de], a
 | |
|         jr   checkForShield
 | |
| checkForSecondKeyItem:
 | |
|         bit  5, a
 | |
|         jr   nz, checkForShield
 | |
|         ld   a, $05
 | |
|         ld   [de], a
 | |
| 
 | |
| checkForShield:
 | |
|         inc  de
 | |
|         ; Check if we have the shield or the bow to see if we need to remove certain entries from the shop
 | |
|         ld   a, [$DB44]
 | |
|         and  a
 | |
|         jr   z, hasNoShieldLevel
 | |
|         ld   a, $03
 | |
|         ld   [de], a ; Add shield buy option
 | |
| hasNoShieldLevel:
 | |
| 
 | |
|         inc  de
 | |
|         ld   a, $05
 | |
|         call checkInventory
 | |
|         jr   nz, hasNoBow
 | |
|         ld   a, $06
 | |
|         ld   [de], a ; Add arrow buy option
 | |
| hasNoBow:
 | |
| 
 | |
|         inc  de
 | |
|         ld   a, $02
 | |
|         call checkInventory
 | |
|         jr   nz, hasNoBombs
 | |
|         ld   a, $04
 | |
|         ld   [de], a ; Add bomb buy option
 | |
| hasNoBombs:
 | |
| 
 | |
|         pop  bc
 | |
|         call $3B12 ; increase entity state
 | |
|     """, 0x7839), fill_nop=True)
 | |
| 
 | |
|     # We do not have enough room at the shovel/bow buy entry to handle this
 | |
|     # So jump to a bit where we have some more space to work, as there is some dead code in the shop.
 | |
|     rom.patch(0x04, 0x3AA9, 0x3AAE, ASM("jp $7AC3"), fill_nop=True)
 | |
| 
 | |
|     # Patch over the "you stole it" dialog
 | |
|     rom.patch(0x00, 0x1A1C, 0x1A21, ASM("""ld   a, $C9
 | |
|        call   $2385"""), fill_nop=True)
 | |
|     rom.patch(0x04, 0x3AC3, 0x3AD8, ASM("""
 | |
|         ; No room override needed, we're in the proper room
 | |
|         ; Call our chest item giving code.
 | |
|         ld   a, $0E
 | |
|         rst  8
 | |
|         ; Update the room status to mark first item as bought
 | |
|         ld   hl, $DAA1
 | |
|         ld   a, [hl]
 | |
|         or   $10
 | |
|         ld   [hl], a
 | |
|         ret
 | |
|     """), fill_nop=True)
 | |
|     rom.patch(0x04, 0x3A73, 0x3A7E, ASM("jp $7A91"), fill_nop=True)
 | |
|     rom.patch(0x04, 0x3A91, 0x3AA9, ASM("""
 | |
|         ; Override the room - luckily nothing will go wrong here if we leave it as is
 | |
|         ld a, $A7
 | |
|         ldh  [$F6], a
 | |
|         ; Call our chest item giving code.
 | |
|         ld   a, $0E
 | |
|         rst  8
 | |
|         ; Update the room status to mark second item as bought
 | |
|         ld   hl, $DAA1
 | |
|         ld   a, [hl]
 | |
|         or   $20
 | |
|         ld   [hl], a
 | |
|         ret
 | |
|     """), fill_nop=True)
 | |
| 
 | |
|     # Patch shop item graphics rendering to use some new code at the end of the bank.
 | |
|     rom.patch(0x04, 0x3B91, 0x3BAC, ASM("""
 | |
|         call $7FD0
 | |
|     """), fill_nop=True)
 | |
|     rom.patch(0x04, 0x3BD3, 0x3BE3, ASM("""
 | |
|         jp   $7FD0
 | |
|     """), fill_nop=True)
 | |
|     rom.patch(0x04, 0x3FD0, "00" * 42, ASM("""
 | |
|         ; Check if first key item
 | |
|         and  a
 | |
|         jr   nz, notShovel
 | |
|         ld   a, [$77C5]
 | |
|         ldh  [$F1], a
 | |
|         ld   a, $01
 | |
|         rst  8
 | |
|         ret
 | |
| notShovel:
 | |
|         cp   $04
 | |
|         jr   nz, notBow
 | |
|         ld   a, [$77C6]
 | |
|         ldh  [$F1], a
 | |
|         ld   a, $01
 | |
|         rst  8
 | |
|         ret
 | |
| notBow:
 | |
|         cp   $05
 | |
|         jr   nz, notArrows
 | |
|         ; Load arrow graphics and render then as a dual sprite
 | |
|         ld   de, $7B58
 | |
|         call $3BC0
 | |
|         ret
 | |
| notArrows:
 | |
|         ; Load the normal graphics
 | |
|         ld   de, $7B5A
 | |
|         jp   $3C77
 | |
|     """), fill_nop=True)
 |