summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
authorentrpntr <entrpntr@gmail.com>2020-04-12 12:03:05 -0400
committerentrpntr <entrpntr@gmail.com>2020-04-12 12:03:05 -0400
commit51ad0b240e70c0bebb0cfd921ad365ff27e7617c (patch)
treee7100eee944790913c74b6b7c61c542080321dd4 /engine
parentac8070fa92e5295908ae22f6892157baf81b64ce (diff)
Money, marts, and mom.
Diffstat (limited to 'engine')
-rw-r--r--engine/events/mom.asm676
-rw-r--r--engine/events/money.asm209
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