diff options
author | entrpntr <entrpntr@gmail.com> | 2020-04-12 12:03:05 -0400 |
---|---|---|
committer | entrpntr <entrpntr@gmail.com> | 2020-04-12 12:03:05 -0400 |
commit | 51ad0b240e70c0bebb0cfd921ad365ff27e7617c (patch) | |
tree | e7100eee944790913c74b6b7c61c542080321dd4 /engine | |
parent | ac8070fa92e5295908ae22f6892157baf81b64ce (diff) |
Money, marts, and mom.
Diffstat (limited to 'engine')
-rw-r--r-- | engine/events/mom.asm | 676 | ||||
-rw-r--r-- | engine/events/money.asm | 209 |
2 files changed, 885 insertions, 0 deletions
diff --git a/engine/events/mom.asm b/engine/events/mom.asm new file mode 100644 index 00000000..c795bfff --- /dev/null +++ b/engine/events/mom.asm @@ -0,0 +1,676 @@ +BankOfMom: + ldh a, [hInMenu] + push af + ld a, $1 + ldh [hInMenu], a + xor a + ld [wJumptableIndex], a +.loop + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + call .RunJumptable + jr .loop + +.done + pop af + ldh [hInMenu], a + ret + +.RunJumptable: + ld a, [wJumptableIndex] + ld e, a + ld d, 0 + ld hl, .dw + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.dw + + dw .CheckIfBankInitialized + dw .InitializeBank + dw .IsThisAboutYourMoney + dw .AccessBankOfMom + dw .StoreMoney + dw .TakeMoney + dw .StopOrStartSavingMoney + dw .JustDoWhatYouCan + dw .AskDST + +.CheckIfBankInitialized: + ld a, [wMomSavingMoney] + bit MOM_ACTIVE_F, a + jr nz, .savingmoneyalready + set MOM_ACTIVE_F, a + ld [wMomSavingMoney], a + ld a, $1 + jr .done_0 + +.savingmoneyalready + ld a, $2 + +.done_0 + ld [wJumptableIndex], a + ret + +.InitializeBank: + ld hl, MomLeavingText1 + call PrintText + call YesNoBox + jr c, .DontSaveMoney + ld hl, MomLeavingText2 + call PrintText + ld a, (1 << MOM_ACTIVE_F) | (1 << MOM_SAVING_SOME_MONEY_F) + jr .done_1 + +.DontSaveMoney: + ld a, 1 << MOM_ACTIVE_F + +.done_1 + ld [wMomSavingMoney], a + ld hl, MomLeavingText3 + call PrintText + ld a, $8 + ld [wJumptableIndex], a + ret + +.IsThisAboutYourMoney: + ld hl, MomIsThisAboutYourMoneyText + call PrintText + call YesNoBox + jr c, .nope + ld a, $3 + jr .done_2 + +.nope + call DSTChecks + ld a, $7 + +.done_2 + ld [wJumptableIndex], a + ret + +.AccessBankOfMom: + ld hl, MomBankWhatDoYouWantToDoText + call PrintText + call LoadStandardMenuHeader + ld hl, MenuHeader_0x166b5 + call CopyMenuHeader + call VerticalMenu + call CloseWindow + jr c, .cancel + ld a, [wMenuCursorY] + cp $1 + jr z, .withdraw + cp $2 + jr z, .deposit + cp $3 + jr z, .stopsaving + +.cancel + ld a, $7 + jr .done_3 + +.withdraw + ld a, $5 + jr .done_3 + +.deposit + ld a, $4 + jr .done_3 + +.stopsaving + ld a, $6 + +.done_3 + ld [wJumptableIndex], a + ret + +.StoreMoney: + ld hl, MomStoreMoneyText + call PrintText + xor a + ld hl, wStringBuffer2 + ld [hli], a + ld [hli], a + ld [hl], a + ld a, 5 + ld [wMomBankDigitCursorPosition], a + call LoadStandardMenuHeader + call Mom_SetUpDepositMenu + call Mom_Wait10Frames + call Mom_WithdrawDepositMenuJoypad + call CloseWindow + jr c, .CancelDeposit + ld hl, wStringBuffer2 + ld a, [hli] + or [hl] + inc hl + or [hl] + jr z, .CancelDeposit + ld de, wMoney + ld bc, wStringBuffer2 + farcall CompareMoney + jr c, .InsufficientFundsInWallet + ld hl, wStringBuffer2 + ld de, wStringBuffer2 + 3 + ld bc, 3 + call CopyBytes + ld bc, wMomsMoney + ld de, wStringBuffer2 + farcall GiveMoney + jr c, .NotEnoughRoomInBank + ld bc, wStringBuffer2 + 3 + ld de, wMoney + farcall TakeMoney + ld hl, wStringBuffer2 + ld de, wMomsMoney + ld bc, 3 + call CopyBytes + ld de, SFX_TRANSACTION + call PlaySFX + call WaitSFX + ld hl, MomStoredMoneyText + call PrintText + ld a, $8 + jr .done_4 + +.InsufficientFundsInWallet: + ld hl, MomInsufficientFundsInWalletText + call PrintText + ret + +.NotEnoughRoomInBank: + ld hl, MomNotEnoughRoomInBankText + call PrintText + ret + +.CancelDeposit: + ld a, $7 + +.done_4 + ld [wJumptableIndex], a + ret + +.TakeMoney: + ld hl, MomTakeMoneyText + call PrintText + xor a + ld hl, wStringBuffer2 + ld [hli], a + ld [hli], a + ld [hl], a + ld a, 5 + ld [wMomBankDigitCursorPosition], a + call LoadStandardMenuHeader + call Mom_SetUpWithdrawMenu + call Mom_Wait10Frames + call Mom_WithdrawDepositMenuJoypad + call CloseWindow + jr c, .CancelWithdraw + ld hl, wStringBuffer2 + ld a, [hli] + or [hl] + inc hl + or [hl] + jr z, .CancelWithdraw + ld hl, wStringBuffer2 + ld de, wStringBuffer2 + 3 + ld bc, 3 + call CopyBytes + ld de, wMomsMoney + ld bc, wStringBuffer2 + farcall CompareMoney + jr c, .InsufficientFundsInBank + ld bc, wMoney + ld de, wStringBuffer2 + farcall GiveMoney + jr c, .NotEnoughRoomInWallet + ld bc, wStringBuffer2 + 3 + ld de, wMomsMoney + farcall TakeMoney + ld hl, wStringBuffer2 + ld de, wMoney + ld bc, 3 + call CopyBytes + ld de, SFX_TRANSACTION + call PlaySFX + call WaitSFX + ld hl, MomTakenMoneyText + call PrintText + ld a, $8 + jr .done_5 + +.InsufficientFundsInBank: + ld hl, MomHaventSavedThatMuchText + call PrintText + ret + +.NotEnoughRoomInWallet: + ld hl, MomNotEnoughRoomInWalletText + call PrintText + ret + +.CancelWithdraw: + ld a, $7 + +.done_5 + ld [wJumptableIndex], a + ret + +.StopOrStartSavingMoney: + ld hl, MomSaveMoneyText + call PrintText + call YesNoBox + jr c, .StopSavingMoney + ld a, (1 << MOM_ACTIVE_F) | (1 << MOM_SAVING_SOME_MONEY_F) + ld [wMomSavingMoney], a + ld hl, MomStartSavingMoneyText + call PrintText + ld a, $8 + ld [wJumptableIndex], a + ret + +.StopSavingMoney: + ld a, 1 << MOM_ACTIVE_F + ld [wMomSavingMoney], a + ld a, $7 + ld [wJumptableIndex], a + ret + +.JustDoWhatYouCan: + ld hl, MomJustDoWhatYouCanText + call PrintText + +.AskDST: + ld hl, wJumptableIndex + set 7, [hl] + ret + +DSTChecks: +; check the time; avoid changing DST if doing so would change the current day + ld a, [wDST] + bit 7, a + ldh a, [hHours] + jr z, .NotDST + and a ; within one hour of 00:00? + jr z, .LostBooklet + jr .loop + +.NotDST: + cp 23 ; within one hour of 23:00? + jr nz, .loop + ; fallthrough + +.LostBooklet: + call .ClearBox + bccoord 1, 14 + ld hl, .TimesetAskAdjustDSTText + call PlaceHLTextAtBC + call YesNoBox + ret c + call .ClearBox + bccoord 1, 14 + ld hl, .MomLostGearBookletText + call PlaceHLTextAtBC + ret + +.loop + call .ClearBox + bccoord 1, 14 + ld a, [wDST] + bit 7, a + jr z, .SetDST + ld hl, .TimesetAskNotDSTText + call PlaceHLTextAtBC + call YesNoBox + ret c + ld a, [wDST] + res 7, a + ld [wDST], a + call .SetClockBack + predef UpdateTimePredef + call .ClearBox + bccoord 1, 14 + ld hl, .TimesetNotDSTText + call PlaceHLTextAtBC + ret + +.SetDST: + ld hl, .TimesetAskDSTText + call PlaceHLTextAtBC + call YesNoBox + ret c + ld a, [wDST] + set 7, a + ld [wDST], a + call .SetClockForward + predef UpdateTimePredef + call .ClearBox + bccoord 1, 14 + ld hl, .TimesetDSTText + call PlaceHLTextAtBC + ret + +.SetClockForward: + ld a, [wStartHour] + add 1 + sub 24 + jr nc, .DontLoopHourForward + add 24 +.DontLoopHourForward: + ld [wStartHour], a + ccf + ld a, [wStartDay] + adc 0 + ld [wStartDay], a + ret + +.SetClockBack: + ld a, [wStartHour] + sub 1 + jr nc, .DontLoopHourBack + add 24 +.DontLoopHourBack: + ld [wStartHour], a + ld a, [wStartDay] + sbc 0 + jr nc, .DontLoopDayBack + add 7 +.DontLoopDayBack: + ld [wStartDay], a + ret + +.ClearBox: + hlcoord 1, 14 + lb bc, 3, 18 + call ClearBox + ret + +.TimesetAskAdjustDSTText: + text_far _TimesetAskAdjustDSTText + text_end + +.MomLostGearBookletText: + text_far _MomLostGearBookletText + text_end + +.TimesetAskDSTText: + text_far _TimesetAskDSTText + text_end + +.TimesetDSTText: + text_far _TimesetDSTText + text_end + +.TimesetAskNotDSTText: + text_far _TimesetAskNotDSTText + text_end + +.TimesetNotDSTText: + text_far _TimesetNotDSTText + text_end + +Mom_SetUpWithdrawMenu: + ld de, Mon_WithdrawString + jr Mom_ContinueMenuSetup + +Mom_SetUpDepositMenu: + ld de, Mom_DepositString +Mom_ContinueMenuSetup: + push de + xor a + ldh [hBGMapMode], a + hlcoord 0, 0 + lb bc, 6, 18 + call Textbox + hlcoord 1, 2 + ld de, Mom_SavedString + call PlaceString + hlcoord 12, 2 + ld de, wMomsMoney + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + hlcoord 1, 4 + ld de, Mom_HeldString + call PlaceString + hlcoord 12, 4 + ld de, wMoney + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + hlcoord 1, 6 + pop de + call PlaceString + hlcoord 12, 6 + ld de, wStringBuffer2 + lb bc, PRINTNUM_MONEY | PRINTNUM_LEADINGZEROS | 3, 6 + call PrintNum + call UpdateSprites + call CGBOnly_CopyTilemapAtOnce + ret + +Mom_Wait10Frames: + ld c, 10 + call DelayFrames + ret + +Mom_WithdrawDepositMenuJoypad: +.loop + call JoyTextDelay + ld hl, hJoyPressed + ld a, [hl] + and B_BUTTON + jr nz, .pressedB + ld a, [hl] + and A_BUTTON + jr nz, .pressedA + call .dpadaction + xor a + ldh [hBGMapMode], a + hlcoord 12, 6 + ld bc, 7 + ld a, " " + call ByteFill + hlcoord 12, 6 + ld de, wStringBuffer2 + lb bc, PRINTNUM_MONEY | PRINTNUM_LEADINGZEROS | 3, 6 + call PrintNum + ldh a, [hVBlankCounter] + and $10 + jr nz, .skip + hlcoord 13, 6 + ld a, [wMomBankDigitCursorPosition] + ld c, a + ld b, 0 + add hl, bc + ld [hl], " " + +.skip + call WaitBGMap + jr .loop + +.pressedB + scf + ret + +.pressedA + and a + ret + +.dpadaction + ld hl, hJoyLast + ld a, [hl] + and D_UP + jr nz, .incrementdigit + ld a, [hl] + and D_DOWN + jr nz, .decrementdigit + ld a, [hl] + and D_LEFT + jr nz, .movecursorleft + ld a, [hl] + and D_RIGHT + jr nz, .movecursorright + and a + ret + +.movecursorleft + ld hl, wMomBankDigitCursorPosition + ld a, [hl] + and a + ret z + dec [hl] + ret + +.movecursorright + ld hl, wMomBankDigitCursorPosition + ld a, [hl] + cp 5 + ret nc + inc [hl] + ret + +.incrementdigit + ld hl, .DigitQuantities + call .getdigitquantity + ld c, l + ld b, h + ld de, wStringBuffer2 + farcall GiveMoney + ret + +.decrementdigit + ld hl, .DigitQuantities + call .getdigitquantity + ld c, l + ld b, h + ld de, wStringBuffer2 + farcall TakeMoney + ret + +.getdigitquantity + ld a, [wMomBankDigitCursorPosition] + push de + ld e, a + ld d, 0 + add hl, de + add hl, de + add hl, de + pop de + ret + +.DigitQuantities: + dt 100000 + dt 10000 + dt 1000 + dt 100 + dt 10 + dt 1 + + dt 100000 + dt 10000 + dt 1000 + dt 100 + dt 10 + dt 1 + + dt 900000 + dt 90000 + dt 9000 + dt 900 + dt 90 + dt 9 + +MomLeavingText1: + text_far _MomLeavingText1 + text_end + +MomLeavingText2: + text_far _MomLeavingText2 + text_end + +MomLeavingText3: + text_far _MomLeavingText3 + text_end + +MomIsThisAboutYourMoneyText: + text_far _MomIsThisAboutYourMoneyText + text_end + +MomBankWhatDoYouWantToDoText: + text_far _MomBankWhatDoYouWantToDoText + text_end + +MomStoreMoneyText: + text_far _MomStoreMoneyText + text_end + +MomTakeMoneyText: + text_far _MomTakeMoneyText + text_end + +MomSaveMoneyText: + text_far _MomSaveMoneyText + text_end + +MomHaventSavedThatMuchText: + text_far _MomHaventSavedThatMuchText + text_end + +MomNotEnoughRoomInWalletText: + text_far _MomNotEnoughRoomInWalletText + text_end + +MomInsufficientFundsInWalletText: + text_far _MomInsufficientFundsInWalletText + text_end + +MomNotEnoughRoomInBankText: + text_far _MomNotEnoughRoomInBankText + text_end + +MomStartSavingMoneyText: + text_far _MomStartSavingMoneyText + text_end + +MomStoredMoneyText: + text_far _MomStoredMoneyText + text_end + +MomTakenMoneyText: + text_far _MomTakenMoneyText + text_end + +MomJustDoWhatYouCanText: + text_far _MomJustDoWhatYouCanText + text_end + +Mom_SavedString: + db "SAVED@" + +Mon_WithdrawString: + db "WITHDRAW@" + +Mom_DepositString: + db "DEPOSIT@" + +Mom_HeldString: + db "HELD@" + +MenuHeader_0x166b5: + db MENU_BACKUP_TILES ; flags + menu_coords 0, 0, 10, 10 + dw MenuData_0x166bd + db 1 ; default option + +MenuData_0x166bd: + db STATICMENU_CURSOR ; flags + db 4 ; items + db "GET@" + db "SAVE@" + db "CHANGE@" + db "CANCEL@" diff --git a/engine/events/money.asm b/engine/events/money.asm new file mode 100644 index 00000000..c8f9d058 --- /dev/null +++ b/engine/events/money.asm @@ -0,0 +1,209 @@ +GiveMoney:: + ld a, 3 + call AddMoney + ld bc, MaxMoney + ld a, 3 + call CompareMoney + jr z, .not_maxed_out + jr c, .not_maxed_out + ld hl, MaxMoney + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + scf + ret + +.not_maxed_out + and a + ret + +MaxMoney: + dt MAX_MONEY + +TakeMoney:: + ld a, 3 + call SubtractMoney + jr nc, .okay + ; leave with 0 money + xor a + ld [de], a + inc de + ld [de], a + inc de + ld [de], a + scf + ret + +.okay + and a + ret + +CompareMoney:: + ld a, 3 +CompareFunds: +; a: number of bytes +; bc: start addr of amount (big-endian) +; de: start addr of account (big-endian) + push hl + push de + push bc + ld h, b + ld l, c + ld c, 0 + ld b, a +.loop1 + dec a + jr z, .done + inc de + inc hl + jr .loop1 + +.done + and a +.loop2 + ld a, [de] + sbc [hl] + jr z, .okay + inc c + +.okay + dec de + dec hl + dec b + jr nz, .loop2 + jr c, .set_carry + ld a, c + and a + jr .skip_carry + +.set_carry + ld a, 1 + and a + scf +.skip_carry + pop bc + pop de + pop hl + ret + +SubtractMoney: + ld a, 3 +SubtractFunds: +; a: number of bytes +; bc: start addr of amount (big-endian) +; de: start addr of account (big-endian) + push hl + push de + push bc + ld h, b + ld l, c + ld b, a + ld c, 0 +.loop + dec a + jr z, .done + inc de + inc hl + jr .loop + +.done + and a +.loop2 + ld a, [de] + sbc [hl] + ld [de], a + dec de + dec hl + dec b + jr nz, .loop2 + pop bc + pop de + pop hl + ret + +AddMoney: + ld a, 3 +AddFunds: +; a: number of bytes +; bc: start addr of amount (big-endian) +; de: start addr of account (big-endian) + push hl + push de + push bc + + ld h, b + ld l, c + ld b, a +.loop1 + dec a + jr z, .done + inc de + inc hl + jr .loop1 + +.done + and a +.loop2 + ld a, [de] + adc [hl] + ld [de], a + dec de + dec hl + dec b + jr nz, .loop2 + + pop bc + pop de + pop hl + ret + +GiveCoins:: + ld a, 2 + ld de, wCoins + call AddFunds + ld a, 2 + ld bc, .maxcoins + call CompareFunds + jr c, .not_maxed + ld hl, .maxcoins + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + scf + ret + +.not_maxed + and a + ret + +.maxcoins + bigdw MAX_COINS + +TakeCoins:: + ld a, 2 + ld de, wCoins + call SubtractFunds + jr nc, .okay + ; leave with 0 coins + xor a + ld [de], a + inc de + ld [de], a + scf + ret + +.okay + and a + ret + +CheckCoins:: + ld a, 2 + ld de, wCoins + jp CompareFunds |