diff options
author | libjet <libj3t@gmail.com> | 2020-05-21 14:55:54 +0100 |
---|---|---|
committer | libjet <libj3t@gmail.com> | 2020-05-21 14:55:54 +0100 |
commit | aa4e2677fe574014cf1c43ba890df9773a83fc10 (patch) | |
tree | 30d8c38f116667538393128915e501e2e01eb25e | |
parent | e9637cc9e67a7ebdbefdba9439e94930195fa50f (diff) |
Add engine/pokemon/party_menu.asm
-rwxr-xr-x | data/party_menu_qualities.asm | 35 | ||||
-rwxr-xr-x | engine/pokemon/party_menu.asm | 783 | ||||
-rw-r--r-- | main.asm | 27 |
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 @@ -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:: |