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)
 |