diff options
-rw-r--r-- | main.asm | 333 |
1 files changed, 286 insertions, 47 deletions
@@ -5060,7 +5060,72 @@ DisplayStartMenu: ; 2ACD call $36a0 ; transfer tile pattern data for text windows into VRAM jp CloseTextDisplay -INCBIN "baserom.gbc",$2b7f,$2f9e - $2b7f +; function to count how many bits are set in a string of bytes +; INPUT: +; hl = address of string of bytes +; b = length of string of bytes +; OUTPUT: +; [$D11E] = number of set bits +CountSetBits: ; 2B7F + ld c,0 +.loop\@ + ld a,[hli] + ld e,a + ld d,8 +.innerLoop\@ ; count how many bits are set in the current byte + srl e + ld a,0 + adc c + ld c,a + dec d + jr nz,.innerLoop\@ + dec b + jr nz,.loop\@ + ld a,c + ld [$d11e],a ; store number of set bits + ret + +INCBIN "baserom.gbc",$2B96,$2BBB - $2B96 + +; function to remove an item (in varying quantities) from the player's bag or PC box +; INPUT: +; HL = address of inventory (either W_NUMBAGITEMS or W_NUMBOXITEMS) +; [$CF92] = index (within the inventory) of the item to remove +; [$CF96] = quantity to remove +RemoveItemFromInventory: ; 2BBB + ld a,[$ffb8] + push af + ld a,BANK(RemoveItemFromInventory_) + ld [$ffb8],a + ld [$2000],a + call RemoveItemFromInventory_ + pop af + ld [$ffb8],a + ld [$2000],a + ret + +; function to add an item (in varying quantities) to the player's bag or PC box +; INPUT: +; HL = address of inventory (either W_NUMBAGITEMS or W_NUMBOXITEMS) +; [$CF91] = item ID +; [$CF96] = item quantity +; sets carry flag if successful, unsets carry flag if unsuccessful +AddItemToInventory: ; 2BCF + push bc + ld a,[$ffb8] + push af + ld a,BANK(AddItemToInventory_) + ld [$ffb8],a + ld [$2000],a + call AddItemToInventory_ + pop bc + ld a,b + ld [$ffb8],a + ld [$2000],a + pop bc + ret + +INCBIN "baserom.gbc",$2be6,$2f9e - $2be6 GetMonName: ; 2F9E push hl @@ -5171,7 +5236,42 @@ TechnicalPrefix: ; 303c HiddenPrefix: ; 303e db "HM" -INCBIN "baserom.gbc",$3040,$31cc - $3040 +; sets carry if item is HM, clears carry if item is not HM +; Input: a = item ID +IsItemHM: ; 3040 + cp a,HM_01 + jr c,.notHM\@ + cp a,TM_01 + ret +.notHM\@ + and a + ret + +; sets carry if move is an HM, clears carry if move is not an HM +; Input: a = move ID +IsMoveHM: ; 3049 + ld hl,HMMoves + ld de,1 + jp IsInArray + +HMMoves: ; 3052 + db CUT,FLY,SURF,STRENGTH,FLASH + db $ff ; terminator + +GetMoveName: ; 3058 + push hl + ld a,MOVE_NAME + ld [$d0b6],a + ld a,[$d11e] + ld [$d0b5],a + ld a,BANK(MoveNames) + ld [$d0b7],a + call GetName + ld de,$cd6d ; pointer to where move name is stored in RAM + pop hl + ret + +INCBIN "baserom.gbc",$3071,$31cc - $3071 LoadTrainerHeader: ; 0x31cc call $3157 @@ -7057,60 +7157,49 @@ ENDC INCBIN "baserom.gbc",$6b21,$6e0c - $6b21 -UnnamedText_6e0c: ; 0x6e0c - TX_FAR _UnnamedText_6e0c +PokemartBuyingGreetingText: ; 0x6e0c + TX_FAR _PokemartBuyingGreetingText db $50 -; 0x6e0c + 5 bytes -UnnamedText_6e11: ; 0x6e11 - TX_FAR _UnnamedText_6e11 +PokemartTellBuyPrice: ; 0x6e11 + TX_FAR _PokemartTellBuyPrice db $50 -; 0x6e11 + 5 bytes -UnnamedText_6e16: ; 0x6e16 - TX_FAR _UnnamedText_6e16 +PokemartBoughtItemText: ; 0x6e16 + TX_FAR _PokemartBoughtItemText db $50 -; 0x6e16 + 5 bytes -UnnamedText_6e1b: ; 0x6e1b - TX_FAR _UnnamedText_6e1b +PokemartNotEnoughMoneyText: ; 0x6e1b + TX_FAR _PokemartNotEnoughMoneyText db $50 -; 0x6e1b + 5 bytes -UnnamedText_6e20: ; 0x6e20 - TX_FAR _UnnamedText_6e20 +PokemartItemBagFullText: ; 0x6e20 + TX_FAR _PokemartItemBagFullText db $50 -; 0x6e20 + 5 bytes -UnnamedText_6e25: ; 0x6e25 - TX_FAR _UnnamedText_6e25 +PokemonSellingGreetingText: ; 0x6e25 + TX_FAR _PokemonSellingGreetingText db $50 -; 0x6e25 + 5 bytes -UnnamedText_6e2a: ; 0x6e2a - TX_FAR _UnnamedText_6e2a +PokemartTellSellPrice: ; 0x6e2a + TX_FAR _PokemartTellSellPrice db $50 -; 0x6e2a + 5 bytes -UnnamedText_6e2f: ; 0x6e2f - TX_FAR _UnnamedText_6e2f +PokemartItemBagEmptyText: ; 0x6e2f + TX_FAR _PokemartItemBagEmptyText db $50 -; 0x6e2f + 5 bytes -UnnamedText_6e34: ; 0x6e34 - TX_FAR _UnnamedText_6e34 +PokemartUnsellableItemText: ; 0x6e34 + TX_FAR _PokemartUnsellableItemText db $50 -; 0x6e34 + 5 bytes -UnnamedText_6e39: ; 0x6e39 - TX_FAR _UnnamedText_6e39 +PokemartThankYouText: ; 0x6e39 + TX_FAR _PokemartThankYouText db $50 -; 0x6e39 + 5 bytes -UnnamedText_6e3e: ; 0x6e3e - TX_FAR _UnnamedText_6e3e +PokemartAnythingElseText: ; 0x6e3e + TX_FAR _PokemartAnythingElseText db $50 -; 0x6e3e + 5 bytes INCBIN "baserom.gbc",$6e43,$6fb4 - $6e43 @@ -8785,7 +8874,157 @@ UnnamedText_cdff: ; 0xcdff db $50 ; 0xcdff + 5 bytes -INCBIN "baserom.gbc",$ce04,$b4 + +; function to add an item (in varying quantities) to the player's bag or PC box +; INPUT: +; hl = address of inventory (either W_NUMBAGITEMS or W_NUMBOXITEMS) +; [$CF91] = item ID +; [$CF96] = item quantity +; sets carry flag if successful, unsets carry flag if unsuccessful +AddItemToInventory_: ; 4E04 + ld a,[$cf96] ; a = item quantity + push af + push bc + push de + push hl + push hl + ld d,50 ; PC box can hold 50 items + ld a,W_NUMBAGITEMS & $FF + cp l + jr nz,.checkIfInventoryFull\@ + ld a,W_NUMBAGITEMS >> 8 + cp h + jr nz,.checkIfInventoryFull\@ +; if the destination is the bag + ld d,20 ; bag can hold 20 items +.checkIfInventoryFull\@ + ld a,[hl] + sub d + ld d,a + ld a,[hli] + and a + jr z,.addNewItem\@ +.loop\@ + ld a,[hli] + ld b,a ; b = ID of current item in table + ld a,[$cf91] ; a = ID of item being added + cp b ; does the current item in the table match the item being added? + jp z,.increaseItemQuantity\@ ; if so, increase the item's quantity + inc hl + ld a,[hl] + cp a,$ff ; is it the end of the table? + jr nz,.loop\@ +.addNewItem\@ ; add an item not yet in the inventory + pop hl + ld a,d + and a ; is there room for a new item slot? + jr z,.done\@ +; if there is room + inc [hl] ; increment the number of items in the inventory + ld a,[hl] ; the number of items will be the index of the new item + add a + dec a + ld c,a + ld b,0 + add hl,bc ; hl = address to store the item + ld a,[$cf91] + ld [hli],a ; store item ID + ld a,[$cf96] + ld [hli],a ; store item quantity + ld [hl],$ff ; store terminator + jp .success\@ +.increaseItemQuantity\@ ; increase the quantity of an item already in the inventory + ld a,[$cf96] + ld b,a ; b = quantity to add + ld a,[hl] ; a = existing item quantity + add b ; a = new item quantity + cp a,100 + jp c,.storeNewQuantity\@ ; if the new quantity is less than 100, store it +; if the new quantity is greater than or equal to 100, +; try to max out the current slot and add the rest in a new slot + sub a,99 + ld [$cf96],a ; a = amount left over (to put in the new slot) + ld a,d + and a ; is there room for a new item slot? + jr z,.increaseItemQuantityFailed\@ +; if so, store 99 in the current slot and store the rest in a new slot + ld a,99 + ld [hli],a + jp .loop\@ +.increaseItemQuantityFailed\@ + pop hl + and a + jr .done\@ +.storeNewQuantity\@ + ld [hl],a + pop hl +.success\@ + scf +.done\@ + pop hl + pop de + pop bc + pop bc + ld a,b + ld [$cf96],a ; restore the initial value from when the function was called + ret + +; function to remove an item (in varying quantities) from the player's bag or PC box +; INPUT: +; hl = address of inventory (either W_NUMBAGITEMS or W_NUMBOXITEMS) +; [$CF92] = index (within the inventory) of the item to remove +; [$CF96] = quantity to remove +RemoveItemFromInventory_: ; 4E74 + push hl + inc hl + ld a,[$cf92] ; index (within the inventory) of the item being removed + sla a + add l + ld l,a + jr nc,.noCarry\@ + inc h +.noCarry\@ + inc hl + ld a,[$cf96] ; quantity being removed + ld e,a + ld a,[hl] ; a = current quantity + sub e + ld [hld],a ; store new quantity + ld [$cf97],a + and a + jr nz,.skipMovingUpSlots\@ +; if the remaining quantity is 0, +; remove the emptied item slot and move up all the following item slots +.moveSlotsUp\@ + ld e,l + ld d,h + inc de + inc de ; de = address of the slot following the emptied one +.loop\@ ; loop to move up the following slots + ld a,[de] + inc de + ld [hli],a + cp a,$ff + jr nz,.loop\@ +; update menu info + xor a + ld [$cc36],a + ld [W_CURMENUITEMID],a + ld [$cc2c],a + ld [$d07e],a + pop hl + ld a,[hl] ; a = number of items in inventory + dec a ; decrement the number of items + ld [hl],a ; store new number of items + ld [$d12a],a + cp a,2 + jr c,.done\@ + ld [W_MAXMENUITEMID],a + jr .done\@ +.skipMovingUpSlots\@ + pop hl +.done\@ + ret ; wild pokemon data: from 4EB8 to 55C7 @@ -78844,11 +79083,11 @@ _RepelWoreOffText: ; 0xa25ef db "wore off.", $57 ; 0xa25ef + 25 bytes -_UnnamedText_6e0c: ; 0xa2608 +_PokemartBuyingGreetingText: ; 0xa2608 db $0, "Take your time.", $57 ; 0xa2608 + 17 bytes -_UnnamedText_6e11: ; 0xa2619 +_PokemartTellBuyPrice: ; 0xa2619 TX_RAM $cf4b db $0, "?", $4f db "That will be", $55 @@ -78857,48 +79096,48 @@ _UnnamedText_6e11: ; 0xa2619 db $0, ". OK?", $57 ; 0xa2639 -_UnnamedText_6e16: ; 0xa2639 +_PokemartBoughtItemText: ; 0xa2639 db $0, "Here you are!", $4f db "Thank you!", $58 ; 0xa2639 + 26 bytes -_UnnamedText_6e1b: ; 0xa2653 +_PokemartNotEnoughMoneyText: ; 0xa2653 db $0, "You don't have", $4f db "enough money.", $58 ; 0xa2653 + 29 bytes -_UnnamedText_6e20: ; 0xa2670 +_PokemartItemBagFullText: ; 0xa2670 db $0, "You can't carry", $4f db "any more items.", $58 ; 0xa2670 + 32 bytes -_UnnamedText_6e25: ; 0xa2690 +_PokemonSellingGreetingText: ; 0xa2690 db $0, "What would you", $4f db "like to sell?", $57 ; 0xa2690 + 30 bytes -_UnnamedText_6e2a: ; 0xa26ae +_PokemartTellSellPrice: ; 0xa26ae db $0, "I can pay you", $4f db $f0, "@" db $2, $9f, $ff, $c3 ; XXX db $0, " for that.", $57 ; 0xa26cf -_UnnamedText_6e2f: ; 0xa26cf +_PokemartItemBagEmptyText: ; 0xa26cf db $0, "You don't have", $4f db "anything to sell.", $58 ; 0xa26cf + 33 bytes -_UnnamedText_6e34: ; 0xa26f0 +_PokemartUnsellableItemText: ; 0xa26f0 db $0, "I can't put a", $4f db "price on that.", $58 ; 0xa26f0 + 29 bytes -_UnnamedText_6e39: ; 0xa270d +_PokemartThankYouText: ; 0xa270d db $0, "Thank you!", $57 ; 0xa270d + 12 bytes -_UnnamedText_6e3e: ; 0xa2719 +_PokemartAnythingElseText: ; 0xa2719 db $0, "Is there anything", $4f db "else I can do?", $57 ; 0xa2719 + 34 bytes |