From 870d85fc2713703f6dbc760df5b2c54328f0c9c3 Mon Sep 17 00:00:00 2001 From: luckytyphlosion <10688458+luckytyphlosion@users.noreply.github.com> Date: Tue, 3 Jul 2018 13:27:51 -0400 Subject: Merge branch 'master' of https://github.com/pret/pokegold-spaceworld --- engine/items/inventory.asm | 1446 ++++++++++++++++++++--------------------- engine/items/item_effects.asm | 158 ++--- 2 files changed, 802 insertions(+), 802 deletions(-) (limited to 'engine/items') diff --git a/engine/items/inventory.asm b/engine/items/inventory.asm index 9524d70..c30e5c0 100755 --- a/engine/items/inventory.asm +++ b/engine/items/inventory.asm @@ -1,723 +1,723 @@ -INCLUDE "constants.asm" - -SECTION "Inventory", ROMX[$4AA1], BANK[$03] - -_ReceiveItem: ; 03:4AA1 - call DoesHLEqualwNumBagItems - jp nz, PutItemInPocket - push hl - callab CheckItemPocket - ld a, [wItemAttributeParamBuffer] - dec a - ld hl, .Pockets - jp CallJumptable - -.Pockets: ; 03:4ABA - dw .Item - dw .KeyItem - dw .Ball - dw .TMHM - -.Item: ; 03:4AC2 - pop hl - jp PutItemInPocket - -.KeyItem: ; 03:4AC6 - pop hl - jp ReceiveKeyItem - -.Ball: ; 03:4ACA - pop hl - ld a, [wCurItem] - ld c, a - call GetBallIndex - jp ReceiveBall - -.TMHM: ; 03:4AD5 - pop hl - ld a, [wCurItem] - ld c, a - call GetTMHMNumber - jp ReceiveTMHM - - -_TossItem: ; 03:4AE0 - call DoesHLEqualwNumBagItems - jr nz, .remove_item - push hl - callab CheckItemPocket - ld a, [wItemAttributeParamBuffer] - dec a - ld hl, .Pockets - jp CallJumptable - -.Pockets ; 03:4AF8 - dw .Item - dw .KeyItem - dw .Ball - dw .TMHM - -.Ball ; 03:4B00 - pop hl - ld a, [wCurItem] - ld c, a - call GetBallIndex - jp TossBall - -.TMHM ; 03:4B0B - pop hl - ld a, [wCurItem] - ld c, a - call GetTMHMNumber - jp TossTMHM - -.KeyItem ; 03:4B16 - pop hl - jp TossKeyItem - -.Item ; 03:4B1A - pop hl - -.remove_item ; 03:4B1B - jp RemoveItemFromPocket - - -_CheckItem: ; 03:4B1E - call DoesHLEqualwNumBagItems - jr nz, .not_bag - push hl - callab CheckItemPocket - ld a, [wItemAttributeParamBuffer] - dec a - ld hl, .Pockets - jp CallJumptable - -.Pockets ; 03:4B36 - dw .Item - dw .KeyItem - dw .Ball - dw .TMHM - -.Ball ; 03:4B3E - pop hl - ld a, [wCurItem] - ld c, a - call GetBallIndex - jp CheckBall - -.TMHM ; 03:4B49 - pop hl - ld a, [wCurItem] - ld c, a - call GetTMHMNumber - jp CheckTMHM - -.KeyItem ; 03:4B54 - pop hl - jp CheckKeyItems - -.Item ; 03:4B58 - pop hl - -.not_bag - jp CheckTheItem - - -DoesHLEqualwNumBagItems: ; 03:4B5C - ld a, l - cp LOW(wNumBagItems) - ret nz - ld a, h - cp HIGH(wNumBagItems) - ret - - -PutItemInPocket: ; 03:4B64 - ld d, h - ld e, l - inc hl - ld a, [wCurItem] - ld c, a - ld b, 0 - -; will add the item once the total -; available space (b) exceeds the -; amount being added -.loop - ld a, [hli] - cp -1 - jr z, .terminator - cp c - jr nz, .next - ld a, 99 - sub [hl] - add b - ld b, a - ld a, [wItemQuantity] - cp b - jr z, .can_add - jr c, .can_add - -.next - inc hl - jr .loop - -.terminator - call GetPocketCapacity - ld a, [de] - cp c - jr c, .can_add - - and a - ret - -.can_add - ld h, d - ld l, e - ld a, [wCurItem] - ld c, a - -.loop2 - inc hl - ld a, [hli] - cp a, -1 - jr z, .terminator2 - cp c - jr nz, .loop2 - - ld a, [wItemQuantity] - add [hl] - cp a, 100 - jr nc, .set_max - ld [hl], a - jr .done - -; set this slot's quantity to 99, -; and keep iterating through list -; to add remaining amount -.set_max - ld [hl], 99 - sub 99 - ld [wItemQuantity], a - jr .loop2 - -.terminator2 - dec hl - ld a, [wCurItem] - ld [hli], a - ld a, [wItemQuantity] - ld [hli], a - ld [hl], -1 - ld h, d - ld l, e - inc [hl] - -.done - scf - ret - - -GetPocketCapacity: ; 03:4BC1 - ld c, MAX_ITEMS - ld a, e - cp a, LOW(wNumBagItems) - jr nz, .not_bag - ld a, d - cp HIGH(wNumBagItems) - ret z - -.not_bag - ld c, MAX_PC_ITEMS - ret - - -RemoveItemFromPocket: ;03:4BCF - ld d, h - ld e, l - inc hl - ld a, [wItemIndex] - ld c, a - ld b, 0 - add hl, bc - add hl, bc - inc hl - ld a, [wItemQuantity] - ld b, a - ld a, [hl] - sub b - jr c, .underflow - - ld [hl], a - ld [wItemQuantityBuffer], a - and a - jr nz, .done - -; if the remaining quantity is zero -; then erase the slot by shifting -; the subsequent data upwards - dec hl - ld b, h - ld c, l - inc hl - inc hl - -.loop - ld a, [hli] - ld [bc], a - inc bc - cp -1 - jr nz, .loop - ld h, d - ld l, e - dec [hl] - -.done - scf - ret - -.underflow - and a - ret - - -CheckTheItem: ; 03:4BFD - ld a, [wCurItem] - ld c, a - -.loop - inc hl - ld a, [hli] - cp -1 - jr z, .fail - cp c - jr nz, .loop - - scf - ret - -.fail - and a - ret - - -ReceiveKeyItem: ; 03:4C0E - ld hl, wNumKeyItems - ld a, [hli] - cp a, MAX_KEY_ITEMS - jr nc, .full_pack - ld c, a - ld b, 0 - add hl, bc - ld a, [wCurItem] - ld [hli], a - ld [hl], -1 - ld hl, wNumKeyItems - inc [hl] - scf - ret - -.full_pack - and a - ret - - -TossKeyItem: ; 03:4C28 - ld hl, wNumKeyItems - dec [hl] - inc hl - ld a, [wItemIndex] - ld e, a - ld d, 0 - add hl, de - ld d, h - ld e, l - inc hl - -; erase this item by shifting -; all subsequent data upwards -.loop - ld a, [hli] - ld [de], a - inc de - cp -1 - jr nz, .loop - scf - ret - - -CheckKeyItems: ; 03:4C40 - ld a, [wCurItem] - ld c, a - ld hl, wKeyItems - -.loop - ld a, [hli] - cp c - jr z, .done - cp -1 - jr nz, .loop - - and a - ret - -.done - scf - ret - - -; get index of ball item id c from BallItems -GetBallIndex: ; 03:4C53 - ld a, c - push hl - push de - push bc - ld hl, BallItems - ld de, 1 - call FindItemInTable - ld a, b - pop bc - pop de - pop hl - ld c, a - ret - - -; get ball item id at index c in BallItems -GetBallByIndex: ; 03:4c66 - push bc - push hl - ld b, 0 - ld hl, BallItems - add hl, bc - ld a, [hl] - pop hl - pop bc - ld c, a - ret - - -BallItems: ; 03:4C73 - db ITEM_MASTER_BALL - db ITEM_ULTRA_BALL - db ITEM_GREAT_BALL - db ITEM_POKE_BALL - db -1 - - -; empties the ball pocket by setting the -; terminator immediately after wNumBallItems - - ; Note, the ball pocket appears to be - ; a fixed length, not -1 terminated -EmptyBallPocket: ; 03:4C78 - ld hl, wNumBallItems - xor a - ld [hli], a - ld [hl], -1 - ret - - -ReceiveBall: ; 03:4C80 - ld hl, wBallQuantities - ld b, 0 - add hl, bc - ld a, [wItemQuantity] - add [hl] - cp 100 - jr nc, .overflow - ld b, a - ld a, [hl] - and a - jr nz, .done - -; increase the ball pocket size if -; this ball's previous quantity was 0 - ld a, [wNumBallItems] - inc a - ld [wNumBallItems], a - -.done - ld [hl], b - scf - ret - -.overflow - and a - ret - - -TossBall: ; 03:4C9F - ld hl, wBallQuantities - ld b, 0 - add hl, bc - ld a, [wItemQuantity] - ld b, a - ld a, [hl] - sub b - jr c, .underflow - jr nz, .done - -; increase the ball pocket size if -; this ball's new quantity is 0 - ld b, a - ld a, [wNumBallItems] - dec a - ld [wNumBallItems], a - ld a, b - -.done - ld [hl], a - ld [wItemQuantityBuffer], a - scf - ret - -.underflow - and a - ret - - -CheckBall: ; 03:4CC0 - ld hl, wBallQuantities - ld b, 0 - add hl, bc - ld a, [hl] - and a - ret z - scf - ret - - -ReceiveTMHM: ; 03:4CCB - ld b, 0 - ld hl, wTMsHMs - add hl, bc - ld a, [wItemQuantity] - add [hl] - cp 100 - jr nc, .overflow - ld [hl], a - scf - ret - -.overflow - and a - ret - - -TossTMHM: ; 03:4CDE - ld b, 0 - ld hl, wTMsHMs - add hl, bc - ld a, [wItemQuantity] - ld b, a - ld a, [hl] - sub b - jr c, .underflow - - ld [hl], a - ld [wItemQuantityBuffer], a - scf - ret - -.underflow - and a - ret - - -CheckTMHM: ; 03:4CF4 - ld b, 0 - ld hl, wTMsHMs - add hl, bc - ld a, [hl] - and a - ret z - scf - ret - -GetTMHMNumber: ; 03:4CFF - ld a, c - ld c, 0 - - sub ITEM_TM01 - jr c, .not_machine - - cp ITEM_C8 - ITEM_TM01 - jr z, .not_machine - jr c, .finish - - inc c - cp ITEM_E1 - ITEM_TM01 - jr z, .not_machine - - jr c, .finish - inc c - -; c represents the amount of non-TMs which -; appear ahead of this item in the list -; so subtract that value before exiting -.finish - sub c - ld c, a - scf - ret - -.not_machine - and a - ret - -GetNumberedTMHM: ; 03:4D1A -; Return the item id of a TM/HM by number c. - ld a, c - ld c, 0 -; Adjust for any dummy items. - cp ITEM_C8 - ITEM_TM01 ; TM01-04 - jr c, .finish - inc c - cp ITEM_E1 - ITEM_TM01 - 1 ; TM05-28 - jr c, .finish - inc c - cp ITEM_FF - ITEM_TM01 - 2 ; End of list - jr nc, .not_machine -.finish - add c - add ITEM_TM01 - ld c, a - scf - ret -.not_machine - and a - ret - -SECTION "GetItemAmount", ROMX[$4e10], BANK[$03] - -; Returns carry if user has the item -; and the amount in b -GetItemAmount: ; 03:4e10 - call CheckAmountInItemPocket - ret c - call CheckAmountInKeyItems - ret c - ld b, 0 - and a - ret - -; Returns the amount of item b in b -CheckAmountInItemPocket: ; 03:4E1C - ld hl, wItems -.loop - inc hl - ld a, [hli] - cp -1 - ret z - cp b - jr nz, .loop - - ld a, [hl] - ld b, a - scf - ret - -; Returns the amount of item b in b -CheckAmountInKeyItems: ; 03:4E2B - ld hl, wNumKeyItems - ld a, [hli] - and a - ret z - -.loop - ld a, [hli] - cp -1 - ret z - cp b - jr nz, .loop - ld b, 1 - scf - ret - -SECTION "_CheckTossableItem", ROMX[$53AD], BANK[$03] - -; Return 1 in wItemAttributeParamBuffer and -; carry if wCurItem can't be removed from the bag. -_CheckTossableItem: ; 03:53AD - ld a, ITEMATTR_PERMISSIONS - call GetItemAttr - bit CANT_TOSS_F, a - jr nz, ItemAttr_ReturnCarry - and a - ret - -; Return 1 in wItemAttributeParamBuffer -; and carry if wCurItem can't be selected. -CheckSelectableItem: ; 03:53B8 - ld a, ITEMATTR_PERMISSIONS - call GetItemAttr - bit CANT_SELECT_F, a - jr nz, ItemAttr_ReturnCarry - and a - ret - -; Return the pocket for wCurItem in wItemAttributeParamBuffer. -CheckItemPocket: ; 03:53C3 - ld a, ITEMATTR_POCKET - call GetItemAttr - and $f - ld [wItemAttributeParamBuffer], a - ret - -; Return the context for wCurItem in wItemAttributeParamBuffer. -CheckItemContext: ; 03:53CE - ld a, ITEMATTR_HELP - call GetItemAttr - and $f - ld [wItemAttributeParamBuffer], a - ret - -; Return the menu for wCurItem in wItemAttributeParamBuffer. -CheckItemMenu: ; 03:53D9 - ld a, ITEMATTR_HELP - call GetItemAttr - swap a - and $f - ld [wItemAttributeParamBuffer], a - ret - -; Get attribute a of wCurItem. -GetItemAttr: ; 03:53E6 - push hl - push bc - ld hl, ItemAttributes - ld c, a - ld b, 0 - add hl, bc - xor a - ld [wItemAttributeParamBuffer], a - ld a, [wCurItem] - dec a - ld c, a - ld a, ITEMATTR_STRUCT_LENGTH - call AddNTimes - ld a, BANK(ItemAttributes) - call GetFarByte - pop bc - pop hl - ret - -ItemAttr_ReturnCarry: ; 03:5405 - ld a, 1 - ld [wItemAttributeParamBuffer], a - scf - ret - -; Return the price of wCurItem in de. -GetItemPrice: ; 03:540C - push hl - push bc - ld a, ITEMATTR_PRICE - call GetItemAttr - ld e, a - ld a, ITEMATTR_PRICE_HI - call GetItemAttr - ld d, a - pop bc - pop hl - ret +INCLUDE "constants.asm" + +SECTION "Inventory", ROMX[$4AA1], BANK[$03] + +_ReceiveItem: ; 03:4AA1 + call DoesHLEqualwNumBagItems + jp nz, PutItemInPocket + push hl + callab CheckItemPocket + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, .Pockets + jp CallJumptable + +.Pockets: ; 03:4ABA + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM + +.Item: ; 03:4AC2 + pop hl + jp PutItemInPocket + +.KeyItem: ; 03:4AC6 + pop hl + jp ReceiveKeyItem + +.Ball: ; 03:4ACA + pop hl + ld a, [wCurItem] + ld c, a + call GetBallIndex + jp ReceiveBall + +.TMHM: ; 03:4AD5 + pop hl + ld a, [wCurItem] + ld c, a + call GetTMHMNumber + jp ReceiveTMHM + + +_TossItem: ; 03:4AE0 + call DoesHLEqualwNumBagItems + jr nz, .remove_item + push hl + callab CheckItemPocket + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, .Pockets + jp CallJumptable + +.Pockets ; 03:4AF8 + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM + +.Ball ; 03:4B00 + pop hl + ld a, [wCurItem] + ld c, a + call GetBallIndex + jp TossBall + +.TMHM ; 03:4B0B + pop hl + ld a, [wCurItem] + ld c, a + call GetTMHMNumber + jp TossTMHM + +.KeyItem ; 03:4B16 + pop hl + jp TossKeyItem + +.Item ; 03:4B1A + pop hl + +.remove_item ; 03:4B1B + jp RemoveItemFromPocket + + +_CheckItem: ; 03:4B1E + call DoesHLEqualwNumBagItems + jr nz, .not_bag + push hl + callab CheckItemPocket + ld a, [wItemAttributeParamBuffer] + dec a + ld hl, .Pockets + jp CallJumptable + +.Pockets ; 03:4B36 + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM + +.Ball ; 03:4B3E + pop hl + ld a, [wCurItem] + ld c, a + call GetBallIndex + jp CheckBall + +.TMHM ; 03:4B49 + pop hl + ld a, [wCurItem] + ld c, a + call GetTMHMNumber + jp CheckTMHM + +.KeyItem ; 03:4B54 + pop hl + jp CheckKeyItems + +.Item ; 03:4B58 + pop hl + +.not_bag + jp CheckTheItem + + +DoesHLEqualwNumBagItems: ; 03:4B5C + ld a, l + cp LOW(wNumBagItems) + ret nz + ld a, h + cp HIGH(wNumBagItems) + ret + + +PutItemInPocket: ; 03:4B64 + ld d, h + ld e, l + inc hl + ld a, [wCurItem] + ld c, a + ld b, 0 + +; will add the item once the total +; available space (b) exceeds the +; amount being added +.loop + ld a, [hli] + cp -1 + jr z, .terminator + cp c + jr nz, .next + ld a, 99 + sub [hl] + add b + ld b, a + ld a, [wItemQuantity] + cp b + jr z, .can_add + jr c, .can_add + +.next + inc hl + jr .loop + +.terminator + call GetPocketCapacity + ld a, [de] + cp c + jr c, .can_add + + and a + ret + +.can_add + ld h, d + ld l, e + ld a, [wCurItem] + ld c, a + +.loop2 + inc hl + ld a, [hli] + cp a, -1 + jr z, .terminator2 + cp c + jr nz, .loop2 + + ld a, [wItemQuantity] + add [hl] + cp a, 100 + jr nc, .set_max + ld [hl], a + jr .done + +; set this slot's quantity to 99, +; and keep iterating through list +; to add remaining amount +.set_max + ld [hl], 99 + sub 99 + ld [wItemQuantity], a + jr .loop2 + +.terminator2 + dec hl + ld a, [wCurItem] + ld [hli], a + ld a, [wItemQuantity] + ld [hli], a + ld [hl], -1 + ld h, d + ld l, e + inc [hl] + +.done + scf + ret + + +GetPocketCapacity: ; 03:4BC1 + ld c, MAX_ITEMS + ld a, e + cp a, LOW(wNumBagItems) + jr nz, .not_bag + ld a, d + cp HIGH(wNumBagItems) + ret z + +.not_bag + ld c, MAX_PC_ITEMS + ret + + +RemoveItemFromPocket: ;03:4BCF + ld d, h + ld e, l + inc hl + ld a, [wItemIndex] + ld c, a + ld b, 0 + add hl, bc + add hl, bc + inc hl + ld a, [wItemQuantity] + ld b, a + ld a, [hl] + sub b + jr c, .underflow + + ld [hl], a + ld [wItemQuantityBuffer], a + and a + jr nz, .done + +; if the remaining quantity is zero +; then erase the slot by shifting +; the subsequent data upwards + dec hl + ld b, h + ld c, l + inc hl + inc hl + +.loop + ld a, [hli] + ld [bc], a + inc bc + cp -1 + jr nz, .loop + ld h, d + ld l, e + dec [hl] + +.done + scf + ret + +.underflow + and a + ret + + +CheckTheItem: ; 03:4BFD + ld a, [wCurItem] + ld c, a + +.loop + inc hl + ld a, [hli] + cp -1 + jr z, .fail + cp c + jr nz, .loop + + scf + ret + +.fail + and a + ret + + +ReceiveKeyItem: ; 03:4C0E + ld hl, wNumKeyItems + ld a, [hli] + cp a, MAX_KEY_ITEMS + jr nc, .full_pack + ld c, a + ld b, 0 + add hl, bc + ld a, [wCurItem] + ld [hli], a + ld [hl], -1 + ld hl, wNumKeyItems + inc [hl] + scf + ret + +.full_pack + and a + ret + + +TossKeyItem: ; 03:4C28 + ld hl, wNumKeyItems + dec [hl] + inc hl + ld a, [wItemIndex] + ld e, a + ld d, 0 + add hl, de + ld d, h + ld e, l + inc hl + +; erase this item by shifting +; all subsequent data upwards +.loop + ld a, [hli] + ld [de], a + inc de + cp -1 + jr nz, .loop + scf + ret + + +CheckKeyItems: ; 03:4C40 + ld a, [wCurItem] + ld c, a + ld hl, wKeyItems + +.loop + ld a, [hli] + cp c + jr z, .done + cp -1 + jr nz, .loop + + and a + ret + +.done + scf + ret + + +; get index of ball item id c from BallItems +GetBallIndex: ; 03:4C53 + ld a, c + push hl + push de + push bc + ld hl, BallItems + ld de, 1 + call FindItemInTable + ld a, b + pop bc + pop de + pop hl + ld c, a + ret + + +; get ball item id at index c in BallItems +GetBallByIndex: ; 03:4c66 + push bc + push hl + ld b, 0 + ld hl, BallItems + add hl, bc + ld a, [hl] + pop hl + pop bc + ld c, a + ret + + +BallItems: ; 03:4C73 + db ITEM_MASTER_BALL + db ITEM_ULTRA_BALL + db ITEM_GREAT_BALL + db ITEM_POKE_BALL + db -1 + + +; empties the ball pocket by setting the +; terminator immediately after wNumBallItems + + ; Note, the ball pocket appears to be + ; a fixed length, not -1 terminated +EmptyBallPocket: ; 03:4C78 + ld hl, wNumBallItems + xor a + ld [hli], a + ld [hl], -1 + ret + + +ReceiveBall: ; 03:4C80 + ld hl, wBallQuantities + ld b, 0 + add hl, bc + ld a, [wItemQuantity] + add [hl] + cp 100 + jr nc, .overflow + ld b, a + ld a, [hl] + and a + jr nz, .done + +; increase the ball pocket size if +; this ball's previous quantity was 0 + ld a, [wNumBallItems] + inc a + ld [wNumBallItems], a + +.done + ld [hl], b + scf + ret + +.overflow + and a + ret + + +TossBall: ; 03:4C9F + ld hl, wBallQuantities + ld b, 0 + add hl, bc + ld a, [wItemQuantity] + ld b, a + ld a, [hl] + sub b + jr c, .underflow + jr nz, .done + +; increase the ball pocket size if +; this ball's new quantity is 0 + ld b, a + ld a, [wNumBallItems] + dec a + ld [wNumBallItems], a + ld a, b + +.done + ld [hl], a + ld [wItemQuantityBuffer], a + scf + ret + +.underflow + and a + ret + + +CheckBall: ; 03:4CC0 + ld hl, wBallQuantities + ld b, 0 + add hl, bc + ld a, [hl] + and a + ret z + scf + ret + + +ReceiveTMHM: ; 03:4CCB + ld b, 0 + ld hl, wTMsHMs + add hl, bc + ld a, [wItemQuantity] + add [hl] + cp 100 + jr nc, .overflow + ld [hl], a + scf + ret + +.overflow + and a + ret + + +TossTMHM: ; 03:4CDE + ld b, 0 + ld hl, wTMsHMs + add hl, bc + ld a, [wItemQuantity] + ld b, a + ld a, [hl] + sub b + jr c, .underflow + + ld [hl], a + ld [wItemQuantityBuffer], a + scf + ret + +.underflow + and a + ret + + +CheckTMHM: ; 03:4CF4 + ld b, 0 + ld hl, wTMsHMs + add hl, bc + ld a, [hl] + and a + ret z + scf + ret + +GetTMHMNumber: ; 03:4CFF + ld a, c + ld c, 0 + + sub ITEM_TM01 + jr c, .not_machine + + cp ITEM_C8 - ITEM_TM01 + jr z, .not_machine + jr c, .finish + + inc c + cp ITEM_E1 - ITEM_TM01 + jr z, .not_machine + + jr c, .finish + inc c + +; c represents the amount of non-TMs which +; appear ahead of this item in the list +; so subtract that value before exiting +.finish + sub c + ld c, a + scf + ret + +.not_machine + and a + ret + +GetNumberedTMHM: ; 03:4D1A +; Return the item id of a TM/HM by number c. + ld a, c + ld c, 0 +; Adjust for any dummy items. + cp ITEM_C8 - ITEM_TM01 ; TM01-04 + jr c, .finish + inc c + cp ITEM_E1 - ITEM_TM01 - 1 ; TM05-28 + jr c, .finish + inc c + cp ITEM_FF - ITEM_TM01 - 2 ; End of list + jr nc, .not_machine +.finish + add c + add ITEM_TM01 + ld c, a + scf + ret +.not_machine + and a + ret + +SECTION "GetItemAmount", ROMX[$4e10], BANK[$03] + +; Returns carry if user has the item +; and the amount in b +GetItemAmount: ; 03:4e10 + call CheckAmountInItemPocket + ret c + call CheckAmountInKeyItems + ret c + ld b, 0 + and a + ret + +; Returns the amount of item b in b +CheckAmountInItemPocket: ; 03:4E1C + ld hl, wItems +.loop + inc hl + ld a, [hli] + cp -1 + ret z + cp b + jr nz, .loop + + ld a, [hl] + ld b, a + scf + ret + +; Returns the amount of item b in b +CheckAmountInKeyItems: ; 03:4E2B + ld hl, wNumKeyItems + ld a, [hli] + and a + ret z + +.loop + ld a, [hli] + cp -1 + ret z + cp b + jr nz, .loop + ld b, 1 + scf + ret + +SECTION "_CheckTossableItem", ROMX[$53AD], BANK[$03] + +; Return 1 in wItemAttributeParamBuffer and +; carry if wCurItem can't be removed from the bag. +_CheckTossableItem: ; 03:53AD + ld a, ITEMATTR_PERMISSIONS + call GetItemAttr + bit CANT_TOSS_F, a + jr nz, ItemAttr_ReturnCarry + and a + ret + +; Return 1 in wItemAttributeParamBuffer +; and carry if wCurItem can't be selected. +CheckSelectableItem: ; 03:53B8 + ld a, ITEMATTR_PERMISSIONS + call GetItemAttr + bit CANT_SELECT_F, a + jr nz, ItemAttr_ReturnCarry + and a + ret + +; Return the pocket for wCurItem in wItemAttributeParamBuffer. +CheckItemPocket: ; 03:53C3 + ld a, ITEMATTR_POCKET + call GetItemAttr + and $f + ld [wItemAttributeParamBuffer], a + ret + +; Return the context for wCurItem in wItemAttributeParamBuffer. +CheckItemContext: ; 03:53CE + ld a, ITEMATTR_HELP + call GetItemAttr + and $f + ld [wItemAttributeParamBuffer], a + ret + +; Return the menu for wCurItem in wItemAttributeParamBuffer. +CheckItemMenu: ; 03:53D9 + ld a, ITEMATTR_HELP + call GetItemAttr + swap a + and $f + ld [wItemAttributeParamBuffer], a + ret + +; Get attribute a of wCurItem. +GetItemAttr: ; 03:53E6 + push hl + push bc + ld hl, ItemAttributes + ld c, a + ld b, 0 + add hl, bc + xor a + ld [wItemAttributeParamBuffer], a + ld a, [wCurItem] + dec a + ld c, a + ld a, ITEMATTR_STRUCT_LENGTH + call AddNTimes + ld a, BANK(ItemAttributes) + call GetFarByte + pop bc + pop hl + ret + +ItemAttr_ReturnCarry: ; 03:5405 + ld a, 1 + ld [wItemAttributeParamBuffer], a + scf + ret + +; Return the price of wCurItem in de. +GetItemPrice: ; 03:540C + push hl + push bc + ld a, ITEMATTR_PRICE + call GetItemAttr + ld e, a + ld a, ITEMATTR_PRICE_HI + call GetItemAttr + ld d, a + pop bc + pop hl + ret diff --git a/engine/items/item_effects.asm b/engine/items/item_effects.asm index d2e9545..7f886f1 100755 --- a/engine/items/item_effects.asm +++ b/engine/items/item_effects.asm @@ -1,79 +1,79 @@ -INCLUDE "constants.asm" - -SECTION "ApplyPPUp", ROMX[$78f6], BANK[$03] - -ApplyPPUp: ; 03:78f6 - ld a, MON_MOVES - call GetPartyParamLocation - push hl - ld de, wStringBuffer1 - predef FillPP - pop hl - ld c, MON_PP - MON_MOVES - ld b, 0 - add hl, bc - ld de, wStringBuffer1 + 1 - ld b, 0 -.loop - inc b - ld a, b - cp NUM_MOVES + 1 - ret z - ld a, [wce37] - dec a - jr nz, .use - ld a, [wMenuCursorY] - inc a - cp b - jr nz, .skip -.use - ld a, [hl] - and PP_UP_MASK - call nz, ComputeMaxPP -.skip - inc hl - inc de - jr .loop - -ComputeMaxPP: ; 03:792B - push bc - ; Divide the base PP by 5. - ld a, [de] - ldh [hDividend + 3], a - xor a - ldh [hDividend], a - ldh [hDividend + 1], a - ldh [hDividend + 2], a - ld a, 5 - ldh [hDivisor], a - ld b, 4 - call Divide - ; Get the number of PP, which are bits 6 and 7 of the PP value stored in RAM. - ld a, [hl] - ld b, a - swap a - and $f - srl a - srl a - ld c, a -.loop - ; Normally, a move with 40 PP would have 64 PP with three PP Ups. - ; Since this would overflow into bit 6, we prevent that from happening - ; by decreasing the extra amount of PP each PP Up provides, resulting - ; in a maximum of 61. - ldh a, [hQuotient + 2] - cp $8 - jr c, .okay - ld a, $7 -.okay - add b - ld b, a - ld a, [wce37] - dec a - jr z, .no_pp_up - dec c - jr nz, .loop -.no_pp_up - ld [hl], b - pop bc - ret +INCLUDE "constants.asm" + +SECTION "ApplyPPUp", ROMX[$78f6], BANK[$03] + +ApplyPPUp: ; 03:78f6 + ld a, MON_MOVES + call GetPartyParamLocation + push hl + ld de, wStringBuffer1 + predef FillPP + pop hl + ld c, MON_PP - MON_MOVES + ld b, 0 + add hl, bc + ld de, wStringBuffer1 + 1 + ld b, 0 +.loop + inc b + ld a, b + cp NUM_MOVES + 1 + ret z + ld a, [wce37] + dec a + jr nz, .use + ld a, [wMenuCursorY] + inc a + cp b + jr nz, .skip +.use + ld a, [hl] + and PP_UP_MASK + call nz, ComputeMaxPP +.skip + inc hl + inc de + jr .loop + +ComputeMaxPP: ; 03:792B + push bc + ; Divide the base PP by 5. + ld a, [de] + ldh [hDividend + 3], a + xor a + ldh [hDividend], a + ldh [hDividend + 1], a + ldh [hDividend + 2], a + ld a, 5 + ldh [hDivisor], a + ld b, 4 + call Divide + ; Get the number of PP, which are bits 6 and 7 of the PP value stored in RAM. + ld a, [hl] + ld b, a + swap a + and $f + srl a + srl a + ld c, a +.loop + ; Normally, a move with 40 PP would have 64 PP with three PP Ups. + ; Since this would overflow into bit 6, we prevent that from happening + ; by decreasing the extra amount of PP each PP Up provides, resulting + ; in a maximum of 61. + ldh a, [hQuotient + 2] + cp $8 + jr c, .okay + ld a, $7 +.okay + add b + ld b, a + ld a, [wce37] + dec a + jr z, .no_pp_up + dec c + jr nz, .loop +.no_pp_up + ld [hl], b + pop bc + ret -- cgit v1.2.3