mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
Links Awakening: Implement New Game (#1334)
Adds Link's Awakening: DX. Fully imports and forks LADXR, with permission - https://github.com/daid/LADXR
This commit is contained in:
152
worlds/ladx/LADXR/patches/shop.py
Normal file
152
worlds/ladx/LADXR/patches/shop.py
Normal file
@@ -0,0 +1,152 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user