summaryrefslogtreecommitdiff
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
parentac8070fa92e5295908ae22f6892157baf81b64ce (diff)
Money, marts, and mom.
-rw-r--r--constants/wram_constants.asm8
-rw-r--r--data/items/marts.asm406
-rwxr-xr-xdata/text/common_1.asm32
-rw-r--r--data/text/common_3.asm16
-rw-r--r--engine/events/mom.asm676
-rw-r--r--engine/events/money.asm209
-rw-r--r--main.asm18
-rw-r--r--wram.asm19
8 files changed, 1335 insertions, 49 deletions
diff --git a/constants/wram_constants.asm b/constants/wram_constants.asm
index 40ff3791..4f59a355 100644
--- a/constants/wram_constants.asm
+++ b/constants/wram_constants.asm
@@ -162,6 +162,14 @@ NUM_OBJECTS EQU 16
const STATUSFLAGS2_REACHED_GOLDENROD_F ; 6
const STATUSFLAGS2_ROCKETS_IN_MAHOGANY_F ; 7
+; wMomSavingMoney::
+MOM_SAVING_SOME_MONEY_F EQU 0
+MOM_SAVING_HALF_MONEY_F EQU 1
+MOM_SAVING_ALL_MONEY_F EQU 2
+MOM_ACTIVE_F EQU 7
+
+MOM_SAVING_MONEY_MASK EQU (1 << MOM_SAVING_SOME_MONEY_F) | (1 << MOM_SAVING_HALF_MONEY_F) | (1 << MOM_SAVING_ALL_MONEY_F)
+
; wJohtoBadges:: ; d57c
const_def
const ZEPHYRBADGE
diff --git a/data/items/marts.asm b/data/items/marts.asm
new file mode 100644
index 00000000..1d48ea53
--- /dev/null
+++ b/data/items/marts.asm
@@ -0,0 +1,406 @@
+Marts:
+; entries correspond to MART_* constants
+ dw MartCherrygrove
+ dw MartCherrygroveDex
+ dw MartViolet
+ dw MartAzalea
+ dw MartCianwood
+ dw MartGoldenrod2F1
+ dw MartGoldenrod2F2
+ dw MartGoldenrod3F
+ dw MartGoldenrod4F
+ dw MartGoldenrod5F1
+ dw MartGoldenrod5F2
+ dw MartGoldenrod5F3
+ dw MartGoldenrod5F4
+ dw MartOlivine
+ dw MartEcruteak
+ dw MartMahogany1
+ dw MartMahogany2
+ dw MartBlackthorn
+ dw MartViridian
+ dw MartPewter
+ dw MartCerulean
+ dw MartLavender
+ dw MartVermilion
+ dw MartCeladon2F1
+ dw MartCeladon2F2
+ dw MartCeladon3F
+ dw MartCeladon4F
+ dw MartCeladon5F1
+ dw MartCeladon5F2
+ dw MartFuchsia
+ dw MartSaffron
+ dw MartMtMoon
+ dw MartIndigoPlateau
+ dw MartUnderground
+.End
+
+MartCherrygrove:
+ db 4 ; # items
+ db POTION
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db AWAKENING
+ db -1 ; end
+
+MartCherrygroveDex:
+ db 5 ; # items
+ db POKE_BALL
+ db POTION
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db AWAKENING
+ db -1 ; end
+
+MartViolet:
+ db 10 ; # items
+ db POKE_BALL
+ db POTION
+ db ESCAPE_ROPE
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db AWAKENING
+ db X_DEFEND
+ db X_ATTACK
+ db X_SPEED
+ db FLOWER_MAIL
+ db -1 ; end
+
+MartAzalea:
+ db 9 ; # items
+ db CHARCOAL
+ db POKE_BALL
+ db POTION
+ db SUPER_POTION
+ db ESCAPE_ROPE
+ db REPEL
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db FLOWER_MAIL
+ db -1 ; end
+
+MartCianwood:
+ db 5 ; # items
+ db POTION
+ db SUPER_POTION
+ db HYPER_POTION
+ db FULL_HEAL
+ db REVIVE
+ db -1 ; end
+
+MartGoldenrod2F1:
+ db 7 ; # items
+ db POTION
+ db SUPER_POTION
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db AWAKENING
+ db BURN_HEAL
+ db ICE_HEAL
+ db -1 ; end
+
+MartGoldenrod2F2:
+ db 8 ; # items
+ db POKE_BALL
+ db GREAT_BALL
+ db ESCAPE_ROPE
+ db REPEL
+ db REVIVE
+ db FULL_HEAL
+ db POKE_DOLL
+ db FLOWER_MAIL
+ db -1 ; end
+
+MartGoldenrod3F:
+ db 7 ; # items
+ db X_SPEED
+ db X_SPECIAL
+ db X_DEFEND
+ db X_ATTACK
+ db DIRE_HIT
+ db GUARD_SPEC
+ db X_ACCURACY
+ db -1 ; end
+
+MartGoldenrod4F:
+ db 5 ; # items
+ db PROTEIN
+ db IRON
+ db CARBOS
+ db CALCIUM
+ db HP_UP
+ db -1 ; end
+
+MartGoldenrod5F1:
+ db 3 ; # items
+ db TM_THUNDERPUNCH
+ db TM_FIRE_PUNCH
+ db TM_ICE_PUNCH
+ db -1 ; end
+
+MartGoldenrod5F2:
+ db 4 ; # items
+ db TM_THUNDERPUNCH
+ db TM_FIRE_PUNCH
+ db TM_ICE_PUNCH
+ db TM_HEADBUTT
+ db -1 ; end
+
+MartGoldenrod5F3:
+ db 4 ; # items
+ db TM_THUNDERPUNCH
+ db TM_FIRE_PUNCH
+ db TM_ICE_PUNCH
+ db TM_ROCK_SMASH
+ db -1 ; end
+
+MartGoldenrod5F4:
+ db 5 ; # items
+ db TM_THUNDERPUNCH
+ db TM_FIRE_PUNCH
+ db TM_ICE_PUNCH
+ db TM_HEADBUTT
+ db TM_ROCK_SMASH
+ db -1 ; end
+
+MartOlivine:
+ db 9 ; # items
+ db GREAT_BALL
+ db SUPER_POTION
+ db HYPER_POTION
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db AWAKENING
+ db ICE_HEAL
+ db SUPER_REPEL
+ db SURF_MAIL
+ db -1 ; end
+
+MartEcruteak:
+ db 10 ; # items
+ db POKE_BALL
+ db GREAT_BALL
+ db POTION
+ db SUPER_POTION
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db AWAKENING
+ db BURN_HEAL
+ db ICE_HEAL
+ db REVIVE
+ db -1 ; end
+
+MartMahogany1:
+ db 4 ; # items
+ db TINYMUSHROOM
+ db SLOWPOKETAIL
+ db POKE_BALL
+ db POTION
+ db -1 ; end
+
+MartMahogany2:
+ db 9 ; # items
+ db RAGECANDYBAR
+ db GREAT_BALL
+ db SUPER_POTION
+ db HYPER_POTION
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db SUPER_REPEL
+ db REVIVE
+ db FLOWER_MAIL
+ db -1 ; end
+
+MartBlackthorn:
+ db 9 ; # items
+ db GREAT_BALL
+ db ULTRA_BALL
+ db HYPER_POTION
+ db MAX_POTION
+ db FULL_HEAL
+ db REVIVE
+ db MAX_REPEL
+ db X_DEFEND
+ db X_ATTACK
+ db -1 ; end
+
+MartViridian:
+ db 9 ; # items
+ db ULTRA_BALL
+ db HYPER_POTION
+ db FULL_HEAL
+ db REVIVE
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db AWAKENING
+ db BURN_HEAL
+ db FLOWER_MAIL
+ db -1 ; end
+
+MartPewter:
+ db 7 ; # items
+ db GREAT_BALL
+ db SUPER_POTION
+ db SUPER_REPEL
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db AWAKENING
+ db BURN_HEAL
+ db -1 ; end
+
+MartCerulean:
+ db 9 ; # items
+ db GREAT_BALL
+ db ULTRA_BALL
+ db SUPER_POTION
+ db SUPER_REPEL
+ db FULL_HEAL
+ db X_DEFEND
+ db X_ATTACK
+ db DIRE_HIT
+ db SURF_MAIL
+ db -1 ; end
+
+MartLavender:
+ db 8 ; # items
+ db GREAT_BALL
+ db POTION
+ db SUPER_POTION
+ db MAX_REPEL
+ db ANTIDOTE
+ db PARLYZ_HEAL
+ db AWAKENING
+ db BURN_HEAL
+ db -1 ; end
+
+MartVermilion:
+ db 8 ; # items
+ db ULTRA_BALL
+ db SUPER_POTION
+ db HYPER_POTION
+ db REVIVE
+ db PARLYZ_HEAL
+ db AWAKENING
+ db BURN_HEAL
+ db LITEBLUEMAIL
+ db -1 ; end
+
+MartCeladon2F1:
+ db 7 ; # items
+ db POTION
+ db SUPER_POTION
+ db HYPER_POTION
+ db MAX_POTION
+ db REVIVE
+ db SUPER_REPEL
+ db MAX_REPEL
+ db -1 ; end
+
+MartCeladon2F2:
+ db 10 ; # items
+ db POKE_BALL
+ db GREAT_BALL
+ db ULTRA_BALL
+ db ESCAPE_ROPE
+ db FULL_HEAL
+ db ANTIDOTE
+ db BURN_HEAL
+ db ICE_HEAL
+ db AWAKENING
+ db PARLYZ_HEAL
+ db -1 ; end
+
+MartCeladon3F:
+ db 5 ; # items
+ db TM_HIDDEN_POWER
+ db TM_SUNNY_DAY
+ db TM_PROTECT
+ db TM_RAIN_DANCE
+ db TM_SANDSTORM
+ db -1 ; end
+
+MartCeladon4F:
+ db 3 ; # items
+ db POKE_DOLL
+ db LOVELY_MAIL
+ db SURF_MAIL
+ db -1 ; end
+
+MartCeladon5F1:
+ db 5 ; # items
+ db HP_UP
+ db PROTEIN
+ db IRON
+ db CARBOS
+ db CALCIUM
+ db -1 ; end
+
+MartCeladon5F2:
+ db 7 ; # items
+ db X_ACCURACY
+ db GUARD_SPEC
+ db DIRE_HIT
+ db X_ATTACK
+ db X_DEFEND
+ db X_SPEED
+ db X_SPECIAL
+ db -1 ; end
+
+MartFuchsia:
+ db 7 ; # items
+ db GREAT_BALL
+ db ULTRA_BALL
+ db SUPER_POTION
+ db HYPER_POTION
+ db FULL_HEAL
+ db MAX_REPEL
+ db FLOWER_MAIL
+ db -1 ; end
+
+MartSaffron:
+ db 8 ; # items
+ db GREAT_BALL
+ db ULTRA_BALL
+ db HYPER_POTION
+ db MAX_POTION
+ db FULL_HEAL
+ db X_ATTACK
+ db X_DEFEND
+ db FLOWER_MAIL
+ db -1 ; end
+
+MartMtMoon:
+ db 6 ; # items
+ db POKE_DOLL
+ db FRESH_WATER
+ db SODA_POP
+ db LEMONADE
+ db REPEL
+ db PORTRAITMAIL
+ db -1 ; end
+
+MartIndigoPlateau:
+ db 7 ; # items
+ db ULTRA_BALL
+ db MAX_REPEL
+ db HYPER_POTION
+ db MAX_POTION
+ db FULL_RESTORE
+ db REVIVE
+ db FULL_HEAL
+ db -1 ; end
+
+MartUnderground:
+ db 4 ; # items
+ db ENERGYPOWDER
+ db ENERGY_ROOT
+ db HEAL_POWDER
+ db REVIVAL_HERB
+ db -1 ; end
+
+DefaultMart:
+ db 2 ; # items
+ db POKE_BALL
+ db POTION
+ db -1 ; end
diff --git a/data/text/common_1.asm b/data/text/common_1.asm
index a4bb9ca4..2747f902 100755
--- a/data/text/common_1.asm
+++ b/data/text/common_1.asm
@@ -1191,7 +1191,7 @@ UnknownText_0x1bd6f5::
line "so cute!"
done
-UnknownText_0x1bd77f::
+_MomLeavingText1::
text "Wow, that's a cute"
line "#MON."
@@ -1219,14 +1219,14 @@ UnknownText_0x1bd77f::
line "save your money?"
done
-UnknownText_0x1bd868::
+_MomLeavingText2::
text "OK, I'll take care"
line "of your money."
para "<……><……><……>"
prompt
-UnknownText_0x1bd88e::
+_MomLeavingText3::
text "Be careful."
para "#MON are your"
@@ -1236,7 +1236,7 @@ UnknownText_0x1bd88e::
para "Now, go on!"
done
-UnknownText_0x1bd8da::
+_MomIsThisAboutYourMoneyText::
text "Hi! Welcome home!"
line "You're trying very"
cont "hard, I see."
@@ -1248,47 +1248,47 @@ UnknownText_0x1bd8da::
line "your money?"
done
-UnknownText_0x1bd942::
+_MomBankWhatDoYouWantToDoText::
text "What do you want"
line "to do?"
done
-UnknownText_0x1bd95b::
+_MomStoreMoneyText::
text "How much do you"
line "want to save?"
done
-UnknownText_0x1bd97a::
+_MomTakeMoneyText::
text "How much do you"
line "want to take?"
done
-UnknownText_0x1bd999::
+_MomSaveMoneyText::
text "Do you want to"
line "save some money?"
done
-UnknownText_0x1bd9ba::
+_MomHaventSavedThatMuchText::
text "You haven't saved"
line "that much."
prompt
-UnknownText_0x1bd9d7::
+_MomNotEnoughRoomInWalletText::
text "You can't take"
line "that much."
prompt
-UnknownText_0x1bd9f1::
+_MomInsufficientFundsInWalletText::
text "You don't have"
line "that much."
prompt
-UnknownText_0x1bda0b::
+_MomNotEnoughRoomInBankText::
text "You can't save"
line "that much."
prompt
-UnknownText_0x1bda25::
+_MomStartSavingMoneyText::
text "OK, I'll save your"
line "money. Trust me!"
@@ -1296,17 +1296,17 @@ UnknownText_0x1bda25::
line "with it!"
done
-UnknownText_0x1bda5b::
+_MomStoredMoneyText::
text "Your money's safe"
line "here! Get going!"
done
-UnknownText_0x1bda7e::
+_MomTakenMoneyText::
text "<PLAYER>, don't"
line "give up!"
done
-UnknownText_0x1bda90::
+_MomJustDoWhatYouCanText::
text "Just do what"
line "you can."
done
diff --git a/data/text/common_3.asm b/data/text/common_3.asm
index d89d72d2..4a8e0a07 100644
--- a/data/text/common_3.asm
+++ b/data/text/common_3.asm
@@ -500,39 +500,39 @@ UnknownText_0x1c5fd1::
text "Which #MON?"
prompt
-Text_DSTIsThatOK::
+_DSTIsThatOKText::
text " DST,"
line "is that OK?"
done
-UnknownText_0x1c5ff1::
+_TimeAskOkayText::
text ","
line "is that OK?"
done
-UnknownText_0x1c6000::
+_TimesetAskDSTText::
text "Do you want to"
line "switch to Daylight"
cont "Saving Time?"
done
-UnknownText_0x1c6030::
+_TimesetDSTText::
text "I set the clock"
line "forward by one"
cont "hour."
prompt
-UnknownText_0x1c6056::
+_TimesetAskNotDSTText::
text "Is Daylight Saving"
line "Time over?"
done
-UnknownText_0x1c6075::
+_TimesetNotDSTText::
text "I put the clock"
line "back one hour."
prompt
-UnknownText_0x1c6095::
+_TimesetAskAdjustDSTText::
text "Do you want to"
line "adjust your clock"
@@ -540,7 +540,7 @@ UnknownText_0x1c6095::
line "Saving Time?"
done
-UnknownText_0x1c60d1::
+_MomLostGearBookletText::
text "I lost the in-"
line "struction booklet"
cont "for the #GEAR."
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
diff --git a/main.asm b/main.asm
index 27fb03c5..a58a8b9a 100644
--- a/main.asm
+++ b/main.asm
@@ -85,21 +85,9 @@ INCLUDE "engine/overworld/map_setup.asm"
dr $156be, $15871 ; ?
INCLUDE "engine/events/pokemon_pc.asm"
INCLUDE "engine/items/mart.asm"
-
-GiveMoney:
- dr $1622c, $1624f
-TakeMoney:
- dr $1624f, $16260
-CompareMoney:
- dr $16260, $162fe
-Marts:
- dr $162fe, $16342
-.End:
- dr $16342, $16469
-DefaultMart:
- dr $16469, $1646d
-BankOfMom:
- dr $1646d, $16935
+INCLUDE "engine/events/money.asm"
+INCLUDE "data/items/marts.asm"
+INCLUDE "engine/events/mom.asm"
INCLUDE "engine/events/daycare.asm"
Function16e3a:
dr $16e3a, $16ff7
diff --git a/wram.asm b/wram.asm
index 9c6eca94..af8cde81 100644
--- a/wram.asm
+++ b/wram.asm
@@ -2128,16 +2128,17 @@ wNamedObjectTypeBuffer:: ds 1 ; ce61
wce62:: ds 1 ; ce62
wce63::
wJumptableIndex::
- db ; ce63
-wce64:: ds 1 ; ce64
+ db
+wce64::
+wMomBankDigitCursorPosition::
+ db
wce65::
wIntroSceneTimer::
wCurPocket::
- db ; ce65
-
-wPackUsedItem::
+ db
wce66::
- db ; ce66
+wPackUsedItem::
+ db
wRequested2bpp:: ds 1 ; ce67
wRequested2bppSource:: dw ; ce68
@@ -3055,7 +3056,7 @@ wd1e4:: ds 1 ; d1e4
wd1e5:: ds 1 ; d1e5
wd1e6:: ds 1 ; d1e6
wd1e7:: ds 1 ; d1e7
-wd1e8:: ds 1 ; d1e8
+wDST:: db ; d1e8
wd1e9:: ds 1 ; d1e9
wGameTimeCap:: ds 1 ; d1ea
@@ -3158,9 +3159,7 @@ wPlayerData3::
wStatusFlags:: ds 1 ; d571
wStatusFlags2:: ds 1 ; d572
wMoney:: ds 3 ; d573
-wd576:: ds 1 ; d576
-wd577:: ds 1 ; d577
-wd578:: ds 1 ; d578
+wMomsMoney:: ds 3 ; d576
wMomSavingMoney:: ds 1 ; d579
wCoins:: dw ; d57a