diff options
Diffstat (limited to 'src/home/card_data.asm')
-rw-r--r-- | src/home/card_data.asm | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/src/home/card_data.asm b/src/home/card_data.asm new file mode 100644 index 0000000..9fd78ae --- /dev/null +++ b/src/home/card_data.asm @@ -0,0 +1,214 @@ +; load data of card with text id of name at de to wLoadedCard1 +LoadCardDataToBuffer1_FromName: + ld hl, CardPointers + 2 ; skip first NULL pointer + ld a, BANK(CardPointers) + call BankpushROM2 +.find_card_loop + ld a, [hli] + or [hl] + jr z, .done + push hl + ld a, [hld] + ld l, [hl] + ld h, a + ld a, BANK(CardPointers) + call BankpushROM2 + ld bc, CARD_DATA_NAME + add hl, bc + ld a, [hli] + cp e + jr nz, .no_match + ld a, [hl] + cp d +.no_match + pop hl + pop hl + inc hl + jr nz, .find_card_loop + dec hl + ld a, [hld] + ld l, [hl] + ld h, a + ld a, BANK(CardPointers) + call BankpushROM2 + ld de, wLoadedCard1 + ld b, PKMN_CARD_DATA_LENGTH +.copy_card_loop + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .copy_card_loop + pop hl +.done + call BankpopROM + ret + +; load data of card with id at e to wLoadedCard2 +LoadCardDataToBuffer2_FromCardID: + push hl + ld hl, wLoadedCard2 + jr LoadCardDataToHL_FromCardID + +; load data of card with id at e to wLoadedCard1 +LoadCardDataToBuffer1_FromCardID: + push hl + ld hl, wLoadedCard1 +; fallthrough + +LoadCardDataToHL_FromCardID: + push de + push bc + push hl + call GetCardPointer + pop de + jr c, .done + ld a, BANK(CardPointers) + call BankpushROM2 + ld b, PKMN_CARD_DATA_LENGTH +.copy_card_data_loop + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .copy_card_data_loop + call BankpopROM + or a +.done + pop bc + pop de + pop hl + ret + +; return in a the type (TYPE_* constant) of the card with id at e +GetCardType: + push hl + call GetCardPointer + jr c, .done + ld a, BANK(CardPointers) + call BankpushROM2 + ld l, [hl] + call BankpopROM + ld a, l + or a +.done + pop hl + ret + +; return in de the 2-byte text id of the name of the card with id at e +GetCardName: + push hl + call GetCardPointer + jr c, .done + ld a, BANK(CardPointers) + call BankpushROM2 + ld de, CARD_DATA_NAME + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + call BankpopROM + or a +.done + pop hl + ret + +; from the card id in a, returns type into a, rarity into b, and set into c +GetCardTypeRarityAndSet: + push hl + push de + ld d, 0 + ld e, a + call GetCardPointer + jr c, .done + ld a, BANK(CardPointers) + call BankpushROM2 + ld e, [hl] ; CARD_DATA_TYPE + ld bc, CARD_DATA_RARITY + add hl, bc + ld b, [hl] ; CARD_DATA_RARITY + inc hl + ld c, [hl] ; CARD_DATA_SET + call BankpopROM + ld a, e + or a +.done + pop de + pop hl + ret + +; return at hl the pointer to the data of the card with id at e +; return carry if e was out of bounds, so no pointer was returned +GetCardPointer: + push de + push bc + ld l, e + ld h, $0 + add hl, hl + ld bc, CardPointers + add hl, bc + ld a, h + cp HIGH(CardPointers + 2 + (2 * NUM_CARDS)) + jr nz, .nz + ld a, l + cp LOW(CardPointers + 2 + (2 * NUM_CARDS)) +.nz + ccf + jr c, .out_of_bounds + ld a, BANK(CardPointers) + call BankpushROM2 + ld a, [hli] + ld h, [hl] + ld l, a + call BankpopROM + or a +.out_of_bounds + pop bc + pop de + ret + +; input: +; hl = card_gfx_index +; de = where to load the card gfx to +; bc are supposed to be $30 (number of tiles of a card gfx) and TILE_SIZE respectively +; card_gfx_index = (<Name>CardGfx - CardGraphics) / 8 (using absolute ROM addresses) +; also copies the card's palette to wCardPalette +LoadCardGfx: + ldh a, [hBankROM] + push af + push hl + ; first, get the bank with the card gfx is at + srl h + srl h + srl h + ld a, BANK(CardGraphics) + add h + call BankswitchROM + pop hl + ; once we have the bank, get the pointer: multiply by 8 and discard the bank offset + add hl, hl + add hl, hl + add hl, hl + res 7, h + set 6, h ; $4000 ≤ hl ≤ $7fff + call CopyGfxData + ld b, CGB_PAL_SIZE + ld de, wCardPalette +.copy_card_palette + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .copy_card_palette + pop af + call BankswitchROM + ret + +; identical to CopyFontsOrDuelGraphicsTiles +CopyFontsOrDuelGraphicsTiles2: + ld a, BANK(Fonts) ; BANK(DuelGraphics) + call BankpushROM + ld c, TILE_SIZE + call CopyGfxData + call BankpopROM + ret |