126 lines
3.6 KiB
Python
126 lines
3.6 KiB
Python
import os
|
|
import binascii
|
|
import pkgutil
|
|
|
|
from ..assembler import ASM
|
|
from ..utils import formatText
|
|
|
|
ItemNameLookupTable = 0x0100
|
|
ItemNameLookupSize = 2
|
|
TotalRoomCount = 0x316
|
|
|
|
AnItemText = "an item"
|
|
ItemNameStringBufferStart = ItemNameLookupTable + \
|
|
TotalRoomCount * ItemNameLookupSize
|
|
|
|
|
|
def addBank34(rom, item_list):
|
|
rom.patch(0x34, 0x0000, ItemNameLookupTable, ASM("""
|
|
; Get the pointer in the lookup table, doubled as it's two bytes
|
|
ld hl, $2080
|
|
push de
|
|
call OffsetPointerByRoomNumber
|
|
pop de
|
|
add hl, hl
|
|
|
|
ldi a, [hl] ; hl = *hl
|
|
ld h, [hl]
|
|
ld l, a
|
|
|
|
; If there's no data, bail
|
|
ld a, l
|
|
or h
|
|
jp z, SwitchBackTo3E
|
|
|
|
ld de, wCustomMessage
|
|
; Copy "Got " to de
|
|
ld a, 71
|
|
ld [de], a
|
|
inc de
|
|
ld a, 111
|
|
ld [de], a
|
|
inc de
|
|
ld a, 116
|
|
ld [de], a
|
|
inc de
|
|
ld a, 32
|
|
ld [de], a
|
|
inc de
|
|
; Copy in our item name
|
|
call MessageCopyString
|
|
SwitchBackTo3E:
|
|
; Bail
|
|
ld a, $3e ; Set bank number
|
|
jp $080C ; switch bank
|
|
|
|
; this should be shared but I got link errors
|
|
OffsetPointerByRoomNumber:
|
|
ldh a, [$F6] ; map room
|
|
ld e, a
|
|
ld a, [$DBA5] ; is indoor
|
|
ld d, a
|
|
ldh a, [$F7] ; mapId
|
|
cp $FF
|
|
jr nz, .notColorDungeon
|
|
|
|
ld d, $03
|
|
jr .notCavesA
|
|
|
|
.notColorDungeon:
|
|
cp $1A
|
|
jr nc, .notCavesA
|
|
cp $06
|
|
jr c, .notCavesA
|
|
inc d
|
|
.notCavesA:
|
|
add hl, de
|
|
ret
|
|
""" + pkgutil.get_data(__name__, os.path.join("bank3e.asm", "message.asm")).decode().replace("\r", ""), 0x4000), fill_nop=True)
|
|
|
|
nextItemLookup = ItemNameStringBufferStart
|
|
nameLookup = {
|
|
|
|
}
|
|
|
|
name = AnItemText
|
|
|
|
def add_or_get_name(name):
|
|
nonlocal nextItemLookup
|
|
if name in nameLookup:
|
|
return nameLookup[name]
|
|
if len(name) + 1 + nextItemLookup >= 0x4000:
|
|
return nameLookup[AnItemText]
|
|
asm = ASM(f'db "{name}", $ff\n')
|
|
rom.patch(0x34, nextItemLookup, None, asm)
|
|
patch_len = len(binascii.unhexlify(asm))
|
|
nameLookup[name] = nextItemLookup + 0x4000
|
|
nextItemLookup += patch_len
|
|
return nameLookup[name]
|
|
|
|
item_text_addr = add_or_get_name(AnItemText)
|
|
#error_text_addr = add_or_get_name("Please report this check to #bug-reports in the AP discord")
|
|
def swap16(x):
|
|
assert x <= 0xFFFF
|
|
return (x >> 8) | ((x & 0xFF) << 8)
|
|
|
|
def to_hex_address(x):
|
|
return f"{swap16(x):04x}"
|
|
|
|
# Set defaults for every room
|
|
for i in range(TotalRoomCount):
|
|
rom.patch(0x34, ItemNameLookupTable + i *
|
|
ItemNameLookupSize, None, to_hex_address(0))
|
|
|
|
for item in item_list:
|
|
if not item.custom_item_name:
|
|
continue
|
|
assert item.room < TotalRoomCount, item.room
|
|
# Item names of exactly 255 characters will cause overwrites to occur in the text box
|
|
# assert len(item.custom_item_name) < 0x100
|
|
# Custom text is only 95 bytes long, restrict to 50
|
|
addr = add_or_get_name(item.custom_item_name[:50])
|
|
rom.patch(0x34, ItemNameLookupTable + item.room *
|
|
ItemNameLookupSize, None, to_hex_address(addr))
|
|
if item.extra:
|
|
rom.patch(0x34, ItemNameLookupTable + item.extra *
|
|
ItemNameLookupSize, None, to_hex_address(addr)) |