summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlibjet <libj3t@gmail.com>2020-05-21 14:55:54 +0100
committerlibjet <libj3t@gmail.com>2020-05-21 14:55:54 +0100
commitaa4e2677fe574014cf1c43ba890df9773a83fc10 (patch)
tree30d8c38f116667538393128915e501e2e01eb25e
parente9637cc9e67a7ebdbefdba9439e94930195fa50f (diff)
Add engine/pokemon/party_menu.asm
-rwxr-xr-xdata/party_menu_qualities.asm35
-rwxr-xr-xengine/pokemon/party_menu.asm783
-rw-r--r--main.asm27
3 files changed, 824 insertions, 21 deletions
diff --git a/data/party_menu_qualities.asm b/data/party_menu_qualities.asm
new file mode 100755
index 00000000..0f8b19bf
--- /dev/null
+++ b/data/party_menu_qualities.asm
@@ -0,0 +1,35 @@
+; WritePartyMenuTilemap.Jumptable indexes (see engine/party_menu.asm)
+ const_def
+ const PARTYMENUQUALITY_NICKNAMES
+ const PARTYMENUQUALITY_HP_BAR
+ const PARTYMENUQUALITY_HP_DIGITS
+ const PARTYMENUQUALITY_LEVEL
+ const PARTYMENUQUALITY_STATUS
+ const PARTYMENUQUALITY_TMHM_COMPAT
+ const PARTYMENUQUALITY_EVO_STONE_COMPAT
+ const PARTYMENUQUALITY_GENDER
+
+partymenuqualities: MACRO
+rept _NARG
+ db PARTYMENUQUALITY_\1
+ shift
+endr
+ db -1 ; end
+ENDM
+
+PartyMenuQualityPointers:
+; entries correspond to PARTYMENUACTION_* constants
+ dw .Default ; PARTYMENUACTION_CHOOSE_POKEMON
+ dw .Default ; PARTYMENUACTION_HEALING_ITEM
+ dw .Default ; PARTYMENUACTION_SWITCH
+ dw .TMHM ; PARTYMENUACTION_TEACH_TMHM
+ dw .Default ; PARTYMENUACTION_MOVE
+ dw .EvoStone ; PARTYMENUACTION_EVO_STONE
+ dw .Gender ; PARTYMENUACTION_GIVE_MON
+ dw .Gender ; PARTYMENUACTION_GIVE_MON_FEMALE
+ dw .Default ; PARTYMENUACTION_GIVE_ITEM
+
+.Default: partymenuqualities NICKNAMES, HP_BAR, HP_DIGITS, LEVEL, STATUS
+.TMHM: partymenuqualities NICKNAMES, TMHM_COMPAT, LEVEL, STATUS
+.EvoStone: partymenuqualities NICKNAMES, EVO_STONE_COMPAT, LEVEL, STATUS
+.Gender: partymenuqualities NICKNAMES, GENDER, LEVEL, STATUS
diff --git a/engine/pokemon/party_menu.asm b/engine/pokemon/party_menu.asm
new file mode 100755
index 00000000..93f9b93b
--- /dev/null
+++ b/engine/pokemon/party_menu.asm
@@ -0,0 +1,783 @@
+SelectMonFromParty:
+ call DisableSpriteUpdates
+ xor a
+ ld [wPartyMenuActionText], a
+ call ClearBGPalettes
+ call InitPartyMenuLayout
+ call WaitBGMap
+ call SetPalettes
+ call DelayFrame
+ call PartyMenuSelect
+ call ReturnToMapWithSpeechTextbox
+ ret
+
+SelectTradeOrDayCareMon:
+ ld a, b
+ ld [wPartyMenuActionText], a
+ call DisableSpriteUpdates
+ call ClearBGPalettes
+ call InitPartyMenuLayout
+ call WaitBGMap
+ ld b, SCGB_PARTY_MENU
+ call GetSGBLayout
+ call SetPalettes
+ call DelayFrame
+ call PartyMenuSelect
+ call ReturnToMapWithSpeechTextbox
+ ret
+
+InitPartyMenuLayout:
+ call LoadPartyMenuGFX
+ call InitPartyMenuWithCancel
+ call InitPartyMenuGFX
+ call WritePartyMenuTilemap
+ call PrintPartyMenuText
+ ret
+
+LoadPartyMenuGFX:
+ call LoadFontsBattleExtra
+ callfar InitPartyMenuPalettes ; engine/color.asm
+ callfar ClearSpriteAnims2
+ ret
+
+WritePartyMenuTilemap:
+ ld hl, wOptions
+ ld a, [hl]
+ push af
+ set NO_TEXT_SCROLL, [hl]
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ ld a, " "
+ call ByteFill ; blank the tilemap
+ call GetPartyMenuQualityIndexes
+.loop
+ ld a, [hli]
+ cp -1
+ jr z, .end
+ push hl
+ ld hl, .Jumptable
+ rst JumpTable
+ pop hl
+ jr .loop
+.end
+ pop af
+ ld [wOptions], a
+ ret
+
+.Jumptable:
+; entries correspond to PARTYMENUQUALITY_* constants
+ dw PlacePartyNicknames
+ dw PlacePartyHPBar
+ dw PlacePartyMenuHPDigits
+ dw PlacePartyMonLevel
+ dw PlacePartyMonStatus
+ dw PlacePartyMonTMHMCompatibility
+ dw PlacePartyMonEvoStoneCompatibility
+ dw PlacePartyMonGender
+
+PlacePartyNicknames:
+ hlcoord 3, 1
+ ld a, [wPartyCount]
+ and a
+ jr z, .end
+ ld c, a
+ ld b, 0
+.loop
+ push bc
+ push hl
+ push hl
+ ld hl, wPartyMonNicknames
+ ld a, b
+ call GetNick
+ pop hl
+ call PlaceString
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+
+.end
+ dec hl
+ dec hl
+ ld de, .CANCEL
+ call PlaceString
+ ret
+
+.CANCEL:
+ db "CANCEL@"
+
+PlacePartyHPBar:
+ xor a
+ ld [wSGBPals], a
+ ld a, [wPartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 11, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .skip
+ push hl
+ call PlacePartymonHPBar
+ pop hl
+ ld d, $6
+ ld b, $0
+ call DrawBattleHPBar
+ ld hl, wHPPals
+ ld a, [wSGBPals]
+ ld c, a
+ ld b, $0
+ add hl, bc
+ call SetHPPal
+ ld b, SCGB_PARTY_MENU_HP_PALS
+ call GetSGBLayout
+.skip
+ ld hl, wSGBPals
+ inc [hl]
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ld b, SCGB_PARTY_MENU
+ call GetSGBLayout
+ ret
+
+PlacePartymonHPBar:
+ ld a, b
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld hl, wPartyMon1HP
+ call AddNTimes
+ ld a, [hli]
+ or [hl]
+ jr nz, .not_fainted
+ xor a
+ ld e, a
+ ld c, a
+ ret
+
+.not_fainted
+ dec hl
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld e, a
+ predef ComputeHPBarPixels
+ ret
+
+PlacePartyMenuHPDigits:
+ ld a, [wPartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 13, 1
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ push hl
+ ld a, b
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld hl, wPartyMon1HP
+ call AddNTimes
+ ld e, l
+ ld d, h
+ pop hl
+ push de
+ lb bc, 2, 3
+ call PrintNum
+ pop de
+ ld a, "/"
+ ld [hli], a
+ inc de
+ inc de
+ lb bc, 2, 3
+ call PrintNum
+
+.next
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+
+PlacePartyMonLevel:
+ ld a, [wPartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 8, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ push hl
+ ld a, b
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld hl, wPartyMon1Level
+ call AddNTimes
+ ld e, l
+ ld d, h
+ pop hl
+ ld a, [de]
+ cp 100 ; This is distinct from MAX_LEVEL.
+ jr nc, .ThreeDigits
+ ld a, "<LV>"
+ ld [hli], a
+ lb bc, PRINTNUM_LEFTALIGN | 1, 2
+ ; jr .okay
+.ThreeDigits:
+ lb bc, PRINTNUM_LEFTALIGN | 1, 3
+; .okay
+ call PrintNum
+
+.next
+ pop hl
+ ld de, SCREEN_WIDTH * 2
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+
+PlacePartyMonStatus:
+ ld a, [wPartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 5, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ push hl
+ ld a, b
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld hl, wPartyMon1Status
+ call AddNTimes
+ ld e, l
+ ld d, h
+ pop hl
+ call PlaceStatusString
+
+.next
+ pop hl
+ ld de, SCREEN_WIDTH * 2
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+
+PlacePartyMonTMHMCompatibility:
+ ld a, [wPartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 12, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ push hl
+ ld hl, wPartySpecies
+ ld e, b
+ ld d, 0
+ add hl, de
+ ld a, [hl]
+ ld [wCurPartySpecies], a
+ predef CanLearnTMHMMove
+ pop hl
+ call .PlaceAbleNotAble
+ call PlaceString
+
+.next
+ pop hl
+ ld de, SCREEN_WIDTH * 2
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+
+.PlaceAbleNotAble:
+ ld a, c
+ and a
+ jr nz, .able
+ ld de, .string_not_able
+ ret
+
+.able
+ ld de, .string_able
+ ret
+
+.string_able
+ db "ABLE@"
+
+.string_not_able
+ db "NOT ABLE@"
+
+PlacePartyMonEvoStoneCompatibility:
+ ld a, [wPartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 12, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ push hl
+ ld a, b
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld hl, wPartyMon1Species
+ call AddNTimes
+ ld a, [hl]
+ dec a
+ ld e, a
+ ld d, 0
+ ld hl, EvosAttacksPointers
+ add hl, de
+ add hl, de
+ call .DetermineCompatibility
+ pop hl
+ call PlaceString
+
+.next
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+
+.DetermineCompatibility:
+ ld de, wStringBuffer1
+ ld a, BANK(EvosAttacksPointers)
+ ld bc, 2
+ call FarCopyBytes
+ ld hl, wStringBuffer1
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, wStringBuffer1
+ ld a, BANK("Evolutions and Attacks")
+ ld bc, 10
+ call FarCopyBytes
+ ld hl, wStringBuffer1
+.loop2
+ ld a, [hli]
+ and a
+ jr z, .nope
+ inc hl
+ inc hl
+ cp EVOLVE_ITEM
+ jr nz, .loop2
+ dec hl
+ dec hl
+ ld a, [wCurItem]
+ cp [hl]
+ inc hl
+ inc hl
+ jr nz, .loop2
+ ld de, .string_able
+ ret
+
+.nope
+ ld de, .string_not_able
+ ret
+
+.string_able
+ db "ABLE@"
+.string_not_able
+ db "NOT ABLE@"
+
+PlacePartyMonGender:
+ ld a, [wPartyCount]
+ and a
+ ret z
+ ld c, a
+ ld b, 0
+ hlcoord 12, 2
+.loop
+ push bc
+ push hl
+ call PartyMenuCheckEgg
+ jr z, .next
+ ld [wCurPartySpecies], a
+ push hl
+ ld a, b
+ ld [wCurPartyMon], a
+ xor a
+ ld [wMonType], a
+ call GetGender
+ ld de, .unknown
+ jr c, .got_gender
+ ld de, .male
+ jr nz, .got_gender
+ ld de, .female
+
+.got_gender
+ pop hl
+ call PlaceString
+
+.next
+ pop hl
+ ld de, 2 * SCREEN_WIDTH
+ add hl, de
+ pop bc
+ inc b
+ dec c
+ jr nz, .loop
+ ret
+
+.male
+ db "♂…MALE@"
+
+.female
+ db "♀…FEMALE@"
+
+.unknown
+ db "…UNKNOWN@"
+
+PartyMenuCheckEgg:
+ ld a, LOW(wPartySpecies)
+ add b
+ ld e, a
+ ld a, HIGH(wPartySpecies)
+ adc 0
+ ld d, a
+ ld a, [de]
+ cp EGG
+ ret
+
+GetPartyMenuQualityIndexes:
+ ld a, [wPartyMenuActionText]
+ and $f0
+ jr nz, .skip
+ ld a, [wPartyMenuActionText]
+ and $f
+ ld e, a
+ ld d, 0
+ ld hl, PartyMenuQualityPointers
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+.skip
+ ld hl, PartyMenuQualityPointers.Default
+ ret
+
+INCLUDE "data/party_menu_qualities.asm"
+
+InitPartyMenuGFX:
+ ld hl, wPartyCount
+ ld a, [hli]
+ and a
+ ret z
+ ld c, a
+ xor a
+ ldh [hObjectStructIndexBuffer], a
+.loop
+ push bc
+ push hl
+ ld hl, LoadMenuMonIcon
+ ld a, BANK(LoadMenuMonIcon)
+ ld e, MONICON_PARTYMENU
+ rst FarCall
+ ldh a, [hObjectStructIndexBuffer]
+ inc a
+ ldh [hObjectStructIndexBuffer], a
+ pop hl
+ pop bc
+ dec c
+ jr nz, .loop
+ callfar PlaySpriteAnimations
+ ret
+
+InitPartyMenuWithCancel:
+; with cancel
+ xor a
+ ld [wSwitchMon], a
+ ld de, PartyMenuAttributes
+ call SetMenuAttributes
+ ld a, [wPartyCount]
+ inc a
+ ld [w2DMenuNumRows], a ; list length
+ dec a
+ ld b, a
+ ld a, [wPartyMenuCursor]
+ and a
+ jr z, .skip
+ inc b
+ cp b
+ jr c, .done
+
+.skip
+ ld a, 1
+
+.done
+ ld [wMenuCursorY], a
+ ld a, A_BUTTON | B_BUTTON
+ ld [wMenuJoypadFilter], a
+ ret
+
+InitPartyMenuNoCancel:
+; no cancel
+ ld de, PartyMenuAttributes
+ call SetMenuAttributes
+ ld a, [wPartyCount]
+ ld [w2DMenuNumRows], a ; list length
+ ld b, a
+ ld a, [wPartyMenuCursor]
+ and a
+ jr z, .skip
+ inc b
+ cp b
+ jr c, .done
+.skip
+ ld a, 1
+.done
+ ld [wMenuCursorY], a
+ ld a, A_BUTTON | B_BUTTON
+ ld [wMenuJoypadFilter], a
+ ret
+
+PartyMenuAttributes:
+; cursor y
+; cursor x
+; num rows
+; num cols
+; bit 6: animate sprites bit 5: wrap around
+; ?
+; distance between items (hi: y, lo: x)
+; allowed buttons (mask)
+ db 1, 0
+ db 0, 1
+ db $60, $00
+ dn 2, 0
+ db 0
+
+PartyMenuSelect:
+; sets carry if exitted menu.
+ call StaticMenuJoypad
+ call PlaceHollowCursor
+ ld a, [wPartyCount]
+ inc a
+ ld b, a
+ ld a, [wMenuCursorY] ; menu selection?
+ cp b
+ jr z, .exitmenu ; CANCEL
+ ld [wPartyMenuCursor], a
+ ldh a, [hJoyLast]
+ ld b, a
+ bit B_BUTTON_F, b
+ jr nz, .exitmenu ; B button
+ ld a, [wMenuCursorY]
+ dec a
+ ld [wCurPartyMon], a
+ ld c, a
+ ld b, $0
+ ld hl, wPartySpecies
+ add hl, bc
+ ld a, [hl]
+ ld [wCurPartySpecies], a
+
+ ld de, SFX_READ_TEXT_2
+ call PlaySFX
+ call WaitSFX
+ and a
+ ret
+
+.exitmenu
+ ld de, SFX_READ_TEXT_2
+ call PlaySFX
+ call WaitSFX
+ scf
+ ret
+
+PrintPartyMenuText:
+ hlcoord 0, 14
+ lb bc, 2, 18
+ call Textbox
+ ld a, [wPartyCount]
+ and a
+ jr nz, .haspokemon
+ ld de, YouHaveNoPKMNString
+ jr .gotstring
+.haspokemon
+ ld a, [wPartyMenuActionText]
+ and $f ; drop high nibble
+ ld hl, PartyMenuStrings
+ ld e, a
+ ld d, $0
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld d, [hl]
+ ld e, a
+.gotstring
+ ld a, [wOptions]
+ push af
+ set NO_TEXT_SCROLL, a
+ ld [wOptions], a
+ hlcoord 1, 16 ; Coord
+ call PlaceString
+ pop af
+ ld [wOptions], a
+ ret
+
+PartyMenuStrings:
+ dw ChooseAMonString
+ dw UseOnWhichPKMNString
+ dw WhichPKMNString
+ dw TeachWhichPKMNString
+ dw MoveToWhereString
+ dw UseOnWhichPKMNString
+ dw ChooseAMonString ; Probably used to be ChooseAFemalePKMNString
+ dw ChooseAMonString ; Probably used to be ChooseAMalePKMNString
+ dw ToWhichPKMNString
+
+ChooseAMonString:
+ db "Choose a #MON.@"
+
+UseOnWhichPKMNString:
+ db "Use on which <PK><MN>?@"
+
+WhichPKMNString:
+ db "Which <PK><MN>?@"
+
+TeachWhichPKMNString:
+ db "Teach which <PK><MN>?@"
+
+MoveToWhereString:
+ db "Move to where?@"
+
+ChooseAFemalePKMNString:
+; unused
+ db "Choose a ♀<PK><MN>.@"
+
+ChooseAMalePKMNString:
+; unused
+ db "Choose a ♂<PK><MN>.@"
+
+ToWhichPKMNString:
+ db "To which <PK><MN>?@"
+
+YouHaveNoPKMNString:
+ db "You have no <PK><MN>!@"
+
+PrintPartyMenuActionText:
+ ld a, [wCurPartyMon]
+ ld hl, wPartyMonNicknames
+ call GetNick
+ ld a, [wPartyMenuActionText]
+ and $f
+ ld hl, .MenuActionTexts
+ call .PrintText
+ ret
+
+.MenuActionTexts:
+; entries correspond to PARTYMENUTEXT_* constants
+ dw .CuredOfPoisonText
+ dw .BurnWasHealedText
+ dw .WasDefrostedText
+ dw .WokeUpText
+ dw .RidOfParalysisText
+ dw .RecoveredSomeHPText
+ dw .HealthReturnedText
+ dw .RevitalizedText
+ dw .GrewToLevelText
+ dw .CameToItsSensesText
+
+.RecoveredSomeHPText:
+ text_far _RecoveredSomeHPText
+ text_end
+
+.CuredOfPoisonText:
+ text_far _CuredOfPoisonText
+ text_end
+
+.RidOfParalysisText:
+ text_far _RidOfParalysisText
+ text_end
+
+.BurnWasHealedText:
+ text_far _BurnWasHealedText
+ text_end
+
+.WasDefrostedText:
+ text_far _WasDefrostedText
+ text_end
+
+.WokeUpText:
+ text_far _WokeUpText
+ text_end
+
+.HealthReturnedText:
+ text_far _HealthReturnedText
+ text_end
+
+.RevitalizedText:
+ text_far _RevitalizedText
+ text_end
+
+.GrewToLevelText:
+ text_far _GrewToLevelText
+ text_end
+
+.CameToItsSensesText:
+ text_far _CameToItsSensesText
+ text_end
+
+.PrintText:
+ ld e, a
+ ld d, 0
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [wOptions]
+ push af
+ set NO_TEXT_SCROLL, a
+ ld [wOptions], a
+ call PrintText
+ pop af
+ ld [wOptions], a
+ ret
diff --git a/main.asm b/main.asm
index 31eb277f..60e75e04 100644
--- a/main.asm
+++ b/main.asm
@@ -356,26 +356,9 @@ INCLUDE "engine/pokemon/mail.asm"
SECTION "bank14", ROMX
-SelectMonFromParty::
- dr $50000, $5001d
-SelectTradeOrDayCareMon::
- dr $5001d, $5004f
-LoadPartyMenuGFX::
- dr $5004f, $5005f
-WritePartyMenuTilemap::
- dr $5005f, $50355
-InitPartyMenuGFX::
- dr $50355, $5037a
-InitPartyMenuWithCancel::
- dr $5037a, $503a2
-InitPartyMenuNoCancel::
- dr $503a2, $503cc
-PartyMenuSelect::
- dr $503cc, $5040f
-PrintPartyMenuText::
- dr $5040f, $504db
-PrintPartyMenuActionText::
- dr $504db, $5054f
+
+INCLUDE "engine/pokemon/party_menu.asm"
+
LoadFishingGFX::
dr $5054f, $50610
DoPoisonStep::
@@ -414,7 +397,9 @@ GetGender::
ListMovePP::
dr $51364, $513e4
Unused_PlaceEnemyHPLevel::
- dr $513e4, $51437
+ dr $513e4, $51413
+PlaceStatusString::
+ dr $51413, $51437
PlaceNonFaintStatus::
dr $51437, $51478
ListMoves::