diff options
author | yenatch <yenatch@gmail.com> | 2017-12-23 13:17:46 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-23 13:17:46 -0500 |
commit | 878092004956418bfd77bfdb9fc9dd7f640f80d2 (patch) | |
tree | 3a97e3eb15d5c545977038e67589f92158e5bf23 /engine | |
parent | a6656a986bf9dde51561cab090648e0117b173ad (diff) | |
parent | 3c37bfc6fa2570a0a77c1230673910257ecf32df (diff) |
Merge pull request #419 from roukaour/master
More reorganization and documentation
Diffstat (limited to 'engine')
91 files changed, 11396 insertions, 3143 deletions
diff --git a/engine/battle_start.asm b/engine/battle_transition.asm index 7a16c3b82..f8756649b 100644 --- a/engine/battle_start.asm +++ b/engine/battle_transition.asm @@ -363,19 +363,6 @@ StartTrainerBattle_SetUpForSpinOutro: ; 8c43d (23:443d) ld [wcf64], a ret -spintable_entry: MACRO - db \1 - dw .wedge\2 - dwcoord \3, \4 -ENDM - -; quadrants - const_def - const UPPER_LEFT - const UPPER_RIGHT - const LOWER_LEFT - const LOWER_RIGHT - StartTrainerBattle_SpinToBlack: ; 8c44f (23:444f) xor a ld [hBGMapMode], a @@ -412,7 +399,19 @@ endr ret ; 8c490 (23:4490) +; quadrants + const_def + const UPPER_LEFT + const UPPER_RIGHT + const LOWER_LEFT + const LOWER_RIGHT + .spintable ; 8c490 +spintable_entry: MACRO + db \1 + dw .wedge\2 + dwcoord \3, \4 +ENDM spintable_entry UPPER_LEFT, 1, 1, 6 spintable_entry UPPER_LEFT, 2, 0, 3 spintable_entry UPPER_LEFT, 3, 1, 0 @@ -797,12 +796,6 @@ StartTrainerBattle_DrawSineWave: ; 8c6f7 (23:46f7) sine_wave $100 ; 8c768 -zoombox: macro -; width, height, start y, start x - db \1, \2 - dwcoord \3, \4 -endm - StartTrainerBattle_ZoomToBlack: ; 8c768 (23:4768) callba Function5602 ld de, .boxes @@ -835,6 +828,11 @@ StartTrainerBattle_ZoomToBlack: ; 8c768 (23:4768) ; 8c792 (23:4792) .boxes ; 8c792 +zoombox: macro +; width, height, start y, start x + db \1, \2 + dwcoord \3, \4 +endm zoombox 4, 2, 8, 8 zoombox 6, 4, 7, 7 zoombox 8, 6, 6, 6 @@ -864,3 +862,12 @@ StartTrainerBattle_ZoomToBlack: ; 8c768 (23:4768) jr nz, .row ret ; 8c7c9 (23:47c9) + +Function8c7c9: +; XXX + ld a, $1 + ld [hBGMapMode], a + call WaitBGMap + xor a + ld [hBGMapMode], a + ret diff --git a/engine/breeding/egg.asm b/engine/breeding.asm index b402f99f1..b402f99f1 100755 --- a/engine/breeding/egg.asm +++ b/engine/breeding.asm diff --git a/engine/card_flip.asm b/engine/card_flip.asm index 063d5324f..cfcd949e6 100755 --- a/engine/card_flip.asm +++ b/engine/card_flip.asm @@ -1415,7 +1415,6 @@ else endc endm - cardflip_cursor 11, 2, .Impossible cardflip_cursor 12, 2, .Impossible cardflip_cursor 13, 2, .PokeGroupPair @@ -1665,50 +1664,7 @@ CardFlip_InitAttrPals: ; e0c37 (38:4c37) ; e0c93 (38:4c93) .palettes ; e0c93 - RGB 31, 31, 31 - RGB 17, 07, 31 - RGB 06, 19, 08 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 29, 25, 00 - RGB 06, 19, 08 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 13, 30 - RGB 06, 19, 08 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 08, 17, 30 - RGB 06, 19, 08 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 08, 31, 08 - RGB 06, 19, 08 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 17, 07, 31 - RGB 06, 19, 08 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 17, 07, 31 - RGB 06, 19, 08 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 17, 07, 31 - RGB 06, 19, 08 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 00, 00 - RGB 31, 00, 00 +INCLUDE "data/palettes/card_flip.pal" ; e0cdb CardFlipLZ03: ; e0cdb @@ -1727,16 +1683,5 @@ CardFlipLZ02: ; e0ea8 INCBIN "gfx/card_flip/card_flip_2.2bpp.lz" CardFlipTilemap: ; e110c - db $ef, $15, $27, $2a, $2a, $06, $27, $2a, $2a, $06, $27 - db $ef, $07, $27, $3e, $3f, $42, $43, $46, $47, $4a, $4b - db $ef, $17, $26, $40, $41, $44, $45, $48, $49, $4c, $4d - db $ef, $25, $04, $00, $01, $00, $01, $00, $01, $00, $01 - db $ef, $05, $14, $10, $11, $10, $11, $10, $11, $10, $11 - db $ef, $16, $24, $20, $21, $20, $21, $20, $21, $20, $21 - db $ef, $25, $04, $00, $02, $00, $02, $00, $02, $00, $02 - db $ef, $05, $14, $10, $12, $10, $12, $10, $12, $10, $12 - db $ef, $16, $24, $20, $22, $20, $22, $20, $22, $20, $22 - db $ef, $25, $04, $00, $03, $00, $03, $00, $03, $00, $03 - db $ef, $05, $14, $10, $13, $10, $13, $10, $13, $10, $13 - db $ef, $16, $24, $20, $23, $20, $23, $20, $23, $20, $23 +INCBIN "gfx/card_flip/card_flip.tilemap" ; e1190 diff --git a/engine/caught_data.asm b/engine/caught_data.asm new file mode 100644 index 000000000..c079009ae --- /dev/null +++ b/engine/caught_data.asm @@ -0,0 +1,247 @@ +CheckPartyFullAfterContest: ; 4d9e5 + ld a, [wContestMon] + and a + jp z, .DidntCatchAnything + ld [CurPartySpecies], a + ld [CurSpecies], a + call GetBaseData + ld hl, PartyCount + ld a, [hl] + cp 6 + jp nc, .TryAddToBox + inc a + ld [hl], a + ld c, a + ld b, $0 + add hl, bc + ld a, [wContestMon] + ld [hli], a + ld [CurSpecies], a + ld a, $ff + ld [hl], a + ld hl, PartyMon1Species + ld a, [PartyCount] + dec a + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, wContestMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + ld a, [PartyCount] + dec a + ld hl, PartyMonOT + call SkipNames + ld d, h + ld e, l + ld hl, PlayerName + call CopyBytes + ld a, [CurPartySpecies] + ld [wd265], a + call GetPokemonName + ld hl, StringBuffer1 + ld de, wMonOrItemNameBuffer + ld bc, PKMN_NAME_LENGTH + call CopyBytes + call GiveANickname_YesNo + jr c, .Party_SkipNickname + ld a, [PartyCount] + dec a + ld [CurPartyMon], a + xor a + ld [MonType], a + ld de, wMonOrItemNameBuffer + callab InitNickname + +.Party_SkipNickname: + ld a, [PartyCount] + dec a + ld hl, PartyMonNicknames + call SkipNames + ld d, h + ld e, l + ld hl, wMonOrItemNameBuffer + call CopyBytes + ld a, [PartyCount] + dec a + ld hl, PartyMon1Level + call GetPartyLocation + ld a, [hl] + ld [CurPartyLevel], a + call SetCaughtData + ld a, [PartyCount] + dec a + ld hl, PartyMon1CaughtLocation + call GetPartyLocation + ld a, [hl] + and $80 + ld b, $13 + or b + ld [hl], a + xor a + ld [wContestMon], a + and a + ld [ScriptVar], a + ret + +.TryAddToBox: ; 4daa3 + ld a, BANK(sBoxCount) + call GetSRAMBank + ld hl, sBoxCount + ld a, [hl] + cp MONS_PER_BOX + call CloseSRAM + jr nc, .BoxFull + xor a + ld [CurPartyMon], a + ld hl, wContestMon + ld de, wBufferMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + ld hl, PlayerName + ld de, wBufferMonOT + ld bc, NAME_LENGTH + call CopyBytes + callab InsertPokemonIntoBox + ld a, [CurPartySpecies] + ld [wd265], a + call GetPokemonName + call GiveANickname_YesNo + ld hl, StringBuffer1 + jr c, .Box_SkipNickname + ld a, BOXMON + ld [MonType], a + ld de, wMonOrItemNameBuffer + callab InitNickname + ld hl, wMonOrItemNameBuffer + +.Box_SkipNickname: + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + ld de, sBoxMonNicknames + ld bc, PKMN_NAME_LENGTH + call CopyBytes + call CloseSRAM + +.BoxFull: + ld a, BANK(sBoxMon1Level) + call GetSRAMBank + ld a, [sBoxMon1Level] + ld [CurPartyLevel], a + call CloseSRAM + call SetBoxMonCaughtData + ld a, BANK(sBoxMon1CaughtLocation) + call GetSRAMBank + ld hl, sBoxMon1CaughtLocation + ld a, [hl] + and $80 + ld b, $13 + or b + ld [hl], a + call CloseSRAM + xor a + ld [wContestMon], a + ld a, $1 + ld [ScriptVar], a + ret + +.DidntCatchAnything: ; 4db35 + ld a, $2 + ld [ScriptVar], a + ret + +GiveANickname_YesNo: ; 4db3b + ld hl, TextJump_GiveANickname + call PrintText + jp YesNoBox + +TextJump_GiveANickname: ; 0x4db44 + ; Give a nickname to the @ you received? + text_jump UnknownText_0x1c12fc + db "@" + +SetCaughtData: ; 4db49 + ld a, [PartyCount] + dec a + ld hl, PartyMon1CaughtLevel + call GetPartyLocation +SetBoxmonOrEggmonCaughtData: ; 4db53 + ld a, [TimeOfDay] + inc a + rrca + rrca + ld b, a + ld a, [CurPartyLevel] + or b + ld [hli], a + ld a, [MapGroup] + ld b, a + ld a, [MapNumber] + ld c, a + cp MAP_POKECENTER_2F + jr nz, .NotPokecenter2F + ld a, b + cp GROUP_POKECENTER_2F + jr nz, .NotPokecenter2F + + ld a, [BackupMapGroup] + ld b, a + ld a, [BackupMapNumber] + ld c, a + +.NotPokecenter2F: + call GetWorldMapLocation + ld b, a + ld a, [PlayerGender] + rrca + or b + ld [hl], a + ret + +SetBoxMonCaughtData: ; 4db83 + ld a, BANK(sBoxMon1CaughtLevel) + call GetSRAMBank + ld hl, sBoxMon1CaughtLevel + call SetBoxmonOrEggmonCaughtData + call CloseSRAM + ret + +SetGiftBoxMonCaughtData: ; 4db92 + push bc + ld a, BANK(sBoxMon1CaughtLevel) + call GetSRAMBank + ld hl, sBoxMon1CaughtLevel + pop bc + call SetGiftMonCaughtData + call CloseSRAM + ret + +SetGiftPartyMonCaughtData: ; 4dba3 + ld a, [PartyCount] + dec a + ld hl, PartyMon1CaughtLevel + push bc + call GetPartyLocation + pop bc +SetGiftMonCaughtData: ; 4dbaf + xor a + ld [hli], a + ld a, $7e + rrc b + or b + ld [hl], a + ret + +SetEggMonCaughtData: ; 4dbb8 (13:5bb8) + ld a, [CurPartyMon] + ld hl, PartyMon1CaughtLevel + call GetPartyLocation + ld a, [CurPartyLevel] + push af + ld a, $1 + ld [CurPartyLevel], a + call SetBoxmonOrEggmonCaughtData + pop af + ld [CurPartyLevel], a + ret diff --git a/engine/cgb_layouts.asm b/engine/cgb_layouts.asm new file mode 100644 index 000000000..18fda6170 --- /dev/null +++ b/engine/cgb_layouts.asm @@ -0,0 +1,1071 @@ +; Replaces the functionality of sgb.asm to work with CGB hardware. + +CheckCGB: ; 8d55 + ld a, [hCGB] + and a + ret +; 8d59 + +Predef_LoadSGBLayoutCGB: ; 8d59 + ld a, b + cp SCGB_RAM + jr nz, .not_ram + ld a, [SGBPredef] +.not_ram + cp SCGB_PARTY_MENU_HP_PALS + jp z, CGB_ApplyPartyMenuHPPals + call ResetBGPals + ld l, a + ld h, 0 + add hl, hl + ld de, .dw + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .ReturnFromJumpTable + push de + jp hl +; 8d79 + +.ReturnFromJumpTable: ; 8d79 + ret +; 8d7a + +.dw ; 8d7a + dw _CGB_BattleGrayscale + dw _CGB_BattleColors + dw _CGB_PokegearPals + dw _CGB_StatsScreenHPPals + dw _CGB_Pokedex + dw _CGB_SlotMachine + dw _CGB06 + dw _CGB07 + dw _CGB_Diploma + dw _CGB_MapPals + dw _CGB_PartyMenu + dw _CGB_Evolution + dw _CGB0c + dw _CGB0d + dw _CGB_MoveList + dw _CGB0f + dw _CGB_PokedexSearchOption + dw _CGB11 + dw _CGB_Pokepic + dw _CGB13 + dw _CGB_PackPals + dw _CGB_TrainerCard + dw _CGB_PokedexUnownMode + dw _CGB_BillsPC + dw _CGB_UnownPuzzle + dw _CGB_GamefreakLogo ; called before copyright + dw _CGB_PlayerOrMonFrontpicPals + dw _CGB_TradeTube + dw _CGB_TrainerOrMonFrontpicPals + dw _CGB_MysteryGift + dw _CGB1e +; 8db8 + +_CGB_BattleGrayscale: ; 8db8 + ld hl, PalPacket_9c66 + 1 + ld de, UnknBGPals + ld c, 4 + call CopyPalettes + ld hl, PalPacket_9c66 + 1 + ld de, UnknBGPals palette PAL_BATTLE_BG_EXP + ld c, 4 + call CopyPalettes + ld hl, PalPacket_9c66 + 1 + ld de, UnknOBPals + ld c, 2 + call CopyPalettes + jr _CGB_FinishBattleScreenLayout + +_CGB_BattleColors: ; 8ddb + ld de, UnknBGPals + call GetBattlemonBackpicPalettePointer + push hl + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_PLAYER + call GetEnemyFrontpicPalettePointer + push hl + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_ENEMY + ld a, [EnemyHPPal] + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld bc, HPBarPals + add hl, bc + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_ENEMY_HP + ld a, [PlayerHPPal] + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld bc, HPBarPals + add hl, bc + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_PLAYER_HP + ld hl, ExpBarPalette + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_BG_EXP + ld de, UnknOBPals + pop hl + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_OB_ENEMY + pop hl + call LoadPalette_White_Col1_Col2_Black ; PAL_BATTLE_OB_PLAYER + ld a, SCGB_BATTLE_COLORS + ld [SGBPredef], a + call ApplyPals +_CGB_FinishBattleScreenLayout: ; 8e23 + call InitPartyMenuBGPal7 + hlcoord 0, 0, AttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, PAL_BATTLE_BG_ENEMY_HP + call ByteFill + hlcoord 0, 4, AttrMap + lb bc, 8, 10 + ld a, PAL_BATTLE_BG_PLAYER + call FillBoxCGB + hlcoord 10, 0, AttrMap + lb bc, 7, 10 + ld a, PAL_BATTLE_BG_ENEMY + call FillBoxCGB + hlcoord 0, 0, AttrMap + lb bc, 4, 10 + ld a, PAL_BATTLE_BG_ENEMY_HP + call FillBoxCGB + hlcoord 10, 7, AttrMap + lb bc, 5, 10 + ld a, PAL_BATTLE_BG_PLAYER_HP + call FillBoxCGB + hlcoord 10, 11, AttrMap + lb bc, 1, 9 + ld a, PAL_BATTLE_BG_EXP + call FillBoxCGB + hlcoord 0, 12, AttrMap + ld bc, 6 * SCREEN_WIDTH + ld a, PAL_BATTLE_BG_TEXT + call ByteFill + ld hl, Palettes_979c + ld de, UnknOBPals palette PAL_BATTLE_OB_GRAY + ld bc, 6 palettes + ld a, BANK(UnknOBPals) + call FarCopyWRAM + call ApplyAttrMap + ret +; 8e85 + + +InitPartyMenuBGPal7: ; 8e85 + callba Function100dc0 +Mobile_InitPartyMenuBGPal7: ; 8e8b + ld hl, Palette_b311 + jr nc, .not_mobile + ld hl, Palette_b309 +.not_mobile + ld de, UnknBGPals palette 7 + ld bc, 1 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + ret +; 8e9f + +InitPartyMenuBGPal0: ; 8e9f + callba Function100dc0 + ld hl, Palette_b311 + jr nc, .not_mobile + ld hl, Palette_b309 +.not_mobile + ld de, UnknBGPals palette 0 + ld bc, 1 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + ret +; 8eb9 + +_CGB_PokegearPals: ; 8eb9 + ld a, [PlayerGender] + bit 0, a + jr z, .male + ld hl, FemalePokegearPals + jr .got_pals + +.male + ld hl, MalePokegearPals +.got_pals + ld de, UnknBGPals + ld bc, 6 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 8edb + +_CGB_StatsScreenHPPals: ; 8edb + ld de, UnknBGPals + ld a, [wCurHPPal] + ld l, a + ld h, $0 + add hl, hl + add hl, hl + ld bc, HPBarPals + add hl, bc + call LoadPalette_White_Col1_Col2_Black ; hp palette + ld a, [CurPartySpecies] + ld bc, TempMonDVs + call GetPlayerOrMonPalettePointer + call LoadPalette_White_Col1_Col2_Black ; mon palette + ld hl, ExpBarPalette + call LoadPalette_White_Col1_Col2_Black ; exp palette + ld hl, StatsScreenPagePals + ld de, UnknBGPals palette 3 + ld bc, 3 palettes ; pink, green, and blue page palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + call WipeAttrMap + + hlcoord 0, 0, AttrMap + lb bc, 8, SCREEN_WIDTH + ld a, $1 ; mon palette + call FillBoxCGB + + hlcoord 10, 16, AttrMap + ld bc, 10 + ld a, $2 ; exp palette + call ByteFill + + hlcoord 13, 5, AttrMap + lb bc, 2, 2 + ld a, $3 ; pink page palette + call FillBoxCGB + + hlcoord 15, 5, AttrMap + lb bc, 2, 2 + ld a, $4 ; green page palette + call FillBoxCGB + + hlcoord 17, 5, AttrMap + lb bc, 2, 2 + ld a, $5 ; blue page palette + call FillBoxCGB + + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 8f52 + +StatsScreenPagePals: ; 8f52 +; pink + RGB 31, 31, 31 + RGB 31, 19, 31 + RGB 31, 15, 31 + RGB 00, 00, 00 +; green + RGB 31, 31, 31 + RGB 21, 31, 14 + RGB 17, 31, 00 + RGB 00, 00, 00 +; blue + RGB 31, 31, 31 + RGB 17, 31, 31 + RGB 17, 31, 31 + RGB 00, 00, 00 +; 8f6a + +StatsScreenPals: ; 8f6a +; pink + RGB 31, 19, 31 +; green + RGB 21, 31, 14 +; blue + RGB 17, 31, 31 +; 8f70 + +_CGB_Pokedex: ; 8f70 + ld de, UnknBGPals + ld a, $1d + call GetPredefPal + call LoadHLPaletteIntoDE ; dex interface palette + ld a, [CurPartySpecies] + cp $ff + jr nz, .is_pokemon + ld hl, .PokedexQuestionMarkPalette + call LoadHLPaletteIntoDE ; green question mark palette + jr .got_palette + +.is_pokemon + call GetMonPalettePointer_ + call LoadPalette_White_Col1_Col2_Black ; mon palette +.got_palette + call WipeAttrMap + hlcoord 1, 1, AttrMap + lb bc, 7, 7 + ld a, $1 ; green question mark palette + call FillBoxCGB + call InitPartyMenuOBPals + ld hl, .PokedexCursorPalette + ld de, UnknOBPals palette 7 ; green cursor palette + ld bc, 1 palettes + ld a, BANK(UnknOBPals) + call FarCopyWRAM + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 8fba + +.PokedexQuestionMarkPalette: ; 8fba + RGB 11, 23, 00 + RGB 07, 17, 00 + RGB 06, 16, 03 + RGB 05, 12, 01 + +.PokedexCursorPalette: ; 8fc2 + RGB 00, 00, 00 + RGB 11, 23, 00 + RGB 07, 17, 00 + RGB 00, 00, 00 +; 8fca + +_CGB_BillsPC: ; 8fca + ld de, UnknBGPals + ld a, $1d + call GetPredefPal + call LoadHLPaletteIntoDE + ld a, [CurPartySpecies] + cp $ff + jr nz, .GetMonPalette + ld hl, .BillsPCOrangePalette + call LoadHLPaletteIntoDE + jr .Resume + +.GetMonPalette: + ld bc, TempMonDVs + call GetPlayerOrMonPalettePointer + call LoadPalette_White_Col1_Col2_Black +.Resume: + call WipeAttrMap + hlcoord 1, 4, AttrMap + lb bc, 7, 7 + ld a, $1 + call FillBoxCGB + call InitPartyMenuOBPals + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9009 + +.Function9009: ; 9009 + ld hl, .BillsPCOrangePalette + call LoadHLPaletteIntoDE + jr .asm_901a + +.unused + ld bc, TempMonDVs + call GetPlayerOrMonPalettePointer + call LoadPalette_White_Col1_Col2_Black +.asm_901a + call WipeAttrMap + hlcoord 1, 1, AttrMap + lb bc, 7, 7 + ld a, $1 + call FillBoxCGB + call InitPartyMenuOBPals + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9036 + +.BillsPCOrangePalette: ; 9036 + RGB 31, 15, 00 + RGB 23, 12, 00 + RGB 15, 07, 00 + RGB 00, 00, 00 +; 903e + +_CGB_PokedexUnownMode: ; 903e + ld de, UnknBGPals + ld a, $1d + call GetPredefPal + call LoadHLPaletteIntoDE + ld a, [CurPartySpecies] + call GetMonPalettePointer_ + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + hlcoord 7, 5, AttrMap + lb bc, 7, 7 + ld a, $1 + call FillBoxCGB + call InitPartyMenuOBPals + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 906e + +_CGB_SlotMachine: ; 906e + ld hl, SlotMachinePals + ld de, UnknBGPals + ld bc, 16 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + call WipeAttrMap + hlcoord 0, 2, AttrMap + lb bc, 10, 3 + ld a, $2 + call FillBoxCGB + hlcoord 17, 2, AttrMap + lb bc, 10, 3 + ld a, $2 + call FillBoxCGB + hlcoord 0, 4, AttrMap + lb bc, 6, 3 + ld a, $3 + call FillBoxCGB + hlcoord 17, 4, AttrMap + lb bc, 6, 3 + ld a, $3 + call FillBoxCGB + hlcoord 0, 6, AttrMap + lb bc, 2, 3 + ld a, $4 + call FillBoxCGB + hlcoord 17, 6, AttrMap + lb bc, 2, 3 + ld a, $4 + call FillBoxCGB + hlcoord 4, 2, AttrMap + lb bc, 2, 12 + ld a, $1 + call FillBoxCGB + hlcoord 3, 2, AttrMap + lb bc, 10, 1 + ld a, $1 + call FillBoxCGB + hlcoord 16, 2, AttrMap + lb bc, 10, 1 + ld a, $1 + call FillBoxCGB + hlcoord 0, 12, AttrMap + ld bc, $78 + ld a, $7 + call ByteFill + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 90f8 + +_CGB06: ; 90f8 + ld hl, PalPacket_9ca6 + 1 + call CopyFourPalettes + call WipeAttrMap + ld de, UnknOBPals + ld a, $3c + call GetPredefPal + call LoadHLPaletteIntoDE + hlcoord 0, 6, AttrMap + lb bc, 12, SCREEN_WIDTH + ld a, $1 + call FillBoxCGB + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9122 + +_CGB07: ; 9122 + ld b, 0 + ld hl, .Jumptable + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + jp hl +; 912d + +.Jumptable: ; 912d + dw .Function9133 + dw .Function9166 + dw .Function9180 +; 9133 + +.Function9133: ; 9133 + ld hl, .Palette_914e + ld de, UnknBGPals + call LoadHLPaletteIntoDE + ld hl, .Palette_9156 + ld de, UnknOBPals + ld bc, 2 palettes + ld a, BANK(UnknOBPals) + call FarCopyWRAM + call WipeAttrMap + ret +; 914e + +.Palette_914e: ; 914e + RGB 19, 31, 19 + RGB 18, 23, 31 + RGB 11, 21, 28 + RGB 04, 16, 24 + +.Palette_9156: ; 9156 + RGB 29, 29, 29 + RGB 20, 19, 20 + RGB 19, 06, 04 + RGB 03, 04, 06 + + RGB 31, 31, 31 + RGB 31, 31, 31 + RGB 31, 00, 00 + RGB 03, 04, 06 +; 9166 + +.Function9166: ; 9166 + ld de, UnknBGPals + ld a, $38 + call GetPredefPal + call LoadHLPaletteIntoDE + + ld de, UnknOBPals + ld a, $39 + call GetPredefPal + call LoadHLPaletteIntoDE + call WipeAttrMap + ret +; 9180 + +.Function9180: ; 9180 + ld hl, PalPacket_9c36 + 1 + call CopyFourPalettes + ld de, UnknOBPals + ld a, $3a + call GetPredefPal + call LoadHLPaletteIntoDE + call WipeAttrMap + ret +; 9195 + +_CGB11: ; 9195 + ld hl, Palettes_b789 + ld de, UnknBGPals + ld bc, 5 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + call ApplyPals + call WipeAttrMap + call ApplyAttrMap + ret +; 91ad + +_CGB_Diploma: ; 91ad + ld hl, DiplomaPalettes + ld de, UnknBGPals + ld bc, 16 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + + ld hl, PalPacket_9cb6 + 1 + call CopyFourPalettes + call WipeAttrMap + call ApplyAttrMap + ret +; 91c8 + +_CGB_MapPals: ; 91c8 + call LoadMapPals + ld a, SCGB_MAPPALS + ld [SGBPredef], a + ret +; 91d1 + +_CGB_PartyMenu: ; 91d1 + ld hl, PalPacket_9c56 + 1 + call CopyFourPalettes + call InitPartyMenuBGPal0 + call InitPartyMenuBGPal7 + call InitPartyMenuOBPals + call ApplyAttrMap + ret +; 91e4 + +_CGB_Evolution: ; 91e4 + ld de, UnknBGPals + ld a, c + and a + jr z, .pokemon + ld a, $1a + call GetPredefPal + call LoadHLPaletteIntoDE + jr .got_palette + +.pokemon + ld hl, PartyMon1DVs + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [CurPartyMon] + call AddNTimes + ld c, l + ld b, h + ld a, [PlayerHPPal] + call GetPlayerOrMonPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld hl, Palettes_979c + ld de, UnknOBPals palette 2 + ld bc, 6 palettes + ld a, BANK(UnknOBPals) + call FarCopyWRAM + +.got_palette + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9228 + +_CGB0c: ; 9228 + ld hl, Palettes_b6f1 + ld de, UnknBGPals + ld bc, 5 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + ld hl, Palettes_b719 + ld de, UnknOBPals + ld bc, 2 palettes + ld a, BANK(UnknOBPals) + call FarCopyWRAM + ld a, SCGB_DIPLOMA + ld [SGBPredef], a + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9251 + +_CGB0d: ; 9251 + ld hl, PalPacket_9cb6 + 1 + call CopyFourPalettes + call WipeAttrMap + call ApplyAttrMap + ret +; 925e + +_CGB_UnownPuzzle: ; 925e + ld hl, PalPacket_9bc6 + 1 + call CopyFourPalettes + ld de, UnknOBPals + ld a, $4c + call GetPredefPal + call LoadHLPaletteIntoDE + ld a, [rSVBK] + push af + ld a, BANK(UnknOBPals) + ld [rSVBK], a + ld hl, UnknOBPals + ld a, $1f + ld [hli], a + ld a, $0 + ld [hl], a + pop af + ld [rSVBK], a + call WipeAttrMap + call ApplyAttrMap + ret +; 9289 + +_CGB_TrainerCard: ; 9289 + ld de, UnknBGPals + xor a ; CHRIS + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, FALKNER ; KRIS + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, BUGSY + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, WHITNEY + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, MORTY + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, CHUCK + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, JASMINE + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, PRYCE + call GetTrainerPalettePointer + call LoadPalette_White_Col1_Col2_Black + ld a, $24 + call GetPredefPal + call LoadHLPaletteIntoDE + + ; fill screen with opposite-gender palette for the card border + hlcoord 0, 0, AttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + ld a, [PlayerGender] + and a + ld a, $1 ; kris + jr z, .got_gender + ld a, $0 ; chris +.got_gender + call ByteFill + ; fill trainer sprite area with same-gender palette + hlcoord 14, 1, AttrMap + lb bc, 7, 5 + ld a, [PlayerGender] + and a + ld a, $0 ; chris + jr z, .got_gender2 + ld a, $1 ; kris +.got_gender2 + call FillBoxCGB + ; top-right corner still uses the border's palette + hlcoord 18, 1, AttrMap + ld [hl], $1 + hlcoord 2, 11, AttrMap + lb bc, 2, 4 + ld a, $1 ; falkner + call FillBoxCGB + hlcoord 6, 11, AttrMap + lb bc, 2, 4 + ld a, $2 ; bugsy + call FillBoxCGB + hlcoord 10, 11, AttrMap + lb bc, 2, 4 + ld a, $3 ; whitney + call FillBoxCGB + hlcoord 14, 11, AttrMap + lb bc, 2, 4 + ld a, $4 ; morty + call FillBoxCGB + hlcoord 2, 14, AttrMap + lb bc, 2, 4 + ld a, $5 ; chuck + call FillBoxCGB + hlcoord 6, 14, AttrMap + lb bc, 2, 4 + ld a, $6 ; jasmine + call FillBoxCGB + hlcoord 10, 14, AttrMap + lb bc, 2, 4 + ld a, $7 ; pryce + call FillBoxCGB + ; clair uses kris's palette + ld a, [PlayerGender] + and a + push af + jr z, .got_gender3 + hlcoord 14, 14, AttrMap + lb bc, 2, 4 + ld a, $1 + call FillBoxCGB +.got_gender3 + pop af + ld c, $0 + jr nz, .got_gender4 + inc c +.got_gender4 + ld a, c + hlcoord 18, 1, AttrMap + ld [hl], a + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9373 + +_CGB_MoveList: ; 9373 + ld de, UnknBGPals + ld a, $10 + call GetPredefPal + call LoadHLPaletteIntoDE + ld a, [PlayerHPPal] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld bc, HPBarPals + add hl, bc + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + hlcoord 11, 1, AttrMap + lb bc, 2, 9 + ld a, $1 + call FillBoxCGB + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 93a6 + +_CGB0f: ; 93a6 + ld hl, PalPacket_9c46 + 1 + call CopyFourPalettes + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 93ba + +_CGB_PokedexSearchOption: ; 93ba + ld de, UnknBGPals + ld a, $1d + call GetPredefPal + call LoadHLPaletteIntoDE + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 93d3 + +_CGB_PackPals: ; 93d3 +; pack pals + ld a, [BattleType] + cp BATTLETYPE_TUTORIAL + jr z, .tutorial_male + + ld a, [PlayerGender] + bit 0, a + jr z, .tutorial_male + + ld hl, .KrisPackPals + jr .got_gender + +.tutorial_male + ld hl, .ChrisPackPals + +.got_gender + ld de, UnknBGPals + ld bc, 8 palettes ; 6 palettes? + ld a, BANK(UnknBGPals) + call FarCopyWRAM + call WipeAttrMap + hlcoord 0, 0, AttrMap + lb bc, 1, 10 + ld a, $1 + call FillBoxCGB + hlcoord 10, 0, AttrMap + lb bc, 1, 10 + ld a, $2 + call FillBoxCGB + hlcoord 7, 2, AttrMap + lb bc, 9, 1 + ld a, $3 + call FillBoxCGB + hlcoord 0, 7, AttrMap + lb bc, 3, 5 + ld a, $4 + call FillBoxCGB + hlcoord 0, 3, AttrMap + lb bc, 3, 5 + ld a, $5 + call FillBoxCGB + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 9439 + +.ChrisPackPals: ; 9439 +INCLUDE "data/palettes/pack.pal" +; 9469 + +.KrisPackPals: ; 9469 +INCLUDE "data/palettes/pack_f.pal" +; 9499 + +_CGB_Pokepic: ; 9499 + call _CGB_MapPals + ld de, SCREEN_WIDTH + hlcoord 0, 0, AttrMap + ld a, [wMenuBorderTopCoord] +.loop + and a + jr z, .found_top + dec a + add hl, de + jr .loop + +.found_top + ld a, [wMenuBorderLeftCoord] + ld e, a + ld d, $0 + add hl, de + ld a, [wMenuBorderTopCoord] + ld b, a + ld a, [wMenuBorderBottomCoord] + inc a + sub b + ld b, a + ld a, [wMenuBorderLeftCoord] + ld c, a + ld a, [wMenuBorderRightCoord] + sub c + inc a + ld c, a + ld a, $0 + call FillBoxCGB + call ApplyAttrMap + ret +; 94d0 + +_CGB13: ; 94d0 + ld hl, PalPacket_9ba6 + 1 + call CopyFourPalettes + call WipeAttrMap + hlcoord 0, 4, AttrMap + lb bc, 10, SCREEN_WIDTH + ld a, $2 + call FillBoxCGB + hlcoord 0, 6, AttrMap + lb bc, 6, SCREEN_WIDTH + ld a, $1 + call FillBoxCGB + call ApplyAttrMap + call ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 94fa + +_CGB_GamefreakLogo: ; 94fa + ld de, UnknBGPals + ld a, $4e + call GetPredefPal + call LoadHLPaletteIntoDE + ld hl, .Palette + ld de, UnknOBPals + call LoadHLPaletteIntoDE + ld hl, .Palette + ld de, UnknOBPals palette 1 + call LoadHLPaletteIntoDE + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ret +; 9521 + +.Palette: ; 9521 + RGB 31, 31, 31 + RGB 13, 11, 00 + RGB 23, 12, 28 + RGB 00, 00, 00 +; 9529 + +_CGB_PlayerOrMonFrontpicPals: ; 9529 + ld de, UnknBGPals + ld a, [CurPartySpecies] + ld bc, TempMonDVs + call GetPlayerOrMonPalettePointer + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ret +; 9542 + +_CGB1e: ; 9542 + ld de, UnknBGPals + ld a, [CurPartySpecies] + call GetMonPalettePointer_ + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + call ApplyAttrMap + ret +; 9555 + +_CGB_TradeTube: ; 9555 + ld hl, PalPacket_9cc6 + 1 + call CopyFourPalettes + ld hl, PartyMenuOBPals + ld de, UnknOBPals + ld bc, 1 palettes + ld a, BANK(UnknOBPals) + call FarCopyWRAM + ld de, UnknOBPals palette 7 + ld a, $1c + call GetPredefPal + call LoadHLPaletteIntoDE + call WipeAttrMap + ret +; 9578 + +_CGB_TrainerOrMonFrontpicPals: ; 9578 + ld de, UnknBGPals + ld a, [CurPartySpecies] + ld bc, TempMonDVs + call GetFrontpicPalettePointer + call LoadPalette_White_Col1_Col2_Black + call WipeAttrMap + call ApplyAttrMap + call ApplyPals + ret +; 9591 + +_CGB_MysteryGift: ; 9591 + ld hl, .Palettes + ld de, UnknBGPals + ld bc, 2 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + call ApplyPals + call WipeAttrMap + hlcoord 3, 7, AttrMap + lb bc, 8, 14 + ld a, $1 + call FillBoxCGB + hlcoord 1, 5, AttrMap + lb bc, 1, 18 + ld a, $1 + call FillBoxCGB + hlcoord 1, 16, AttrMap + lb bc, 1, 18 + ld a, $1 + call FillBoxCGB + hlcoord 0, 0, AttrMap + lb bc, 17, 2 + ld a, $1 + call FillBoxCGB + hlcoord 18, 5, AttrMap + lb bc, 12, 1 + ld a, $1 + call FillBoxCGB + call ApplyAttrMap + ret +; 95e0 + +.Palettes: ; 95e0 + RGB 31, 31, 31 + RGB 16, 31, 14 + RGB 05, 14, 21 + RGB 05, 13, 10 + + RGB 31, 31, 31 + RGB 11, 21, 25 + RGB 05, 14, 21 + RGB 00, 03, 19 +; 95f0 diff --git a/engine/check_battle_scene.asm b/engine/check_battle_scene.asm new file mode 100644 index 000000000..b63f00907 --- /dev/null +++ b/engine/check_battle_scene.asm @@ -0,0 +1,47 @@ +CheckBattleScene: ; 4ea44 +; Return carry if battle scene is turned off. + + ld a, 0 + ld hl, wLinkMode + call GetFarWRAMByte + cp LINK_MOBILE + jr z, .mobile + + ld a, [Options] + bit BATTLE_SCENE, a + jr nz, .off + + and a + ret + +.mobile + ld a, [wcd2f] + and a + jr nz, .from_wram + + ld a, $4 + call GetSRAMBank + ld a, [$a60c] + ld c, a + call CloseSRAM + + ld a, c + bit 0, c + jr z, .off + + and a + ret + +.from_wram + ld a, $5 + ld hl, w5_dc00 + call GetFarWRAMByte + bit 0, a + jr z, .off + + and a + ret + +.off + scf + ret diff --git a/engine/check_nick_errors.asm b/engine/check_nick_errors.asm new file mode 100644 index 000000000..1cedca420 --- /dev/null +++ b/engine/check_nick_errors.asm @@ -0,0 +1,74 @@ +CheckNickErrors:: ; 669f +; error-check monster nick before use +; must be a peace offering to gamesharkers + +; input: de = nick location + + push bc + push de + ld b, PKMN_NAME_LENGTH + +.checkchar +; end of nick? + ld a, [de] + cp "@" ; terminator + jr z, .end + +; check if this char is a text command + ld hl, .textcommands + dec hl +.loop +; next entry + inc hl +; reached end of commands table? + ld a, [hl] + cp -1 + jr z, .done + +; is the current char between this value (inclusive)... + ld a, [de] + cp [hl] + inc hl + jr c, .loop +; ...and this one? + cp [hl] + jr nc, .loop + +; replace it with a "?" + ld a, "?" + ld [de], a + jr .loop + +.done +; next char + inc de +; reached end of nick without finding a terminator? + dec b + jr nz, .checkchar + +; change nick to "?@" + pop de + push de + ld a, "?" + ld [de], a + inc de + ld a, "@" + ld [de], a +.end +; if the nick has any errors at this point it's out of our hands + pop de + pop bc + ret + +.textcommands ; 66cf +; table defining which characters are actually text commands +; format: + ; ≥ < + db "<START>", TX_BOX + 1 + db "<PLAY_G>", $18 + 1 + db $1d, "%" + 1 + db $35, "<GREEN>" + 1 + db "<ENEMY>", "<ENEMY>" + 1 + db "<MOM>", "<TM>" + 1 + db "<ROCKET>", "┘" + 1 + db -1 ; end diff --git a/engine/check_time.asm b/engine/check_time.asm new file mode 100644 index 000000000..615b51d29 --- /dev/null +++ b/engine/check_time.asm @@ -0,0 +1,19 @@ +CheckTime:: ; c000 + ld a, [TimeOfDay] + ld hl, TimeOfDayTable + ld de, 2 + call IsInArray + inc hl + ld c, [hl] + ret c + + xor a + ld c, a + ret + +TimeOfDayTable: ; c012 + db MORN_F, MORN + db DAY_F, DAY + db NITE_F, NITE + db NITE_F, NITE + db -1 diff --git a/engine/color.asm b/engine/color.asm index add8c24ac..12f22d4c1 100644 --- a/engine/color.asm +++ b/engine/color.asm @@ -1,5 +1,4 @@ -PALPACKET_LENGTH EQU $10 -INCLUDE "predef/sgb.asm" +INCLUDE "engine/sgb_layouts.asm" SHINY_ATK_BIT EQU 5 SHINY_DEF_VAL EQU 10 @@ -355,7 +354,7 @@ ApplyHPBarPals: ld h, $0 add hl, hl add hl, hl - ld bc, Palettes_a8be + ld bc, HPBarPals add hl, bc ld bc, 4 ld a, $5 @@ -450,57 +449,9 @@ LoadMailPalettes: ret .MailPals: - RGB 20, 31, 11 - RGB 31, 19, 00 - RGB 31, 10, 09 - RGB 00, 00, 00 - - RGB 15, 20, 31 - RGB 30, 26, 00 - RGB 31, 12, 00 - RGB 00, 00, 00 +INCLUDE "data/palettes/mail.pal" - RGB 24, 17, 31 - RGB 30, 26, 00 - RGB 08, 11, 31 - RGB 00, 00, 00 - - RGB 31, 25, 17 - RGB 31, 18, 04 - RGB 28, 12, 05 - RGB 00, 00, 00 - - RGB 19, 26, 31 - RGB 31, 05, 08 - RGB 31, 09, 31 - RGB 00, 00, 00 - - RGB 31, 19, 28 - RGB 31, 21, 00 - RGB 12, 22, 00 - RGB 00, 00, 00 - - RGB 19, 17, 23 - RGB 30, 26, 00 - RGB 31, 12, 00 - RGB 00, 00, 00 - - RGB 07, 26, 31 - RGB 26, 26, 27 - RGB 31, 11, 11 - RGB 00, 00, 00 - - RGB 21, 31, 21 - RGB 30, 26, 00 - RGB 31, 12, 00 - RGB 00, 00, 00 - - RGB 07, 26, 31 - RGB 31, 31, 00 - RGB 00, 21, 00 - RGB 00, 00, 00 - -INCLUDE "predef/cgb.asm" +INCLUDE "engine/cgb_layouts.asm" Function95f0: ; XXX @@ -544,7 +495,7 @@ GetPredefPal: add hl, hl add hl, hl add hl, hl - ld bc, Palettes_9df6 + ld bc, PredefPals add hl, bc ret @@ -731,7 +682,7 @@ CGB_ApplyPartyMenuHPPals: ; 96f3 CGB layout $fc ret InitPartyMenuOBPals: - ld hl, Palettes_b681 + ld hl, PartyMenuOBPals ld de, UnknOBPals ld bc, 2 palettes ld a, $5 @@ -805,42 +756,14 @@ Function9779: mobile dec c jr nz, .loop ld hl, Palettes_979c - ld de, UnknOBPals + 8 * 2 + ld de, UnknOBPals palette 2 ld bc, 2 palettes ld a, $5 call FarCopyWRAM ret Palettes_979c: - RGB 31, 31, 31 - RGB 25, 25, 25 - RGB 13, 13, 13 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 07 - RGB 31, 16, 01 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 19, 24 - RGB 30, 10, 06 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 12, 25, 01 - RGB 05, 14, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 08, 12, 31 - RGB 01, 04, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 24, 18, 07 - RGB 20, 15, 03 - RGB 00, 00, 00 +INCLUDE "data/palettes/979c.pal" Function97cc: ; XXX @@ -1142,7 +1065,7 @@ SGBBorder_PushBGPals: call DisableLCD ld a, %11100100 ld [rBGP], a - ld hl, Palettes_9df6 + ld hl, PredefPals ld de, VTiles1 ld bc, $1000 call CopyData @@ -1351,532 +1274,35 @@ PalPacket_9dc6: db $79, $26, $08, $00, $0b, $39, $cd, $48, $0c, $d0, $34, $a5, $ PalPacket_9dd6: db $79, $1b, $08, $00, $0b, $ea, $ea, $ea, $ea, $ea, $a9, $01, $cd, $4f, $0c, $d0 PalPacket_9de6: db $79, $10, $08, $00, $0b, $4c, $20, $08, $ea, $ea, $ea, $ea, $ea, $60, $ea, $ea -Palettes_9df6: - RGB 31, 31, 31 - RGB 22, 25, 19 - RGB 16, 21, 30 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 27, 28, 31 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 24, 28, 19 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 24, 24, 24 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 21, 23, 31 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 24, 21, 27 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 24, 16 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 25, 30, 26 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 25, 31 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 20, 19 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 26, 19 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 27, 28, 27 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 24, 30, 23 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 29, 24, 29 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 26, 23, 29 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 25, 23, 20 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 29, 26, 18 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 21, 18 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 26, 25, 31 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 22, 21, 31 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 22, 25, 21 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 21, 21, 22 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 20, 20 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 26, 26, 26 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 21, 14, 09 - RGB 15, 20, 20 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 12, 28, 22 - RGB 15, 20, 20 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 07, 07, 07 - RGB 02, 03, 03 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 22, 17 - RGB 16, 14, 19 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 18, 20, 27 - RGB 11, 15, 23 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 20, 10 - RGB 26, 10, 06 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 21, 25, 29 - RGB 14, 19, 25 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 27, 22, 24 - RGB 21, 15, 23 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 28, 20, 15 - RGB 21, 14, 09 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 20, 26, 16 - RGB 09, 20, 11 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 22, 24 - RGB 28, 15, 21 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 28, 14 - RGB 26, 20, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 26, 21, 22 - RGB 15, 15, 18 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 23, 19, 13 - RGB 14, 12, 17 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 16, 18, 21 - RGB 10, 12, 18 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 22, 15, 16 - RGB 17, 02, 05 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 15, 20, 20 - RGB 05, 16, 16 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 23, 15, 19 - RGB 14, 04, 12 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 20, 17, 18 - RGB 18, 13, 11 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 23, 21, 16 - RGB 12, 12, 10 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 21, 25, 29 - RGB 30, 22, 24 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 26, 23, 16 - RGB 29, 14, 09 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 18, 18, 18 - RGB 10, 10, 10 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 26, 15 - RGB 00, 23, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 26, 15 - RGB 31, 23, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 26, 15 - RGB 31, 00, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 29, 26, 19 - RGB 27, 20, 14 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 24, 20, 10 - RGB 21, 00, 04 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 20, 10 - RGB 21, 00, 04 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 26, 16 - RGB 16, 12, 09 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 15, 28, 26 - RGB 12, 22, 26 - RGB 03, 16, 14 - - RGB 31, 31, 31 - RGB 15, 28, 26 - RGB 23, 24, 24 - RGB 00, 00, 00 - - RGB 31, 31, 24 - RGB 07, 27, 19 - RGB 26, 20, 10 - RGB 19, 12, 08 - - RGB 31, 31, 31 - RGB 31, 28, 14 - RGB 31, 13, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 16, 18, 21 - RGB 10, 12, 18 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 23, 21, 16 - RGB 12, 12, 10 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 14, 00 - RGB 07, 11, 15 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 26, 21, 22 - RGB 26, 10, 06 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 27, 04 - RGB 24, 20, 11 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 13, 25 - RGB 24, 20, 11 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 16, 19, 29 - RGB 24, 20, 11 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 22, 24 - RGB 18, 18, 18 - RGB 16, 10, 07 - - RGB 31, 31, 31 - RGB 21, 25, 29 - RGB 18, 18, 18 - RGB 16, 10, 07 - - RGB 31, 31, 31 - RGB 20, 26, 16 - RGB 18, 18, 18 - RGB 16, 10, 07 - - RGB 31, 31, 31 - RGB 31, 28, 14 - RGB 18, 18, 18 - RGB 16, 10, 07 - - RGB 31, 31, 31 - RGB 18, 18, 18 - RGB 26, 10, 06 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 22, 24 - RGB 28, 15, 21 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 26, 20, 00 - RGB 16, 19, 29 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 16, 02, 30 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 16, 13, 04 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 28, 04, 02 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 18, 23, 31 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 24, 20, 11 - RGB 18, 13, 11 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 25, 30, 00 - RGB 25, 30, 00 - - RGB 00, 00, 00 - RGB 08, 11, 11 - RGB 21, 21, 21 - RGB 31, 31, 31 +PredefPals: +INCLUDE "data/palettes/predef.pal" SGBBorderMap: - db $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $14, $14, $15, $14, $16, $14, $17, $14, $17, $54, $16, $54, $15, $54, $14, $54, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14 - db $01, $14, $02, $14, $03, $14, $03, $54, $02, $54, $01, $54, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $24, $14, $25, $14, $26, $14, $07, $14, $07, $54, $26, $54, $25, $54, $24, $54, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $54, $01, $14, $02, $14, $03, $14, $03, $54, $02, $54, $01, $54 - db $11, $14, $12, $14, $13, $14, $13, $54, $12, $54, $11, $54, $10, $54, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $24, $14, $34, $14, $35, $14, $35, $54, $34, $54, $33, $54, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $10, $14, $11, $14, $12, $14, $13, $14, $13, $54, $12, $54, $11, $54 - db $21, $14, $22, $14, $23, $14, $23, $54, $22, $54, $21, $54, $20, $54, $07, $14, $08, $14, $09, $14, $0a, $14, $0b, $14, $0c, $14, $0d, $14, $07, $14, $07, $14, $18, $14, $09, $14, $1a, $14, $1b, $14, $0d, $14, $0c, $14, $1c, $14, $29, $14, $07, $14, $20, $14, $21, $14, $22, $14, $23, $14, $23, $54, $22, $54, $21, $54 - db $31, $14, $32, $14, $07, $14, $07, $14, $32, $54, $36, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $38, $10, $27, $10, $32, $14, $07, $54, $07, $54, $32, $54, $31, $54 - db $05, $14, $06, $14, $07, $14, $07, $54, $06, $54, $1f, $10, $37, $10, $06, $14, $07, $14, $07, $54, $06, $54, $05, $54 - db $15, $14, $16, $14, $17, $14, $17, $54, $16, $54, $1f, $10, $37, $10, $16, $14, $17, $14, $17, $54, $16, $54, $15, $54 - db $25, $14, $26, $14, $07, $14, $07, $54, $26, $54, $1f, $10, $37, $10, $26, $14, $07, $14, $07, $54, $26, $54, $25, $54 - db $33, $14, $34, $14, $35, $14, $35, $54, $34, $54, $1f, $10, $37, $10, $34, $14, $35, $14, $35, $54, $34, $54, $33, $54 - db $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $1f, $10, $37, $10, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14 - db $02, $54, $01, $54, $07, $54, $07, $14, $07, $14, $1f, $10, $37, $10, $07, $14, $07, $14, $07, $14, $01, $14, $02, $14 - db $12, $54, $11, $54, $10, $54, $07, $14, $07, $14, $1f, $10, $37, $10, $07, $14, $07, $14, $10, $14, $11, $14, $12, $14 - db $22, $54, $21, $54, $20, $54, $07, $14, $07, $14, $1f, $10, $37, $10, $07, $14, $07, $14, $20, $14, $21, $14, $22, $14 - db $32, $54, $31, $54, $30, $54, $07, $14, $07, $14, $1f, $10, $37, $10, $07, $14, $07, $14, $30, $14, $31, $14, $32, $14 - db $06, $54, $05, $54, $04, $54, $07, $14, $07, $14, $1f, $10, $37, $10, $07, $14, $07, $14, $04, $14, $05, $14, $06, $14 - db $16, $54, $15, $54, $14, $54, $07, $14, $07, $14, $1f, $10, $37, $10, $07, $14, $07, $14, $14, $14, $15, $14, $16, $14 - db $26, $54, $25, $54, $24, $54, $07, $14, $07, $14, $1f, $10, $37, $10, $07, $14, $07, $14, $24, $14, $25, $14, $26, $14 - db $34, $54, $33, $54, $07, $54, $07, $14, $07, $14, $1f, $10, $37, $10, $07, $14, $07, $14, $07, $14, $33, $14, $34, $14 - db $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $1f, $10, $37, $10, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14 - db $01, $14, $02, $14, $03, $14, $03, $54, $02, $54, $1f, $10, $37, $10, $02, $14, $03, $14, $03, $54, $02, $54, $01, $54 - db $11, $14, $12, $14, $13, $14, $13, $54, $12, $54, $1f, $10, $37, $10, $12, $14, $13, $14, $13, $54, $12, $54, $11, $54 - db $21, $14, $22, $14, $23, $14, $23, $54, $22, $54, $1f, $10, $37, $10, $22, $14, $23, $14, $23, $54, $22, $54, $21, $54 - db $31, $14, $32, $14, $07, $14, $07, $14, $32, $54, $1f, $10, $37, $10, $32, $14, $07, $54, $07, $54, $32, $54, $31, $54 - db $05, $14, $06, $14, $07, $14, $07, $54, $06, $54, $2e, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2f, $10, $2d, $10, $06, $14, $07, $14, $07, $54, $06, $54, $05, $54 - db $15, $14, $16, $14, $17, $14, $17, $54, $16, $54, $15, $54, $14, $54, $07, $14, $07, $14, $39, $14, $0e, $14, $09, $14, $0f, $14, $28, $14, $07, $14, $19, $14, $0c, $14, $1c, $14, $29, $14, $2a, $14, $2b, $14, $2c, $14, $39, $14, $07, $14, $07, $14, $14, $14, $15, $14, $16, $14, $17, $14, $17, $54, $16, $54, $15, $54 - db $25, $14, $26, $14, $07, $14, $07, $54, $26, $54, $25, $54, $24, $54, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $01, $14, $02, $14, $03, $14, $03, $54, $02, $54, $01, $54, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $24, $14, $25, $14, $26, $14, $07, $14, $07, $54, $26, $54, $25, $54 - db $33, $14, $34, $14, $35, $14, $35, $54, $34, $54, $24, $54, $07, $54, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $10, $14, $11, $14, $12, $14, $13, $14, $13, $54, $12, $54, $11, $54, $10, $54, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $24, $14, $34, $14, $35, $14, $35, $54, $34, $54, $33, $54 - db $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $20, $14, $21, $14, $22, $14, $23, $14, $23, $54, $22, $54, $21, $54, $20, $54, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14, $07, $14 +INCLUDE "data/sgb_border_map.asm" SGBBorderPalettes: - RGB 24, 06, 06 - RGB 24, 24, 26 - RGB 14, 15, 20 - RGB 04, 07, 10 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 18, 24, 18 - RGB 31, 26, 15 - RGB 26, 19, 10 - RGB 12, 07, 05 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 18, 06, 31 - RGB 31, 31, 29 - RGB 31, 12, 00 - RGB 00, 00, 00 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 12, 31, 06 - RGB 22, 26, 30 - RGB 16, 17, 21 - RGB 00, 03, 00 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 - RGB 31, 31, 25 +INCLUDE "data/palettes/sgb_border.pal" SGBBorder: INCBIN "gfx/sgb/sgb_border.2bpp" -Palettes_a8be: +HPBarPals: +; green RGB 30, 26, 15 RGB 00, 23, 00 - +; yellow RGB 30, 26, 15 RGB 31, 21, 00 - +; red RGB 30, 26, 15 RGB 31, 00, 00 -Palettes_a8ca: +ExpBarPalette: +; blue RGB 30, 26, 15 RGB 04, 17, 31 INCLUDE "gfx/pics/palette_pointers.asm" - INCLUDE "gfx/trainer_palettes.asm" LoadMapPals: @@ -2027,324 +1453,34 @@ Palette_b311: ; b311 not mobile RGB 00, 00, 00 TilesetBGPalette: -INCLUDE "tilesets/bg.pal" +INCLUDE "data/palettes/tileset_bg.pal" MapObjectPals:: -INCLUDE "tilesets/ob.pal" +INCLUDE "data/palettes/map_objects.pal" RoofPals: -INCLUDE "tilesets/roof.pal" +INCLUDE "data/palettes/roofs.pal" DiplomaPalettes: - RGB 27, 31, 27 - RGB 21, 21, 21 - RGB 13, 13, 13 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 31, 07, 06 - RGB 20, 02, 03 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 10, 31, 09 - RGB 04, 14, 01 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 08, 12, 31 - RGB 01, 04, 31 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 31, 31, 07 - RGB 31, 16, 01 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 22, 16, 08 - RGB 13, 07, 01 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 15, 31, 31 - RGB 05, 17, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 11, 11, 19 - RGB 07, 07, 12 - RGB 00, 00, 00 - -Palettes_b681: - RGB 27, 31, 27 - RGB 31, 19, 10 - RGB 31, 07, 04 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 31, 19, 10 - RGB 10, 14, 20 - RGB 00, 00, 00 +INCLUDE "data/palettes/diploma.pal" - RGB 27, 31, 27 - RGB 31, 19, 10 - RGB 31, 07, 04 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 31, 19, 10 - RGB 31, 07, 04 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 31, 19, 10 - RGB 31, 07, 04 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 31, 19, 10 - RGB 31, 07, 04 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 31, 19, 10 - RGB 31, 07, 04 - RGB 00, 00, 00 - - RGB 27, 31, 27 - RGB 31, 19, 10 - RGB 31, 07, 04 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 21, 21, 21 - RGB 13, 13, 13 - RGB 07, 07, 07 - - RGB 31, 31, 31 - RGB 31, 31, 07 - RGB 31, 16, 01 - RGB 07, 07, 07 - - RGB 31, 31, 31 - RGB 31, 19, 24 - RGB 30, 10, 06 - RGB 07, 07, 07 - - RGB 31, 31, 31 - RGB 12, 25, 01 - RGB 05, 14, 00 - RGB 07, 07, 07 - - RGB 31, 31, 31 - RGB 08, 12, 31 - RGB 01, 04, 31 - RGB 07, 07, 07 - - RGB 31, 31, 31 - RGB 24, 18, 07 - RGB 20, 15, 03 - RGB 07, 07, 07 +PartyMenuOBPals: +INCLUDE "data/palettes/party_menu.pal" Palettes_b6f1: - RGB 31, 31, 31 - RGB 18, 23, 31 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 22, 00, 31 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 00, 00 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 25, 22, 00 - RGB 15, 20, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 23, 26, 31 - RGB 18, 23, 31 - RGB 00, 00, 00 +INCLUDE "data/palettes/b6f1.pal" Palettes_b719: - RGB 31, 31, 31 - RGB 07, 06, 03 - RGB 07, 06, 03 - RGB 07, 06, 03 - - RGB 31, 31, 31 - RGB 31, 31, 00 - RGB 26, 22, 00 - RGB 00, 00, 00 +INCLUDE "data/palettes/b719.pal" MalePokegearPals: - RGB 28, 31, 20 - RGB 21, 21, 21 - RGB 13, 13, 13 - RGB 00, 00, 00 - - RGB 28, 31, 20 - RGB 00, 31, 00 - RGB 00, 00, 31 - RGB 00, 00, 00 - - RGB 28, 31, 20 - RGB 00, 31, 00 - RGB 15, 07, 00 - RGB 00, 00, 00 - - RGB 28, 31, 20 - RGB 31, 15, 00 - RGB 15, 07, 00 - RGB 00, 00, 00 - - RGB 28, 31, 20 - RGB 00, 31, 00 - RGB 00, 00, 31 - RGB 31, 00, 00 - - RGB 28, 31, 20 - RGB 00, 31, 00 - RGB 15, 07, 00 - RGB 31, 00, 00 +INCLUDE "data/palettes/pokegear.pal" FemalePokegearPals: - RGB 28, 31, 20 - RGB 21, 21, 21 - RGB 13, 13, 13 - RGB 00, 00, 00 - - RGB 28, 31, 20 - RGB 00, 31, 00 - RGB 00, 00, 31 - RGB 00, 00, 00 - - RGB 28, 31, 20 - RGB 00, 31, 00 - RGB 15, 07, 00 - RGB 00, 00, 00 - - RGB 28, 31, 20 - RGB 10, 18, 31 - RGB 13, 06, 31 - RGB 00, 00, 00 - - RGB 28, 31, 20 - RGB 00, 31, 00 - RGB 00, 00, 31 - RGB 31, 00, 00 - - RGB 28, 31, 20 - RGB 00, 31, 00 - RGB 15, 07, 00 - RGB 31, 00, 00 +INCLUDE "data/palettes/pokegear_f.pal" Palettes_b789: - RGB 31, 31, 31 - RGB 30, 22, 24 - RGB 18, 18, 18 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 10, 11, 31 - RGB 18, 18, 18 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 12, 31, 11 - RGB 18, 18, 18 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 29, 26, 05 - RGB 18, 18, 18 - RGB 00, 00, 00 +INCLUDE "data/palettes/b789.pal" SlotMachinePals: - RGB 31, 31, 31 - RGB 24, 25, 28 - RGB 24, 24, 09 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 10, 06 - RGB 24, 24, 09 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 15, 31, 00 - RGB 24, 24, 09 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 15, 31 - RGB 24, 24, 09 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 15, 21, 31 - RGB 24, 24, 09 - RGB 00, 00, 00 - - RGB 31, 31, 11 - RGB 31, 31, 06 - RGB 24, 24, 09 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 16, 19, 29 - RGB 25, 22, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 21, 21, 21 - RGB 13, 13, 13 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 30, 10, 06 - RGB 31, 00, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 12, 25, 01 - RGB 05, 14, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 12, 25, 01 - RGB 30, 10, 06 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 06 - RGB 20, 15, 03 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 06 - RGB 15, 21, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 06 - RGB 20, 15, 03 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 24, 21 - RGB 31, 13, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 - RGB 00, 00, 00 - +INCLUDE "data/palettes/slot_machine.pal" diff --git a/engine/consume_held_item.asm b/engine/consume_held_item.asm new file mode 100644 index 000000000..52d7894cd --- /dev/null +++ b/engine/consume_held_item.asm @@ -0,0 +1,80 @@ +ConsumeHeldItem: ; 27192 + push hl + push de + push bc + ld a, [hBattleTurn] + and a + ld hl, OTPartyMon1Item + ld de, EnemyMonItem + ld a, [CurOTMon] + jr z, .theirturn + ld hl, PartyMon1Item + ld de, BattleMonItem + ld a, [CurBattleMon] + +.theirturn + push hl + push af + ld a, [de] + ld b, a + callba GetItemHeldEffect + ld hl, .ConsumableEffects +.loop + ld a, [hli] + cp b + jr z, .ok + inc a + jr nz, .loop + pop af + pop hl + pop bc + pop de + pop hl + ret + +.ok + xor a + ld [de], a + pop af + pop hl + call GetPartyLocation + ld a, [hBattleTurn] + and a + jr nz, .ourturn + ld a, [wBattleMode] + dec a + jr z, .done + +.ourturn + ld [hl], $0 + +.done + pop bc + pop de + pop hl + ret + +.ConsumableEffects: ; 271de +; Consumable items? + db HELD_BERRY + db HELD_2 + db HELD_5 + db HELD_HEAL_POISON + db HELD_HEAL_FREEZE + db HELD_HEAL_BURN + db HELD_HEAL_SLEEP + db HELD_HEAL_PARALYZE + db HELD_HEAL_STATUS + db HELD_30 + db HELD_ATTACK_UP + db HELD_DEFENSE_UP + db HELD_SPEED_UP + db HELD_SP_ATTACK_UP + db HELD_SP_DEFENSE_UP + db HELD_ACCURACY_UP + db HELD_EVASION_UP + db HELD_38 + db HELD_71 + db HELD_ESCAPE + db HELD_CRITICAL_UP + db -1 diff --git a/engine/credits.asm b/engine/credits.asm index f8cce7a15..0fe7685a6 100644 --- a/engine/credits.asm +++ b/engine/credits.asm @@ -1,121 +1,7 @@ INCLUDE "includes.asm" -SECTION "Credits", ROMX - - const_def - const SATOSHI_TAJIRI - const JUNICHI_MASUDA - const TETSUYA_WATANABE - const SHIGEKI_MORIMOTO - const SOUSUKE_TAMADA - const TAKENORI_OOTA - const KEN_SUGIMORI - const MOTOFUMI_FUJIWARA - const ATSUKO_NISHIDA - const MUNEO_SAITO - const SATOSHI_OOTA - const RENA_YOSHIKAWA - const JUN_OKUTANI - const HIRONOBU_YOSHIDA - const ASUKA_IWASHITA - const GO_ICHINOSE - const MORIKAZU_AOKI - const KOHJI_NISHINO - const KENJI_MATSUSHIMA - const TOSHINOBU_MATSUMIYA - const SATORU_IWATA - const NOBUHIRO_SEYA - const KAZUHITO_SEKINE - const TETSUJI_OOTA - const NCL_SUPER_MARIO_CLUB - const SARUGAKUCHO - const AKITO_MORI - const TAKAHIRO_HARADA - const TOHRU_HASHIMOTO - const NOBORU_MATSUMOTO - const TAKEHIRO_IZUSHI - const TAKASHI_KAWAGUCHI - const TSUNEKAZU_ISHIHARA - const HIROSHI_YAMAUCHI - const KENJI_SAIKI - const ATSUSHI_TADA - const NAOKO_KAWAKAMI - const HIROYUKI_ZINNAI - const KUNIMI_KAWAMURA - const HISASHI_SOGABE - const KEITA_KAGAYA - const YOSHINORI_MATSUDA - const HITOMI_SATO - const TORU_OSAWA - const TAKAO_OHARA - const YUICHIRO_ITO - const TAKAO_SHIMIZU - const PLANNING - const KEITA_NAKAMURA - const HIROTAKA_UEMURA - const HIROAKI_TAMURA - const NORIAKI_SAKAGUCHI - const MIYUKI_SATO - const GAKUZI_NOMOTO - const AI_MASHIMA - const MIKIHIRO_ISHIKAWA - const HIDEYUKI_HASHIMOTO - const SATOSHI_YAMATO - const SHIGERU_MIYAMOTO - const GAIL_TILDEN - const NOB_OGASAWARA - const SETH_MCMAHILL - const HIROTO_ALEXANDER - const TERESA_LILLYGREN - const THOMAS_HERTZOG - const ERIK_JOHNSON - const HIRO_NAKAMURA - const TERUKI_MURAKAWA - const KAZUYOSHI_OSAWA - const KIMIKO_NAKAMICHI - const CREDIT_END - const CREDIT_UNKNOWN - const STAFF - const DIRECTOR - const CODIRECTOR - const PROGRAMMERS - const GRAPHICS_DIRECTOR - const MONSTER_DESIGN - const GRAPHICS_DESIGN - const CREDIT_MUSIC - const CREDIT_SOUND_EFFECTS - const GAME_DESIGN - const GAME_SCENARIO - const TOOL_PROGRAMMING - const PARAMETRIC_DESIGN - const SCRIPT_DESIGN - const MAP_DATA_DESIGN - const MAP_DESIGN - const PRODUCT_TESTING - const SPECIAL_THANKS - const PRODUCERS - const EXECUTIVE_PRODUCER - const POKEMON_ANIMATION - const POKEDEX_TEXT - const MOBILE_PRJ_LEADER - const MOBILE_SYSTEM_AD - const MOBILE_STADIUM_DIR - const COORDINATION - const COPYRIGHT - const US_VERSION_STAFF - const US_COORDINATION - const TEXT_TRANSLATION - const PAAD_TESTING - -const_value SET -7 - const CREDITS_THEEND - const CREDITS_WAIT2 - const CREDITS_MUSIC - const CREDITS_CLEAR - const CREDITS_SCENE - const CREDITS_WAIT - const CREDITS_END +SECTION "Credits", ROMX Credits:: ; 109847 bit 6, b ; Hall Of Fame @@ -635,7 +521,6 @@ GetCreditsPalette: ; 109b2c .UpdatePals: ; Update the first three colors in both palette buffers. - push af push hl add UnknBGPals % $100 @@ -657,72 +542,8 @@ GetCreditsPalette: ; 109b2c call CopyBytes ret - CreditsPalettes: - -; Pichu - RGB 31, 00, 31 - RGB 31, 25, 00 - RGB 11, 14, 31 - RGB 07, 07, 07 - - RGB 31, 05, 05 - RGB 11, 14, 31 - RGB 11, 14, 31 - RGB 31, 31, 31 - - RGB 31, 05, 05 - RGB 00, 00, 00 - RGB 31, 31, 31 - RGB 31, 31, 31 - -; Smoochum - RGB 31, 31, 31 - RGB 31, 27, 00 - RGB 26, 06, 31 - RGB 07, 07, 07 - - RGB 03, 13, 31 - RGB 20, 00, 24 - RGB 26, 06, 31 - RGB 31, 31, 31 - - RGB 03, 13, 31 - RGB 00, 00, 00 - RGB 31, 31, 31 - RGB 31, 31, 31 - -; Ditto - RGB 31, 31, 31 - RGB 23, 12, 28 - RGB 31, 22, 00 - RGB 07, 07, 07 - - RGB 03, 20, 00 - RGB 31, 22, 00 - RGB 31, 22, 00 - RGB 31, 31, 31 - - RGB 03, 20, 00 - RGB 00, 00, 00 - RGB 31, 31, 31 - RGB 31, 31, 31 - -; Igglybuff - RGB 31, 31, 31 - RGB 31, 10, 31 - RGB 31, 00, 09 - RGB 07, 07, 07 - - RGB 31, 14, 00 - RGB 31, 00, 09 - RGB 31, 00, 09 - RGB 31, 31, 31 - - RGB 31, 14, 00 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 +INCLUDE "data/palettes/credits.pal" ; 109bca Credits_LoadBorderGFX: ; 109bca (42:5bca) @@ -791,521 +612,6 @@ Credits_TheEnd: ; 109c11 (42:5c11) ; 109c24 (42:5c24) -CreditsBorderGFX: INCBIN "gfx/credits/border.2bpp" - -CreditsMonsGFX: -CreditsPichuGFX: INCBIN "gfx/credits/pichu.2bpp" -CreditsSmoochumGFX: INCBIN "gfx/credits/smoochum.2bpp" -CreditsDittoGFX: INCBIN "gfx/credits/ditto.2bpp" -CreditsIgglybuffGFX: INCBIN "gfx/credits/igglybuff.2bpp" - - -CreditsScript: ; 10acb4 - -; Clear the banner. - db CREDITS_CLEAR - -; Pokemon Crystal Version Staff - db STAFF, 1 - - db CREDITS_WAIT, 8 - -; Play the credits music. - db CREDITS_MUSIC - - db CREDITS_WAIT2, 10 - - db CREDITS_WAIT, 1 - -; Update the banner. - db CREDITS_SCENE, 0 ; Pichu - - db DIRECTOR, 1 - db SATOSHI_TAJIRI, 2 - - db CREDITS_WAIT, 12 - - db CODIRECTOR, 1 - db JUNICHI_MASUDA, 2 - - db CREDITS_WAIT, 12 - - db PROGRAMMERS, 0 - db SOUSUKE_TAMADA, 1 - db HISASHI_SOGABE, 2 - db KEITA_KAGAYA, 3 - db YOSHINORI_MATSUDA, 4 - - db CREDITS_WAIT, 12 - - db PROGRAMMERS, 0 - db SHIGEKI_MORIMOTO, 1 - db TETSUYA_WATANABE, 2 - db TAKENORI_OOTA, 3 - - db CREDITS_WAIT, 12 - - db GRAPHICS_DIRECTOR, 1 - db KEN_SUGIMORI, 2 - - db CREDITS_WAIT, 12 - - db MONSTER_DESIGN, 0 - db KEN_SUGIMORI, 1 - db MOTOFUMI_FUJIWARA, 2 - db SHIGEKI_MORIMOTO, 3 - db HIRONOBU_YOSHIDA, 4 - db SATOSHI_OOTA, 5 - - db CREDITS_WAIT, 12 - - db MONSTER_DESIGN, 0 - db ATSUKO_NISHIDA, 1 - db MUNEO_SAITO, 2 - db RENA_YOSHIKAWA, 3 - - db CREDITS_WAIT, 12 - - db POKEMON_ANIMATION, 1 - db HIRONOBU_YOSHIDA, 2 - db JUN_OKUTANI, 3 - - db CREDITS_WAIT, 12 - -; Clear the banner. - db CREDITS_CLEAR - - db CREDITS_WAIT, 1 - -; Update the banner. - db CREDITS_SCENE, 1 ; Smoochum - - db GRAPHICS_DESIGN, 0 - db HIRONOBU_YOSHIDA, 1 - db JUN_OKUTANI, 2 - db ASUKA_IWASHITA, 3 - db TETSUYA_WATANABE, 4 - - db CREDITS_WAIT, 12 - - db CREDIT_MUSIC, 0 - db JUNICHI_MASUDA, 1 - db MORIKAZU_AOKI, 2 - db GO_ICHINOSE, 3 - - db CREDITS_WAIT, 12 - - db CREDIT_SOUND_EFFECTS, 0 - db MORIKAZU_AOKI, 1 - db JUNICHI_MASUDA, 2 - db TETSUYA_WATANABE, 3 - - db CREDITS_WAIT, 12 - - db GAME_DESIGN, 0 - db JUNICHI_MASUDA, 1 - db SHIGEKI_MORIMOTO, 2 - db KOHJI_NISHINO, 3 - - db CREDITS_WAIT, 12 - - db GAME_DESIGN, 0 - db TETSUJI_OOTA, 1 - db HITOMI_SATO, 2 - db KENJI_MATSUSHIMA, 3 - - db CREDITS_WAIT, 12 - - db GAME_SCENARIO, 0 - db JUNICHI_MASUDA, 1 - db KOHJI_NISHINO, 2 - db TOSHINOBU_MATSUMIYA, 3 - db KENJI_MATSUSHIMA, 4 - - db CREDITS_WAIT, 12 - - db POKEDEX_TEXT, 1 - db TOSHINOBU_MATSUMIYA, 2 - - db CREDITS_WAIT, 12 - - db TOOL_PROGRAMMING, 1 - db SOUSUKE_TAMADA, 2 - db TAKENORI_OOTA, 3 - - db CREDITS_WAIT, 12 - - db PARAMETRIC_DESIGN, 1 - db KOHJI_NISHINO, 2 - - db CREDITS_WAIT, 12 - -; Clear the banner. - db CREDITS_CLEAR - - db CREDITS_WAIT, 1 - -; Update the banner. - db CREDITS_SCENE, 2 ; Ditto - - db SCRIPT_DESIGN, 1 - db TETSUJI_OOTA, 2 - db NOBUHIRO_SEYA, 3 - - db CREDITS_WAIT, 12 - - db MAP_DATA_DESIGN, 1 - db TETSUJI_OOTA, 2 - db KAZUHITO_SEKINE, 3 - - db CREDITS_WAIT, 12 - - db MAP_DESIGN, 0 - db TETSUJI_OOTA, 1 - db KOHJI_NISHINO, 2 - db NOBUHIRO_SEYA, 3 - - db CREDITS_WAIT, 12 - - db COORDINATION, 1 - db HIROYUKI_ZINNAI, 2 - - db CREDITS_WAIT, 12 - - db PRODUCERS, 0 - db SATORU_IWATA, 1 - db SATOSHI_YAMATO, 2 - db SHIGERU_MIYAMOTO, 3 - - db CREDITS_WAIT, 12 - - db PRODUCERS, 1 - db TSUNEKAZU_ISHIHARA, 2 - - db CREDITS_WAIT, 12 - -; Clear the banner. - db CREDITS_CLEAR - - db CREDITS_WAIT, 1 - -; Update the banner. - db CREDITS_SCENE, 3 ; Igglybuff - - db US_VERSION_STAFF, 2 - - db CREDITS_WAIT, 9 - - db US_COORDINATION, 1 - db GAIL_TILDEN, 2 - db HIRO_NAKAMURA, 3 - - db CREDITS_WAIT, 12 - - db US_COORDINATION, 1 - db JUNICHI_MASUDA, 2 - db SETH_MCMAHILL, 3 - - db CREDITS_WAIT, 12 - - db US_COORDINATION, 1 - db HIROTO_ALEXANDER, 2 - db TERESA_LILLYGREN, 3 - - db CREDITS_WAIT, 12 - - db TEXT_TRANSLATION, 1 - db NOB_OGASAWARA, 2 - - db CREDITS_WAIT, 12 - - db PROGRAMMERS, 1 - db TERUKI_MURAKAWA, 2 - db KAZUYOSHI_OSAWA, 3 - - db CREDITS_WAIT, 12 - - db PAAD_TESTING, 1 - db THOMAS_HERTZOG, 2 - db ERIK_JOHNSON, 3 - - db CREDITS_WAIT, 12 - - db PRODUCT_TESTING, 0 - db PLANNING, 1 - - db CREDITS_WAIT, 12 - - db PRODUCT_TESTING, 0 - db KEITA_NAKAMURA, 1 - db HIROTAKA_UEMURA, 2 - db HIROAKI_TAMURA, 3 - db NORIAKI_SAKAGUCHI, 4 - - db CREDITS_WAIT, 12 - - db PRODUCT_TESTING, 0 - db NCL_SUPER_MARIO_CLUB, 1 - db KENJI_SAIKI, 2 - db ATSUSHI_TADA, 3 - db MIYUKI_SATO, 4 - - db CREDITS_WAIT, 12 - - db SPECIAL_THANKS, 0 - db KIMIKO_NAKAMICHI, 1 - db AKITO_MORI, 2 - - db CREDITS_WAIT, 12 - - db SPECIAL_THANKS, 0 - db GAKUZI_NOMOTO, 1 - db AI_MASHIMA, 2 - db KUNIMI_KAWAMURA, 3 - - db CREDITS_WAIT, 12 - - db SPECIAL_THANKS, 0 - db MIKIHIRO_ISHIKAWA, 1 - db HIDEYUKI_HASHIMOTO, 2 - - db CREDITS_WAIT, 12 - - db EXECUTIVE_PRODUCER, 1 - db HIROSHI_YAMAUCHI, 2 - - db CREDITS_WAIT, 12 - - db COPYRIGHT, 1 - - db CREDITS_WAIT, 9 - -; Display "The End" graphic. - db CREDITS_THEEND - - db CREDITS_WAIT, 20 - - db CREDITS_END -; 10ae13 - - -CreditsStrings: - dw .SatoshiTajiri - dw .JunichiMasuda - dw .TetsuyaWatanabe - dw .ShigekiMorimoto - dw .SousukeTamada - dw .TakenoriOota - dw .KenSugimori - dw .MotofumiFujiwara - dw .AtsukoNishida - dw .MuneoSaito - dw .SatoshiOota - dw .RenaYoshikawa - dw .JunOkutani - dw .HironobuYoshida - dw .AsukaIwashita - dw .GoIchinose - dw .MorikazuAoki - dw .KohjiNishino - dw .KenjiMatsushima - dw .ToshinobuMatsumiya - dw .SatoruIwata - dw .NobuhiroSeya - dw .KazuhitoSekine - dw .TetsujiOota - dw .NclSuperMarioClub - dw .Sarugakucho - dw .AkitoMori - dw .TakahiroHarada - dw .TohruHashimoto - dw .NoboruMatsumoto - dw .TakehiroIzushi - dw .TakashiKawaguchi - dw .TsunekazuIshihara - dw .HiroshiYamauchi - dw .KenjiSaiki - dw .AtsushiTada - dw .NaokoKawakami - dw .HiroyukiZinnai - dw .KunimiKawamura - dw .HisashiSogabe - dw .KeitaKagaya - dw .YoshinoriMatsuda - dw .HitomiSato - dw .ToruOsawa - dw .TakaoOhara - dw .YuichiroIto - dw .TakaoShimizu - dw .Planning - dw .KeitaNakamura - dw .HirotakaUemura - dw .HiroakiTamura - dw .NoriakiSakaguchi - dw .MiyukiSato - dw .GakuziNomoto - dw .AiMashima - dw .MikihiroIshikawa - dw .HideyukiHashimoto - dw .SatoshiYamato - dw .ShigeruMiyamoto - dw .GailTilden - dw .NobOgasawara - dw .SethMcMahill - dw .HirotoAlexander - dw .TeresaLillygren - dw .ThomasHertzog - dw .ErikJohnson - dw .HiroNakamura - dw .TerukiMurakawa - dw .KazuyoshiOsawa - dw .KimikoNakamichi - dw .End - dw .Unknown - dw .Staff - dw .Director - dw .CoDirector - dw .Programmers - dw .GraphicsDirector - dw .MonsterDesign - dw .GraphicsDesign - dw .Music - dw .SoundEffects - dw .GameDesign - dw .GameScenario - dw .ToolProgramming - dw .ParametricDesign - dw .ScriptDesign - dw .MapDataDesign - dw .MapDesign - dw .ProductTesting - dw .SpecialThanks - dw .Producers - dw .ExecutiveProducer - dw .PokemonAnimation - dw .PokedexText - dw .MobilePrjLeader - dw .MobileSystemAd - dw .MobileStadiumDir - dw .Coordination - dw .Copyright - dw .UsVersionStaff - dw .UsCoordination - dw .TextTranslation - dw .PaadTesting - -.SatoshiTajiri: db " SATOSHI TAJIRI@" ; "たじり さとし@" -.JunichiMasuda: db " JUNICHI MASUDA@" ; "ますだ じゅんいち@" -.TetsuyaWatanabe: db " TETSUYA WATANABE@" ; "わたなべ てつや@" -.ShigekiMorimoto: db " SHIGEKI MORIMOTO@" ; "もりもと しげき@" -.SousukeTamada: db " SOUSUKE TAMADA@" ; "たまだ そうすけ@" -.TakenoriOota: db " TAKENORI OOTA@" ; "おおた たけのり@" -.KenSugimori: db " KEN SUGIMORI@" ; "すぎもり けん@" -.MotofumiFujiwara: db " MOTOFUMI FUJIWARA@" ; "ふじわら もとふみ@" -.AtsukoNishida: db " ATSUKO NISHIDA@" ; "にしだ あつこ@" -.MuneoSaito: db " MUNEO SAITO@" ; "さいとう むねお@" -.SatoshiOota: db " SATOSHI OOTA@" ; "おおた さとし@" -.RenaYoshikawa: db " RENA YOSHIKAWA@" ; "よしかわ れな@" -.JunOkutani: db " JUN OKUTANI@" ; "おくたに じゅん@" -.HironobuYoshida: db " HIRONOBU YOSHIDA@" ; "よしだ ひろのぶ@" -.AsukaIwashita: db " ASUKA IWASHITA@" ; "いわした あすか@" -.GoIchinose: db " GO ICHINOSE@" ; "いちのせ ごう@" -.MorikazuAoki: db " MORIKAZU AOKI@" ; "あおき もりかず@" -.KohjiNishino: db " KOHJI NISHINO@" ; "にしの こうじ@" -.KenjiMatsushima: db " KENJI MATSUSHIMA@" ; "まつしま けんじ@" -.ToshinobuMatsumiya: db "TOSHINOBU MATSUMIYA@" ; "まつみや としのぶ@" -.SatoruIwata: db " SATORU IWATA@" ; "いわた さとる@" -.NobuhiroSeya: db " NOBUHIRO SEYA@" ; "せや のぶひろ@" -.KazuhitoSekine: db " KAZUHITO SEKINE@" ; "せきね かずひと@" -.TetsujiOota: db " TETSUJI OOTA@" ; "おおた てつじ@" -.NclSuperMarioClub: db "NCL SUPER MARIO CLUB@" ; "スーパーマりォクラブ@" -.Sarugakucho: db " SARUGAKUCHO@" ; "さるがくちょう@" -.AkitoMori: db " AKITO MORI@" ; "もり あきと@" -.TakahiroHarada: db " TAKAHIRO HARADA@" ; "はらだ たかひろ@" -.TohruHashimoto: db " TOHRU HASHIMOTO@" ; "はしもと とおる@" -.NoboruMatsumoto: db " NOBORU MATSUMOTO@" ; "まつもと のぼる@" -.TakehiroIzushi: db " TAKEHIRO IZUSHI@" ; "いずし たけひろ@" -.TakashiKawaguchi: db " TAKASHI KAWAGUCHI@" ; "かわぐち たかし@" -.TsunekazuIshihara: db " TSUNEKAZU ISHIHARA@" ; "いしはら つねかず@" -.HiroshiYamauchi: db " HIROSHI YAMAUCHI@" ; "やまうち ひろし@" -.KenjiSaiki: db " KENJI SAIKI@" ; "さいき けんじ@" -.AtsushiTada: db " ATSUSHI TADA@" ; "ただ あつし@" -.NaokoKawakami: db " NAOKO KAWAKAMI@" ; "かわかみ なおこ@" -.HiroyukiZinnai: db " HIROYUKI ZINNAI@" ; "じんない ひろゆき@" -.KunimiKawamura: db " KUNIMI KAWAMURA@" ; "かわむら くにみ@" -.HisashiSogabe: db " HISASHI SOGABE@" ; "そがべ ひさし@" -.KeitaKagaya: db " KEITA KAGAYA@" ; "かがや けいた@" -.YoshinoriMatsuda: db " YOSHINORI MATSUDA@" ; "まつだ よしのり@" -.HitomiSato: db " HITOMI SATO@" ; "さとう ひとみ@" -.ToruOsawa: db " TORU OSAWA@" ; "おおさわ とおる@" -.TakaoOhara: db " TAKAO OHARA@" ; "おおはら たかお@" -.YuichiroIto: db " YUICHIRO ITO@" ; "いとう ゆういちろう@" -.TakaoShimizu: db " TAKAO SHIMIZU@" ; "しみず たかお@" -.Planning: db " SPECIAL PRODUCTION" - next " PLANNING" ; "きかくかいはつぶ@" - next " & DEVELOPMENT DEPT.@" -.KeitaNakamura: db " KEITA NAKAMURA@" ; "なかむら けいた@" -.HirotakaUemura: db " HIROTAKA UEMURA@" ; "うえむら ひろたか@" -.HiroakiTamura: db " HIROAKI TAMURA@" ; "たむら ひろあき@" -.NoriakiSakaguchi: db " NORIAKI SAKAGUCHI@" ; "さかぐち のりあき@" -.MiyukiSato: db " MIYUKI SATO@" ; "さとう みゆき@" -.GakuziNomoto: db " GAKUZI NOMOTO@" ; "のもと がくじ@" -.AiMashima: db " AI MASHIMA@" ; "ましま あい@" -.MikihiroIshikawa: db " MIKIHIRO ISHIKAWA@" ; "いしかわ みきひろ@" -.HideyukiHashimoto: db " HIDEYUKI HASHIMOTO@" ; "はしもと ひでゆき@" -.SatoshiYamato: db " SATOSHI YAMATO@" ; "やまと さとし@" -.ShigeruMiyamoto: db " SHIGERU MIYAMOTO@" ; "みやもと しげる@" -.End: db " END@" ; "おしまい@" -.Unknown: db " ????????@" ; "????????@" -.GailTilden: db " GAIL TILDEN@" -.NobOgasawara: db " NOB OGASAWARA@" -.SethMcMahill: db " SETH McMAHILL@" -.HirotoAlexander: db " HIROTO ALEXANDER@" -.TeresaLillygren: db " TERESA LILLYGREN@" -.ThomasHertzog: db " THOMAS HERTZOG@" -.ErikJohnson: db " ERIK JOHNSON@" -.HiroNakamura: db " HIRO NAKAMURA@" -.TerukiMurakawa: db " TERUKI MURAKAWA@" -.KazuyoshiOsawa: db " KAZUYOSHI OSAWA@" -.KimikoNakamichi: db " KIMIKO NAKAMICHI@" -.Staff: db " #MON" ; "ポケットモンスター" - next " CRYSTAL VERSION" ; " クりスタル バージョン" - next " STAFF@" ; " スタッフ@" -.Director: db " DIRECTOR@" ; "エグゼクティブ ディレクター@" -.CoDirector: db " CO-DIRECTOR@" ; "ディレクター@" -.Programmers: db " PROGRAMMERS@" ; "プログラム@" -.GraphicsDirector: db " GRAPHICS DIRECTOR@" ; "グラフィック ディレクター@" -.MonsterDesign: db " MONSTER DESIGN@" ; "# デザイン@" -.GraphicsDesign: db " GRAPHICS DESIGN@" ; "グラフィック デザイン@" -.Music: db " MUSIC@" ; "おんがく@" -.SoundEffects: db " SOUND EFFECTS@" ; "サウンド エフ→クト@" -.GameDesign: db " GAME DESIGN@" ; "ゲームデザイン@" -.GameScenario: db " GAME SCENARIO@" ; "シナりォ@" -.ToolProgramming: db " TOOL PROGRAMMING@" ; "ツール プログラム@" -.ParametricDesign: db " PARAMETRIC DESIGN@" ; "パラメーター せってい@" -.ScriptDesign: db " SCRIPT DESIGN@" ; "スクりプト せってい@" -.MapDataDesign: db " MAP DATA DESIGN@" ; "マップデータ せってい@" -.MapDesign: db " MAP DESIGN@" ; "マップ デザイン@" -.ProductTesting: db " PRODUCT TESTING@" ; "デバッグプレイ@" -.SpecialThanks: db " SPECIAL THANKS@" ; "スぺシャルサンクス@" -.Producers: db " PRODUCERS@" ; "プロデューサー@" -.ExecutiveProducer: db " EXECUTIVE PRODUCER@" ; "エグゼクティブ プロデューサー@" -.PokemonAnimation: db " #MON ANIMATION@" ; "# アニメーション@" -.PokedexText: db " #DEX TEXT@" ; "ずかん テキスト@" -.MobilePrjLeader: db " MOBILE PRJ. LEADER@" ; "モバイルプロジ→クト りーダー@" -.MobileSystemAd: db " MOBILE SYSTEM AD.@" ; "モバイル システムアドバイザー@" -.MobileStadiumDir: db "MOBILE STADIUM DIR.@" ; "モバイルスタジアム ディレクター@" -.Coordination: db " COORDINATION@" ; "コーディネーター@" -.UsVersionStaff: db " US VERSION STAFF@" -.UsCoordination: db " US COORDINATION@" -.TextTranslation: db " TEXT TRANSLATION@" -.PaadTesting: db " PAAD TESTING@" - -.Copyright: - ; (C) 1 9 9 5 - 2 0 0 1 N i n t e n d o - db $60,$61,$62,$63,$64,$65,$66,$67,$68,$69,$6a,$6b,$6c - ; (C) 1 9 9 5 - 2 0 0 1 C r e a t u r e s i n c . - next $60,$61,$62,$63,$64,$65,$66,$6d,$6e,$6f,$70,$71,$72, $7a,$7b,$7c - ; (C) 1 9 9 5 - 2 0 0 1 G A M E F R E A K i n c . - next $60,$61,$62,$63,$64,$65,$66,$73,$74,$75,$76,$77,$78,$79, $7a,$7b,$7c - db "@" +INCLUDE "gfx/credits.asm" +INCLUDE "data/credits_script.asm" +INCLUDE "data/credits_strings.asm" diff --git a/engine/crystal_colors.asm b/engine/crystal_colors.asm new file mode 100755 index 000000000..f8c1a6781 --- /dev/null +++ b/engine/crystal_colors.asm @@ -0,0 +1,336 @@ +GetMysteryGift_MobileAdapterLayout: ; 4930f (mobile) + ld a, b + cp SCGB_RAM + jr nz, .not_ram + ld a, [SGBPredef] +.not_ram + push af + callba ResetBGPals + pop af + ld l, a + ld h, 0 + add hl, hl + ld de, .dw + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .done + push de + jp hl +.done + ret +; 49330 (12:5330) + +.dw ; 49330 + + dw MG_Mobile_Layout00 + dw MG_Mobile_Layout01 + dw MG_Mobile_Layout02 +; 49336 + +MG_Mobile_Layout_FillBox: ; 49336 +.row + push bc + push hl +.col + ld [hli], a + dec c + jr nz, .col + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ret +; 49346 + +MG_Mobile_Layout_WipeAttrMap: ; 49346 (12:5346) + hlcoord 0, 0, AttrMap + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + xor a + call ByteFill + ret + +MG_Mobile_Layout_LoadPals: ; 49351 (12:5351) + ld de, UnknBGPals + ld hl, Palette_493e1 + ld bc, 5 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + ld de, UnknBGPals palette PAL_BG_TEXT + ld hl, Palette_TextBG7 + ld bc, 1 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + ret + +MG_Mobile_Layout00: ; 4936e (12:536e) + call MG_Mobile_Layout_LoadPals + call MG_Mobile_Layout_WipeAttrMap + call MG_Mobile_Layout_CreatePalBoxes + callba ApplyAttrMap + callba ApplyPals + ret + +MG_Mobile_Layout_CreatePalBoxes: ; 49384 (12:5384) + hlcoord 0, 0, AttrMap + lb bc, 4, 1 + ld a, $1 + call MG_Mobile_Layout_FillBox + lb bc, 2, 1 + ld a, $2 + call MG_Mobile_Layout_FillBox + lb bc, 6, 1 + ld a, $3 + call MG_Mobile_Layout_FillBox + hlcoord 1, 0, AttrMap + ld a, $1 + lb bc, 3, 18 + call MG_Mobile_Layout_FillBox + lb bc, 2, 18 + ld a, $2 + call MG_Mobile_Layout_FillBox + lb bc, 12, 18 + ld a, $3 + call MG_Mobile_Layout_FillBox + hlcoord 19, 0, AttrMap + lb bc, 4, 1 + ld a, $1 + call MG_Mobile_Layout_FillBox + lb bc, 2, 1 + ld a, $2 + call MG_Mobile_Layout_FillBox + lb bc, 6, 1 + ld a, $3 + call MG_Mobile_Layout_FillBox + hlcoord 0, 12, AttrMap + ld bc, 6 * SCREEN_WIDTH + ld a, $7 + call ByteFill + ret +; 493e1 (12:53e1) + +Palette_493e1: ; 493e1 +INCLUDE "data/palettes/mg_mobile.pal" +; 49409 + +LoadOW_BGPal7:: ; 49409 + ld hl, Palette_TextBG7 + ld de, UnknBGPals palette PAL_BG_TEXT + ld bc, 1 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + ret +; 49418 + +Palette_TextBG7: ; 49418 + RGB 31, 31, 31 + RGB 08, 19, 28 + RGB 05, 05, 16 + RGB 00, 00, 00 +; 49420 + +Function49420:: ; 49420 (12:5420) + ld hl, MansionPalette4 + ld de, UnknBGPals palette PAL_BG_ROOF + ld bc, 1 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + ret +; 4942f (12:542f) + +MG_Mobile_Layout01: ; 4942f + call MG_Mobile_Layout_LoadPals + ld de, UnknBGPals palette PAL_BG_TEXT + ld hl, Palette_49478 + ld bc, 1 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + call MG_Mobile_Layout_WipeAttrMap + hlcoord 0, 0, AttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + hlcoord 0, 14, AttrMap + ld bc, 4 * SCREEN_WIDTH + ld a, $7 + call ByteFill + ld a, [wd002] + bit 6, a + jr z, .asm_49464 + call Function49480 + jr .asm_49467 + +.asm_49464 + call Function49496 + +.asm_49467 + callba ApplyAttrMap + callba ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + ret +; 49478 + +Palette_49478: ; 49478 + RGB 31, 31, 31 + RGB 26, 31, 00 + RGB 20, 16, 03 + RGB 00, 00, 00 +; 49480 + +Function49480: ; 49480 + hlcoord 0, 0, AttrMap + lb bc, 4, SCREEN_WIDTH + ld a, $7 + call MG_Mobile_Layout_FillBox + hlcoord 0, 2, AttrMap + ld a, $4 + ld [hl], a + hlcoord 19, 2, AttrMap + ld [hl], a + ret +; 49496 + +Function49496: ; 49496 + hlcoord 0, 0, AttrMap + lb bc, 2, SCREEN_WIDTH + ld a, $7 + call MG_Mobile_Layout_FillBox + hlcoord 0, 1, AttrMap + ld a, $4 + ld [hl], a + hlcoord 19, 1, AttrMap + ld [hl], a + ret +; 494ac + +INCLUDE "tilesets/special_palettes.asm" + +MG_Mobile_Layout02: ; 49706 + ld hl, Palette_49732 + ld de, UnknBGPals + ld bc, 1 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + callba ApplyPals + call MG_Mobile_Layout_WipeAttrMap + callba ApplyAttrMap + ld hl, Palette_4973a + ld de, UnknOBPals + ld bc, 1 palettes + ld a, BANK(UnknOBPals) + call FarCopyWRAM + ret +; 49732 + +Palette_49732: ; 49732 + RGB 31, 31, 31 + RGB 23, 16, 07 + RGB 23, 07, 07 + RGB 03, 07, 20 +; 4973a + +Palette_4973a: ; 4973a + RGB 00, 00, 00 + RGB 07, 05, 31 + RGB 14, 18, 31 + RGB 31, 31, 31 +; 49742 + +Function49742: ; 49742 + ld hl, Palette_49757 + ld de, UnknBGPals + ld bc, $40 + ld a, $5 + call FarCopyWRAM + callba ApplyPals + ret +; 49757 + +Palette_49757: ; 49757 +INCLUDE "data/palettes/49757.pal" +; 49797 + +_InitMG_Mobile_LinkTradePalMap: ; 49797 + hlcoord 0, 0, AttrMap + lb bc, 16, 2 + ld a, $4 + call MG_Mobile_Layout_FillBox + ld a, $3 + ldcoord_a 0, 1, AttrMap + ldcoord_a 0, 14, AttrMap + hlcoord 2, 0, AttrMap + lb bc, 8, 18 + ld a, $5 + call MG_Mobile_Layout_FillBox + hlcoord 2, 8, AttrMap + lb bc, 8, 18 + ld a, $6 + call MG_Mobile_Layout_FillBox + hlcoord 0, 16, AttrMap + lb bc, 2, SCREEN_WIDTH + ld a, $4 + call MG_Mobile_Layout_FillBox + ld a, $3 + lb bc, 6, 1 + hlcoord 6, 1, AttrMap + call MG_Mobile_Layout_FillBox + ld a, $3 + lb bc, 6, 1 + hlcoord 17, 1, AttrMap + call MG_Mobile_Layout_FillBox + ld a, $3 + lb bc, 6, 1 + hlcoord 6, 9, AttrMap + call MG_Mobile_Layout_FillBox + ld a, $3 + lb bc, 6, 1 + hlcoord 17, 9, AttrMap + call MG_Mobile_Layout_FillBox + ld a, $2 + hlcoord 2, 16, AttrMap + ld [hli], a + ld a, $7 + ld [hli], a + ld [hli], a + ld [hli], a + ld a, $2 + ld [hl], a + hlcoord 2, 17, AttrMap + ld a, $3 + ld bc, 6 + call ByteFill + ret +; 49811 + +LoadTradeRoomBGPals: ; 49811 + ld hl, TradeRoomPalette + ld de, UnknBGPals palette PAL_BG_GREEN + ld bc, 6 palettes + ld a, BANK(UnknBGPals) + call FarCopyWRAM + callba ApplyPals + ret +; 49826 + +TradeRoomPalette: ; 49826 +INCLUDE "data/palettes/trade_room.pal" +; 49856 + +InitMG_Mobile_LinkTradePalMap: ; 49856 + call _InitMG_Mobile_LinkTradePalMap + ret +; 4985a + +Unknown_4985a: ; unreferenced + db $ab, $03, $57, $24, $ac, $0e, $13, $32 + db $be, $30, $5b, $4c, $47, $60, $ed, $f2 + db $ab, $03, $55, $26, $aa, $0a, $13, $3a + db $be, $28, $33, $24, $6e, $71, $df, $b0 + db $a8, $00, $e5, $e0, $9a, $fc, $f4, $2c + db $fe, $4c, $a3, $5e, $c6, $3a, $ab, $4d + db $a8, $00, $b5, $b0, $de, $e8, $fc, $1c + db $ba, $66, $f7, $0e, $ba, $5e, $43, $bd diff --git a/engine/crystal_intro.asm b/engine/crystal_intro.asm index d0a0b7281..b417044eb 100755 --- a/engine/crystal_intro.asm +++ b/engine/crystal_intro.asm @@ -341,29 +341,7 @@ GameFreakLogoScene5: ; e47ab (39:47ab) ; e47ac (39:47ac) GameFreakLogoPalettes: ; e47ac -; Ditto's color as it turns into the Game Freak logo. -; Fade from pink to orange. -; One color per step. - RGB 23, 12, 28 - RGB 23, 12, 27 - RGB 23, 13, 26 - RGB 23, 13, 24 - - RGB 24, 14, 22 - RGB 24, 14, 20 - RGB 24, 15, 18 - RGB 24, 15, 16 - - RGB 25, 16, 14 - RGB 25, 16, 12 - RGB 25, 17, 10 - RGB 25, 17, 08 - - RGB 26, 18, 06 - RGB 26, 18, 04 - RGB 26, 19, 02 - RGB 26, 19, 00 - +INCLUDE "data/palettes/crystal_intro/gamefreak_logo.pal" ; e47cc GameFreakLogo: ; e47cc @@ -506,11 +484,11 @@ IntroScene1: ; e495b (39:495b) ld [rSVBK], a ld hl, Palette_365ad ld de, UnknBGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld hl, Palette_365ad ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes pop af ld [rSVBK], a @@ -579,11 +557,11 @@ IntroScene3: ; e49fd (39:49fd) ld [rSVBK], a ld hl, Palette_e5edd ld de, UnknBGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld hl, Palette_e5edd ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes pop af ld [rSVBK], a @@ -645,11 +623,11 @@ IntroScene5: ; e4a7a (39:4a7a) ld [rSVBK], a ld hl, Palette_365ad ld de, UnknBGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld hl, Palette_365ad ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes pop af ld [rSVBK], a @@ -752,12 +730,12 @@ IntroScene7: ; e4b3f (39:4b3f) ld hl, Palette_e5edd ld de, UnknBGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld hl, Palette_e5edd ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes pop af @@ -910,11 +888,11 @@ IntroScene11: ; e4c86 (39:4c86) ld [rSVBK], a ld hl, Palette_365ad ld de, UnknBGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld hl, Palette_365ad ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes pop af ld [rSVBK], a @@ -1037,11 +1015,11 @@ IntroScene13: ; e4d6d (39:4d6d) ld [rSVBK], a ld hl, Palette_e5edd ld de, UnknBGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld hl, Palette_e5edd ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes pop af ld [rSVBK], a @@ -1146,11 +1124,11 @@ IntroScene15: ; e4e40 (39:4e40) ld [rSVBK], a ld hl, Palette_e77dd ld de, UnknBGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld hl, Palette_e77dd ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes pop af ld [rSVBK], a @@ -1220,11 +1198,11 @@ IntroScene17: ; e4ef5 (39:4ef5) ld [rSVBK], a ld hl, Palette_e6d6d ld de, UnknBGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld hl, Palette_e6d6d ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes pop af ld [rSVBK], a @@ -1294,11 +1272,11 @@ IntroScene19: ; e4f7e (39:4f7e) ld [rSVBK], a ld hl, Palette_e77dd ld de, UnknBGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld hl, Palette_e77dd ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes pop af ld [rSVBK], a @@ -1464,11 +1442,11 @@ IntroScene26: ; e50bb (39:50bb) ld [rSVBK], a ld hl, Palette_e679d ld de, UnknBGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld hl, Palette_e679d ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes pop af ld [rSVBK], a @@ -1572,47 +1550,7 @@ Intro_Scene24_ApplyPaletteFade: ; e5172 (39:5172) ; e519c (39:519c) .FadePals: ; e519c -; Fade to white. - RGB 24, 12, 09 - RGB 31, 31, 31 - RGB 12, 00, 31 - RGB 00, 00, 00 - - RGB 31, 19, 05 - RGB 31, 31, 31 - RGB 15, 05, 31 - RGB 07, 07, 07 - - RGB 31, 21, 09 - RGB 31, 31, 31 - RGB 18, 09, 31 - RGB 11, 11, 11 - - RGB 31, 23, 13 - RGB 31, 31, 31 - RGB 21, 13, 31 - RGB 15, 15, 15 - - RGB 31, 25, 17 - RGB 31, 31, 31 - RGB 25, 17, 31 - RGB 19, 19, 19 - - RGB 31, 27, 21 - RGB 31, 31, 31 - RGB 27, 21, 31 - RGB 23, 23, 23 - - RGB 31, 29, 25 - RGB 31, 31, 31 - RGB 29, 26, 31 - RGB 27, 27, 27 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - +INCLUDE "data/palettes/crystal_intro/fade.pal" ; e51dc CrystalIntro_InitUnownAnim: ; e51dc (39:51dc) @@ -1685,7 +1623,7 @@ CrystalIntro_UnownFade: ; e5223 (39:5223) push hl push bc ld hl, BGPals - ld bc, 4 * 16 + ld bc, 8 palettes xor a call ByteFill pop bc @@ -2150,85 +2088,8 @@ INCBIN "gfx/intro/003.tilemap.lz" ; e5edd Palette_e5edd: ; e5edd - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 0, 4, 5 - RGB 1, 8, 5 - RGB 4, 12, 9 - RGB 24, 12, 9 - - RGB 0, 4, 5 - RGB 9, 6, 8 - RGB 8, 16, 5 - RGB 5, 10, 4 - - RGB 31, 31, 31 - RGB 9, 6, 8 - RGB 18, 9, 9 - RGB 13, 8, 9 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 2, 5, 22 - RGB 1, 5, 12 - - RGB 31, 31, 31 - RGB 31, 10, 25 - RGB 31, 21, 0 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 21, 31 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 +INCLUDE "data/palettes/crystal_intro/intro_1.pal" +; e5f5d IntroUnownsGFX: ; e5f5d INCBIN "gfx/intro/unowns.2bpp.lz" @@ -2263,85 +2124,8 @@ INCBIN "gfx/intro/007.tilemap.lz" ; e65ad Palette_365ad: ; e65ad - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 10, 0, 10 - RGB 19, 0, 19 - RGB 31, 0, 31 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 +INCLUDE "data/palettes/crystal_intro/intro_2.pal" +; e662d IntroCrystalUnownsGFX: ; e662d INCBIN "gfx/intro/crystal_unowns.2bpp.lz" @@ -2356,85 +2140,8 @@ INCBIN "gfx/intro/015.tilemap.lz" ; e679d Palette_e679d: ; e679d - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 +INCLUDE "data/palettes/crystal_intro/intro_3.pal" +; e681d IntroSuicuneCloseGFX: ; e681d INCBIN "gfx/intro/suicune_close.2bpp.lz" @@ -2449,85 +2156,8 @@ INCBIN "gfx/intro/011.tilemap.lz" ; e6d6d Palette_e6d6d: ; e6d6d - RGB 24, 12, 9 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 24, 12, 9 - RGB 31, 31, 31 - RGB 8, 9, 31 - RGB 0, 0, 0 - - RGB 24, 12, 9 - RGB 12, 20, 31 - RGB 19, 8, 31 - RGB 0, 0, 0 - - RGB 12, 20, 31 - RGB 8, 9, 31 - RGB 19, 8, 31 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 12, 20, 31 - RGB 8, 9, 31 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 +INCLUDE "data/palettes/crystal_intro/intro_4.pal" +; e6ded IntroSuicuneJumpGFX: ; e6ded INCBIN "gfx/intro/suicune_jump.2bpp.lz" @@ -2554,85 +2184,7 @@ INCBIN "gfx/intro/013.tilemap.lz" ; e77dd Palette_e77dd: ; e77dd - RGB 24, 12, 9 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 24, 12, 9 - RGB 31, 31, 31 - RGB 8, 9, 31 - RGB 0, 0, 0 - - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - RGB 24, 12, 9 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 12, 0, 31 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 21, 9, 0 - RGB 21, 9, 0 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 - - RGB 31, 31, 31 - RGB 20, 20, 20 - RGB 11, 11, 11 - RGB 0, 0, 0 +INCLUDE "data/palettes/crystal_intro/intro_5.pal" IntroUnownBackGFX: ; e785d INCBIN "gfx/intro/unown_back.2bpp.lz" @@ -2646,4 +2198,3 @@ IntroGrass3GFX: ; e7a1d INCBIN "gfx/intro/grass3.2bpp" IntroGrass4GFX: ; e7a5d INCBIN "gfx/intro/grass4.2bpp" - diff --git a/engine/debug.asm b/engine/debug.asm index 9c2bb35c2..bcd53c021 100755 --- a/engine/debug.asm +++ b/engine/debug.asm @@ -159,7 +159,7 @@ Function819a7: ; 819a7 ld [rSVBK], a ld hl, Palette_819f4 ld de, BGPals - ld bc, $80 + ld bc, 16 palettes call CopyBytes ld a, $80 ld [rBGPI], a @@ -193,93 +193,10 @@ Function819a7: ; 819a7 ; 819f4 Palette_819f4: ; 819f4 - ; white - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 - - ; red - RGB 31, 00, 00 - RGB 31, 00, 00 - RGB 31, 00, 00 - RGB 00, 00, 00 - - ; green - RGB 00, 31, 00 - RGB 00, 31, 00 - RGB 00, 31, 00 - RGB 00, 00, 00 - - ; blue - RGB 00, 00, 31 - RGB 00, 00, 31 - RGB 00, 00, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 +INCLUDE "data/palettes/debug/bg.pal" Palette_81a34: ; 81a34 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 31, 31, 31 - RGB 00, 00, 00 - - ; red - RGB 31, 31, 31 - RGB 31, 00, 00 - RGB 31, 00, 00 - RGB 00, 00, 00 - - ; green - RGB 31, 31, 31 - RGB 00, 31, 00 - RGB 00, 31, 00 - RGB 00, 00, 00 - - ; blue - RGB 31, 31, 31 - RGB 00, 00, 31 - RGB 00, 00, 31 - RGB 00, 00, 00 +INCLUDE "data/palettes/debug/ob.pal" ; 81a74 Function81a74: ; 81a74 diff --git a/engine/decorations.asm b/engine/decorations.asm index b69f4f3c3..160022b93 100755 --- a/engine/decorations.asm +++ b/engine/decorations.asm @@ -1374,3 +1374,13 @@ _GetDecorationSprite: ; 27085 ld a, c ret ; 27092 + +PadCoords_de: ; 27092 + ld a, d + add 4 + ld d, a + ld a, e + add 4 + ld e, a + call GetBlockLocation + ret diff --git a/engine/dma_transfer.asm b/engine/dma_transfer.asm new file mode 100755 index 000000000..a0dad0dde --- /dev/null +++ b/engine/dma_transfer.asm @@ -0,0 +1,625 @@ +HDMATransferAttrMapAndTileMapToWRAMBank3:: ; 104000 + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + decoord 0, 0, AttrMap + ld hl, wScratchAttrMap + call CutAndPasteAttrMap + decoord 0, 0 + ld hl, wScratchTileMap + call CutAndPasteTilemap + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransferToWRAMBank3 + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransferToWRAMBank3 + ret +; 10402d + +HDMATransferTileMapToWRAMBank3:: ; 10402d + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + decoord 0, 0 + ld hl, wScratchTileMap + call CutAndPasteTilemap + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransferToWRAMBank3 + ret +; 104047 + +HDMATransferAttrMapToWRAMBank3: ; 104047 + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + decoord 0, 0, AttrMap + ld hl, wScratchAttrMap + call CutAndPasteAttrMap + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransferToWRAMBank3 + ret +; 104061 + +ReloadMapPart:: ; 104061 + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + decoord 0, 0, AttrMap + ld hl, wScratchAttrMap + call CutAndPasteAttrMap + decoord 0, 0 + ld hl, wScratchTileMap + call CutAndPasteTilemap + call DelayFrame + + di + ld a, [rVBK] + push af + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransfer_Wait127Scanlines_toBGMap + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransfer_Wait127Scanlines_toBGMap + pop af + ld [rVBK], a + ei + + ret + +Mobile_ReloadMapPart: ; 104099 + ld hl, ReloadMapPart ; useless + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + decoord 0, 0, AttrMap + ld hl, wScratchAttrMap + call CutAndPasteAttrMap + decoord 0, 0 + ld hl, wScratchTileMap + call CutAndPasteTilemap + call DelayFrame + + di + ld a, [rVBK] + push af + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransfer_NoDI + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransfer_NoDI + pop af + ld [rVBK], a + ei + + ret +; 1040d4 + +; XXX + ld hl, .unreferenced_1040da + jp CallInSafeGFXMode + +.unreferenced_1040da + ld a, $1 + ld [rVBK], a + ld a, $3 + ld [rSVBK], a + ld de, w3_d800 + ld a, [hBGMapAddress + 1] + ld [rHDMA1], a + ld a, [hBGMapAddress] + ld [rHDMA2], a + ld a, d + ld [rHDMA3], a + ld a, e + ld [rHDMA4], a + ld a, $23 + ld [hDMATransfer], a + call WaitDMATransfer + ret +; 1040fb + +; XXX + ld hl, .unreferenced_104101 + jp CallInSafeGFXMode + +.unreferenced_104101 + ld a, $1 + ld [rVBK], a + ld a, $3 + ld [rSVBK], a + ld hl, w3_d800 + call HDMATransferToWRAMBank3 + ret +; 104110 + +OpenAndCloseMenu_HDMATransferTileMapAndAttrMap:: ; 104110 +; OpenText + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + ; Transfer AttrMap and Tilemap to BGMap + ; Fill vBGAttrs with $00 + ; Fill vBGTiles with " " + decoord 0, 0, AttrMap + ld hl, wScratchAttrMap + call CutAndPasteAttrMap + decoord 0, 0 + ld hl, wScratchTileMap + call CutAndPasteTilemap + call DelayFrame + + di + ld a, [rVBK] + push af + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransfer_Wait123Scanlines_toBGMap + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransfer_Wait123Scanlines_toBGMap + pop af + ld [rVBK], a + ei + ret +; 104148 + +Mobile_OpenAndCloseMenu_HDMATransferTileMapAndAttrMap: ; 104148 (41:4148) + ld hl, .Function + jp CallInSafeGFXMode + +.Function: + ; Transfer AttrMap and Tilemap to BGMap + ; Fill vBGAttrs with $00 + ; Fill vBGTiles with $ff + decoord 0, 0, AttrMap + ld hl, wScratchAttrMap + call CutAndPasteAttrMap + ld c, $ff + decoord 0, 0 + ld hl, wScratchTileMap + call CutAndPasteMap + + ld a, $1 + ld [rVBK], a + ld hl, wScratchAttrMap + call HDMATransfer_Wait127Scanlines_toBGMap + ld a, $0 + ld [rVBK], a + ld hl, wScratchTileMap + call HDMATransfer_Wait127Scanlines_toBGMap + ret +; 104177 + +CallInSafeGFXMode: ; 104177 + ld a, [hBGMapMode] + push af + ld a, [hMapAnims] + push af + xor a + ld [hBGMapMode], a + ld [hMapAnims], a + ld a, [rSVBK] + push af + ld a, $6 + ld [rSVBK], a + ld a, [rVBK] + push af + + call ._hl_ + + pop af + ld [rVBK], a + pop af + ld [rSVBK], a + pop af + ld [hMapAnims], a + pop af + ld [hBGMapMode], a + ret +; 10419c + +._hl_ ; 10419c + jp hl +; 10419d + + +HDMATransferToWRAMBank3: ; 10419d (41:419d) + call _LoadHDMAParameters + ld a, $23 + ld [hDMATransfer], a + +WaitDMATransfer: ; 104a14 +.loop + call DelayFrame + ld a, [hDMATransfer] + and a + jr nz, .loop + ret + +HDMATransfer_Wait127Scanlines_toBGMap: ; 1041ad (41:41ad) +; HDMA transfer from hl to [hBGMapAddress] +; hBGMapAddress -> de +; 2 * SCREEN_HEIGHT -> c + ld a, [hBGMapAddress + 1] + ld d, a + ld a, [hBGMapAddress] + ld e, a + ld c, 2 * SCREEN_HEIGHT + jr HDMATransfer_Wait127Scanlines + +HDMATransfer_Wait123Scanlines_toBGMap: ; 1041b7 (41:41b7) +; HDMA transfer from hl to [hBGMapAddress] +; hBGMapAddress -> de +; 2 * SCREEN_HEIGHT -> c +; $7b --> b + ld a, [hBGMapAddress + 1] + ld d, a + ld a, [hBGMapAddress] + ld e, a + ld c, 2 * SCREEN_HEIGHT + jr HDMATransfer_Wait123Scanlines +; 1041c1 (41:41c1) + +HDMATransfer_NoDI: ; 1041c1 +; HDMA transfer from hl to [hBGMapAddress] +; [hBGMapAddress] --> de +; 2 * SCREEN_HEIGHT --> c + ld a, [hBGMapAddress + 1] + ld d, a + ld a, [hBGMapAddress] + ld e, a + ld c, 2 * SCREEN_HEIGHT + + ; [rHDMA1, rHDMA2] = hl & $fff0 + ld a, h + ld [rHDMA1], a + ld a, l + and $f0 + ld [rHDMA2], a + ; [rHDMA3, rHDMA4] = de & $1ff0 + ld a, d + and $1f + ld [rHDMA3], a + ld a, e + and $f0 + ld [rHDMA4], a + ; b = c | %10000000 + ld a, c + dec c + or $80 + ld b, a + ; d = $7f - c + 1 + ld a, $7f + sub c + ld d, a + ; while [rLY] >= d: pass +.loop1 + ld a, [rLY] + cp d + jr nc, .loop1 + ; while not [rSTAT] & 3: pass +.loop2 + ld a, [rSTAT] + and $3 + jr z, .loop2 + ; load the 5th byte of HDMA + ld a, b + ld [rHDMA5], a + ; wait until rLY advances (c + 1) times + ld a, [rLY] + inc c + ld hl, rLY +.loop3 + cp [hl] + jr z, .loop3 + ld a, [hl] + dec c + jr nz, .loop3 + ld hl, rHDMA5 + res 7, [hl] + ret +; 104205 + +HDMATransfer_Wait123Scanlines: + ld b, $7b + jr _continue_HDMATransfer + + +HDMATransfer_Wait127Scanlines: + ld b, $7f +_continue_HDMATransfer: +; a lot of waiting around for hardware registers + ; [rHDMA1, rHDMA2] = hl & $fff0 + ld a, h + ld [rHDMA1], a + ld a, l + and $f0 ; high nybble + ld [rHDMA2], a + ; [rHDMA3, rHDMA4] = de & $1ff0 + ld a, d + and $1f ; lower 5 bits + ld [rHDMA3], a + ld a, e + and $f0 ; high nybble + ld [rHDMA4], a + ; e = c | %10000000 + ld a, c + dec c + or $80 + ld e, a + ; d = b - c + 1 + ld a, b + sub c + ld d, a + ; while [rLY] >= d: pass +.ly_loop + ld a, [rLY] + cp d + jr nc, .ly_loop + + di + ; while [rSTAT] & 3: pass +.rstat_loop_1 + ld a, [rSTAT] + and $3 + jr nz, .rstat_loop_1 + ; while not [rSTAT] & 3: pass +.rstat_loop_2 + ld a, [rSTAT] + and $3 + jr z, .rstat_loop_2 + ; load the 5th byte of HDMA + ld a, e + ld [rHDMA5], a + ; wait until rLY advances (c + 1) times + ld a, [rLY] + inc c + ld hl, rLY +.final_ly_loop + cp [hl] + jr z, .final_ly_loop + ld a, [hl] + dec c + jr nz, .final_ly_loop + ld hl, rHDMA5 + res 7, [hl] + ei + + ret +; 10424e + + +_LoadHDMAParameters: ; 10424e (41:424e) + ld a, h + ld [rHDMA1], a + ld a, l + ld [rHDMA2], a + ld a, [hBGMapAddress + 1] + and $1f + ld [rHDMA3], a + ld a, [hBGMapAddress] + ld [rHDMA4], a + ret + +CutAndPasteTilemap: ; 10425f (41:425f) + ld c, " " + jr CutAndPasteMap + +CutAndPasteAttrMap: ; 104263 (41:4263) + ld c, $0 + +CutAndPasteMap: ; 104265 (41:4265) +; back up the value of c to hMapObjectIndexBuffer + ld a, [hMapObjectIndexBuffer] + push af + ld a, c + ld [hMapObjectIndexBuffer], a + +; for each row on the screen + ld c, SCREEN_HEIGHT +.loop1 +; for each tile in the row + ld b, SCREEN_WIDTH +.loop2 +; copy from de to hl + ld a, [de] + inc de + ld [hli], a + dec b + jr nz, .loop2 + +; load the original value of c into hl 12 times + ld a, [hMapObjectIndexBuffer] + ld b, BG_MAP_WIDTH - SCREEN_WIDTH +.loop3 + ld [hli], a + dec b + jr nz, .loop3 + + dec c + jr nz, .loop1 + +; restore the original value of hMapObjectIndexBuffer + pop af + ld [hMapObjectIndexBuffer], a + ret + + +_Get2bpp:: ; 104284 + ; 2bpp when [rLCDC] & $80 + ; switch to WRAM bank 6 + ld a, [rSVBK] + push af + ld a, $6 + ld [rSVBK], a + + push bc + push hl + + ; Copy c tiles of the 2bpp from b:de to wScratchTileMap + ld a, b ; bank + ld l, c ; number of tiles + ld h, $0 + ; multiply by 16 (16 bytes of a 2bpp = 8 x 8 tile) + add hl, hl + add hl, hl + add hl, hl + add hl, hl + ld b, h + ld c, l + ld h, d ; address + ld l, e + ld de, wScratchTileMap + call FarCopyBytes + + pop hl + pop bc + + push bc + call DelayFrame + pop bc + + ld d, h + ld e, l + ld hl, wScratchTileMap + call HDMATransfer_Wait127Scanlines + + ; restore the previous bank + pop af + ld [rSVBK], a + ret +; 1042b2 + +_Get1bpp:: ; 1042b2 + ; 1bpp when [rLCDC] & $80 +.loop + ld a, c + cp $10 + jp c, .bankswitch + jp z, .bankswitch + push bc + push hl + push de + ld c, $10 + call .bankswitch + pop de + ld hl, $80 + add hl, de + ld d, h + ld e, l + pop hl + lb bc, 1, 0 + add hl, bc + pop bc + ld a, c + sub $10 + ld c, a + jr .loop +; 1042d6 + +.bankswitch ; 1042d6 + ld a, [rSVBK] + push af + ld a, $6 + ld [rSVBK], a + + push bc + push hl + + ld a, b + ld l, c + ld h, $0 + add hl, hl ; multiply by 8 + add hl, hl ; multiply by 8 + add hl, hl ; multiply by 8 + ld c, l + ld b, h + ld h, d + ld l, e + ld de, wScratchTileMap + call FarCopyBytesDouble_DoubleBankSwitch + + pop hl + pop bc + + push bc + call DelayFrame + pop bc + + ld d, h + ld e, l + ld hl, wScratchTileMap + call HDMATransfer_Wait127Scanlines + + pop af + ld [rSVBK], a + ret +; 104303 + +HDMATransfer_OnlyTopFourRows: ; 104303 + ld hl, .Function + jp CallInSafeGFXMode +; 104309 + +.Function: + ld hl, wScratchTileMap + decoord 0, 0 + call .Copy + ld hl, wScratchTileMap + $80 + decoord 0, 0, AttrMap + call .Copy + ld a, $1 + ld [rVBK], a + ld c, $8 + ld hl, wScratchTileMap + $80 + debgcoord 0, 0, VBGMap1 + call HDMATransfer_Wait127Scanlines + ld a, $0 + ld [rVBK], a + ld c, $8 + ld hl, wScratchTileMap + debgcoord 0, 0, VBGMap1 + call HDMATransfer_Wait127Scanlines + ret + +.Copy: ; 10433a (41:433a) + ld b, 4 +.outer_loop + ld c, SCREEN_WIDTH +.inner_loop + ld a, [de] + ld [hli], a + inc de + dec c + jr nz, .inner_loop + ld a, l + add BG_MAP_WIDTH - SCREEN_WIDTH + ld l, a + ld a, h + adc $0 + ld h, a + dec b + jr nz, .outer_loop + ret +; 104350 diff --git a/engine/empty_sram.asm b/engine/empty_sram.asm new file mode 100644 index 000000000..aa4b28e0d --- /dev/null +++ b/engine/empty_sram.asm @@ -0,0 +1,19 @@ +EmptyAllSRAMBanks: ; 4cf1f + ld a, $0 + call .EmptyBank + ld a, $1 + call .EmptyBank + ld a, $2 + call .EmptyBank + ld a, $3 + call .EmptyBank + ret + +.EmptyBank: ; 4cf34 + call GetSRAMBank + ld hl, SRAM_Begin + ld bc, SRAM_End - SRAM_Begin + xor a + call ByteFill + call CloseSRAM + ret diff --git a/engine/european_mail.asm b/engine/european_mail.asm new file mode 100644 index 000000000..8f037cc43 --- /dev/null +++ b/engine/european_mail.asm @@ -0,0 +1,129 @@ +IsMailEuropean: ; 1de5c8 +; return 1 if French +; return 2 if German +; return 3 if Italian +; return 4 if Spanish +; return 0 if none of the above + ld c, $0 + ld hl, sPartyMon1MailAuthorNationality - sPartyMon1Mail + add hl, de + ld a, [hli] + cp "E" + ret nz + ld a, [hli] + inc c + cp "F" + ret z + inc c + cp "G" + ret z + inc c + cp "I" + ret z + inc c + cp "S" + ret z + ld c, $0 + ret + +; The regular font. +StandardEnglishFont: ; 1de5e6 +INCBIN "gfx/font/english.1bpp" + +; An extended font. +FrenchGermanFont: ; 1de9e6 +INCBIN "gfx/font/french_german.1bpp" + +; An even more extended font. +SpanishItalianFont: ; 1dede6 +INCBIN "gfx/font/spanish_italian.1bpp" + +HandleFrenchGermanMail: ; 1df1e6 +; called if mail is french or german +; fix 's 't 'v + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + cp $dc ; 's in french/german font + jr nz, .check_intermediate_chars + ld a, "'s" + jr .replace + +.check_intermediate_chars + sub "'s" + jr c, .dont_replace + cp "'v" - "'s" + 1 + jr nc, .dont_replace + add $cd + +.replace + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret + +LireLeCourrierAnglais: +DeutenEnglischenPost: ; 1df203 +; Cette fonction convertit certains des caractères anglais pour +; leur équivalent dans le jeu de caractères français. +; Diese Funktion wandelt bestimmte englische Zeichen, um ihre +; Entsprechung in der Deutschen-Zeichensatz. + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + cp "'s" + jr nz, .check_intermediate_chars + ld a, $dc + jr .replace + +.check_intermediate_chars + sub $cd + jr c, .dont_replace + cp "'v" - "'s" + 1 + jr nc, .dont_replace + add "'s" + +.replace + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret + +HandleSpanishItalianMail: ; 1df220 +LeerCorreosIngleses: +LeggiPostaInglese: +; This function converts certain characters between +; the English and Spanish/Italian character sets. +; Esta función convierte ciertos caracteres entre +; el juego de caracteres Inglés y Español. +; Questa funzione converte alcuni caratteri tra +; l'inglese e il set di caratteri italiani. + ld b, sPartyMon1MailAuthor - sPartyMon1Mail + ld h, d + ld l, e +.loop + ld a, [hl] + and $f0 + cp $d0 + jr nz, .dont_replace + ld a, [hl] + add $8 + and $f + or $d0 + ld [hl], a + +.dont_replace + inc hl + dec b + jr nz, .loop + ret diff --git a/engine/experience.asm b/engine/experience.asm new file mode 100644 index 000000000..c33aaf02a --- /dev/null +++ b/engine/experience.asm @@ -0,0 +1,162 @@ +CalcLevel: ; 50e1b + ld a, [TempMonSpecies] + ld [CurSpecies], a + call GetBaseData + ld d, 1 +.next_level + inc d + ld a, d + cp (MAX_LEVEL + 1) % $100 + jr z, .got_level + call CalcExpAtLevel + push hl + ld hl, TempMonExp + 2 + ld a, [hProduct + 3] + ld c, a + ld a, [hld] + sub c + ld a, [hProduct + 2] + ld c, a + ld a, [hld] + sbc c + ld a, [hProduct + 1] + ld c, a + ld a, [hl] + sbc c + pop hl + jr nc, .next_level + +.got_level + dec d + ret + +CalcExpAtLevel: ; 50e47 +; (a/b)*n**3 + c*n**2 + d*n - e + ld a, [BaseGrowthRate] + add a + add a + ld c, a + ld b, 0 + ld hl, GrowthRates + add hl, bc +; Cube the level + call .LevelSquared + ld a, d + ld [hMultiplier], a + call Multiply + +; Multiply by a + ld a, [hl] + and $f0 + swap a + ld [hMultiplier], a + call Multiply +; Divide by b + ld a, [hli] + and $f + ld [hDivisor], a + ld b, 4 + call Divide +; Push the cubic term to the stack + ld a, [hQuotient + 0] + push af + ld a, [hQuotient + 1] + push af + ld a, [hQuotient + 2] + push af +; Square the level and multiply by the lower 7 bits of c + call .LevelSquared + ld a, [hl] + and $7f + ld [hMultiplier], a + call Multiply +; Push the absolute value of the quadratic term to the stack + ld a, [hProduct + 1] + push af + ld a, [hProduct + 2] + push af + ld a, [hProduct + 3] + push af + ld a, [hli] + push af +; Multiply the level by d + xor a + ld [hMultiplicand + 0], a + ld [hMultiplicand + 1], a + ld a, d + ld [hMultiplicand + 2], a + ld a, [hli] + ld [hMultiplier], a + call Multiply +; Subtract e + ld b, [hl] + ld a, [hProduct + 3] + sub b + ld [hMultiplicand + 2], a + ld b, $0 + ld a, [hProduct + 2] + sbc b + ld [hMultiplicand + 1], a + ld a, [hProduct + 1] + sbc b + ld [hMultiplicand], a +; If bit 7 of c is set, c is negative; otherwise, it's positive + pop af + and $80 + jr nz, .subtract +; Add c*n**2 to (d*n - e) + pop bc + ld a, [hProduct + 3] + add b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + adc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + adc b + ld [hMultiplicand], a + jr .done_quadratic + +.subtract +; Subtract c*n**2 from (d*n - e) + pop bc + ld a, [hProduct + 3] + sub b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + sbc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + sbc b + ld [hMultiplicand], a + +.done_quadratic +; Add (a/b)*n**3 to (d*n - e +/- c*n**2) + pop bc + ld a, [hProduct + 3] + add b + ld [hMultiplicand + 2], a + pop bc + ld a, [hProduct + 2] + adc b + ld [hMultiplicand + 1], a + pop bc + ld a, [hProduct + 1] + adc b + ld [hMultiplicand], a + ret + +.LevelSquared: ; 50eed + xor a + ld [hMultiplicand + 0], a + ld [hMultiplicand + 1], a + ld a, d + ld [hMultiplicand + 2], a + ld [hMultiplier], a + jp Multiply + +INCLUDE "data/growth_rates.asm" diff --git a/engine/flag_predef.asm b/engine/flag_predef.asm new file mode 100644 index 000000000..bd4f37882 --- /dev/null +++ b/engine/flag_predef.asm @@ -0,0 +1,70 @@ +FlagPredef: ; 4d7c1 +; Perform action b on flag c in flag array hl. +; If checking a flag, check flag array d:hl unless d is 0. + +; For longer flag arrays, see FlagAction. + + push hl + push bc + +; Divide by 8 to get the byte we want. + push bc + srl c + srl c + srl c + ld b, 0 + add hl, bc + pop bc + +; Which bit we want from the byte + ld a, c + and 7 + ld c, a + +; Shift left until we can mask the bit + ld a, 1 + jr z, .shifted +.shift + add a + dec c + jr nz, .shift +.shifted + ld c, a + +; What are we doing to this flag? + dec b + jr z, .set ; 1 + dec b + jr z, .check ; 2 + +.reset + ld a, c + cpl + and [hl] + ld [hl], a + jr .done + +.set + ld a, [hl] + or c + ld [hl], a + jr .done + +.check + ld a, d + cp 0 + jr nz, .farcheck + + ld a, [hl] + and c + jr .done + +.farcheck + call GetFarByte + and c + +.done + pop bc + pop hl + ld c, a + ret diff --git a/engine/fruit_trees.asm b/engine/fruit_trees.asm index 5c74b3bff..4f9de8300 100644 --- a/engine/fruit_trees.asm +++ b/engine/fruit_trees.asm @@ -103,7 +103,7 @@ GetFruitTreeItem: ; 4408a ; 44097 -INCLUDE "data/fruit_tree_items.asm" +INCLUDE "data/items/fruit_trees.asm" FruitBearingTreeText: ; 440b5 diff --git a/engine/gbc_only.asm b/engine/gbc_only.asm new file mode 100644 index 000000000..a77a44d72 --- /dev/null +++ b/engine/gbc_only.asm @@ -0,0 +1,149 @@ +GBCOnlyScreen: ; 4ea82 + + ld a, [hCGB] + and a + ret nz + + ld de, MUSIC_NONE + call PlayMusic + + call ClearTileMap + + ld hl, GBCOnlyGFX + ld de, $d000 + ld a, [rSVBK] + push af + ld a, 0 + ld [rSVBK], a + call Decompress + pop af + ld [rSVBK], a + + ld de, $d000 + ld hl, VTiles2 + lb bc, BANK(GBCOnlyGFX), $54 + call Get2bpp + + ld de, Font + ld hl, VTiles1 + lb bc, BANK(Font), $80 + call Get1bpp + + call DrawGBCOnlyScreen + + call WaitBGMap + +; better luck next time +.loop + call DelayFrame + jr .loop +; 4eac5 + + +DrawGBCOnlyScreen: ; 4eac5 + + call DrawGBCOnlyBorder + + ; Pokemon + hlcoord 3, 2 + ld b, 14 + ld c, 4 + ld a, $8 + call DrawGBCOnlyGraphic + + ; Crystal + hlcoord 5, 6 + ld b, 10 + ld c, 2 + ld a, $40 + call DrawGBCOnlyGraphic + + ld de, GBCOnlyString + hlcoord 1, 10 + call PlaceString + + ret +; 4eaea + + +DrawGBCOnlyBorder: ; 4eaea + + hlcoord 0, 0 + ld [hl], 0 ; top-left + + inc hl + ld a, 1 ; top + call .FillRow + + ld [hl], 2 ; top-right + + hlcoord 0, 1 + ld a, 3 ; left + call .FillColumn + + hlcoord 19, 1 + ld a, 4 ; right + call .FillColumn + + hlcoord 0, 17 + ld [hl], 5 ; bottom-left + + inc hl + ld a, 6 ; bottom + call .FillRow + + ld [hl], 7 ; bottom-right + ret +; 4eb15 + +.FillRow: ; 4eb15 + ld c, SCREEN_WIDTH - 2 +.next_column + ld [hli], a + dec c + jr nz, .next_column + ret +; 4eb1c + +.FillColumn: ; 4eb1c + ld de, SCREEN_WIDTH + ld c, SCREEN_HEIGHT - 2 +.next_row + ld [hl], a + add hl, de + dec c + jr nz, .next_row + ret +; 4eb27 + + +DrawGBCOnlyGraphic: ; 4eb27 + ld de, SCREEN_WIDTH +.y + push bc + push hl +.x + ld [hli], a + inc a + dec b + jr nz, .x + pop hl + add hl, de + pop bc + dec c + jr nz, .y + ret +; 4eb38 + + +GBCOnlyString: ; 4eb38 + db "This Game Pak is" + next "designed only for" + next "use on the" + next "Game Boy Color.@" +; 4eb76 + + +GBCOnlyGFX: ; 4eb76 +INCBIN "gfx/sgb/gbc_only.2bpp.lz" +; 4f0bc diff --git a/engine/get_breedmon_growth.asm b/engine/get_breedmon_growth.asm new file mode 100644 index 000000000..20c546315 --- /dev/null +++ b/engine/get_breedmon_growth.asm @@ -0,0 +1,27 @@ +GetBreedMon1LevelGrowth: ; e698 + ld hl, wBreedMon1Stats + ld de, TempMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + callab CalcLevel + ld a, [wBreedMon1Level] + ld b, a + ld a, d + ld e, a + sub b + ld d, a + ret + +GetBreedMon2LevelGrowth: ; e6b3 + ld hl, wBreedMon2Stats + ld de, TempMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + callab CalcLevel + ld a, [wBreedMon2Level] + ld b, a + ld a, d + ld e, a + sub b + ld d, a + ret diff --git a/engine/healmachineanim.asm b/engine/healmachineanim.asm deleted file mode 100755 index 4f543c0b3..000000000 --- a/engine/healmachineanim.asm +++ /dev/null @@ -1,265 +0,0 @@ -HealMachineAnim: ; 12324 - ; If you have no Pokemon, don't change the buffer. This can lead to some glitchy effects if you have no Pokemon. - ld a, [PartyCount] - and a - ret z - ; The location of the healing machine relative to the player is stored in ScriptVar. - ; 0: Up and left (Pokemon Center) - ; 1: Left (Elm's Lab) - ; 2: Up (Hall of Fame) - ld a, [ScriptVar] - ld [Buffer1], a - ld a, [rOBP1] - ld [Buffer2], a - call .DoJumptableFunctions - ld a, [Buffer2] - call DmgToCgbObjPal1 - ret -; 1233e - -.DoJumptableFunctions: ; 1233e - xor a - ld [Buffer3], a -.jumpable_loop - ld a, [Buffer1] - ld e, a - ld d, 0 - ld hl, .Pointers - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [Buffer3] - ld e, a - inc a - ld [Buffer3], a - add hl, de - ld a, [hl] - cp 5 - jr z, .finish - ld hl, .Jumptable - rst JumpTable - jr .jumpable_loop - -.finish - ret -; 12365 - -.Pointers: ; 12365 - dw .Pokecenter - dw .ElmLab - dw .HallOfFame -; 1236b - -.Pokecenter: ; 1236b - db 0, 1, 3, 5 -.ElmLab: ; 1236f - db 0, 1, 3, 5 -.HallOfFame: ; 12373 - db 0, 2, 4, 5 -; 12377 - -.Jumptable: ; 12377 - dw .LoadGFX - dw .PC_LoadBallsOntoMachine - dw .HOF_LoadBallsOntoMachine - dw .PlayHealMusic - dw .HOF_PlaySFX - dw .dummy_5 ; never encountered -; 12383 - -.LoadGFX: ; 12383 - call .LoadPalettes - ld de, .HealMachineGFX - ld hl, VTiles0 tile $7c - lb bc, BANK(.HealMachineGFX), $2 - call Request2bpp - ret -; 12393 - -.PC_LoadBallsOntoMachine: ; 12393 - ld hl, Sprites + $80 - ld de, .PC_ElmsLab_OAM - call .PlaceHealingMachineTile - call .PlaceHealingMachineTile - jr .LoadBallsOntoMachine - -.HOF_LoadBallsOntoMachine: ; 123a1 - ld hl, Sprites + $80 - ld de, .HOF_OAM - -.LoadBallsOntoMachine: ; 123a7 - ld a, [PartyCount] - ld b, a -.party_loop - call .PlaceHealingMachineTile - push de - ld de, SFX_SECOND_PART_OF_ITEMFINDER - call PlaySFX - pop de - ld c, 30 - call DelayFrames - dec b - jr nz, .party_loop - ret -; 123bf - -.PlayHealMusic: ; 123bf - ld de, MUSIC_HEAL - call PlayMusic - jp .FlashPalettes8Times -; 123c8 - -.HOF_PlaySFX: ; 123c8 - ld de, SFX_GAME_FREAK_LOGO_GS - call PlaySFX - call .FlashPalettes8Times - call WaitSFX - ld de, SFX_BOOT_PC - call PlaySFX - ret -; 123db - -.dummy_5 ; 123db - ret -; 123dc - -.PC_ElmsLab_OAM: ; 123dc - dsprite 4, 0, 4, 2, $7c, $16 - dsprite 4, 0, 4, 6, $7c, $16 - dsprite 4, 6, 4, 0, $7d, $16 - dsprite 4, 6, 5, 0, $7d, $36 ; xflip - dsprite 5, 3, 4, 0, $7d, $16 - dsprite 5, 3, 5, 0, $7d, $36 ; xflip - dsprite 6, 0, 4, 0, $7d, $16 - dsprite 6, 0, 5, 0, $7d, $36 ; xflip -; 123fc - -.HealMachineGFX: ; 123fc -INCBIN "gfx/overworld/heal_machine.2bpp" -; 1241c - -.HOF_OAM: ; 1241c - dsprite 7, 4, 10, 1, $7d, $16 - dsprite 7, 4, 10, 6, $7d, $16 - dsprite 7, 3, 9, 5, $7d, $16 - dsprite 7, 3, 11, 2, $7d, $16 - dsprite 7, 1, 9, 1, $7d, $16 - dsprite 7, 1, 11, 5, $7d, $16 -; 12434 - -.LoadPalettes: ; 12434 - call IsCGB - jr nz, .cgb - ld a, %11100000 - ld [rOBP1], a - ret - -.cgb - ld hl, .palettes - ld de, OBPals + 8 * 6 - ld bc, 8 - ld a, $5 - call FarCopyWRAM - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 12451 - -.palettes ; 12451 - RGB 31, 31, 31 - RGB 31, 19, 10 - RGB 31, 07, 01 - RGB 00, 00, 00 -; 12459 - -.FlashPalettes8Times: ; 12459 - ld c, $8 -.palette_loop - push bc - call .FlashPalettes - ld c, 10 - call DelayFrames - pop bc - dec c - jr nz, .palette_loop - ret -; 12469 - -.FlashPalettes: ; 12469 - call IsCGB - jr nz, .go - ld a, [rOBP1] - xor %00101000 - ld [rOBP1], a - ret - -.go - ld a, [rSVBK] - push af - ld a, $5 - ld [rSVBK], a - - ld hl, OBPals + 8 * 6 - ld a, [hli] - ld e, a - ld a, [hli] - ld d, a - push de - ld c, $3 -.palette_loop_2 - ld a, [hli] - ld e, a - ld a, [hld] - ld d, a - dec hl - ld a, d - ld [hld], a - ld a, e - ld [hli], a - inc hl - inc hl - inc hl - dec c - jr nz, .palette_loop_2 - pop de - dec hl - ld a, d - ld [hld], a - ld a, e - ld [hl], a - - pop af - ld [rSVBK], a - ld a, $1 - ld [hCGBPalUpdate], a - ret -; 124a3 - -.PlaceHealingMachineTile: ; 124a3 - push bc - ld a, [Buffer1] - bcpixel 2, 4 - cp $1 ; ElmsLab - jr z, .okay - bcpixel 0, 0 - -.okay - ld a, [de] - add c - inc de - ld [hli], a - ld a, [de] - add b - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - pop bc - ret -; 124c1 diff --git a/engine/init_gender.asm b/engine/init_gender.asm index 3ae856029..dfb3fbdd4 100755 --- a/engine/init_gender.asm +++ b/engine/init_gender.asm @@ -20,7 +20,7 @@ InitCrystalData: ; 48000 ret ; 4802f -INCLUDE "misc/mobile_12.asm" +INCLUDE "mobile/mobile_12.asm" InitGender: ; 48dcb (12:4dcb) call InitGenderScreen diff --git a/engine/init_hof_credits.asm b/engine/init_hof_credits.asm new file mode 100644 index 000000000..0f55a10ab --- /dev/null +++ b/engine/init_hof_credits.asm @@ -0,0 +1,79 @@ +InitDisplayForHallOfFame: ; 4e881 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + call LoadStandardFont + call LoadFontsBattleExtra + hlbgcoord 0, 0 + ld bc, VBGMap1 - VBGMap0 + ld a, " " + call ByteFill + hlcoord 0, 0, AttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + xor a + ld [hSCY], a + ld [hSCX], a + call EnableLCD + ld hl, .SavingRecordDontTurnOff + call PrintText + call WaitBGMap2 + call SetPalettes + ret + +.SavingRecordDontTurnOff: ; 0x4e8bd + ; SAVING RECORD… DON'T TURN OFF! + text_jump UnknownText_0x1bd39e + db "@" + +InitDisplayForRedCredits: ; 4e8c2 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + call DisableLCD + call LoadStandardFont + call LoadFontsBattleExtra + hlbgcoord 0, 0 + ld bc, VBGMap1 - VBGMap0 + ld a, " " + call ByteFill + hlcoord 0, 0, AttrMap + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + ld hl, UnknBGPals + ld c, 4 tiles +.load_white_palettes + ld a, (palred 31 + palgreen 31 + palblue 31) % $100 + ld [hli], a + ld a, (palred 31 + palgreen 31 + palblue 31) / $100 + ld [hli], a + dec c + jr nz, .load_white_palettes + xor a + ld [hSCY], a + ld [hSCX], a + call EnableLCD + call WaitBGMap2 + call SetPalettes + ret + +ResetDisplayBetweenHallOfFameMons: ; 4e906 + ld a, [rSVBK] + push af + ld a, $6 + ld [rSVBK], a + ld hl, wDecompressScratch + ld bc, wScratchAttrMap - wDecompressScratch + ld a, " " + call ByteFill + hlbgcoord 0, 0 + ld de, wDecompressScratch + ld b, 0 + ld c, 4 tiles + call Request2bpp + pop af + ld [rSVBK], a + ret diff --git a/engine/init_list.asm b/engine/init_list.asm new file mode 100644 index 000000000..e2b7235ab --- /dev/null +++ b/engine/init_list.asm @@ -0,0 +1,54 @@ +InitList: ; 50db9 + ld a, [wInitListType] + + cp INIT_ENEMYOT_LIST + jr nz, .check_party_ot_name + ld hl, OTPartyCount + ld de, OTPartyMonOT + ld a, ENEMY_OT_NAME + jr .done + +.check_party_ot_name + cp INIT_PLAYEROT_LIST + jr nz, .check_mon_name + ld hl, PartyCount + ld de, PartyMonOT + ld a, PARTY_OT_NAME + jr .done + +.check_mon_name + cp INIT_MON_LIST + jr nz, .check_item_name + ld hl, CurMart + ld de, PokemonNames + ld a, PKMN_NAME + jr .done + +.check_item_name + cp INIT_BAG_ITEM_LIST + jr nz, .check_ob_item_name + ld hl, NumItems + ld de, ItemNames + ld a, ITEM_NAME + jr .done + +.check_ob_item_name + ld hl, CurMart + ld de, ItemNames + ld a, ITEM_NAME +.done + ld [wNamedObjectTypeBuffer], a + ld a, l + ld [wListPointer], a + ld a, h + ld [wListPointer + 1], a + ld a, e + ld [wUnusedD102], a + ld a, d + ld [wUnusedD102 + 1], a + ld bc, ItemAttributes + ld a, c + ld [wItemAttributesPtr], a + ld a, b + ld [wItemAttributesPtr + 1], a + ret diff --git a/engine/init_map.asm b/engine/init_map.asm new file mode 100644 index 000000000..5dd6c7b8a --- /dev/null +++ b/engine/init_map.asm @@ -0,0 +1,103 @@ +ReanchorBGMap_NoOAMUpdate:: ; 6454 + call DelayFrame + ld a, [hOAMUpdate] + push af + + ld a, $1 + ld [hOAMUpdate], a + ld a, [hBGMapMode] + push af + xor a + ld [hBGMapMode], a + + call .ReanchorBGMap + + pop af + ld [hBGMapMode], a + pop af + ld [hOAMUpdate], a + ld hl, VramState + set 6, [hl] + ret + +.ReanchorBGMap: + xor a + ld [hLCDCPointer], a + ld [hBGMapMode], a + ld a, $90 + ld [hWY], a + call OverworldTextModeSwitch + ld a, VBGMap1 / $100 + call .LoadBGMapAddrIntoHRAM + call _OpenAndCloseMenu_HDMATransferTileMapAndAttrMap + callba LoadOW_BGPal7 + callba ApplyPals + ld a, $1 + ld [hCGBPalUpdate], a + xor a + ld [hBGMapMode], a + ld [hWY], a + callba HDMATransfer_FillBGMap0WithBlack ; no need to farcall + ld a, VBGMap0 / $100 + call .LoadBGMapAddrIntoHRAM + xor a + ld [wBGMapAnchor], a + ld a, VBGMap0 / $100 + ld [wBGMapAnchor + 1], a + xor a + ld [hSCX], a + ld [hSCY], a + call ApplyBGMapAnchorToObjects + ret + +.LoadBGMapAddrIntoHRAM: ; 64b9 + ld [hBGMapAddress + 1], a + xor a + ld [hBGMapAddress], a + ret + +LoadFonts_NoOAMUpdate:: ; 64bf + ld a, [hOAMUpdate] + push af + ld a, $1 + ld [hOAMUpdate], a + + call .LoadGFX + + pop af + ld [hOAMUpdate], a + ret + +.LoadGFX: + call LoadFontsExtra + ld a, $90 + ld [hWY], a + call SafeUpdateSprites + call LoadStandardFont + ret + +HDMATransfer_FillBGMap0WithBlack: ; 64db + ld a, [rSVBK] + push af + ld a, $6 + ld [rSVBK], a + + ld a, "<BLACK>" ; $60 + ld hl, wDecompressScratch + ld bc, wScratchAttrMap - wDecompressScratch + call ByteFill + ld a, wDecompressScratch / $100 + ld [rHDMA1], a + ld a, wDecompressScratch % $100 + ld [rHDMA2], a + ld a, (VBGMap0 % $8000) / $100 + ld [rHDMA3], a + ld a, (VBGMap0 % $8000) % $100 + ld [rHDMA4], a + ld a, $3f + ld [hDMATransfer], a + call DelayFrame + + pop af + ld [rSVBK], a + ret diff --git a/engine/item_effects.asm b/engine/item_effects.asm new file mode 100644 index 000000000..e881f6338 --- /dev/null +++ b/engine/item_effects.asm @@ -0,0 +1,3318 @@ +_DoItemEffect:: ; e722 + ld a, [CurItem] + ld [wd265], a + call GetItemName + call CopyName1 + ld a, 1 + ld [wItemEffectSucceeded], a + ld a, [CurItem] + dec a + ld hl, ItemEffects + rst JumpTable + ret +; e73c + + +ItemEffects: ; e73c +; entries correspond to item ids (see constants/item_constants.asm) + dw MasterBall + dw UltraBall + dw Brightpowder + dw GreatBall + dw PokeBall + dw TownMap + dw Bicycle + dw MoonStone + dw Antidote + dw BurnHeal + dw IceHeal + dw Awakening + dw ParlyzHeal + dw FullRestore + dw MaxPotion + dw HyperPotion + dw SuperPotion + dw Potion + dw EscapeRope + dw Repel + dw MaxElixer + dw FireStone + dw Thunderstone + dw WaterStone + dw Item19 + dw HPUp + dw Protein + dw Iron + dw Carbos + dw LuckyPunch + dw Calcium + dw RareCandy + dw XAccuracy + dw LeafStone + dw MetalPowder + dw Nugget + dw PokeDoll + dw FullHeal + dw Revive + dw MaxRevive + dw GuardSpec + dw SuperRepel + dw MaxRepel + dw DireHit + dw Item2D + dw FreshWater + dw SodaPop + dw Lemonade + dw XAttack + dw Item32 + dw XDefend + dw XSpeed + dw XSpecial + dw CoinCase + dw Itemfinder + dw PokeFlute + dw ExpShare + dw OldRod + dw GoodRod + dw SilverLeaf + dw SuperRod + dw PPUp + dw Ether + dw MaxEther + dw Elixer + dw RedScale + dw Secretpotion + dw SSTicket + dw MysteryEgg + dw ClearBell + dw SilverWing + dw MoomooMilk + dw QuickClaw + dw Psncureberry + dw GoldLeaf + dw SoftSand + dw SharpBeak + dw Przcureberry + dw BurntBerry + dw IceBerry + dw PoisonBarb + dw KingsRock + dw BitterBerry + dw MintBerry + dw RedApricorn + dw Tinymushroom + dw BigMushroom + dw Silverpowder + dw BluApricorn + dw Item5A + dw AmuletCoin + dw YlwApricorn + dw GrnApricorn + dw CleanseTag + dw MysticWater + dw Twistedspoon + dw WhtApricorn + dw Blackbelt + dw BlkApricorn + dw Item64 + dw PnkApricorn + dw Blackglasses + dw Slowpoketail + dw PinkBow + dw Stick + dw SmokeBall + dw Nevermeltice + dw Magnet + dw Miracleberry + dw Pearl + dw BigPearl + dw Everstone + dw SpellTag + dw Ragecandybar + dw GsBall + dw BlueCard + dw MiracleSeed + dw ThickClub + dw FocusBand + dw Item78 + dw Energypowder + dw EnergyRoot + dw HealPowder + dw RevivalHerb + dw HardStone + dw LuckyEgg + dw CardKey + dw MachinePart + dw EggTicket + dw LostItem + dw Stardust + dw StarPiece + dw BasementKey + dw Pass + dw Item87 + dw Item88 + dw Item89 + dw Charcoal + dw BerryJuice + dw ScopeLens + dw Item8D + dw Item8E + dw MetalCoat + dw DragonFang + dw Item91 + dw Leftovers + dw Item93 + dw Item94 + dw Item95 + dw Mysteryberry + dw DragonScale + dw BerserkGene + dw Item99 + dw Item9A + dw Item9B + dw SacredAsh + dw HeavyBall + dw FlowerMail + dw LevelBall + dw LureBall + dw FastBall + dw ItemA2 + dw LightBall + dw FriendBall + dw MoonBall + dw LoveBall + dw NormalBox + dw GorgeousBox + dw SunStone + dw PolkadotBow + dw ItemAB + dw UpGrade + dw Berry + dw GoldBerry + dw Squirtbottle + dw ItemB0 + dw ParkBall + dw RainbowWing + dw ItemB3 +; e8a2 + + +MasterBall: +UltraBall: +GreatBall: +PokeBall: +HeavyBall: +LevelBall: +LureBall: +FastBall: +FriendBall: +MoonBall: +LoveBall: +ParkBall: ; e8a2 + ld a, [wBattleMode] + dec a + jp nz, UseBallInTrainerBattle + + ld a, [PartyCount] + cp PARTY_LENGTH + jr nz, .room_in_party + + ld a, BANK(sBoxCount) + call GetSRAMBank + ld a, [sBoxCount] + cp MONS_PER_BOX + call CloseSRAM + jp z, Ball_BoxIsFullMessage + +.room_in_party + xor a + ld [wWildMon], a + ld a, [CurItem] + cp PARK_BALL + call nz, ReturnToBattle_UseBall + + ld hl, Options + res NO_TEXT_SCROLL, [hl] + ld hl, UsedItemText + call PrintText + + ld a, [EnemyMonCatchRate] + ld b, a + ld a, [BattleType] + cp BATTLETYPE_TUTORIAL + jp z, .catch_without_fail + ld a, [CurItem] + cp MASTER_BALL + jp z, .catch_without_fail + ld a, [CurItem] + ld c, a + ld hl, BallMultiplierFunctionTable + +.get_multiplier_loop + ld a, [hli] + cp $ff + jr z, .skip_or_return_from_ball_fn + cp c + jr z, .call_ball_function + inc hl + inc hl + jr .get_multiplier_loop + +.call_ball_function + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .skip_or_return_from_ball_fn + push de + jp hl + +.skip_or_return_from_ball_fn + ld a, [CurItem] + cp LEVEL_BALL + ld a, b + jp z, .skip_hp_calc + + ld a, b + ld [hMultiplicand + 2], a + + ld hl, EnemyMonHP + ld b, [hl] + inc hl + ld c, [hl] + inc hl + ld d, [hl] + inc hl + ld e, [hl] + sla c + rl b + + ld h, d + ld l, e + add hl, de + add hl, de + ld d, h + ld e, l + ld a, d + and a + jr z, .okay_1 + + srl d + rr e + srl d + rr e + srl b + rr c + srl b + rr c + + ld a, c + and a + jr nz, .okay_1 + ld c, $1 +.okay_1 + ld b, e + + push bc + ld a, b + sub c + ld [hMultiplier], a + xor a + ld [hDividend + 0], a + ld [hMultiplicand + 0], a + ld [hMultiplicand + 1], a + call Multiply + pop bc + + ld a, b + ld [hDivisor], a + ld b, $4 + call Divide + + ld a, [hQuotient + 2] + and a + jr nz, .statuscheck + ld a, 1 +.statuscheck +; This routine is buggy. It was intended that SLP and FRZ provide a higher +; catch rate than BRN/PSN/PAR, which in turn provide a higher catch rate than +; no status effect at all. But instead, it makes BRN/PSN/PAR provide no +; benefit. +; Uncomment the line below to fix this. + ld b, a + ld a, [EnemyMonStatus] + and 1 << FRZ | SLP + ld c, 10 + jr nz, .addstatus + ; ld a, [EnemyMonStatus] + and a + ld c, 5 + jr nz, .addstatus + ld c, 0 +.addstatus + ld a, b + add c + jr nc, .max_1 + ld a, $ff +.max_1 + + ld d, a + push de + + ; BUG: callba overwrites a, + ; and GetItemHeldEffect takes b anyway. + + ; This is probably the reason + ; the HELD_CATCH_CHANCE effect + ; is never used. + + ; Uncomment the line below to fix. + + ld a, [BattleMonItem] +; ld b, a + callba GetItemHeldEffect + ld a, b + cp HELD_CATCH_CHANCE + + pop de + ld a, d + + jr nz, .skip_hp_calc + add c + jr nc, .skip_hp_calc + ld a, $ff +.skip_hp_calc + + ld b, a + ld [Buffer1], a + call Random + + cp b + ld a, 0 + jr z, .catch_without_fail + jr nc, .fail_to_catch + +.catch_without_fail + ld a, [EnemyMonSpecies] + +.fail_to_catch + ld [wWildMon], a + ld c, 20 + call DelayFrames + + ld a, [CurItem] + cp POKE_BALL + 1 ; Assumes Master/Ultra/Great come before + jr c, .not_kurt_ball + ld a, POKE_BALL +.not_kurt_ball + ld [wBattleAnimParam], a + + ld de, ANIM_THROW_POKE_BALL + ld a, e + ld [FXAnimID], a + ld a, d + ld [FXAnimID + 1], a + xor a + ld [hBattleTurn], a + ld [Buffer2], a + ld [wNumHits], a + predef PlayBattleAnim + + ld a, [wWildMon] + and a + jr nz, .caught + ld a, [Buffer2] + cp $1 + ld hl, Text_NoShake + jp z, .shake_and_break_free + cp $2 + ld hl, Text_OneShake + jp z, .shake_and_break_free + cp $3 + ld hl, Text_TwoShakes + jp z, .shake_and_break_free + cp $4 + ld hl, Text_ThreeShakes + jp z, .shake_and_break_free +.caught + + ld hl, EnemyMonStatus + ld a, [hli] + push af + inc hl + ld a, [hli] + push af + ld a, [hl] + push af + push hl + ld hl, EnemyMonItem + ld a, [hl] + push af + push hl + ld hl, EnemySubStatus5 + ld a, [hl] + push af + set SUBSTATUS_TRANSFORMED, [hl] + +; This code is buggy. Any wild Pokémon that has Transformed will be +; caught as a Ditto, even if it was something else like Mew. +; To fix, do not set [TempEnemyMonSpecies] to DITTO. + bit SUBSTATUS_TRANSFORMED, a + jr nz, .ditto + jr .not_ditto + +.ditto + ld a, DITTO + ld [TempEnemyMonSpecies], a + jr .load_data + +.not_ditto + set SUBSTATUS_TRANSFORMED, [hl] + ld hl, wEnemyBackupDVs + ld a, [EnemyMonDVs] + ld [hli], a + ld a, [EnemyMonDVs + 1] + ld [hl], a + +.load_data + ld a, [TempEnemyMonSpecies] + ld [CurPartySpecies], a + ld a, [EnemyMonLevel] + ld [CurPartyLevel], a + callba LoadEnemyMon + + pop af + ld [EnemySubStatus5], a + + pop hl + pop af + ld [hl], a + pop hl + pop af + ld [hld], a + pop af + ld [hld], a + dec hl + pop af + ld [hl], a + + ld hl, EnemySubStatus5 + bit SUBSTATUS_TRANSFORMED, [hl] + jr nz, .Transformed + ld hl, wWildMonMoves + ld de, EnemyMonMoves + ld bc, NUM_MOVES + call CopyBytes + + ld hl, wWildMonPP + ld de, EnemyMonPP + ld bc, NUM_MOVES + call CopyBytes +.Transformed: + + ld a, [EnemyMonSpecies] + ld [wWildMon], a + ld [CurPartySpecies], a + ld [wd265], a + ld a, [BattleType] + cp BATTLETYPE_TUTORIAL + jp z, .FinishTutorial + + callba TrainerRankings_WildMonsCaught + + ld hl, Text_GotchaMonWasCaught + call PrintText + + call ClearSprites + + ld a, [wd265] + dec a + call CheckCaughtMon + + ld a, c + push af + ld a, [wd265] + dec a + call SetSeenAndCaughtMon + pop af + and a + jr nz, .skip_pokedex + + call CheckReceivedDex + jr z, .skip_pokedex + + ld hl, Text_AddedToPokedex + call PrintText + + call ClearSprites + + ld a, [EnemyMonSpecies] + ld [wd265], a + predef NewPokedexEntry + +.skip_pokedex + ld a, [BattleType] + cp BATTLETYPE_CONTEST + jp z, .catch_bug_contest_mon + cp BATTLETYPE_CELEBI + jr nz, .not_celebi + ld hl, wBattleResult + set 6, [hl] +.not_celebi + + ld a, [PartyCount] + cp PARTY_LENGTH + jr z, .SendToPC + + xor a ; PARTYMON + ld [MonType], a + call ClearSprites + + predef TryAddMonToParty + + callba SetCaughtData + + ld a, [CurItem] + cp FRIEND_BALL + jr nz, .SkipPartyMonFriendBall + + ld a, [PartyCount] + dec a + ld hl, PartyMon1Happiness + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + + ld a, FRIEND_BALL_HAPPINESS + ld [hl], a +.SkipPartyMonFriendBall: + + ld hl, Text_AskNicknameNewlyCaughtMon + call PrintText + + ld a, [CurPartySpecies] + ld [wd265], a + call GetPokemonName + + call YesNoBox + jp c, .return_from_capture + + ld a, [PartyCount] + dec a + ld [CurPartyMon], a + ld hl, PartyMonNicknames + ld bc, PKMN_NAME_LENGTH + call AddNTimes + + ld d, h + ld e, l + push de + xor a ; PARTYMON + ld [MonType], a + ld b, 0 + callba NamingScreen + + call RotateThreePalettesRight + + call LoadStandardFont + + pop hl + ld de, StringBuffer1 + call InitName + + jp .return_from_capture + +.SendToPC: + call ClearSprites + + predef SentPkmnIntoBox + + callba SetBoxMonCaughtData + + ld a, BANK(sBoxCount) + call GetSRAMBank + + ld a, [sBoxCount] + cp MONS_PER_BOX + jr nz, .BoxNotFullYet + ld hl, wBattleResult + set 7, [hl] +.BoxNotFullYet: + ld a, [CurItem] + cp FRIEND_BALL + jr nz, .SkipBoxMonFriendBall + ; The captured mon is now first in the box + ld a, FRIEND_BALL_HAPPINESS + ld [sBoxMon1Happiness], a +.SkipBoxMonFriendBall: + call CloseSRAM + + ld hl, Text_AskNicknameNewlyCaughtMon + call PrintText + + ld a, [CurPartySpecies] + ld [wd265], a + call GetPokemonName + + call YesNoBox + jr c, .SkipBoxMonNickname + + xor a + ld [CurPartyMon], a + ld a, BOXMON + ld [MonType], a + ld de, wMonOrItemNameBuffer + ld b, $0 + callba NamingScreen + + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + + ld hl, wMonOrItemNameBuffer + ld de, sBoxMonNicknames + ld bc, PKMN_NAME_LENGTH + call CopyBytes + + ld hl, sBoxMonNicknames + ld de, StringBuffer1 + call InitName + + call CloseSRAM + +.SkipBoxMonNickname: + ld a, BANK(sBoxMonNicknames) + call GetSRAMBank + + ld hl, sBoxMonNicknames + ld de, wMonOrItemNameBuffer + ld bc, PKMN_NAME_LENGTH + call CopyBytes + + call CloseSRAM + + ld hl, Text_SentToBillsPC + call PrintText + + call RotateThreePalettesRight + call LoadStandardFont + jr .return_from_capture + +.catch_bug_contest_mon + callba BugContest_SetCaughtContestMon + jr .return_from_capture + +.FinishTutorial: + ld hl, Text_GotchaMonWasCaught + +.shake_and_break_free + call PrintText + call ClearSprites + +.return_from_capture + ld a, [BattleType] + cp BATTLETYPE_TUTORIAL + ret z + cp BATTLETYPE_DEBUG + ret z + cp BATTLETYPE_CONTEST + jr z, .used_park_ball + + ld a, [wWildMon] + and a + jr z, .toss + + call ClearBGPalettes + call ClearTileMap + +.toss + ld hl, NumItems + inc a + ld [wItemQuantityChangeBuffer], a + jp TossItem + +.used_park_ball + ld hl, wParkBallsRemaining + dec [hl] + ret +; ec0a + + +BallMultiplierFunctionTable: +; table of routines that increase or decrease the catch rate based on +; which ball is used in a certain situation. + dbw ULTRA_BALL, UltraBallMultiplier + dbw GREAT_BALL, GreatBallMultiplier + dbw SAFARI_BALL, SafariBallMultiplier ; Safari Ball, leftover from RBY + dbw HEAVY_BALL, HeavyBallMultiplier + dbw LEVEL_BALL, LevelBallMultiplier + dbw LURE_BALL, LureBallMultiplier + dbw FAST_BALL, FastBallMultiplier + dbw MOON_BALL, MoonBallMultiplier + dbw LOVE_BALL, LoveBallMultiplier + dbw PARK_BALL, ParkBallMultiplier + db $ff + +UltraBallMultiplier: +; multiply catch rate by 2 + sla b + ret nc + ld b, $ff + ret + +SafariBallMultiplier: +GreatBallMultiplier: +ParkBallMultiplier: +; multiply catch rate by 1.5 + ld a, b + srl a + add b + ld b, a + ret nc + ld b, $ff + ret + +GetPokedexEntryBank: + push hl + push de + ld a, [EnemyMonSpecies] + rlca + rlca + and 3 + ld hl, .PokedexEntryBanks + ld d, 0 + ld e, a + add hl, de + ld a, [hl] + pop de + pop hl + ret + +.PokedexEntryBanks: + +GLOBAL PokedexEntries1 +GLOBAL PokedexEntries2 +GLOBAL PokedexEntries3 +GLOBAL PokedexEntries4 + + db BANK(PokedexEntries1) + db BANK(PokedexEntries2) + db BANK(PokedexEntries3) + db BANK(PokedexEntries4) + +HeavyBallMultiplier: +; subtract 20 from catch rate if weight < 102.4 kg +; else add 0 to catch rate if weight < 204.8 kg +; else add 20 to catch rate if weight < 307.2 kg +; else add 30 to catch rate if weight < 409.6 kg +; else add 40 to catch rate (never happens) + ld a, [EnemyMonSpecies] + ld hl, PokedexDataPointerTable + dec a + ld e, a + ld d, 0 + add hl, de + add hl, de + ld a, BANK(PokedexDataPointerTable) + call GetFarHalfword + +.SkipText: + call GetPokedexEntryBank + call GetFarByte + inc hl + cp "@" + jr nz, .SkipText + + call GetPokedexEntryBank + push bc + inc hl + inc hl + call GetFarHalfword + + srl h + rr l + ld b, h + ld c, l + + rept 4 + srl b + rr c + endr + call .subbc + + srl b + rr c + call .subbc + + ld a, h + pop bc + jr .compare + +.subbc + ; subtract bc from hl + push bc + ld a, b + cpl + ld b, a + ld a, c + cpl + ld c, a + inc bc + add hl, bc + pop bc + ret + +.compare + ld c, a + cp 1024 >> 8 ; 102.4 kg + jr c, .lightmon + + ld hl, .WeightsTable +.lookup + ld a, c + cp [hl] + jr c, .heavymon + inc hl + inc hl + jr .lookup + +.heavymon + inc hl + ld a, b + add [hl] + ld b, a + ret nc + ld b, $ff + ret + +.lightmon + ld a, b + sub 20 + ld b, a + ret nc + ld b, $1 + ret + +.WeightsTable: +; weight factor, boost + db 2048 >> 8, 0 + db 3072 >> 8, 20 + db 4096 >> 8, 30 + db 65280 >> 8, 40 + +LureBallMultiplier: +; multiply catch rate by 3 if this is a fishing rod battle + ld a, [BattleType] + cp BATTLETYPE_FISH + ret nz + + ld a, b + add a + jr c, .max + + add b + jr nc, .done +.max + ld a, $ff +.done + ld b, a + ret + +MoonBallMultiplier: +; This function is buggy. +; Intent: multiply catch rate by 4 if mon evolves with moon stone +; Reality: no boost + +GLOBAL EvosAttacks +GLOBAL EvosAttacksPointers + + push bc + ld a, [TempEnemyMonSpecies] + dec a + ld c, a + ld b, 0 + ld hl, EvosAttacksPointers + add hl, bc + add hl, bc + ld a, BANK(EvosAttacksPointers) + call GetFarHalfword + pop bc + + push bc + ld a, BANK(EvosAttacks) + call GetFarByte + cp EVOLVE_ITEM + pop bc + ret nz + + inc hl + inc hl + inc hl + +; Moon Stone's constant from Pokémon Red is used. +; No Pokémon evolve with Burn Heal, +; so Moon Balls always have a catch rate of 1×. + push bc + ld a, BANK(EvosAttacks) + call GetFarByte + cp MOON_STONE_RED ; BURN_HEAL + pop bc + ret nz + + sla b + jr c, .max + sla b + jr nc, .done +.max + ld b, $ff +.done + ret + +LoveBallMultiplier: +; This function is buggy. +; Intent: multiply catch rate by 8 if mons are of same species, different sex +; Reality: multiply catch rate by 8 if mons are of same species, same sex + + ; does species match? + ld a, [TempEnemyMonSpecies] + ld c, a + ld a, [TempBattleMonSpecies] + cp c + ret nz + + ; check player mon species + push bc + ld a, [TempBattleMonSpecies] + ld [CurPartySpecies], a + xor a ; PARTYMON + ld [MonType], a + ld a, [CurBattleMon] + ld [CurPartyMon], a + callba GetGender + jr c, .done1 ; no effect on genderless + + ld d, 0 ; male + jr nz, .playermale + inc d ; female +.playermale + + ; check wild mon species + push de + ld a, [TempEnemyMonSpecies] + ld [CurPartySpecies], a + ld a, WILDMON + ld [MonType], a + callba GetGender + jr c, .done2 ; no effect on genderless + + ld d, 0 ; male + jr nz, .wildmale + inc d ; female +.wildmale + + ld a, d + pop de + cp d + pop bc + ret nz ; for the intended effect, this should be "ret z" + + sla b + jr c, .max + sla b + jr c, .max + sla b + ret nc +.max + ld b, $ff + ret + +.done2 + pop de + +.done1 + pop bc + ret + +FastBallMultiplier: +; This function is buggy. +; Intent: multiply catch rate by 4 if enemy mon is in one of the three +; FleeMons tables. +; Reality: multiply catch rate by 4 if enemy mon is one of the first three in +; the first FleeMons table. + ld a, [TempEnemyMonSpecies] + ld c, a + ld hl, FleeMons + ld d, 3 + +.loop + ld a, BANK(FleeMons) + call GetFarByte + + inc hl + cp -1 + jr z, .next + cp c + jr nz, .next ; for the intended effect, this should be "jr nz, .loop" + sla b + jr c, .max + + sla b + ret nc + +.max + ld b, $ff + ret + +.next + dec d + jr nz, .loop + ret + +LevelBallMultiplier: +; multiply catch rate by 8 if player mon level / 4 > enemy mon level +; multiply catch rate by 4 if player mon level / 2 > enemy mon level +; multiply catch rate by 2 if player mon level > enemy mon level + ld a, [BattleMonLevel] + ld c, a + ld a, [EnemyMonLevel] + cp c + ret nc ; if player is lower level, we're done here + sla b + jr c, .max + + srl c + cp c + ret nc ; if player/2 is lower level, we're done here + sla b + jr c, .max + + srl c + cp c + ret nc ; if player/4 is lower level, we're done here + sla b + ret nc + +.max + ld b, $ff + ret + +; These two texts were carried over from gen 1. +; They are not used in gen 2, and are dummied out. + +Text_RBY_CatchMarowak: ; 0xedab + ; It dodged the thrown BALL! This #MON can't be caught! + text_jump UnknownText_0x1c5a5a + db "@" +; 0xedb0 + +Text_RBY_NoShake: ; 0xedb0 + ; You missed the #MON! + text_jump UnknownText_0x1c5a90 + db "@" +; 0xedb5 + +Text_NoShake: ; 0xedb5 + ; Oh no! The #MON broke free! + text_jump UnknownText_0x1c5aa6 + db "@" +; 0xedba + +Text_OneShake: ; 0xedba + ; Aww! It appeared to be caught! + text_jump UnknownText_0x1c5ac3 + db "@" +; 0xedbf + +Text_TwoShakes: ; 0xedbf + ; Aargh! Almost had it! + text_jump UnknownText_0x1c5ae3 + db "@" +; 0xedc4 + +Text_ThreeShakes: ; 0xedc4 + ; Shoot! It was so close too! + text_jump UnknownText_0x1c5afa + db "@" +; 0xedc9 + +Text_GotchaMonWasCaught: ; 0xedc9 + ; Gotcha! @ was caught!@ @ + text_jump UnknownText_0x1c5b17 + start_asm + call WaitSFX + push bc + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + ld de, MUSIC_CAPTURE + call PlayMusic + pop bc + ld hl, TextJump_Waitbutton + ret +; ede6 + +TextJump_Waitbutton: ; 0xede6 + ; @ + text_jump Text_Waitbutton_2 + db "@" +; 0xedeb + +Text_SentToBillsPC: ; 0xedeb + ; was sent to BILL's PC. + text_jump UnknownText_0x1c5b38 + db "@" +; 0xedf0 + +Text_AddedToPokedex: ; 0xedf0 + ; 's data was newly added to the #DEX.@ @ + text_jump UnknownText_0x1c5b53 + db "@" +; 0xedf5 + +Text_AskNicknameNewlyCaughtMon: ; 0xedf5 + ; Give a nickname to @ ? + text_jump UnknownText_0x1c5b7f + db "@" +; 0xedfa + +ReturnToBattle_UseBall: ; edfa (3:6dfa) + callba _ReturnToBattle_UseBall + ret + +TownMap: ; ee01 + callba PokegearMap + ret +; ee08 + + +Bicycle: ; ee08 + callba BikeFunction + ret +; ee0f + + +MoonStone: +FireStone: +Thunderstone: +WaterStone: +LeafStone: +SunStone: ; ee0f + ld b, PARTYMENUACTION_EVO_STONE + call UseItem_SelectMon + + jp c, .DecidedNotToUse + + ld a, MON_ITEM + call GetPartyParamLocation + + ld a, [hl] + cp EVERSTONE + jr z, .NoEffect + + ld a, $1 + ld [wForceEvolution], a + callba EvolvePokemon + + ld a, [wMonTriedToEvolve] + and a + jr z, .NoEffect + + jp UseDisposableItem + +.NoEffect: + call WontHaveAnyEffectMessage + +.DecidedNotToUse: + xor a + ld [wItemEffectSucceeded], a + ret +; ee3d + + +HPUp: +Protein: +Iron: +Carbos: +Calcium: ; ee3d + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + + jp c, RareCandy_StatBooster_ExitMenu + + call RareCandy_StatBooster_GetParameters + + call GetStatExpRelativePointer + + ld a, MON_STAT_EXP + call GetPartyParamLocation + + add hl, bc + ld a, [hl] + cp 100 + jr nc, NoEffectMessage + + add 10 + ld [hl], a + call UpdateStatsAfterItem + + call GetStatExpRelativePointer + + ld hl, StatStrings + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld de, StringBuffer2 + ld bc, ITEM_NAME_LENGTH + call CopyBytes + + call Play_SFX_FULL_HEAL + + ld hl, Text_StatRose + call PrintText + + ld c, HAPPINESS_USEDITEM + callba ChangeHappiness + + jp UseDisposableItem + + +NoEffectMessage: ; ee83 + ld hl, WontHaveAnyEffectText + call PrintText + jp ClearPalettes +; ee8c + + +UpdateStatsAfterItem: ; ee8c + ld a, MON_MAXHP + call GetPartyParamLocation + ld d, h + ld e, l + ld a, MON_STAT_EXP - 1 + call GetPartyParamLocation + ld b, $1 + predef_jump CalcPkmnStats +; ee9f + +RareCandy_StatBooster_ExitMenu: ; ee9f + xor a + ld [wItemEffectSucceeded], a + jp ClearPalettes +; eea6 + + +Text_StatRose: ; 0xeea6 + ; 's @ rose. + text_jump UnknownText_0x1c5b9a + db "@" +; 0xeeab + + +StatStrings: ; eeab + dw .health + dw .attack + dw .defense + dw .speed + dw .special + +.health db "HEALTH@" +.attack db "ATTACK@" +.defense db "DEFENSE@" +.speed db "SPEED@" +.special db "SPECIAL@" +; eed9 + + +GetStatExpRelativePointer: ; eed9 + ld a, [CurItem] + ld hl, Table_eeeb +.next + cp [hl] + inc hl + jr z, .got_it + inc hl + jr .next + +.got_it + ld a, [hl] + ld c, a + ld b, 0 + ret +; eeeb + +Table_eeeb: ; eeeb + db HP_UP, MON_HP_EXP - MON_STAT_EXP + db PROTEIN, MON_ATK_EXP - MON_STAT_EXP + db IRON, MON_DEF_EXP - MON_STAT_EXP + db CARBOS, MON_SPD_EXP - MON_STAT_EXP + db CALCIUM, MON_SPC_EXP - MON_STAT_EXP +; eef5 + + +RareCandy_StatBooster_GetParameters: ; eef5 + ld a, [CurPartySpecies] + ld [CurSpecies], a + ld [wd265], a + ld a, MON_LEVEL + call GetPartyParamLocation + ld a, [hl] + ld [CurPartyLevel], a + call GetBaseData + ld a, [CurPartyMon] + ld hl, PartyMonNicknames + call GetNick + ret +; 0xef14 + + +RareCandy: ; ef14 + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + + jp c, RareCandy_StatBooster_ExitMenu + + call RareCandy_StatBooster_GetParameters + + ld a, MON_LEVEL + call GetPartyParamLocation + + ld a, [hl] + cp MAX_LEVEL + jp nc, NoEffectMessage + + inc a + ld [hl], a + ld [CurPartyLevel], a + push de + ld d, a + callba CalcExpAtLevel + + pop de + ld a, MON_EXP + call GetPartyParamLocation + + ld a, [hMultiplicand] + ld [hli], a + ld a, [hMultiplicand + 1] + ld [hli], a + ld a, [hMultiplicand + 2] + ld [hl], a + + ld a, MON_MAXHP + call GetPartyParamLocation + ld a, [hli] + ld b, a + ld c, [hl] + push bc + call UpdateStatsAfterItem + + ld a, MON_MAXHP + 1 + call GetPartyParamLocation + + pop bc + ld a, [hld] + sub c + ld c, a + ld a, [hl] + sbc b + ld b, a + dec hl + ld a, [hl] + add c + ld [hld], a + ld a, [hl] + adc b + ld [hl], a + callba LevelUpHappinessMod + + ld a, PARTYMENUTEXT_LEVEL_UP + call ItemActionText + + xor a ; PARTYMON + ld [MonType], a + predef CopyPkmnToTempMon + + hlcoord 9, 0 + ld b, 10 + ld c, 9 + call TextBox + + hlcoord 11, 1 + ld bc, $0004 + predef PrintTempMonStats + + call WaitPressAorB_BlinkCursor + + xor a ; PARTYMON + ld [MonType], a + ld a, [CurPartySpecies] + ld [wd265], a + predef LearnLevelMoves + + xor a + ld [wForceEvolution], a + callba EvolvePokemon + + jp UseDisposableItem +; efad + + +HealPowder: ; efad + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + + jp c, StatusHealer_ExitMenu + + call UseStatusHealer + + cp $0 + jr nz, .asm_efc9 + ld c, HAPPINESS_BITTERPOWDER + callba ChangeHappiness + + call LooksBitterMessage + + ld a, $0 + +.asm_efc9 + jp StatusHealer_Jumptable +; efcc + + +Antidote: +BurnHeal: +IceHeal: +Awakening: +ParlyzHeal: +FullHeal: +Psncureberry: +Przcureberry: +BurntBerry: +IceBerry: +MintBerry: +Miracleberry: ; efcc + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, StatusHealer_ExitMenu + +FullyHealStatus: ; efd4 + call UseStatusHealer + jp StatusHealer_Jumptable +; efda + + +UseStatusHealer: ; efda (3:6fda) + call IsMonFainted + ld a, $1 + ret z + call GetItemHealingAction + ld a, MON_STATUS + call GetPartyParamLocation + ld a, [hl] + and c + jr nz, .good + call IsItemUsedOnConfusedMon + ld a, $1 + ret nc + ld b, PARTYMENUTEXT_HEAL_CONFUSION +.good + xor a + ld [hl], a + ld a, b + ld [PartyMenuActionText], a + call HealStatus + call Play_SFX_FULL_HEAL + call ItemActionTextWaitButton + call UseDisposableItem + ld a, $0 + ret + +IsItemUsedOnConfusedMon: ; f009 (3:7009) + call IsItemUsedOnBattleMon + jr nc, .nope + ld a, [PlayerSubStatus3] + bit SUBSTATUS_CONFUSED, a + jr z, .nope + ld a, c + cp $ff + jr nz, .nope + scf + ret + +.nope + and a + ret + +BattlemonRestoreHealth: ; f01e (3:701e) + call IsItemUsedOnBattleMon + ret nc + ld a, MON_HP + call GetPartyParamLocation + ld a, [hli] + ld [BattleMonHP], a + ld a, [hld] + ld [BattleMonHP + 1], a + ret + +HealStatus: ; f030 (3:7030) + call IsItemUsedOnBattleMon + ret nc + xor a + ld [BattleMonStatus], a + ld hl, PlayerSubStatus5 + res SUBSTATUS_TOXIC, [hl] + ld hl, PlayerSubStatus1 + res SUBSTATUS_NIGHTMARE, [hl] + call GetItemHealingAction + ld a, c + cp %11111111 + jr nz, .not_full_heal + ld hl, PlayerSubStatus3 + res SUBSTATUS_CONFUSED, [hl] +.not_full_heal + push bc + callba CalcPlayerStats + pop bc + ret + +GetItemHealingAction: ; f058 (3:7058) + push hl + ld a, [CurItem] + ld hl, .healingactions + ld bc, 3 +.next + cp [hl] + jr z, .found_it + add hl, bc + jr .next + +.found_it + inc hl + ld b, [hl] + inc hl + ld a, [hl] + ld c, a + cp %11111111 + pop hl + ret +; f071 (3:7071) + +.healingactions ; f071 +; item, party menu action text, status + db ANTIDOTE, PARTYMENUTEXT_HEAL_PSN, 1 << PSN + db BURN_HEAL, PARTYMENUTEXT_HEAL_BRN, 1 << BRN + db ICE_HEAL, PARTYMENUTEXT_HEAL_FRZ, 1 << FRZ + db AWAKENING, PARTYMENUTEXT_HEAL_SLP, SLP + db PARLYZ_HEAL, PARTYMENUTEXT_HEAL_PAR, 1 << PAR + db FULL_HEAL, PARTYMENUTEXT_HEAL_ALL, %11111111 + db FULL_RESTORE, PARTYMENUTEXT_HEAL_ALL, %11111111 + db HEAL_POWDER, PARTYMENUTEXT_HEAL_ALL, %11111111 + db PSNCUREBERRY, PARTYMENUTEXT_HEAL_PSN, 1 << PSN + db PRZCUREBERRY, PARTYMENUTEXT_HEAL_PAR, 1 << PAR + db BURNT_BERRY, PARTYMENUTEXT_HEAL_FRZ, 1 << FRZ + db ICE_BERRY, PARTYMENUTEXT_HEAL_BRN, 1 << BRN + db MINT_BERRY, PARTYMENUTEXT_HEAL_SLP, SLP + db MIRACLEBERRY, PARTYMENUTEXT_HEAL_ALL, %11111111 + db -1, 0, 0 +; f09e + +StatusHealer_Jumptable: ; f09e (3:709e) + ld hl, .dw + rst JumpTable + ret + +.dw ; f0a3 (3:70a3) + dw StatusHealer_ClearPalettes + dw StatusHealer_NoEffect + dw StatusHealer_ExitMenu + + +RevivalHerb: ; f0a9 + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, StatusHealer_ExitMenu + + call RevivePokemon + cp 0 + jr nz, .asm_f0c5 + + ld c, HAPPINESS_REVIVALHERB + callba ChangeHappiness + call LooksBitterMessage + ld a, 0 + +.asm_f0c5 + jp StatusHealer_Jumptable +; f0c8 + + +Revive: +MaxRevive: ; f0c8 + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, StatusHealer_ExitMenu + + call RevivePokemon + jp StatusHealer_Jumptable +; f0d6 + + +RevivePokemon: ; f0d6 + call IsMonFainted + ld a, 1 + ret nz + ld a, [wBattleMode] + and a + jr z, .skip_to_revive + + ld a, [CurPartyMon] + ld c, a + ld d, 0 + ld hl, wBattleParticipantsIncludingFainted + ld b, CHECK_FLAG + predef FlagPredef + ld a, c + and a + jr z, .skip_to_revive + + ld a, [CurPartyMon] + ld c, a + ld hl, wBattleParticipantsNotFainted + ld b, SET_FLAG + predef FlagPredef + +.skip_to_revive + xor a + ld [Danger], a + ld a, [CurItem] + cp REVIVE + jr z, .revive_half_hp + + call ReviveFullHP + jr .finish_revive + +.revive_half_hp + call ReviveHalfHP + +.finish_revive + call HealHP_SFX_GFX + ld a, PARTYMENUTEXT_REVIVE + ld [PartyMenuActionText], a + call ItemActionTextWaitButton + call UseDisposableItem + ld a, 0 + ret +; f128 + + +FullRestore: ; f128 + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, StatusHealer_ExitMenu + + call IsMonFainted + jp z, StatusHealer_NoEffect + + call IsMonAtFullHealth + jr c, .NotAtFullHealth + + jp FullyHealStatus + +.NotAtFullHealth: + call .FullRestore + jp StatusHealer_Jumptable +; f144 + + +.FullRestore: ; f144 + xor a + ld [Danger], a + call ReviveFullHP + ld a, MON_STATUS + call GetPartyParamLocation + xor a + ld [hli], a + ld [hl], a + call HealStatus + call BattlemonRestoreHealth + call HealHP_SFX_GFX + ld a, PARTYMENUTEXT_HEAL_HP + ld [PartyMenuActionText], a + call ItemActionTextWaitButton + call UseDisposableItem + ld a, 0 + ret +; f16a + + +BitterBerry: ; f16a + ld hl, PlayerSubStatus3 + bit SUBSTATUS_CONFUSED, [hl] + ld a, 1 + jr z, .done + + res SUBSTATUS_CONFUSED, [hl] + xor a + ld [hBattleTurn], a + call UseItemText + + ld hl, ConfusedNoMoreText + call StdBattleTextBox + + ld a, 0 + +.done + jp StatusHealer_Jumptable +; f186 + + +MaxPotion: +HyperPotion: +SuperPotion: +Potion: +FreshWater: +SodaPop: +Lemonade: +MoomooMilk: +Ragecandybar: +BerryJuice: +Berry: +GoldBerry: ; f186 + call ItemRestoreHP + jp StatusHealer_Jumptable +; f18c + + +Energypowder: ; f18c + ld c, HAPPINESS_BITTERPOWDER + jr EnergypowderEnergyRootCommon +; f190 + +EnergyRoot: ; f190 + ld c, HAPPINESS_ENERGYROOT +; f192 + +EnergypowderEnergyRootCommon: ; f192 + push bc + call ItemRestoreHP + pop bc + cp 0 + jr nz, .skip_happiness + + callba ChangeHappiness + call LooksBitterMessage + ld a, 0 + +.skip_happiness + jp StatusHealer_Jumptable +; f1a9 + + +ItemRestoreHP: ; f1a9 (3:71a9) + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + ld a, 2 + ret c + + call IsMonFainted + ld a, 1 + ret z + + call IsMonAtFullHealth + ld a, 1 + ret nc + + xor a + ld [Danger], a + call GetHealingItemAmount + call RestoreHealth + call BattlemonRestoreHealth + call HealHP_SFX_GFX + ld a, PARTYMENUTEXT_HEAL_HP + ld [PartyMenuActionText], a + call ItemActionTextWaitButton + call UseDisposableItem + ld a, 0 + ret + +HealHP_SFX_GFX: ; f1db (3:71db) + push de + ld de, SFX_POTION + call WaitPlaySFX + pop de + ld a, [CurPartyMon] + hlcoord 11, 0 + ld bc, SCREEN_WIDTH * 2 + call AddNTimes + ld a, $2 + ld [wWhichHPBar], a + predef_jump AnimateHPBar + +UseItem_SelectMon: ; f1f9 (3:71f9) + call .SelectMon + ret c + + ld a, [CurPartySpecies] + cp EGG + jr nz, .not_egg + + call CantUseOnEggMessage + scf + ret + +.not_egg + and a + ret + +.SelectMon: ; f20b (3:720b) + ld a, b + ld [PartyMenuActionText], a + push hl + push de + push bc + call ClearBGPalettes + call ChoosePkmnToUseItemOn + pop bc + pop de + pop hl + ret + +ChoosePkmnToUseItemOn: ; f21c (3:721c) + callba LoadPartyMenuGFX + callba InitPartyMenuWithCancel + callba InitPartyMenuGFX + callba WritePartyMenuTilemap + callba PrintPartyMenuText + call WaitBGMap + call SetPalettes + call DelayFrame + callba PartyMenuSelect + ret + +ItemActionText: ; f24a (3:724a) + ld [PartyMenuActionText], a + ld a, [CurPartySpecies] + push af + ld a, [CurPartyMon] + push af + push hl + push de + push bc + callba WritePartyMenuTilemap + callba PrintPartyMenuActionText + call WaitBGMap + call SetPalettes + call DelayFrame + pop bc + pop de + pop hl + pop af + ld [CurPartyMon], a + pop af + ld [CurPartySpecies], a + ret + +ItemActionTextWaitButton: ; f279 (3:7279) + xor a + ld [hBGMapMode], a + hlcoord 0, 0 + ld bc, TileMapEnd - TileMap + ld a, " " + call ByteFill + ld a, [PartyMenuActionText] + call ItemActionText + ld a, $1 + ld [hBGMapMode], a + ld c, 50 + call DelayFrames + jp WaitPressAorB_BlinkCursor + +StatusHealer_NoEffect: ; f299 (3:7299) + call WontHaveAnyEffectMessage + jr StatusHealer_ClearPalettes + +StatusHealer_ExitMenu: ; f29e (3:729e) + xor a + ld [wItemEffectSucceeded], a +StatusHealer_ClearPalettes: ; f2a2 (3:72a2) + call ClearPalettes + ret + +IsItemUsedOnBattleMon: ; f2a6 (3:72a6) + ld a, [wBattleMode] + and a + ret z + ld a, [CurPartyMon] + push hl + ld hl, CurBattleMon + cp [hl] + pop hl + jr nz, .nope + scf + ret + +.nope + xor a + ret + +ReviveHalfHP: ; f2ba (3:72ba) + call LoadHPFromBuffer1 + srl d + rr e + jr ContinueRevive + +ReviveFullHP: ; f2c3 (3:72c3) + call LoadHPFromBuffer1 +ContinueRevive: ; f2c6 (3:72c6) + ld a, MON_HP + call GetPartyParamLocation + ld [hl], d + inc hl + ld [hl], e + jp LoadCurHPIntoBuffer5 + +RestoreHealth: ; f2d1 (3:72d1) + ld a, MON_HP + 1 + call GetPartyParamLocation + ld a, [hl] + add e + ld [hld], a + ld a, [hl] + adc d + ld [hl], a + jr c, .full_hp + call LoadCurHPIntoBuffer5 + ld a, MON_HP + 1 + call GetPartyParamLocation + ld d, h + ld e, l + ld a, MON_MAXHP + 1 + call GetPartyParamLocation + ld a, [de] + sub [hl] + dec de + dec hl + ld a, [de] + sbc [hl] + jr c, .finish +.full_hp + call ReviveFullHP +.finish + ret + +RemoveHP: ; f2f9 (3:72f9) + ld a, MON_HP + 1 + call GetPartyParamLocation + ld a, [hl] + sub e + ld [hld], a + ld a, [hl] + sbc d + ld [hl], a + jr nc, .okay + xor a + ld [hld], a + ld [hl], a +.okay + call LoadCurHPIntoBuffer5 + ret + +IsMonFainted: ; f30d (3:730d) + push de + call LoadMaxHPToBuffer1 + call LoadCurHPToBuffer3 + call LoadHPFromBuffer3 + ld a, d + or e + pop de + ret + +IsMonAtFullHealth: ; f31b (3:731b) + call LoadHPFromBuffer3 + ld h, d + ld l, e + call LoadHPFromBuffer1 + ld a, l + sub e + ld a, h + sbc d + ret + +LoadCurHPIntoBuffer5: ; f328 (3:7328) + ld a, MON_HP + call GetPartyParamLocation + ld a, [hli] + ld [Buffer6], a + ld a, [hl] + ld [Buffer5], a + ret +; f336 (3:7336) + +LoadHPIntoBuffer5: ; f336 + ld a, d + ld [Buffer6], a + ld a, e + ld [Buffer5], a + ret +; f33f + +LoadHPFromBuffer5: ; f33f + ld a, [Buffer6] + ld d, a + ld a, [Buffer5] + ld e, a + ret +; f348 + +LoadCurHPToBuffer3: ; f348 (3:7348) + ld a, MON_HP + call GetPartyParamLocation + ld a, [hli] + ld [Buffer4], a + ld a, [hl] + ld [Buffer3], a + ret + +LoadHPFromBuffer3: ; f356 (3:7356) + ld a, [Buffer4] + ld d, a + ld a, [Buffer3] + ld e, a + ret + +LoadMaxHPToBuffer1: ; f35f (3:735f) + push hl + ld a, MON_MAXHP + call GetPartyParamLocation + ld a, [hli] + ld [Buffer2], a + ld a, [hl] + ld [Buffer1], a + pop hl + ret + +LoadHPFromBuffer1: ; f36f (3:736f) + ld a, [Buffer2] + ld d, a + ld a, [Buffer1] + ld e, a + ret + +GetOneFifthMaxHP: ; f378 (3:7378) + push bc + ld a, MON_MAXHP + call GetPartyParamLocation + ld a, [hli] + ld [hDividend + 0], a + ld a, [hl] + ld [hDividend + 1], a + ld a, 5 + ld [hDivisor], a + ld b, 2 + call Divide + ld a, [hQuotient + 1] + ld d, a + ld a, [hQuotient + 2] + ld e, a + pop bc + ret + +GetHealingItemAmount: ; f395 (3:7395) + push hl + ld a, [CurItem] + ld hl, .Healing + ld d, a +.next + ld a, [hli] + cp -1 + jr z, .NotFound + cp d + jr z, .done + inc hl + inc hl + jr .next + +.NotFound: + scf +.done + ld e, [hl] + inc hl + ld d, [hl] + pop hl + ret +; f3af (3:73af) + +.Healing: ; f3af + dbw FRESH_WATER, 50 + dbw SODA_POP, 60 + dbw LEMONADE, 80 + dbw HYPER_POTION, 200 + dbw SUPER_POTION, 50 + dbw POTION, 20 + dbw MAX_POTION, 999 + dbw FULL_RESTORE, 999 + dbw MOOMOO_MILK, 100 + dbw BERRY, 10 + dbw GOLD_BERRY, 30 + dbw ENERGYPOWDER, 50 + dbw ENERGY_ROOT, 200 + dbw RAGECANDYBAR, 20 + dbw BERRY_JUICE, 20 + dbw -1, 0 +; f3df + +Softboiled_MilkDrinkFunction: ; f3df (3:73df) +; Softboiled/Milk Drink in the field + ld a, [wPartyMenuCursor] + dec a + ld b, a + call .SelectMilkDrinkRecipient ; select pokemon + jr c, .skip + ld a, b + ld [CurPartyMon], a + call IsMonFainted + call GetOneFifthMaxHP + call RemoveHP + push bc + call HealHP_SFX_GFX + pop bc + call GetOneFifthMaxHP + ld a, c + ld [CurPartyMon], a + call IsMonFainted + call RestoreHealth + call HealHP_SFX_GFX + ld a, PARTYMENUTEXT_HEAL_HP + call ItemActionText + call JoyWaitAorB +.skip + ld a, b + inc a + ld [wPartyMenuCursor], a + ret + +.SelectMilkDrinkRecipient: ; f419 (3:7419) +.loop + push bc + ld a, PARTYMENUACTION_HEALING_ITEM + ld [PartyMenuActionText], a + call ChoosePkmnToUseItemOn + pop bc + jr c, .set_carry + ld a, [wPartyMenuCursor] + dec a + ld c, a + ld a, b + cp c + jr z, .cant_use ; chose the same mon as user + ld a, c + ld [CurPartyMon], a + call IsMonFainted + jr z, .cant_use + call IsMonAtFullHealth + jr nc, .cant_use + xor a + ret + +.set_carry + scf + ret + +.cant_use + push bc + ld hl, .Text_CantBeUsed + call MenuTextBoxBackup + pop bc + jr .loop +; f44a (3:744a) + +.Text_CantBeUsed: ; 0xf44a + ; That can't be used on this #MON. + text_jump UnknownText_0x1c5bac + db "@" +; 0xf44f + + +EscapeRope: ; f44f + xor a + ld [wItemEffectSucceeded], a + callba EscapeRopeFunction + + ld a, [wItemEffectSucceeded] + cp 1 + call z, UseDisposableItem + ret +; f462 + + +SuperRepel: ; f462 + ld b, 200 + jr UseRepel +; f466 + +MaxRepel: ; f466 + ld b, 250 + jr UseRepel +; f466 + +Repel: ; f46a + ld b, 100 +; f46c + +UseRepel: ; f46c + ld a, [wRepelEffect] + and a + ld hl, TextJump_RepelUsedEarlierIsStillInEffect + jp nz, PrintText + + ld a, b + ld [wRepelEffect], a + jp UseItemText + + +TextJump_RepelUsedEarlierIsStillInEffect: ; 0xf47d + ; The REPEL used earlier is still in effect. + text_jump Text_RepelUsedEarlierIsStillInEffect + db "@" +; 0xf482 + + +XAccuracy: ; f482 + ld hl, PlayerSubStatus4 + bit SUBSTATUS_X_ACCURACY, [hl] + jp nz, WontHaveAnyEffect_NotUsedMessage + set SUBSTATUS_X_ACCURACY, [hl] + jp UseItemText +; f48f + + +PokeDoll: ; f48f + ld a, [wBattleMode] + dec a + jr nz, .asm_f4a6 + inc a + ld [wForcedSwitch], a + ld a, [wBattleResult] + and 3 << 6 + or $2 + ld [wBattleResult], a + jp UseItemText + +.asm_f4a6 + xor a + ld [wItemEffectSucceeded], a + ret +; f4ab + + +GuardSpec: ; f4ab + ld hl, PlayerSubStatus4 + bit SUBSTATUS_MIST, [hl] + jp nz, WontHaveAnyEffect_NotUsedMessage + set SUBSTATUS_MIST, [hl] + jp UseItemText +; f4b8 + + +DireHit: ; f4b8 + ld hl, PlayerSubStatus4 + bit SUBSTATUS_FOCUS_ENERGY, [hl] + jp nz, WontHaveAnyEffect_NotUsedMessage + set SUBSTATUS_FOCUS_ENERGY, [hl] + jp UseItemText +; f4c5 + + +XAttack: +XDefend: +XSpeed: +XSpecial: ; f4c5 + call UseItemText + + ld a, [CurItem] + ld hl, .x_item_table + +.loop + cp [hl] + jr z, .got_it + inc hl + inc hl + jr .loop + +.got_it + inc hl + ld b, [hl] + xor a + ld [hBattleTurn], a + ld [AttackMissed], a + ld [EffectFailed], a + callba CheckIfStatCanBeRaised + call WaitSFX + + callba BattleCommand_StatUpMessage + callba BattleCommand_StatUpFailText + + ld a, [CurBattleMon] + ld [CurPartyMon], a + ld c, HAPPINESS_USEDXITEM + callba ChangeHappiness + ret +; f504 + +.x_item_table ; f504 + db X_ATTACK, ATTACK + db X_DEFEND, DEFENSE + db X_SPEED, SPEED + db X_SPECIAL, SP_ATTACK +; f50c + + +PokeFlute: ; f50c + ld a, [wBattleMode] + and a + jr nz, .dummy +.dummy + + xor a + ld [wd002], a + + ld b, $ff ^ SLP + + ld hl, PartyMon1Status + call .CureSleep + + ld a, [wBattleMode] + cp WILD_BATTLE + jr z, .skip_otrainer + ld hl, OTPartyMon1Status + call .CureSleep +.skip_otrainer + + ld hl, BattleMonStatus + ld a, [hl] + and b + ld [hl], a + ld hl, EnemyMonStatus + ld a, [hl] + and b + ld [hl], a + + ld a, [wd002] + and a + ld hl, .CatchyTune + jp z, PrintText + ld hl, .PlayedTheFlute + call PrintText + + ld a, [Danger] + and 1 << DANGER_ON_F + jr nz, .dummy2 +.dummy2 + ld hl, .AllSleepingMonWokeUp + jp PrintText + + +.CureSleep: + ld de, PARTYMON_STRUCT_LENGTH + ld c, PARTY_LENGTH + +.loop + ld a, [hl] + push af + and SLP + jr z, .not_asleep + ld a, 1 + ld [wd002], a +.not_asleep + pop af + and b + ld [hl], a + add hl, de + dec c + jr nz, .loop + ret +; f56c + + +.CatchyTune: ; 0xf56c + ; Played the # FLUTE. Now, that's a catchy tune! + text_jump UnknownText_0x1c5bf9 + db "@" +; 0xf571 + +.AllSleepingMonWokeUp: ; 0xf571 + ; All sleeping #MON woke up. + text_jump UnknownText_0x1c5c28 + db "@" +; 0xf576 + +.PlayedTheFlute: ; 0xf576 + ; played the # FLUTE.@ @ + text_jump UnknownText_0x1c5c44 + start_asm + ld a, [wBattleMode] + and a + jr nz, .battle + + push de + ld de, SFX_POKEFLUTE + call WaitPlaySFX + call WaitSFX + pop de + +.battle + jp PokeFluteTerminatorCharacter +; f58f + + +BlueCard: ; f58f + ld hl, .bluecardtext + jp MenuTextBoxWaitButton + +.bluecardtext + text_jump UnknownText_0x1c5c5e + db "@" +; f59a + + +CoinCase: ; f59a + ld hl, .coincasetext + jp MenuTextBoxWaitButton + +.coincasetext + text_jump UnknownText_0x1c5c7b + db "@" +; f5a5 + + +OldRod: ; f5a5 + ld e, $0 + jr UseRod +; f5a9 + +GoodRod: ; f5a9 + ld e, $1 + jr UseRod +; f5ad + +SuperRod: ; f5ad + ld e, $2 + jr UseRod +; f5b1 + +UseRod: ; f5b1 + callba FishFunction + ret +; f5b8 + + +Itemfinder: ; f5b8 + callba ItemFinder + ret +; f5bf + + +MaxElixer: +PPUp: +Ether: +MaxEther: +Elixer: +Mysteryberry: ; f5bf + ld a, [CurItem] + ld [wd002], a + +.loop + ; Party Screen opens to choose on which Pkmn to use the Item + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, PPRestoreItem_Cancel + +.loop2 + ld a, [wd002] + cp MAX_ELIXER + jp z, Elixer_RestorePPofAllMoves + cp ELIXER + jp z, Elixer_RestorePPofAllMoves + + ld hl, TextJump_RaiseThePPOfWhichMove + ld a, [wd002] + cp PP_UP + jr z, .ppup + ld hl, TextJump_RestoreThePPOfWhichMove + +.ppup + call PrintText + + ld a, [CurMoveNum] + push af + xor a + ld [CurMoveNum], a + ld a, $2 + ld [wMoveSelectionMenuType], a + callba MoveSelectionScreen + pop bc + + ld a, b + ld [CurMoveNum], a + jr nz, .loop + ld hl, PartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + call GetMthMoveOfNthPartymon + + push hl + ld a, [hl] + ld [wd265], a + call GetMoveName + call CopyName1 + pop hl + + ld a, [wd002] + cp PP_UP + jp nz, Not_PP_Up + + ld a, [hl] + cp SKETCH + jr z, .CantUsePPUpOnSketch + + ld bc, $0015 + add hl, bc + ld a, [hl] + cp 3 << 6 ; have 3 PP Ups already been used? + jr c, .do_ppup + +.CantUsePPUpOnSketch: +.pp_is_maxed_out + ld hl, TextJump_PPIsMaxedOut + call PrintText + jr .loop2 + +.do_ppup + ld a, [hl] + add 1 << 6 ; increase PP Up count by 1 + ld [hl], a + ld a, $1 + ld [wd265], a + call ApplyPPUp + call Play_SFX_FULL_HEAL + + ld hl, TextJump_PPsIncreased + call PrintText + +FinishPPRestore: ; f64c + call ClearPalettes + jp UseDisposableItem +; f652 + +BattleRestorePP: ; f652 + ld a, [wBattleMode] + and a + jr z, .not_in_battle + ld a, [CurPartyMon] + ld b, a + ld a, [CurBattleMon] + cp b + jr nz, .not_in_battle + ld a, [PlayerSubStatus5] + bit SUBSTATUS_TRANSFORMED, a + jr nz, .not_in_battle + call .UpdateBattleMonPP + +.not_in_battle + call Play_SFX_FULL_HEAL + ld hl, UnknownText_0xf739 + call PrintText + jr FinishPPRestore + +.UpdateBattleMonPP: + ld a, [CurPartyMon] + ld hl, PartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld de, BattleMonMoves + ld b, NUM_MOVES +.loop + ld a, [de] + and a + jr z, .done + cp [hl] + jr nz, .next + push hl + push de + push bc + rept NUM_MOVES + 2 ; BattleMonPP - BattleMonMoves + inc de + endr + ld bc, MON_PP - MON_MOVES + add hl, bc + ld a, [hl] + ld [de], a + pop bc + pop de + pop hl + +.next + inc hl + inc de + dec b + jr nz, .loop + +.done + ret +; f6a7 + +Not_PP_Up: ; f6a7 + call RestorePP + jr nz, BattleRestorePP + jp PPRestoreItem_NoEffect +; f6af + +Elixer_RestorePPofAllMoves: ; f6af + xor a + ld hl, wMenuCursorY + ld [hli], a + ld [hl], a + ld b, NUM_MOVES +.moveLoop + push bc + ld hl, PartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + call GetMthMoveOfNthPartymon + ld a, [hl] + and a + jr z, .next + + call RestorePP + jr z, .next + ld hl, wMenuCursorX + inc [hl] + +.next + ld hl, wMenuCursorY + inc [hl] + pop bc + dec b + jr nz, .moveLoop + ld a, [wMenuCursorX] + and a + jp nz, BattleRestorePP + +PPRestoreItem_NoEffect: ; f6dd + call WontHaveAnyEffectMessage + +PPRestoreItem_Cancel: ; f6e0 + call ClearPalettes + xor a + ld [wItemEffectSucceeded], a + ret +; f6e8 + +RestorePP: ; f6e8 + xor a ; PARTYMON + ld [MonType], a + call GetMaxPPOfMove + ld hl, PartyMon1PP + ld bc, PARTYMON_STRUCT_LENGTH + call GetMthMoveOfNthPartymon + ld a, [wd265] + ld b, a + ld a, [hl] + and (1 << 6) - 1 + cp b + jr nc, .dont_restore + + ld a, [wd002] + cp MAX_ELIXER + jr z, .restore_all + cp MAX_ETHER + jr z, .restore_all + + ld c, 5 + cp MYSTERYBERRY + jr z, .restore_some + + ld c, 10 + +.restore_some + ld a, [hl] + and (1 << 6) - 1 + add c + cp b + jr nc, .restore_all + ld b, a + +.restore_all + ld a, [hl] + and 3 << 6 + or b + ld [hl], a + ret + +.dont_restore + xor a + ret +; f725 + +TextJump_RaiseThePPOfWhichMove: ; 0xf725 + ; Raise the PP of which move? + text_jump Text_RaiseThePPOfWhichMove + db "@" +; 0xf72a + +TextJump_RestoreThePPOfWhichMove: ; 0xf72a + ; Restore the PP of which move? + text_jump Text_RestoreThePPOfWhichMove + db "@" +; 0xf72f + +TextJump_PPIsMaxedOut: ; 0xf72f + ; 's PP is maxed out. + text_jump Text_PPIsMaxedOut + db "@" +; 0xf734 + +TextJump_PPsIncreased: ; 0xf734 + ; 's PP increased. + text_jump Text_PPsIncreased + db "@" +; 0xf739 + +UnknownText_0xf739: ; 0xf739 + ; PP was restored. + text_jump UnknownText_0x1c5cf1 + db "@" +; 0xf73e + + +Squirtbottle: ; f73e + callba _Squirtbottle + ret +; f745 + + +CardKey: ; f745 + callba _CardKey + ret +; f74c + + +BasementKey: ; f74c + callba _BasementKey + ret +; f753 + + +SacredAsh: ; f753 + callba _SacredAsh + ld a, [wItemEffectSucceeded] + cp $1 + ret nz + call UseDisposableItem + ret +; f763 + + +NormalBox: ; f763 + ld c, DECOFLAG_SILVER_TROPHY_DOLL + jr OpenBox +; f767 + +GorgeousBox: ; f767 + ld c, DECOFLAG_GOLD_TROPHY_DOLL +OpenBox: ; f769 + callba SetSpecificDecorationFlag + + ld hl, .text + call PrintText + + jp UseDisposableItem +; f778 + +.text ; 0xf778 + ; There was a trophy inside! + text_jump UnknownText_0x1c5d03 + db "@" +; 0xf77d + +Brightpowder: +Item19: +LuckyPunch: +MetalPowder: +Nugget: +Item2D: +Item32: +ExpShare: +SilverLeaf: +RedScale: +Secretpotion: +SSTicket: +MysteryEgg: +ClearBell: +SilverWing: +QuickClaw: +GoldLeaf: +SoftSand: +SharpBeak: +PoisonBarb: +KingsRock: +RedApricorn: +Tinymushroom: +BigMushroom: +Silverpowder: +BluApricorn: +Item5A: +AmuletCoin: +YlwApricorn: +GrnApricorn: +CleanseTag: +MysticWater: +Twistedspoon: +WhtApricorn: +Blackbelt: +BlkApricorn: +Item64: +PnkApricorn: +Blackglasses: +Slowpoketail: +PinkBow: +Stick: +SmokeBall: +Nevermeltice: +Magnet: +Pearl: +BigPearl: +Everstone: +SpellTag: +GsBall: +MiracleSeed: +ThickClub: +FocusBand: +Item78: +HardStone: +LuckyEgg: +MachinePart: +EggTicket: +LostItem: +Stardust: +StarPiece: +Pass: +Item87: +Item88: +Item89: +Charcoal: +ScopeLens: +Item8D: +Item8E: +MetalCoat: +DragonFang: +Item91: +Leftovers: +Item93: +Item94: +Item95: +DragonScale: +BerserkGene: +Item99: +Item9A: +Item9B: +FlowerMail: +ItemA2: +LightBall: +PolkadotBow: +ItemAB: +UpGrade: +ItemB0: +RainbowWing: +ItemB3: +TeruSama: ; f77d + jp IsntTheTimeMessage +; f780 + + +Play_SFX_FULL_HEAL: ; f780 + push de + ld de, SFX_FULL_HEAL + call WaitPlaySFX + pop de + ret +; f789 + +UseItemText: ; f789 + ld hl, UsedItemText + call PrintText + call Play_SFX_FULL_HEAL + call WaitPressAorB_BlinkCursor +UseDisposableItem: ; f795 + ld hl, NumItems + ld a, 1 + ld [wItemQuantityChangeBuffer], a + jp TossItem +; f7a0 + +UseBallInTrainerBattle: ; f7a0 + call ReturnToBattle_UseBall + ld de, ANIM_THROW_POKE_BALL + ld a, e + ld [FXAnimID], a + ld a, d + ld [FXAnimID + 1], a + xor a + ld [wBattleAnimParam], a + ld [hBattleTurn], a + ld [wNumHits], a + predef PlayBattleAnim + ld hl, BlockedTheBallText + call PrintText + ld hl, DontBeAThiefText + call PrintText + jr UseDisposableItem +; f7ca + +WontHaveAnyEffect_NotUsedMessage: ; f7ca + ld hl, WontHaveAnyEffectText + call PrintText + + ; Item wasn't used. + ld a, $2 + ld [wItemEffectSucceeded], a + ret +; f7d6 + +LooksBitterMessage: ; f7d6 + ld hl, LooksBitterText + jp PrintText +; f7dc + +Ball_BoxIsFullMessage: ; f7dc + ld hl, Ball_BoxIsFullText + call PrintText + + ; Item wasn't used. + ld a, $2 + ld [wItemEffectSucceeded], a + ret +; f7e8 + +CantUseOnEggMessage: ; f7e8 + ld hl, CantUseOnEggText + jr CantUseItemMessage + +IsntTheTimeMessage: ; f7ed + ld hl, IsntTheTimeText + jr CantUseItemMessage + +WontHaveAnyEffectMessage: ; f7f2 + ld hl, WontHaveAnyEffectText + jr CantUseItemMessage + +BelongsToSomeoneElseMessage: ; f7f7 + ld hl, BelongsToSomeoneElseText + jr CantUseItemMessage + +CyclingIsntAllowedMessage: ; f7fc + ld hl, CyclingIsntAllowedText + jr CantUseItemMessage + +CantGetOnYourBikeMessage: ; f801 + ld hl, CantGetOnYourBikeText + +CantUseItemMessage: ; f804 +; Item couldn't be used. + xor a + ld [wItemEffectSucceeded], a + jp PrintText +; f80b + +LooksBitterText: ; 0xf80b + ; It looks bitter… + text_jump UnknownText_0x1c5d3e + db "@" +; 0xf810 + +CantUseOnEggText: ; 0xf810 + ; That can't be used on an EGG. + text_jump UnknownText_0x1c5d50 + db "@" +; 0xf815 + +IsntTheTimeText: ; 0xf815 + ; OAK: ! This isn't the time to use that! + text_jump UnknownText_0x1c5d6e + db "@" +; 0xf81a + +BelongsToSomeoneElseText: ; 0xf81a + ; That belongs to someone else! + text_jump UnknownText_0x1c5d97 + db "@" +; 0xf81f + +WontHaveAnyEffectText: ; 0xf81f + ; It won't have any effect. + text_jump UnknownText_0x1c5db6 + db "@" +; 0xf824 + +BlockedTheBallText: ; 0xf824 + ; The trainer blocked the BALL! + text_jump UnknownText_0x1c5dd0 + db "@" +; 0xf829 + +DontBeAThiefText: ; 0xf829 + ; Don't be a thief! + text_jump UnknownText_0x1c5def + db "@" +; 0xf82e + +CyclingIsntAllowedText: ; 0xf82e + ; Cycling isn't allowed here. + text_jump UnknownText_0x1c5e01 + db "@" +; 0xf833 + +CantGetOnYourBikeText: ; 0xf833 + ; Can't get on your @ now. + text_jump UnknownText_0x1c5e1d + db "@" +; 0xf838 + +Ball_BoxIsFullText: ; 0xf838 + ; The #MON BOX is full. That can't be used now. + text_jump UnknownText_0x1c5e3a + db "@" +; 0xf83d + +UsedItemText: ; 0xf83d + ; used the@ . + text_jump UnknownText_0x1c5e68 + db "@" +; 0xf842 + +GotOnTheItemText: ; 0xf842 + ; got on the@ . + text_jump UnknownText_0x1c5e7b + db "@" +; 0xf847 + +GotOffTheItemText: ; 0xf847 + ; got off@ the @ . + text_jump UnknownText_0x1c5e90 + db "@" +; 0xf84c + + +ApplyPPUp: ; f84c + ld a, MON_MOVES + call GetPartyParamLocation + push hl + ld de, Buffer1 + predef FillPP + pop hl + ld bc, MON_PP - MON_MOVES + add hl, bc + ld de, Buffer1 + ld b, 0 +.loop + inc b + ld a, b + cp NUM_MOVES + 1 + ret z + ld a, [wd265] + dec a + jr nz, .use + ld a, [wMenuCursorY] + inc a + cp b + jr nz, .skip + +.use + ld a, [hl] + and 3 << 6 + ld a, [de] ; wasted cycle + call nz, ComputeMaxPP + +.skip + inc hl + inc de + jr .loop +; f881 + + + +ComputeMaxPP: ; f881 + push bc + ; Divide the base PP by 5. + ld a, [de] + ld [hDividend + 3], a + xor a + ld [hDividend], a + ld [hDividend + 1], a + ld [hDividend + 2], a + ld a, 5 + ld [hDivisor], a + ld b, 4 + call Divide + ; Get the number of PP, which are bits 6 and 7 of the PP value stored in RAM. + ld a, [hl] + ld b, a + swap a + and $f + srl a + srl a + ld c, a + ; If this value is 0, we are done + and a + jr z, .NoPPUp + +.loop + ; Normally, a move with 40 PP would have 64 PP with three PP Ups. + ; Since this would overflow into bit 6, we prevent that from happening + ; by decreasing the extra amount of PP each PP Up provides, resulting + ; in a maximum of 61. + ld a, [hQuotient + 2] + cp $8 + jr c, .okay + ld a, $7 + +.okay + add b + ld b, a + ld a, [wd265] + dec a + jr z, .NoPPUp + dec c + jr nz, .loop + +.NoPPUp: + ld [hl], b + pop bc + ret +; f8b9 + +RestoreAllPP: ; f8b9 + ld a, MON_PP + call GetPartyParamLocation + push hl + ld a, MON_MOVES + call GetPartyParamLocation + pop de + xor a ; PARTYMON + ld [wMenuCursorY], a + ld [MonType], a + ld c, NUM_MOVES +.loop + ld a, [hli] + and a + ret z + push hl + push de + push bc + call GetMaxPPOfMove + pop bc + pop de + ld a, [de] + and 3 << 6 + ld b, a + ld a, [wd265] + add b + ld [de], a + inc de + ld hl, wMenuCursorY + inc [hl] + pop hl + dec c + jr nz, .loop + ret +; f8ec + + +GetMaxPPOfMove: ; f8ec + ld a, [StringBuffer1 + 0] + push af + ld a, [StringBuffer1 + 1] + push af + + ld a, [MonType] + and a + + ld hl, PartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + jr z, .got_partymon ; PARTYMON + + ld hl, OTPartyMon1Moves + dec a + jr z, .got_partymon ; OTPARTYMON + + ld hl, TempMonMoves + dec a + jr z, .got_nonpartymon ; BOXMON + + ld hl, TempMonMoves ; Wasted cycles + dec a + jr z, .got_nonpartymon ; TEMPMON + + ld hl, BattleMonMoves ; WILDMON + +.got_nonpartymon ; BOXMON, TEMPMON, WILDMON + call GetMthMoveOfCurrentMon + jr .gotdatmove + +.got_partymon ; PARTYMON, OTPARTYMON + call GetMthMoveOfNthPartymon + +.gotdatmove + ld a, [hl] + dec a + + push hl + ld hl, Moves + MOVE_PP + ld bc, MOVE_LENGTH + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + ld b, a + ld de, StringBuffer1 + ld [de], a + pop hl + + push bc + ld bc, MON_PP - MON_MOVES + ld a, [MonType] + cp WILDMON + jr nz, .notwild + ld bc, EnemyMonPP - EnemyMonMoves +.notwild + add hl, bc + ld a, [hl] + and 3 << 6 + pop bc + + or b + ld hl, StringBuffer1 + 1 + ld [hl], a + xor a + ld [wd265], a + ld a, b ; this gets lost anyway + call ComputeMaxPP + ld a, [hl] + and (1 << 6) - 1 + ld [wd265], a + + pop af + ld [StringBuffer1 + 1], a + pop af + ld [StringBuffer1 + 0], a + ret +; f963 + +GetMthMoveOfNthPartymon: ; f963 + ld a, [CurPartyMon] + call AddNTimes + +GetMthMoveOfCurrentMon: ; f969 + ld a, [wMenuCursorY] + ld c, a + ld b, 0 + add hl, bc + ret +; f971 + +INCLUDE "engine/pokeball_wobble.asm" diff --git a/engine/knows_move.asm b/engine/knows_move.asm new file mode 100644 index 000000000..4ec3da347 --- /dev/null +++ b/engine/knows_move.asm @@ -0,0 +1,25 @@ +KnowsMove: ; f9ea + ld a, MON_MOVES + call GetPartyParamLocation + ld a, [wPutativeTMHMMove] + ld b, a + ld c, NUM_MOVES +.loop + ld a, [hli] + cp b + jr z, .knows_move + dec c + jr nz, .loop + and a + ret + +.knows_move + ld hl, .Text_knows + call PrintText + scf + ret + +.Text_knows: ; 0xfa06 + ; knows @ . + text_jump UnknownText_0x1c5ea8 + db "@" diff --git a/engine/landmarks.asm b/engine/landmarks.asm index 5e904eae8..75605bbd9 100644 --- a/engine/landmarks.asm +++ b/engine/landmarks.asm @@ -47,7 +47,7 @@ GetLandmarkName:: ; 0x1ca8a5 ; 0x1ca8c3 -INCLUDE "data/landmarks.asm" +INCLUDE "data/maps/landmarks.asm" RegionCheck: ; 0x1caea1 diff --git a/engine/link.asm b/engine/link.asm index 7bca8b891..619d5bae3 100755 --- a/engine/link.asm +++ b/engine/link.asm @@ -2034,7 +2034,7 @@ Function28f09: ; 28f09 ret ; 28f24 -INCLUDE "engine/trade/animation.asm" +INCLUDE "engine/trade_animation.asm" Special_CheckTimeCapsuleCompatibility: ; 29bfb ; Checks to see if your Party is compatible with the generation 1 games. Returns the following in ScriptVar: @@ -2577,7 +2577,18 @@ Special_CableClubCheckWhichChris: ; 29f47 ret ; 29f54 -GFX_29f54: ; 29f54 +UnusedGen1LinkCommsBorderGFX: ; 29f54 ; unreferenced -INCBIN "gfx/unknown/unused_border.2bpp" +INCBIN "gfx/trade/unused_gen_1_border_tiles.2bpp" ; 29fe4 + +Function29fe4: ; unreferenced + ld a, BANK(sPartyMail) + call GetSRAMBank + ld d, $0 + ld b, CHECK_FLAG + predef FlagPredef + call CloseSRAM + ld a, c + and a + ret diff --git a/engine/map_objects.asm b/engine/map_objects.asm index 162ea22df..4b8adb75f 100644 --- a/engine/map_objects.asm +++ b/engine/map_objects.asm @@ -1,7 +1,5 @@ - INCLUDE "data/facings.asm" - INCLUDE "data/map_objects.asm" diff --git a/engine/map_objects_2.asm b/engine/map_objects_2.asm new file mode 100644 index 000000000..3c9a9773c --- /dev/null +++ b/engine/map_objects_2.asm @@ -0,0 +1,70 @@ +LoadObjectMasks: ; 2454f + ld hl, wObjectMasks + xor a + ld bc, NUM_OBJECTS + call ByteFill + nop + ld bc, MapObjects + ld de, wObjectMasks + xor a +.loop + push af + push bc + push de + call GetObjectTimeMask + jr c, .next + call CheckObjectFlag +.next + pop de + ld [de], a + inc de + pop bc + ld hl, OBJECT_LENGTH + add hl, bc + ld b, h + ld c, l + pop af + inc a + cp NUM_OBJECTS + jr nz, .loop + ret + +CheckObjectFlag: ; 2457d (9:457d) + ld hl, MAPOBJECT_SPRITE + add hl, bc + ld a, [hl] + and a + jr z, .masked + ld hl, MAPOBJECT_EVENT_FLAG + add hl, bc + ld a, [hli] + ld e, a + ld a, [hl] + ld d, a + cp -1 + jr nz, .check + ld a, e + cp -1 + jr z, .unmasked + jr .masked +.check + ld b, CHECK_FLAG + call EventFlagAction + ld a, c + and a + jr nz, .masked +.unmasked + xor a + ret + +.masked + ld a, -1 + scf + ret + +GetObjectTimeMask: ; 245a7 (9:45a7) + call CheckObjectTime + ld a, -1 + ret c + xor a + ret diff --git a/engine/map_palettes.asm b/engine/map_palettes.asm new file mode 100644 index 000000000..ffeef7bf6 --- /dev/null +++ b/engine/map_palettes.asm @@ -0,0 +1,86 @@ +SwapTextboxPalettes:: ; 4c000 + hlcoord 0, 0 + decoord 0, 0, AttrMap + ld b, SCREEN_HEIGHT +.loop + push bc + ld c, SCREEN_WIDTH +.innerloop + ld a, [hl] + push hl + srl a + jr c, .UpperNybble + ld hl, TilesetPalettes + add [hl] + ld l, a + ld a, [TilesetPalettes + 1] + adc $0 + ld h, a + ld a, [hl] + and $f + jr .next + +.UpperNybble: + ld hl, TilesetPalettes + add [hl] + ld l, a + ld a, [TilesetPalettes + 1] + adc $0 + ld h, a + ld a, [hl] + swap a + and $f + +.next + pop hl + ld [de], a + res 7, [hl] + inc hl + inc de + dec c + jr nz, .innerloop + pop bc + dec b + jr nz, .loop + ret + +ScrollBGMapPalettes:: ; 4c03f + ld hl, BGMapBuffer + ld de, BGMapPalBuffer +.loop + ld a, [hl] + push hl + srl a + jr c, .UpperNybble + +; .LowerNybble + ld hl, TilesetPalettes + add [hl] + ld l, a + ld a, [TilesetPalettes + 1] + adc $0 + ld h, a + ld a, [hl] + and $f + jr .next + +.UpperNybble: + ld hl, TilesetPalettes + add [hl] + ld l, a + ld a, [TilesetPalettes + 1] + adc $0 + ld h, a + ld a, [hl] + swap a + and $f + +.next + pop hl + ld [de], a + res 7, [hl] + inc hl + inc de + dec c + jr nz, .loop + ret diff --git a/engine/map_setup.asm b/engine/map_setup.asm index 5de4f30da..72fe9c07f 100644 --- a/engine/map_setup.asm +++ b/engine/map_setup.asm @@ -356,7 +356,7 @@ CheckReplaceKrisSprite: ; 154f7 ld a, [PlayerState] cp PLAYER_NORMAL jr z, .nope - cp PLAYER_SLIP + cp PLAYER_SKATE jr z, .nope cp PLAYER_SURF jr z, .surfing diff --git a/engine/mart.asm b/engine/mart.asm index 6bcec4c55..b091c9ef1 100755 --- a/engine/mart.asm +++ b/engine/mart.asm @@ -99,23 +99,7 @@ RooftopSale: ; 15ac4 ret ; 15aee -RooftopSaleData1: ; 15aee - db 5 - dbw POKE_BALL, 150 - dbw GREAT_BALL, 500 - dbw SUPER_POTION, 500 - dbw FULL_HEAL, 500 - dbw REVIVE, 1200 - db -1 -RooftopSaleData2: ; 15aff - db 5 - dbw HYPER_POTION, 1000 - dbw FULL_RESTORE, 2000 - dbw FULL_HEAL, 500 - dbw ULTRA_BALL, 1000 - dbw PROTEIN, 7800 - db -1 -; 15b10 +INCLUDE "data/items/rooftop_sale.asm" LoadMartPointer: ; 15b10 ld a, b @@ -355,15 +339,7 @@ ReadMart: ; 15c25 ret ; 15c51 -BargainShopData: ; 15c51 - db 5 - dbw NUGGET, 4500 - dbw PEARL, 650 - dbw BIG_PEARL, 3500 - dbw STARDUST, 900 - dbw STAR_PIECE, 4600 - db -1 -; 15c62 +INCLUDE "data/items/bargain_shop.asm" BuyMenu: ; 15c62 diff --git a/engine/menu_2.asm b/engine/menu_2.asm new file mode 100644 index 000000000..13568f3c5 --- /dev/null +++ b/engine/menu_2.asm @@ -0,0 +1,263 @@ +PlaceMenuItemName: ; 0x24ab4 + push de + ld a, [MenuSelection] + ld [wNamedObjectIndexBuffer], a + call GetItemName + pop hl + call PlaceString + ret + +PlaceMenuItemQuantity: ; 0x24ac3 + push de + ld a, [MenuSelection] + ld [CurItem], a + callba _CheckTossableItem + ld a, [wItemAttributeParamBuffer] + pop hl + and a + jr nz, .done + ld de, $15 + add hl, de + ld [hl], "×" + inc hl + ld de, MenuSelectionQuantity + lb bc, 1, 2 + call PrintNum + +.done + ret + +PlaceMoneyTopRight: ; 24ae8 + ld hl, MenuDataHeader_0x24b15 + call CopyMenuDataHeader + jr PlaceMoneyDataHeader + +PlaceMoneyBottomLeft: ; 24af0 + ld hl, MenuDataHeader_0x24b1d + call CopyMenuDataHeader + jr PlaceMoneyDataHeader + +PlaceMoneyAtTopLeftOfTextbox: ; 24af8 + ld hl, MenuDataHeader_0x24b15 + lb de, 0, 11 + call OffsetMenuDataHeader + +PlaceMoneyDataHeader: ; 24b01 + call MenuBox + call MenuBoxCoord2Tile + ld de, SCREEN_WIDTH + 1 + add hl, de + ld de, Money + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + ret + +MenuDataHeader_0x24b15: ; 0x24b15 + db $40 ; flags + db 00, 11 ; start coords + db 02, 19 ; end coords + dw NULL + db 1 ; default option + +MenuDataHeader_0x24b1d: ; 0x24b1d + db $40 ; flags + db 11, 00 ; start coords + db 13, 08 ; end coords + dw NULL + db 1 ; default option + +Special_DisplayCoinCaseBalance: ; 24b25 + ; Place a text box of size 1x7 at 11, 0. + hlcoord 11, 0 + ld b, 1 + ld c, 7 + call TextBox + hlcoord 12, 0 + ld de, CoinString + call PlaceString + hlcoord 17, 1 + ld de, ShowMoney_TerminatorString + call PlaceString + ld de, Coins + lb bc, 2, 4 + hlcoord 13, 1 + call PrintNum + ret + +Special_DisplayMoneyAndCoinBalance: ; 24b4e + hlcoord 5, 0 + ld b, 3 + ld c, 13 + call TextBox + hlcoord 6, 1 + ld de, MoneyString + call PlaceString + hlcoord 12, 1 + ld de, Money + lb bc, PRINTNUM_MONEY | 3, 6 + call PrintNum + hlcoord 6, 3 + ld de, CoinString + call PlaceString + hlcoord 15, 3 + ld de, Coins + lb bc, 2, 4 + call PrintNum + ret + +MoneyString: ; 24b83 + db "MONEY@" +CoinString: ; 24b89 + db "COIN@" +ShowMoney_TerminatorString: ; 24b8e + db "@" + +Function24b8f: ; 24b8f +; unreferenced, related to safari? + ld hl, Options + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + hlcoord 0, 0 + ld b, 3 + ld c, 7 + call TextBox + hlcoord 1, 1 + ld de, wSafariTimeRemaining + lb bc, 2, 3 + call PrintNum + hlcoord 4, 1 + ld de, .slash_500 + call PlaceString + hlcoord 1, 3 + ld de, .booru_ko + call PlaceString + hlcoord 5, 3 + ld de, wSafariBallsRemaining + lb bc, 1, 2 + call PrintNum + pop af + ld [Options], a + ret + +.slash_500 ; 24bcf + db "/500@" +.booru_ko ; 24bd4 + db "ボール こ@" + +StartMenu_DrawBugContestStatusBox: ; 24bdc + hlcoord 0, 0 + ld b, 5 + ld c, 17 + call TextBox + ret + +StartMenu_PrintBugContestStatus: ; 24be7 + ld hl, Options + ld a, [hl] + push af + set NO_TEXT_SCROLL, [hl] + call StartMenu_DrawBugContestStatusBox + hlcoord 1, 5 + ld de, .Balls_EN + call PlaceString + hlcoord 8, 5 + ld de, wParkBallsRemaining + lb bc, PRINTNUM_RIGHTALIGN | 1, 2 + call PrintNum + hlcoord 1, 1 + ld de, .CAUGHT + call PlaceString + ld a, [wContestMon] + and a + ld de, .None + jr z, .no_contest_mon + ld [wd265], a + call GetPokemonName + +.no_contest_mon + hlcoord 8, 1 + call PlaceString + ld a, [wContestMon] + and a + jr z, .skip_level + hlcoord 1, 3 + ld de, .LEVEL + call PlaceString + ld a, [wContestMonLevel] + ld h, b + ld l, c + inc hl + ld c, 3 + call Print8BitNumRightAlign + +.skip_level + pop af + ld [Options], a + ret + +.Balls_JP: ; 24c43 + db "ボール こ@" +.CAUGHT: ; 24c4b + db "CAUGHT@" +.Balls_EN: ; 24c52 + db "BALLS:@" +.None: ; 24c59 + db "None@" +.LEVEL: ; 24c5e + db "LEVEL@" + +FindApricornsInBag: ; 24c64 +; Checks the bag for Apricorns. + ld hl, Buffer1 + xor a + ld [hli], a + dec a + ld bc, 10 + call ByteFill + + ld hl, .ApricornBalls +.loop + ld a, [hl] + cp -1 + jr z, .done + push hl + ld [CurItem], a + ld hl, NumItems + call CheckItem + pop hl + jr nc, .nope + ld a, [hl] + call .addtobuffer +.nope + inc hl + inc hl + jr .loop + +.done + ld a, [Buffer1] + and a + ret nz + scf + ret + +.addtobuffer ; 24c94 + push hl + ld hl, Buffer1 + inc [hl] + ld e, [hl] + ld d, 0 + add hl, de + ld [hl], a + pop hl + ret + +.ApricornBalls: ; 24ca0 + db RED_APRICORN, LEVEL_BALL + db BLU_APRICORN, LURE_BALL + db YLW_APRICORN, MOON_BALL + db GRN_APRICORN, FRIEND_BALL + db WHT_APRICORN, FAST_BALL + db BLK_APRICORN, HEAVY_BALL + db PNK_APRICORN, LOVE_BALL + db -1 diff --git a/engine/mon_icons.asm b/engine/mon_icons.asm index 70c439863..18dc4f94b 100755 --- a/engine/mon_icons.asm +++ b/engine/mon_icons.asm @@ -466,7 +466,7 @@ ReadMonMenuIcon: ; 8eab3 ; 8eac4 -INCLUDE "data/mon_menu_icons.asm" +INCLUDE "data/pokemon/menu_icons.asm" INCLUDE "gfx/icon_pointers.asm" diff --git a/engine/mon_stats.asm b/engine/mon_stats.asm new file mode 100644 index 000000000..ec468be16 --- /dev/null +++ b/engine/mon_stats.asm @@ -0,0 +1,486 @@ +DrawPlayerHP: ; 50b0a + ld a, $1 + jr DrawHP + +DrawEnemyHP: ; 50b0e + ld a, $2 + +DrawHP: ; 50b10 + ld [wWhichHPBar], a + push hl + push bc + ; box mons have full HP + ld a, [MonType] + cp BOXMON + jr z, .at_least_1_hp + + ld a, [TempMonHP] + ld b, a + ld a, [TempMonHP + 1] + ld c, a + +; Any HP? + or b + jr nz, .at_least_1_hp + + xor a + ld c, a + ld e, a + ld a, 6 + ld d, a + jp .fainted + +.at_least_1_hp + ld a, [TempMonMaxHP] + ld d, a + ld a, [TempMonMaxHP + 1] + ld e, a + ld a, [MonType] + cp BOXMON + jr nz, .not_boxmon + + ld b, d + ld c, e + +.not_boxmon + predef ComputeHPBarPixels + ld a, 6 + ld d, a + ld c, a + +.fainted + ld a, c + pop bc + ld c, a + pop hl + push de + push hl + push hl + call DrawBattleHPBar + pop hl + +; Print HP + bccoord 1, 1, 0 + add hl, bc + ld de, TempMonHP + ld a, [MonType] + cp BOXMON + jr nz, .not_boxmon_2 + ld de, TempMonMaxHP +.not_boxmon_2 + lb bc, 2, 3 + call PrintNum + + ld a, "/" + ld [hli], a + +; Print max HP + ld de, TempMonMaxHP + lb bc, 2, 3 + call PrintNum + pop hl + pop de + ret + +PrintTempMonStats: ; 50b7b +; Print TempMon's stats at hl, with spacing bc. + push bc + push hl + ld de, .StatNames + call PlaceString + pop hl + pop bc + add hl, bc + ld bc, SCREEN_WIDTH + add hl, bc + ld de, TempMonAttack + lb bc, 2, 3 + call .PrintStat + ld de, TempMonDefense + call .PrintStat + ld de, TempMonSpclAtk + call .PrintStat + ld de, TempMonSpclDef + call .PrintStat + ld de, TempMonSpeed + jp PrintNum + +.PrintStat: ; 50bab + push hl + call PrintNum + pop hl + ld de, SCREEN_WIDTH * 2 + add hl, de + ret + +.StatNames: ; 50bb5 + db "ATTACK" + next "DEFENSE" + next "SPCL.ATK" + next "SPCL.DEF" + next "SPEED" + next "@" + +GetGender: ; 50bdd +; Return the gender of a given monster (CurPartyMon/CurOTMon/CurWildMon). +; When calling this function, a should be set to an appropriate MonType value. + +; return values: +; a = 1: f = nc|nz; male +; a = 0: f = nc|z; female +; f = c: genderless + +; This is determined by comparing the Attack and Speed DVs +; with the species' gender ratio. + +; Figure out what type of monster struct we're looking at. + +; 0: PartyMon + ld hl, PartyMon1DVs + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [MonType] + and a + jr z, .PartyMon + +; 1: OTPartyMon + ld hl, OTPartyMon1DVs + dec a + jr z, .PartyMon + +; 2: sBoxMon + ld hl, sBoxMon1DVs + ld bc, BOXMON_STRUCT_LENGTH + dec a + jr z, .sBoxMon + +; 3: Unknown + ld hl, TempMonDVs + dec a + jr z, .DVs + +; else: WildMon + ld hl, EnemyMonDVs + jr .DVs + +; Get our place in the party/box. + +.PartyMon: +.sBoxMon + ld a, [CurPartyMon] + call AddNTimes + +.DVs: + +; sBoxMon data is read directly from SRAM. + ld a, [MonType] + cp BOXMON + ld a, 1 + call z, GetSRAMBank + +; Attack DV + ld a, [hli] + and $f0 + ld b, a +; Speed DV + ld a, [hl] + and $f0 + swap a + +; Put our DVs together. + or b + ld b, a + +; Close SRAM if we were dealing with a sBoxMon. + ld a, [MonType] + cp BOXMON + call z, CloseSRAM + +; We need the gender ratio to do anything with this. + push bc + ld a, [CurPartySpecies] + dec a + ld hl, BaseData + BASE_GENDER + ld bc, BASE_DATA_SIZE + call AddNTimes + pop bc + + ld a, BANK(BaseData) + call GetFarByte + +; The higher the ratio, the more likely the monster is to be female. + + cp GENDERLESS + jr z, .Genderless + + and a ; GENDER_F0? + jr z, .Male + + cp GENDER_F100 + jr z, .Female + +; Values below the ratio are male, and vice versa. + cp b + jr c, .Male + +.Female: + xor a + ret + +.Male: + ld a, 1 + and a + ret + +.Genderless: + scf + ret + +ListMovePP: ; 50c50 + ld a, [wNumMoves] + inc a + ld c, a + ld a, NUM_MOVES + sub c + ld b, a + push hl + ld a, [Buffer1] + ld e, a + ld d, $0 + ld a, $3e ; P + call .load_loop + ld a, b + and a + jr z, .skip + ld c, a + ld a, "-" + call .load_loop + +.skip + pop hl + inc hl + inc hl + inc hl + ld d, h + ld e, l + ld hl, TempMonMoves + ld b, 0 +.loop + ld a, [hli] + and a + jr z, .done + push bc + push hl + push de + ld hl, wMenuCursorY + ld a, [hl] + push af + ld [hl], b + push hl + callab GetMaxPPOfMove + pop hl + pop af + ld [hl], a + pop de + pop hl + push hl + ld bc, TempMonPP - (TempMonMoves + 1) + add hl, bc + ld a, [hl] + and $3f + ld [StringBuffer1 + 4], a + ld h, d + ld l, e + push hl + ld de, StringBuffer1 + 4 + lb bc, 1, 2 + call PrintNum + ld a, "/" + ld [hli], a + ld de, wd265 + lb bc, 1, 2 + call PrintNum + pop hl + ld a, [Buffer1] + ld e, a + ld d, 0 + add hl, de + ld d, h + ld e, l + pop hl + pop bc + inc b + ld a, b + cp NUM_MOVES + jr nz, .loop + +.done + ret + +.load_loop ; 50cc9 + ld [hli], a + ld [hld], a + add hl, de + dec c + jr nz, .load_loop + ret + +Function50cd0: ; 50cd0 +; XXX +.loop + ld [hl], $32 + inc hl + ld [hl], $3e + dec hl + add hl, de + dec c + jr nz, .loop + ret + +Predef22: ; unreferenced predef + push hl + push hl + ld hl, PartyMonNicknames + ld a, [CurPartyMon] + call GetNick + pop hl + call PlaceString + call CopyPkmnToTempMon + pop hl + ld a, [CurPartySpecies] + cp EGG + jr z, .egg + push hl + ld bc, -12 + add hl, bc + ld b, $0 + call DrawEnemyHP + pop hl + ld bc, 5 + add hl, bc + push de + call PrintLevel + pop de + +.egg + ret + +PlaceStatusString: ; 50d0a + push de + inc de + inc de + ld a, [de] + ld b, a + inc de + ld a, [de] + or b + pop de + jr nz, PlaceNonFaintStatus + push de + ld de, FntString + call CopyStatusString + pop de + ld a, $1 + and a + ret + +FntString: ; 50d22 + db "FNT@" + +CopyStatusString: ; 50d25 + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + ld [hl], a + ret + +PlaceNonFaintStatus: ; 50d2e + push de + ld a, [de] + ld de, PsnString + bit PSN, a + jr nz, .place + ld de, BrnString + bit BRN, a + jr nz, .place + ld de, FrzString + bit FRZ, a + jr nz, .place + ld de, ParString + bit PAR, a + jr nz, .place + ld de, SlpString + and SLP + jr z, .no_status + +.place + call CopyStatusString + ld a, $1 + and a + +.no_status + pop de + ret + +SlpString: db "SLP@" +PsnString: db "PSN@" +BrnString: db "BRN@" +FrzString: db "FRZ@" +ParString: db "PAR@" + +ListMoves: ; 50d6f +; List moves at hl, spaced every [Buffer1] tiles. + ld de, wListMoves_MoveIndicesBuffer + ld b, $0 +.moves_loop + ld a, [de] + inc de + and a + jr z, .no_more_moves + push de + push hl + push hl + ld [CurSpecies], a + ld a, MOVE_NAME + ld [wNamedObjectTypeBuffer], a + call GetName + ld de, StringBuffer1 + pop hl + push bc + call PlaceString + pop bc + ld a, b + ld [wNumMoves], a + inc b + pop hl + push bc + ld a, [Buffer1] + ld c, a + ld b, 0 + add hl, bc + pop bc + pop de + ld a, b + cp NUM_MOVES + jr z, .done + jr .moves_loop + +.no_more_moves + ld a, b +.nonmove_loop + push af + ld [hl], "-" + ld a, [Buffer1] + ld c, a + ld b, 0 + add hl, bc + pop af + inc a + cp NUM_MOVES + jr nz, .nonmove_loop + +.done + ret diff --git a/engine/mysterygift.asm b/engine/mystery_gift.asm index 8204ab332..8204ab332 100755 --- a/engine/mysterygift.asm +++ b/engine/mystery_gift.asm diff --git a/engine/mysterygift2.asm b/engine/mystery_gift_2.asm index dc0baf39c..dc0baf39c 100755 --- a/engine/mysterygift2.asm +++ b/engine/mystery_gift_2.asm diff --git a/engine/new_pokedex_entry.asm b/engine/new_pokedex_entry.asm new file mode 100644 index 000000000..012052530 --- /dev/null +++ b/engine/new_pokedex_entry.asm @@ -0,0 +1,52 @@ +NewPokedexEntry: ; fb877 + ld a, [hMapAnims] + push af + xor a + ld [hMapAnims], a + call LowVolume + call ClearBGPalettes + call ClearTileMap + call UpdateSprites + call ClearSprites + ld a, [wPokedexStatus] + push af + ld a, [hSCX] + add $5 + ld [hSCX], a + xor a + ld [wPokedexStatus], a + callba _NewPokedexEntry + call WaitPressAorB_BlinkCursor + ld a, $1 + ld [wPokedexStatus], a + callba DisplayDexEntry + call WaitPressAorB_BlinkCursor + pop af + ld [wPokedexStatus], a + call MaxVolume + call RotateThreePalettesRight + ld a, [hSCX] + add -5 ; 251 ; NUM_POKEMON + ld [hSCX], a + call .ReturnFromDexRegistration + pop af + ld [hMapAnims], a + ret +; fb8c8 + +.ReturnFromDexRegistration: ; fb8c8 + call ClearTileMap + call LoadFontsExtra + call LoadStandardFont + callba Pokedex_PlaceFrontpicTopLeftCorner + call WaitBGMap2 + callba GetEnemyMonDVs + ld a, [hli] + ld [TempMonDVs], a + ld a, [hl] + ld [TempMonDVs + 1], a + ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + call SetPalettes + ret +; fb8f1 diff --git a/engine/npc_movement.asm b/engine/npc_movement.asm index 9a18cdcb1..e102cc554 100755 --- a/engine/npc_movement.asm +++ b/engine/npc_movement.asm @@ -7,7 +7,8 @@ Function6ec1: ; 6ec1 ld hl, OBJECT_FLAGS1 add hl, bc - bit 4, [hl] ; lost + bit 4, [hl] ; lost, uncomment next line to fix +; jr nz, .resume push hl push bc call Function6f2c diff --git a/engine/overworld.asm b/engine/overworld.asm index 73115e479..a085d1d5a 100755 --- a/engine/overworld.asm +++ b/engine/overworld.asm @@ -389,8 +389,8 @@ AddSpriteGFX: ; 142e5 LoadSpriteGFX: ; 14306 -; Bug: b is not preserved, so -; it's useless as a next count. +; Bug: b is not preserved, so it's useless as a next count. +; Uncomment the lines below to fix. ld hl, UsedSprites ld b, SPRITE_GFX_LIST_CAPACITY @@ -409,7 +409,9 @@ LoadSpriteGFX: ; 14306 ret .LoadSprite: + ; push bc call GetSprite + ; pop bc ld a, l ret ; 1431e @@ -721,6 +723,6 @@ INCLUDE "data/emote_headers.asm" INCLUDE "data/sprite_mons.asm" -INCLUDE "data/outdoor_sprites.asm" +INCLUDE "data/maps/outdoor_sprites.asm" INCLUDE "gfx/sprite_headers.asm" diff --git a/engine/pack.asm b/engine/pack.asm index e10b70e12..858548771 100644 --- a/engine/pack.asm +++ b/engine/pack.asm @@ -1315,10 +1315,10 @@ DrawPackGFX: ; 1089d ; 108cc PackGFXPointers: ; 108cc - dw PackGFX + $f0 * 1 - dw PackGFX + $f0 * 3 - dw PackGFX + $f0 * 0 - dw PackGFX + $f0 * 2 + dw PackGFX + (15 tiles) * 1 + dw PackGFX + (15 tiles) * 3 + dw PackGFX + (15 tiles) * 0 + dw PackGFX + (15 tiles) * 2 ; 108d4 Pack_InterpretJoypad: ; 108d4 (4:48d4) diff --git a/engine/pack_f.asm b/engine/pack_f.asm new file mode 100644 index 000000000..f71e43db8 --- /dev/null +++ b/engine/pack_f.asm @@ -0,0 +1,20 @@ +DrawKrisPackGFX: ; 48e81 + ld hl, PackFGFXPointers + add hl, de + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + ld hl, VTiles2 tile $50 + lb bc, BANK(PackFGFX), 15 + call Request2bpp + ret + +PackFGFXPointers: ; 48e93 + dw PackFGFX + (15 tiles) * 1 + dw PackFGFX + (15 tiles) * 3 + dw PackFGFX + (15 tiles) * 0 + dw PackFGFX + (15 tiles) * 2 + +PackFGFX: ; 48e9b +INCBIN "gfx/pack/pack_f.2bpp" diff --git a/engine/place_graphics.asm b/engine/place_graphics.asm new file mode 100644 index 000000000..d72364776 --- /dev/null +++ b/engine/place_graphics.asm @@ -0,0 +1,56 @@ +PlaceGraphic: ; 2ef6e +; Fill wBoxAlignment-aligned box width b height c +; with iterating tile starting from hGraphicStartTile at hl. +; Predef $13 + + ld de, SCREEN_WIDTH + + ld a, [wBoxAlignment] + and a + jr nz, .right + + ld a, [hGraphicStartTile] +.x1 + push bc + push hl + +.y1 + ld [hl], a + add hl, de + inc a + dec c + jr nz, .y1 + + pop hl + inc hl + pop bc + dec b + jr nz, .x1 + ret + +.right +; Right-aligned. + push bc + ld b, 0 + dec c + add hl, bc + pop bc + + ld a, [hGraphicStartTile] +.x2 + push bc + push hl + +.y2 + ld [hl], a + add hl, de + inc a + dec c + jr nz, .y2 + + pop hl + dec hl + pop bc + dec b + jr nz, .x2 + ret diff --git a/engine/play_slow_cry.asm b/engine/play_slow_cry.asm new file mode 100644 index 000000000..322fd21cc --- /dev/null +++ b/engine/play_slow_cry.asm @@ -0,0 +1,31 @@ +PlaySlowCry: ; fb841 + ld a, [ScriptVar] + call LoadCryHeader + jr c, .done + + ld hl, CryPitch + ld a, [hli] + ld h, [hl] + ld l, a + ld bc, -$140 + add hl, bc + ld a, l + ld [CryPitch], a + ld a, h + ld [CryPitch + 1], a + ld hl, CryLength + ld a, [hli] + ld h, [hl] + ld l, a + ld bc, $60 + add hl, bc + ld a, l + ld [CryLength], a + ld a, h + ld [CryLength + 1], a + callba _PlayCryHeader + call WaitSFX + +.done + ret +; fb877 diff --git a/engine/player_gfx.asm b/engine/player_gfx.asm new file mode 100644 index 000000000..1af444d73 --- /dev/null +++ b/engine/player_gfx.asm @@ -0,0 +1,263 @@ +Function88248: ; 88248 +; XXX + ld c, CAL + ld a, [PlayerGender] + bit 0, a + jr z, .okay + ld c, KAREN + +.okay + ld a, c + ld [TrainerClass], a + ret + +MovePlayerPicRight: ; 88258 + hlcoord 6, 4 + ld de, 1 + jr MovePlayerPic + +MovePlayerPicLeft: ; 88260 + hlcoord 13, 4 + ld de, -1 + ; fallthrough + +MovePlayerPic: ; 88266 +; Move player pic at hl by de * 7 tiles. + ld c, $8 +.loop + push bc + push hl + push de + xor a + ld [hBGMapMode], a + lb bc, 7, 7 + predef PlaceGraphic + xor a + ld [hBGMapThird], a + call WaitBGMap + call DelayFrame + pop de + pop hl + add hl, de + pop bc + dec c + ret z + push hl + push bc + ld a, l + sub e + ld l, a + ld a, h + sbc d + ld h, a + lb bc, 7, 7 + call ClearBox + pop bc + pop hl + jr .loop + +ShowPlayerNamingChoices: ; 88297 + ld hl, ChrisNameMenuHeader + ld a, [PlayerGender] + bit 0, a + jr z, .GotGender + ld hl, KrisNameMenuHeader +.GotGender: + call LoadMenuDataHeader + call VerticalMenu + ld a, [wMenuCursorY] + dec a + call CopyNameFromMenu + call CloseWindow + ret + +ChrisNameMenuHeader: ; 882b5 + db $40 ; flags + db 00, 00 ; start coords + db 11, 10 ; end coords + dw .MaleNames + db 1 ; ???? + db 0 ; default option + +.MaleNames: ; 882be + db $91 ; flags + db 5 ; items + db "NEW NAME@" +MalePlayerNameArray: ; 882c9 + db "CHRIS@" + db "MAT@" + db "ALLAN@" + db "JON@" + db 2 ; displacement + db " NAME @" ; title + +KrisNameMenuHeader: ; 882e5 + db $40 ; flags + db 00, 00 ; start coords + db 11, 10 ; end coords + dw .FemaleNames + db 1 ; ???? + db 0 ; default option + +.FemaleNames: ; 882ee + db $91 ; flags + db 5 ; items + db "NEW NAME@" +FemalePlayerNameArray: ; 882f9 + db "KRIS@" + db "AMANDA@" + db "JUANA@" + db "JODI@" + db 2 ; displacement + db " NAME @" ; title + +GetPlayerNameArray: ; 88318 This Function is never called + ld hl, PlayerName + ld de, MalePlayerNameArray + ld a, [PlayerGender] + bit 0, a + jr z, .done + ld de, FemalePlayerNameArray + +.done + call InitName + ret + +GetPlayerIcon: ; 8832c +; Get the player icon corresponding to gender + +; Male + ld de, ChrisSpriteGFX + ld b, BANK(ChrisSpriteGFX) + + ld a, [PlayerGender] + bit 0, a + jr z, .done + +; Female + ld de, KrisSpriteGFX + ld b, BANK(KrisSpriteGFX) + +.done + ret + +GetCardPic: ; 8833e + ld hl, ChrisCardPic + ld a, [PlayerGender] + bit 0, a + jr z, .GotClass + ld hl, KrisCardPic +.GotClass: + ld de, VTiles2 tile $00 + ld bc, $23 tiles + ld a, BANK(ChrisCardPic) ; BANK(KrisCardPic) + call FarCopyBytes + ld hl, CardGFX + ld de, VTiles2 tile $23 + ld bc, 6 tiles + ld a, BANK(CardGFX) + call FarCopyBytes + ret + +ChrisCardPic: ; 88365 +INCBIN "gfx/trainer_card/chris_card.2bpp" + +KrisCardPic: ; 88595 +INCBIN "gfx/trainer_card/kris_card.2bpp" + +CardGFX: ; 887c5 +INCBIN "gfx/trainer_card/trainer_card.2bpp" + +GetPlayerBackpic: ; 88825 + ld a, [PlayerGender] + bit 0, a + jr z, GetChrisBackpic + call GetKrisBackpic + ret + +GetChrisBackpic: ; 88830 + ld hl, ChrisBackpic + ld b, BANK(ChrisBackpic) + ld de, VTiles2 tile $31 + ld c, 7 * 7 + predef DecompressPredef + ret + +HOF_LoadTrainerFrontpic: ; 88840 + call WaitBGMap + xor a + ld [hBGMapMode], a + ld e, 0 + ld a, [PlayerGender] + bit 0, a + jr z, .GotClass + ld e, 1 + +.GotClass: + ld a, e + ld [TrainerClass], a + ld de, ChrisPic + ld a, [PlayerGender] + bit 0, a + jr z, .GotPic + ld de, KrisPic + +.GotPic: + ld hl, VTiles2 + ld b, BANK(ChrisPic) ; BANK(KrisPic) + ld c, 7 * 7 + call Get2bpp + call WaitBGMap + ld a, $1 + ld [hBGMapMode], a + ret + +DrawIntroPlayerPic: ; 88874 +; Draw the player pic at (6,4). + +; Get class + ld e, CHRIS + ld a, [PlayerGender] + bit 0, a + jr z, .GotClass + ld e, KRIS +.GotClass: + ld a, e + ld [TrainerClass], a + +; Load pic + ld de, ChrisPic + ld a, [PlayerGender] + bit 0, a + jr z, .GotPic + ld de, KrisPic +.GotPic: + ld hl, VTiles2 + ld b, BANK(ChrisPic) ; BANK(KrisPic) + ld c, 7 * 7 ; dimensions + call Get2bpp + +; Draw + xor a + ld [hGraphicStartTile], a + hlcoord 6, 4 + lb bc, 7, 7 + predef PlaceGraphic + ret + +ChrisPic: ; 888a9 +INCBIN "gfx/player/chris.2bpp" + +KrisPic: ; 88bb9 +INCBIN "gfx/player/kris.2bpp" + +GetKrisBackpic: ; 88ec9 +; Kris's backpic is uncompressed. + ld de, KrisBackpic + ld hl, VTiles2 tile $31 + lb bc, BANK(KrisBackpic), 7 * 7 ; dimensions + call Get2bpp + ret + +KrisBackpic: ; 88ed6 +INCBIN "gfx/player/kris_back.2bpp" diff --git a/engine/player_gfx_2.asm b/engine/player_gfx_2.asm new file mode 100644 index 000000000..d6e7791a3 --- /dev/null +++ b/engine/player_gfx_2.asm @@ -0,0 +1,5 @@ +ChrisBackpic: ; 2ba1a +INCBIN "gfx/player/chris_back.2bpp.lz" + +DudeBackpic: ; 2bbaa +INCBIN "gfx/battle/dude.2bpp.lz" diff --git a/engine/player_movement.asm b/engine/player_movement.asm index 7ccb36551..34ca81fe9 100755 --- a/engine/player_movement.asm +++ b/engine/player_movement.asm @@ -42,7 +42,7 @@ DoPlayerMovement:: ; 80000 jr z, .Surf cp PLAYER_BIKE jr z, .Normal - cp PLAYER_SLIP + cp PLAYER_SKATE jr z, .Ice .Normal: @@ -409,6 +409,8 @@ DoPlayerMovement:: ; 80000 ; making bumps silent. ld a, [WalkingDirection] + ; cp STANDING + ; jr z, .not_warp ld e, a ld d, 0 ld hl, .EdgeWarps @@ -420,6 +422,7 @@ DoPlayerMovement:: ; 80000 ld a, 1 ld [wd041], a ld a, [WalkingDirection] + ; This is in the wrong place. cp STANDING jr z, .not_warp @@ -750,11 +753,10 @@ DoPlayerMovement:: ; 80000 ; 803ca .BikeCheck: ; 803ca - ld a, [PlayerState] cp PLAYER_BIKE ret z - cp PLAYER_SLIP + cp PLAYER_SKATE ret ; 803d3 @@ -824,7 +826,7 @@ CheckStandingOnIce:: ; 80404 call CheckIceTile jr nc, .yep ld a, [PlayerState] - cp PLAYER_SLIP + cp PLAYER_SKATE jr nz, .not_ice .yep diff --git a/engine/pokeball_wobble.asm b/engine/pokeball_wobble.asm new file mode 100755 index 000000000..7fb4d3e38 --- /dev/null +++ b/engine/pokeball_wobble.asm @@ -0,0 +1,88 @@ +GetPokeBallWobble: ; f971 (3:7971) +; Returns whether a Poke Ball will wobble in the catch animation. +; Whether a Pokemon is caught is determined beforehand. + + push de + + ld a, [rSVBK] + ld d, a + push de + + ld a, 1 ; BANK(Buffer2) + ld [rSVBK], a + + ld a, [Buffer2] + inc a + ld [Buffer2], a + +; Wobble up to 3 times. + cp 3 + 1 + jr z, .finished + + ld a, [wWildMon] + and a + ld c, 0 ; next + jr nz, .done + + ld hl, .WobbleProbabilities + ld a, [Buffer1] + ld b, a +.loop + ld a, [hli] + cp b + jr nc, .checkwobble + inc hl + jr .loop + +.checkwobble + ld b, [hl] + call Random + cp b + ld c, 0 ; next + jr c, .done + ld c, 2 ; escaped + jr .done + +.finished + ld a, [wWildMon] + and a + ld c, 1 ; caught + jr nz, .done + ld c, 2 ; escaped + +.done + pop de + ld e, a + ld a, d + ld [rSVBK], a + ld a, e + pop de + ret + +.WobbleProbabilities: ; f9ba +; catch rate, chance of wobbling / 255 +; nLeft/255 = (nRight/255) ** 4 + db 1, 63 + db 2, 75 + db 3, 84 + db 4, 90 + db 5, 95 + db 7, 103 + db 10, 113 + db 15, 126 + db 20, 134 + db 30, 149 + db 40, 160 + db 50, 169 + db 60, 177 + db 80, 191 + db 100, 201 + db 120, 211 + db 140, 220 + db 160, 227 + db 180, 234 + db 200, 240 + db 220, 246 + db 240, 251 + db 254, 253 + db 255, 255 diff --git a/engine/pokedex.asm b/engine/pokedex.asm index c60396a40..a7a7a4860 100644 --- a/engine/pokedex.asm +++ b/engine/pokedex.asm @@ -1709,9 +1709,9 @@ Pokedex_ABCMode: ; 40c30 ret -INCLUDE "data/pokedex/order_alpha.asm" +INCLUDE "data/pokemon/dex_order_alpha.asm" -INCLUDE "data/pokedex/order_new.asm" +INCLUDE "data/pokemon/dex_order_new.asm" Pokedex_DisplayModeDescription: ; 40e5b diff --git a/engine/pokedex_3.asm b/engine/pokedex_3.asm new file mode 100644 index 000000000..3414252c1 --- /dev/null +++ b/engine/pokedex_3.asm @@ -0,0 +1,162 @@ +LoadSGBPokedexGFX: ; 1ddf1c + ld hl, SGBPokedexGFX_LZ + ld de, VTiles2 tile $31 + call Decompress + ret + +LoadSGBPokedexGFX2: ; 1ddf26 (77:5f26) + ld hl, SGBPokedexGFX_LZ + ld de, VTiles2 tile $31 + lb bc, BANK(SGBPokedexGFX_LZ), $3a + call DecompressRequest2bpp + ret + +SGBPokedexGFX_LZ: ; 1ddf33 +INCBIN "gfx/pokedex/sgb.2bpp.lz" + +LoadQuestionMarkPic: ; 1de0d7 + ld hl, .QuestionMarkLZ + ld de, sScratch + call Decompress + ret + +.QuestionMarkLZ: ; 1de0e1 +INCBIN "gfx/pics/questionmark/front.2bpp.lz" + +DrawPokedexListWindow: ; 1de171 (77:6171) + ld a, $32 + hlcoord 0, 17 + ld bc, 12 + call ByteFill + hlcoord 0, 1 + lb bc, 15, 11 + call ClearBox + ld a, $34 + hlcoord 0, 0 + ld bc, 11 + call ByteFill + ld a, $39 + hlcoord 0, 16 + ld bc, 11 + call ByteFill + hlcoord 5, 0 + ld [hl], $3f + hlcoord 5, 16 + ld [hl], $40 + ld a, [wCurrentDexMode] + cp DEXMODE_OLD + jr z, .OldMode +; scroll bar + hlcoord 11, 0 + ld [hl], $50 + ld a, $51 + hlcoord 11, 1 + ld b, SCREEN_HEIGHT - 3 + call Bank77_FillColumn + ld [hl], $52 + jr .Done + +.OldMode: +; no scroll bar + hlcoord 11, 0 + ld [hl], $66 + ld a, $67 + hlcoord 11, 1 + ld b, SCREEN_HEIGHT - 3 + call Bank77_FillColumn + ld [hl], $68 +.Done: + ret + +DrawPokedexSearchResultsWindow: ; 1de1d1 (77:61d1) + ld a, $34 + hlcoord 0, 0 + ld bc, 11 + call ByteFill + ld a, $39 + hlcoord 0, 10 + ld bc, 11 + call ByteFill + hlcoord 5, 0 + ld [hl], $3f + hlcoord 5, 10 + ld [hl], $40 + hlcoord 11, 0 + ld [hl], $66 + ld a, $67 + hlcoord 11, 1 + ld b, SCREEN_HEIGHT / 2 + call Bank77_FillColumn + ld [hl], $68 + ld a, $34 + hlcoord 0, 11 + ld bc, 11 + call ByteFill + ld a, $39 + hlcoord 0, 17 + ld bc, 11 + call ByteFill + hlcoord 11, 11 + ld [hl], $66 + ld a, $67 + hlcoord 11, 12 + ld b, 5 + call Bank77_FillColumn + ld [hl], $68 + hlcoord 0, 12 + lb bc, 5, 11 + call ClearBox + ld de, .esults_D + hlcoord 0, 12 + call PlaceString + ret + +.esults_D ; 1de23c +; (SEARCH R) + db "ESULTS" + next "" +; (### FOUN) + next "D!@" + +DrawDexEntryScreenRightEdge: ; 1de247 + ld a, [hBGMapAddress] + ld l, a + ld a, [hBGMapAddress + 1] + ld h, a + push hl + inc hl + ld a, l + ld [hBGMapAddress], a + ld a, h + ld [hBGMapAddress + 1], a + hlcoord 19, 0 + ld [hl], $66 + hlcoord 19, 1 + ld a, $67 + ld b, 15 + call Bank77_FillColumn + ld [hl], $68 + hlcoord 19, 17 + ld [hl], $3c + xor a + ld b, SCREEN_HEIGHT + hlcoord 19, 0, AttrMap + call Bank77_FillColumn + call WaitBGMap2 + pop hl + ld a, l + ld [hBGMapAddress], a + ld a, h + ld [hBGMapAddress + 1], a + ret + +Bank77_FillColumn: ; 1de27f + push de + ld de, SCREEN_WIDTH +.loop + ld [hl], a + add hl, de + dec b + jr nz, .loop + pop de + ret diff --git a/engine/pokegear.asm b/engine/pokegear.asm index 561ece400..bf2c2b40e 100755 --- a/engine/pokegear.asm +++ b/engine/pokegear.asm @@ -2338,44 +2338,7 @@ HasVisitedSpawn: ; 91c50 ; 91c5e -Flypoints: ; 91c5e -; landmark, spawn point - const_def -flypoint: MACRO - const FLY_\1 - db \2, SPAWN_\1 -ENDM -; Johto - flypoint NEW_BARK, NEW_BARK_TOWN - flypoint CHERRYGROVE, CHERRYGROVE_CITY - flypoint VIOLET, VIOLET_CITY - flypoint AZALEA, AZALEA_TOWN - flypoint GOLDENROD, GOLDENROD_CITY - flypoint ECRUTEAK, ECRUTEAK_CITY - flypoint OLIVINE, OLIVINE_CITY - flypoint CIANWOOD, CIANWOOD_CITY - flypoint MAHOGANY, MAHOGANY_TOWN - flypoint LAKE, LAKE_OF_RAGE - flypoint BLACKTHORN, BLACKTHORN_CITY - flypoint MT_SILVER, SILVER_CAVE -; Kanto - -KANTO_FLYPOINT EQU const_value - flypoint PALLET, PALLET_TOWN - flypoint VIRIDIAN, VIRIDIAN_CITY - flypoint PEWTER, PEWTER_CITY - flypoint CERULEAN, CERULEAN_CITY - flypoint VERMILION, VERMILION_CITY - flypoint ROCK_TUNNEL, ROCK_TUNNEL - flypoint LAVENDER, LAVENDER_TOWN - flypoint CELADON, CELADON_CITY - flypoint SAFFRON, SAFFRON_CITY - flypoint FUCHSIA, FUCHSIA_CITY - flypoint CINNABAR, CINNABAR_ISLAND - flypoint INDIGO, INDIGO_PLATEAU - db -1 - -; 91c8f +INCLUDE "data/flypoints.asm" ret_91c8f: ; 91c8f ret @@ -2872,19 +2835,7 @@ TownMapPals: ; 91f13 ret .PalMap: -townmappals: MACRO -rept _NARG / 2 - dn \2, \1 - shift - shift -endr -endm - townmappals 1, 1, 1, 2, 2, 2, 0, 0, 1, 1, 3, 1, 4, 5, 4, 5 - townmappals 1, 1, 1, 2, 2, 2, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0 - townmappals 1, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 - townmappals 0, 0, 0, 0, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 - townmappals 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0 - townmappals 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0 +INCLUDE "data/palettes/town_map.asm" ; 91f7b TownMapMon: ; 91f7b diff --git a/engine/pokegear_2.asm b/engine/pokegear_2.asm new file mode 100644 index 000000000..a5cceecfd --- /dev/null +++ b/engine/pokegear_2.asm @@ -0,0 +1,25 @@ +TownMap_ConvertLineBreakCharacters: ; 1de2c5 + ld hl, StringBuffer1 +.loop + ld a, [hl] + cp "@" + jr z, .end + cp "%" + jr z, .line_break + cp "¯" + jr z, .line_break + inc hl + jr .loop + +.line_break + ld [hl], "<LNBRK>" + +.end + ld de, StringBuffer1 + hlcoord 9, 0 + call PlaceString + ret + + +PokegearGFX: ; 1de2e4 +INCBIN "gfx/pokegear/pokegear.2bpp.lz" diff --git a/engine/pokerus.asm b/engine/pokerus.asm new file mode 100644 index 000000000..3e5e094e4 --- /dev/null +++ b/engine/pokerus.asm @@ -0,0 +1,160 @@ +GivePokerusAndConvertBerries: ; 2ed44 + call ConvertBerriesToBerryJuice + ld hl, PartyMon1PokerusStatus + ld a, [PartyCount] + ld b, a + ld de, PARTYMON_STRUCT_LENGTH +; Check to see if any of your Pokemon already has Pokerus. +; If so, sample its spread through your party. +; This means that you cannot get Pokerus de novo while +; a party member has an active infection. +.loopMons + ld a, [hl] + and $f + jr nz, .TrySpreadPokerus + add hl, de + dec b + jr nz, .loopMons + +; If we haven't been to Goldenrod City at least once, +; prevent the contraction of Pokerus. + ld hl, StatusFlags2 + bit 6, [hl] + ret z + call Random + ld a, [hRandomAdd] + and a + ret nz + ld a, [hRandomSub] + cp $3 + ret nc ; 3/65536 chance (00 00, 00 01 or 00 02) + ld a, [PartyCount] + ld b, a +.randomMonSelectLoop + call Random + and $7 + cp b + jr nc, .randomMonSelectLoop + ld hl, PartyMon1PokerusStatus + call GetPartyLocation ; get pokerus byte of random mon + ld a, [hl] + and $f0 + ret nz ; if it already has pokerus, do nothing +.randomPokerusLoop ; Simultaneously sample the strain and duration + call Random + and a + jr z, .randomPokerusLoop + ld b, a + and $f0 + jr z, .load_pkrs + ld a, b + and $7 + inc a +.load_pkrs + ld b, a ; this should come before the label + swap b + and $3 + inc a + add b + ld [hl], a + ret + +.TrySpreadPokerus: + call Random + cp 1 + 33 percent + ret nc ; 1/3 chance + + ld a, [PartyCount] + cp 1 + ret z ; only one mon, nothing to do + + ld c, [hl] + ld a, b + cp 2 + jr c, .checkPreviousMonsLoop ; no more mons after this one, go backwards + + call Random + cp 1 + 50 percent + jr c, .checkPreviousMonsLoop ; 1/2 chance, go backwards +.checkFollowingMonsLoop + add hl, de + ld a, [hl] + and a + jr z, .infectMon + ld c, a + and $3 + ret z ; if mon has cured pokerus, stop searching + dec b ; go on to next mon + ld a, b + cp 1 + jr nz, .checkFollowingMonsLoop ; no more mons left + ret + +.checkPreviousMonsLoop + ld a, [PartyCount] + cp b + ret z ; no more mons + ld a, l + sub e + ld l, a + ld a, h + sbc d + ld h, a + ld a, [hl] + and a + jr z, .infectMon + ld c, a + and $3 + ret z ; if mon has cured pokerus, stop searching + inc b ; go on to next mon + jr .checkPreviousMonsLoop + +.infectMon + ld a, c + and $f0 + ld b, a + ld a, c + swap a + and $3 + inc a + add b + ld [hl], a + ret + +; any berry held by a Shuckle may be converted to berry juice +ConvertBerriesToBerryJuice: ; 2ede6 + ld hl, StatusFlags2 + bit 6, [hl] + ret z + call Random + cp $10 + ret nc ; 1/16 chance + ld hl, PartyMons + ld a, [PartyCount] +.partyMonLoop + push af + push hl + ld a, [hl] + cp SHUCKLE + jr nz, .loopMon + ld bc, MON_ITEM + add hl, bc + ld a, [hl] + cp BERRY + jr z, .convertToJuice + +.loopMon + pop hl + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop af + dec a + jr nz, .partyMonLoop + ret + +.convertToJuice + ld a, BERRY_JUICE + ld [hl], a + pop hl + pop af + ret diff --git a/engine/pokerus_tick.asm b/engine/pokerus_tick.asm new file mode 100644 index 000000000..3c97fdc5e --- /dev/null +++ b/engine/pokerus_tick.asm @@ -0,0 +1,26 @@ +ApplyPokerusTick: ; 13988 +; decreases all pokemon's pokerus counter by b. if the lower nybble reaches zero, the pokerus is cured. + ld hl, PartyMon1PokerusStatus ; PartyMon1 + MON_PKRS + ld a, [PartyCount] + and a + ret z ; make sure it's not wasting time on an empty party + ld c, a +.loop + ld a, [hl] + and $f ; lower nybble is the number of days remaining + jr z, .next ; if already 0, skip + sub b ; subtract the number of days + jr nc, .ok ; max(result, 0) + xor a +.ok + ld d, a ; back up this value because we need to preserve the strain (upper nybble) + ld a, [hl] + and $f0 + add d + ld [hl], a ; this prevents a cured pokemon from recontracting pokerus +.next + ld de, PARTYMON_STRUCT_LENGTH + add hl, de + dec c + jr nz, .loop + ret diff --git a/engine/print_party.asm b/engine/print_party.asm new file mode 100755 index 000000000..9bf98767b --- /dev/null +++ b/engine/print_party.asm @@ -0,0 +1,362 @@ +PrintPage1: ; 1dc1b0 + hlcoord 0, 0 + decoord 0, 0, wPrinterTileMapBuffer + ld bc, 17 * SCREEN_WIDTH + call CopyBytes + hlcoord 17, 1, wPrinterTileMapBuffer + ld a, $62 + ld [hli], a + inc a + ld [hl], a + hlcoord 17, 2, wPrinterTileMapBuffer + ld a, $64 + ld [hli], a + inc a + ld [hl], a + hlcoord 1, 9, wPrinterTileMapBuffer + ld a, " " + ld [hli], a + ld [hl], a + hlcoord 1, 10, wPrinterTileMapBuffer + ld a, $61 + ld [hli], a + ld [hl], a + hlcoord 2, 11, wPrinterTileMapBuffer + lb bc, 5, 18 + call ClearBox + ld a, [wd265] + dec a + call CheckCaughtMon + push af + ld a, [wd265] + ld b, a + ld c, 1 ; get page 1 + callba GetDexEntryPagePointer + pop af + ld a, b + hlcoord 1, 11, wPrinterTileMapBuffer + call nz, FarString + hlcoord 19, 0, wPrinterTileMapBuffer + ld [hl], $35 + ld de, SCREEN_WIDTH + add hl, de + ld b, $f +.column_loop + ld [hl], $37 + add hl, de + dec b + jr nz, .column_loop + ld [hl], $3a + ret +; 1dc213 + +PrintPage2: ; 1dc213 + hlcoord 0, 0, wPrinterTileMapBuffer + ld bc, 8 * SCREEN_WIDTH + ld a, " " + call ByteFill + hlcoord 0, 0, wPrinterTileMapBuffer + ld a, $36 + ld b, 6 + call .FillColumn + hlcoord 19, 0, wPrinterTileMapBuffer + ld a, $37 + ld b, 6 + call .FillColumn + hlcoord 0, 6, wPrinterTileMapBuffer + ld [hl], $38 + inc hl + ld a, $39 + ld bc, SCREEN_HEIGHT + call ByteFill + ld [hl], $3a + hlcoord 0, 7, wPrinterTileMapBuffer + ld bc, SCREEN_WIDTH + ld a, $32 + call ByteFill + ld a, [wd265] + dec a + call CheckCaughtMon + push af + ld a, [wd265] + ld b, a + ld c, 2 ; get page 2 + callba GetDexEntryPagePointer + pop af + hlcoord 1, 1, wPrinterTileMapBuffer + ld a, b + call nz, FarString + ret +; 1dc26a + +.FillColumn: ; 1dc26a + push de + ld de, SCREEN_WIDTH +.column_loop + ld [hl], a + add hl, de + dec b + jr nz, .column_loop + pop de + ret +; 1dc275 + +GBPrinterStrings: +GBPrinterString_Null: db "@" +GBPrinterString_CheckingLink: next " CHECKING LINK...@" +GBPrinterString_Transmitting: next " TRANSMITTING...@" +GBPrinterString_Printing: next " PRINTING...@" +GBPrinterString_PrinterError1: + db " Printer Error 1" + next "" + next "Check the Game Boy" + next "Printer Manual." + db "@" +GBPrinterString_PrinterError2: + db " Printer Error 2" + next "" + next "Check the Game Boy" + next "Printer Manual." + db "@" +GBPrinterString_PrinterError3: + db " Printer Error 3" + next "" + next "Check the Game Boy" + next "Printer Manual." + db "@" +GBPrinterString_PrinterError4: + db " Printer Error 4" + next "" + next "Check the Game Boy" + next "Printer Manual." + db "@" +; 1dc381 + +PrintPartyMonPage1: ; 1dc381 + call ClearBGPalettes + call ClearTileMap + call ClearSprites + xor a + ld [hBGMapMode], a + call LoadFontsBattleExtra + + ld de, GBPrinterHPIcon + ld hl, VTiles2 tile $71 + lb bc, BANK(GBPrinterHPIcon), 1 + call Request1bpp + + ld de, GBPrinterLvIcon + ld hl, VTiles2 tile $6e + lb bc, BANK(GBPrinterLvIcon), 1 + call Request1bpp + + ld de, ShinyIconGFX + ld hl, VTiles2 tile $3f + lb bc, BANK(ShinyIconGFX), 1 + call Get2bpp + + xor a + ld [MonType], a + callba CopyPkmnToTempMon + hlcoord 0, 7 + ld b, 9 + ld c, 18 + call TextBox + hlcoord 8, 2 + ld a, [TempMonLevel] + call PrintLevel_Force3Digits + hlcoord 12, 2 + ld [hl], "◀" ; Filled left triangle + inc hl + ld de, TempMonMaxHP + lb bc, 2, 3 + call PrintNum + ld a, [CurPartySpecies] + ld [wd265], a + ld [CurSpecies], a + ld hl, PartyMonNicknames + call Function1dc50e + hlcoord 8, 4 + call PlaceString + hlcoord 9, 6 + ld [hl], "/" + call GetPokemonName + hlcoord 10, 6 + call PlaceString + hlcoord 8, 0 + ld [hl], "№" + inc hl + ld [hl], "." + inc hl + ld de, wd265 + lb bc, PRINTNUM_LEADINGZEROS | 1, 3 + call PrintNum + hlcoord 1, 9 + ld de, String1dc550 + call PlaceString + ld hl, PartyMonOT + call Function1dc50e + hlcoord 4, 9 + call PlaceString + hlcoord 1, 11 + ld de, String1dc559 + call PlaceString + hlcoord 4, 11 + ld de, TempMonID + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + hlcoord 1, 14 + ld de, String1dc554 + call PlaceString + hlcoord 7, 14 + ld a, [TempMonMoves + 0] + call Function1dc51a + call Function1dc52c + ld hl, TempMonDVs + predef GetUnownLetter + ld hl, wBoxAlignment + xor a + ld [hl], a + ld a, [CurPartySpecies] + cp UNOWN + jr z, .asm_1dc469 + inc [hl] + +.asm_1dc469 + hlcoord 0, 0 + call _PrepMonFrontpic + call WaitBGMap + ld b, SCGB_STATS_SCREEN_HP_PALS + call GetSGBLayout + call SetPalettes + ret +; 1dc47b + +PrintPartyMonPage2: ; 1dc47b + call ClearBGPalettes + call ClearTileMap + call ClearSprites + xor a + ld [hBGMapMode], a + call LoadFontsBattleExtra + xor a + ld [MonType], a + callba CopyPkmnToTempMon + hlcoord 0, 0 + ld b, 15 + ld c, 18 + call TextBox + ld bc, SCREEN_WIDTH + decoord 0, 0 + hlcoord 0, 1 + call CopyBytes + hlcoord 7, 0 + ld a, [TempMonMoves + 1] + call Function1dc51a + hlcoord 7, 2 + ld a, [TempMonMoves + 2] + call Function1dc51a + hlcoord 7, 4 + ld a, [TempMonMoves + 3] + call Function1dc51a + hlcoord 7, 7 + ld de, String1dc55d + call PlaceString + hlcoord 16, 7 + ld de, TempMonAttack + call .PrintTempMonStats + hlcoord 16, 9 + ld de, TempMonDefense + call .PrintTempMonStats + hlcoord 16, 11 + ld de, TempMonSpclAtk + call .PrintTempMonStats + hlcoord 16, 13 + ld de, TempMonSpclDef + call .PrintTempMonStats + hlcoord 16, 15 + ld de, TempMonSpeed + call .PrintTempMonStats + call WaitBGMap + ld b, SCGB_STATS_SCREEN_HP_PALS + call GetSGBLayout + call SetPalettes + ret +; 1dc507 + +.PrintTempMonStats: ; 1dc507 + lb bc, 2, 3 + call PrintNum + ret +; 1dc50e + +Function1dc50e: ; 1dc50e + ld bc, NAME_LENGTH + ld a, [CurPartyMon] + call AddNTimes + ld e, l + ld d, h + ret +; 1dc51a + +Function1dc51a: ; 1dc51a + and a + jr z, .no_move + + ld [wd265], a + call GetMoveName + jr .got_string + +.no_move + ld de, String1dc584 + +.got_string + call PlaceString + ret +; 1dc52c + +Function1dc52c: ; 1dc52c + callba GetGender + ld a, " " + jr c, .got_gender + ld a, "♂" + jr nz, .got_gender + ld a, "♀" + +.got_gender + hlcoord 17, 2 + ld [hl], a + ld bc, TempMonDVs + callba CheckShininess + ret nc + hlcoord 18, 2 + ld [hl], "<SHINY>" + ret +; 1dc550 + +String1dc550: ; 1dc550 + db "OT/@" + +String1dc554: ; 1dc554 + db "MOVE@" + +String1dc559: ; 1dc559 + db "<ID>№.@" + +String1dc55d: ; 1dc55d + db "ATTACK" + next "DEFENSE" + next "SPCL.ATK" + next "SPCL.DEF" + next "SPEED" + db "@" + +String1dc584: ; 1dc584 + db "------------@" +; 1dc591 + +GBPrinterHPIcon: ; 1dc591 +INCBIN "gfx/printer/hp.1bpp" + +GBPrinterLvIcon: ; 1dc599 +INCBIN "gfx/printer/lv.1bpp" diff --git a/engine/printer.asm b/engine/printer.asm index 7dd2d4f4a..777ea9269 100755 --- a/engine/printer.asm +++ b/engine/printer.asm @@ -1,4 +1,4 @@ -INCLUDE "engine/printer/serial.asm" +INCLUDE "engine/printer_serial.asm" SendScreenToPrinter: ; 843f0 .loop diff --git a/engine/printer/serial.asm b/engine/printer_serial.asm index 6909a38b2..6909a38b2 100755 --- a/engine/printer/serial.asm +++ b/engine/printer_serial.asm diff --git a/engine/printhoursmins.asm b/engine/printhoursmins.asm new file mode 100644 index 000000000..711ff89b6 --- /dev/null +++ b/engine/printhoursmins.asm @@ -0,0 +1,64 @@ +Function1dd6a9: ; 1dd6a9 +; XXX + ld a, b + ld b, c + ld c, a + push bc + push de + ld hl, sp+$2 + ld d, h + ld e, l + pop hl + lb bc, PRINTNUM_LEADINGZEROS | 2, 5 + call PrintNum + pop bc + ret + +PrintHoursMins ; 1dd6bb (77:56bb) +; Hours in b, minutes in c + ld a, b + cp 12 + push af + jr c, .AM + jr z, .PM + sub 12 + jr .PM +.AM: + or a + jr nz, .PM + ld a, 12 +.PM: + ld b, a +; Crazy stuff happening with the stack + push bc + ld hl, sp+$1 + push de + push hl + pop de + pop hl + ld [hl], " " + lb bc, 1, 2 + call PrintNum + ld [hl], ":" + inc hl + ld d, h + ld e, l + ld hl, sp+$0 + push de + push hl + pop de + pop hl + lb bc, PRINTNUM_LEADINGZEROS | 1, 2 + call PrintNum + pop bc + ld de, String_AM + pop af + jr c, .place_am_pm + ld de, String_PM +.place_am_pm + inc hl + call PlaceString + ret + +String_AM: db "AM@" ; 1dd6fc +String_PM: db "PM@" ; 1dd6ff diff --git a/engine/prof_oaks_pc.asm b/engine/prof_oaks_pc.asm index 05ff2b691..69949940b 100755 --- a/engine/prof_oaks_pc.asm +++ b/engine/prof_oaks_pc.asm @@ -1,4 +1,3 @@ - ProfOaksPC: ; 0x265d3 ld hl, OakPCText1 call MenuTextBox @@ -100,31 +99,26 @@ endr ret OakRatings: ; 0x2667f -oakrating: MACRO - db \1 - dw \2, \3 -endm - ; if you caught at most this many, play this sound, load this text - oakrating 9, SFX_DEX_FANFARE_LESS_THAN_20, OakRating01 - oakrating 19, SFX_DEX_FANFARE_LESS_THAN_20, OakRating02 - oakrating 34, SFX_DEX_FANFARE_20_49, OakRating03 - oakrating 49, SFX_DEX_FANFARE_20_49, OakRating04 - oakrating 64, SFX_DEX_FANFARE_50_79, OakRating05 - oakrating 79, SFX_DEX_FANFARE_50_79, OakRating06 - oakrating 94, SFX_DEX_FANFARE_80_109, OakRating07 - oakrating 109, SFX_DEX_FANFARE_80_109, OakRating08 - oakrating 124, SFX_CAUGHT_MON, OakRating09 - oakrating 139, SFX_CAUGHT_MON, OakRating10 - oakrating 154, SFX_DEX_FANFARE_140_169, OakRating11 - oakrating 169, SFX_DEX_FANFARE_140_169, OakRating12 - oakrating 184, SFX_DEX_FANFARE_170_199, OakRating13 - oakrating 199, SFX_DEX_FANFARE_170_199, OakRating14 - oakrating 214, SFX_DEX_FANFARE_200_229, OakRating15 - oakrating 229, SFX_DEX_FANFARE_200_229, OakRating16 - oakrating 239, SFX_DEX_FANFARE_230_PLUS, OakRating17 - oakrating 248, SFX_DEX_FANFARE_230_PLUS, OakRating18 - oakrating 255, SFX_DEX_FANFARE_230_PLUS, OakRating19 + dbww 9, SFX_DEX_FANFARE_LESS_THAN_20, OakRating01 + dbww 19, SFX_DEX_FANFARE_LESS_THAN_20, OakRating02 + dbww 34, SFX_DEX_FANFARE_20_49, OakRating03 + dbww 49, SFX_DEX_FANFARE_20_49, OakRating04 + dbww 64, SFX_DEX_FANFARE_50_79, OakRating05 + dbww 79, SFX_DEX_FANFARE_50_79, OakRating06 + dbww 94, SFX_DEX_FANFARE_80_109, OakRating07 + dbww 109, SFX_DEX_FANFARE_80_109, OakRating08 + dbww 124, SFX_CAUGHT_MON, OakRating09 + dbww 139, SFX_CAUGHT_MON, OakRating10 + dbww 154, SFX_DEX_FANFARE_140_169, OakRating11 + dbww 169, SFX_DEX_FANFARE_140_169, OakRating12 + dbww 184, SFX_DEX_FANFARE_170_199, OakRating13 + dbww 199, SFX_DEX_FANFARE_170_199, OakRating14 + dbww 214, SFX_DEX_FANFARE_200_229, OakRating15 + dbww 229, SFX_DEX_FANFARE_200_229, OakRating16 + dbww 239, SFX_DEX_FANFARE_230_PLUS, OakRating17 + dbww 248, SFX_DEX_FANFARE_230_PLUS, OakRating18 + dbww 255, SFX_DEX_FANFARE_230_PLUS, OakRating19 OakPCText1: ; 0x266de text_jump _OakPCText1 diff --git a/engine/radio.asm b/engine/radio.asm index feded7616..58e953e55 100644 --- a/engine/radio.asm +++ b/engine/radio.asm @@ -1578,7 +1578,6 @@ BuenasPassword4: .greater_than_11 call Random maskbits NUM_PASSWORD_CATEGORIES - and x cp NUM_PASSWORD_CATEGORIES jr nc, .greater_than_11 ; Store it in the high nybble of e. diff --git a/engine/read_trainer_attributes.asm b/engine/read_trainer_attributes.asm new file mode 100644 index 000000000..dfb8d3682 --- /dev/null +++ b/engine/read_trainer_attributes.asm @@ -0,0 +1,64 @@ +GetTrainerClassName: ; 3952d + ld hl, RivalName + ld a, c + cp RIVAL1 + jr z, .rival + + ld [CurSpecies], a + ld a, TRAINER_NAME + ld [wNamedObjectTypeBuffer], a + call GetName + ld de, StringBuffer1 + ret + +.rival + ld de, StringBuffer1 + push de + ld bc, NAME_LENGTH + call CopyBytes + pop de + ret + +GetOTName: ; 39550 + ld hl, OTPlayerName + ld a, [wLinkMode] + and a + jr nz, .ok + + ld hl, RivalName + ld a, c + cp RIVAL1 + jr z, .ok + + ld [CurSpecies], a + ld a, TRAINER_NAME + ld [wNamedObjectTypeBuffer], a + call GetName + ld hl, StringBuffer1 + +.ok + ld bc, TRAINER_CLASS_NAME_LENGTH + ld de, OTClassName + push de + call CopyBytes + pop de + ret + +GetTrainerAttributes: ; 3957b + ld a, [TrainerClass] + ld c, a + call GetOTName + ld a, [TrainerClass] + dec a + ld hl, TrainerClassAttributes + TRNATTR_ITEM1 + ld bc, NUM_TRAINER_ATTRIBUTES + call AddNTimes + ld de, wEnemyTrainerItem1 + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + ld a, [hl] + ld [wEnemyTrainerBaseReward], a + ret diff --git a/engine/read_trainer_party.asm b/engine/read_trainer_party.asm new file mode 100755 index 000000000..9b7727a84 --- /dev/null +++ b/engine/read_trainer_party.asm @@ -0,0 +1,398 @@ + +ReadTrainerParty: ; 39771 + ld a, [InBattleTowerBattle] + bit 0, a + ret nz + + ld a, [wLinkMode] + and a + ret nz + + ld hl, OTPartyCount + xor a + ld [hli], a + dec a + ld [hl], a + + ld hl, OTPartyMons + ld bc, OTPartyMonsEnd - OTPartyMons + xor a + call ByteFill + + ld a, [OtherTrainerClass] + cp CAL + jr nz, .not_cal2 + ld a, [OtherTrainerID] + cp CAL2 + jr z, .cal2 + ld a, [OtherTrainerClass] +.not_cal2 + + dec a + ld c, a + ld b, 0 + ld hl, TrainerGroups + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + + ld a, [OtherTrainerID] + ld b, a +.skip_trainer + dec b + jr z, .got_trainer +.loop + ld a, [hli] + cp $ff + jr nz, .loop + jr .skip_trainer +.got_trainer + +.skip_name + ld a, [hli] + cp "@" + jr nz, .skip_name + + ld a, [hli] + ld c, a + ld b, 0 + ld d, h + ld e, l + ld hl, TrainerTypes + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld bc, .done + push bc + jp hl + +.done + jp ComputeTrainerReward + +.cal2 + ld a, BANK(sMysteryGiftTrainer) + call GetSRAMBank + ld de, sMysteryGiftTrainer + call TrainerType2 + call CloseSRAM + jr .done +; 397e3 + +TrainerTypes: ; 397e3 + dw TrainerType1 ; level, species + dw TrainerType2 ; level, species, moves + dw TrainerType3 ; level, species, item + dw TrainerType4 ; level, species, item, moves +; 397eb + +TrainerType1: ; 397eb +; normal (level, species) + ld h, d + ld l, e +.loop + ld a, [hli] + cp $ff + ret z + + ld [CurPartyLevel], a + ld a, [hli] + ld [CurPartySpecies], a + ld a, OTPARTYMON + ld [MonType], a + push hl + predef TryAddMonToParty + pop hl + jr .loop +; 39806 + +TrainerType2: ; 39806 +; moves + ld h, d + ld l, e +.loop + ld a, [hli] + cp $ff + ret z + + ld [CurPartyLevel], a + ld a, [hli] + ld [CurPartySpecies], a + ld a, OTPARTYMON + ld [MonType], a + + push hl + predef TryAddMonToParty + ld a, [OTPartyCount] + dec a + ld hl, OTPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + pop hl + + ld b, NUM_MOVES +.copy_moves + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .copy_moves + + push hl + + ld a, [OTPartyCount] + dec a + ld hl, OTPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, MON_PP + add hl, de + push hl + ld hl, MON_MOVES + add hl, de + pop de + + ld b, NUM_MOVES +.copy_pp + ld a, [hli] + and a + jr z, .copied_pp + + push hl + push bc + dec a + ld hl, Moves + MOVE_PP + ld bc, MOVE_LENGTH + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + pop bc + pop hl + + ld [de], a + inc de + dec b + jr nz, .copy_pp +.copied_pp + + pop hl + jr .loop +; 39871 + +TrainerType3: ; 39871 +; item + ld h, d + ld l, e +.loop + ld a, [hli] + cp $ff + ret z + + ld [CurPartyLevel], a + ld a, [hli] + ld [CurPartySpecies], a + ld a, OTPARTYMON + ld [MonType], a + push hl + predef TryAddMonToParty + ld a, [OTPartyCount] + dec a + ld hl, OTPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + pop hl + ld a, [hli] + ld [de], a + jr .loop +; 3989d (e:589d) + +TrainerType4: ; 3989d +; item + moves + ld h, d + ld l, e +.loop + ld a, [hli] + cp $ff + ret z + + ld [CurPartyLevel], a + ld a, [hli] + ld [CurPartySpecies], a + + ld a, OTPARTYMON + ld [MonType], a + + push hl + predef TryAddMonToParty + ld a, [OTPartyCount] + dec a + ld hl, OTPartyMon1Item + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + pop hl + + ld a, [hli] + ld [de], a + + push hl + ld a, [OTPartyCount] + dec a + ld hl, OTPartyMon1Moves + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + pop hl + + ld b, NUM_MOVES +.copy_moves + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .copy_moves + + push hl + + ld a, [OTPartyCount] + dec a + ld hl, OTPartyMon1 + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld d, h + ld e, l + ld hl, MON_PP + add hl, de + + push hl + ld hl, MON_MOVES + add hl, de + pop de + + ld b, NUM_MOVES +.copy_pp + ld a, [hli] + and a + jr z, .copied_pp + + push hl + push bc + dec a + ld hl, Moves + MOVE_PP + ld bc, MOVE_LENGTH + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + pop bc + pop hl + + ld [de], a + inc de + dec b + jr nz, .copy_pp +.copied_pp + + pop hl + jr .loop +; 3991b + +ComputeTrainerReward: ; 3991b (e:591b) + ld hl, hProduct + xor a + ld [hli], a + ld [hli], a + ld [hli], a + ld a, [wEnemyTrainerBaseReward] + ld [hli], a + ld a, [CurPartyLevel] + ld [hl], a + call Multiply + ld hl, wBattleReward + xor a + ld [hli], a + ld a, [hProduct + 2] + ld [hli], a + ld a, [hProduct + 3] + ld [hl], a + ret + + +Battle_GetTrainerName:: ; 39939 + ld a, [InBattleTowerBattle] + bit 0, a + ld hl, OTPlayerName + jp nz, CopyTrainerName + + ld a, [OtherTrainerID] + ld b, a + ld a, [OtherTrainerClass] + ld c, a + +GetTrainerName:: ; 3994c + ld a, c + cp CAL + jr nz, .not_cal2 + + ld a, BANK(sMysteryGiftTrainerHouseFlag) + call GetSRAMBank + ld a, [sMysteryGiftTrainerHouseFlag] + and a + call CloseSRAM + jr z, .not_cal2 + + ld a, BANK(sMysteryGiftPartnerName) + call GetSRAMBank + ld hl, sMysteryGiftPartnerName + call CopyTrainerName + jp CloseSRAM + +.not_cal2 + dec c + push bc + ld b, 0 + ld hl, TrainerGroups + add hl, bc + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + pop bc + +.loop + dec b + jr z, CopyTrainerName + +.skip + ld a, [hli] + cp $ff + jr nz, .skip + jr .loop + +CopyTrainerName: ; 39984 + ld de, StringBuffer1 + push de + ld bc, NAME_LENGTH + call CopyBytes + pop de + ret +; 39990 + +Function39990: ; 39990 +; This function is useless. + ld de, StringBuffer1 + push de + ld bc, NAME_LENGTH + pop de + ret +; 39999 diff --git a/engine/save.asm b/engine/save.asm index 74b0626c8..65339e0bb 100644 --- a/engine/save.asm +++ b/engine/save.asm @@ -500,12 +500,12 @@ HallOfFame_InitSaveIfNeeded: ; 14da0 ; 14da9 ValidateSave: ; 14da9 - ld a, BANK(s1_a008) + ld a, BANK(sCheckValue1) ; BANK(sCheckValue2) call GetSRAMBank - ld a, 99 - ld [s1_a008], a - ld a, " " - ld [s1_ad0f], a + ld a, SAVE_CHECK_VALUE_1 + ld [sCheckValue1], a + ld a, SAVE_CHECK_VALUE_2 + ld [sCheckValue2], a jp CloseSRAM ; 14dbb @@ -568,12 +568,12 @@ SaveChecksum: ; 14e13 ; 14e2d ValidateBackupSave: ; 14e2d - ld a, BANK(s0_b208) + ld a, BANK(sBackupCheckValue1) ; BANK(sBackupCheckValue2) call GetSRAMBank - ld a, 99 - ld [s0_b208], a - ld a, " " - ld [s0_bf0f], a + ld a, SAVE_CHECK_VALUE_1 + ld [sBackupCheckValue1], a + ld a, SAVE_CHECK_VALUE_2 + ld [sBackupCheckValue2], a call CloseSRAM ret ; 14e40 @@ -731,13 +731,13 @@ INCLUDE "data/default_options.asm" CheckPrimarySaveFile: ; 14f84 - ld a, BANK(s1_a008) + ld a, BANK(sCheckValue1) ; BANK(sCheckValue2) call GetSRAMBank - ld a, [s1_a008] - cp 99 + ld a, [sCheckValue1] + cp SAVE_CHECK_VALUE_1 jr nz, .nope - ld a, [s1_ad0f] - cp " " + ld a, [sCheckValue2] + cp SAVE_CHECK_VALUE_2 jr nz, .nope ld hl, sOptions ld de, Options @@ -753,13 +753,13 @@ CheckPrimarySaveFile: ; 14f84 ; 14faf CheckBackupSaveFile: ; 14faf - ld a, BANK(s0_b208) + ld a, BANK(sBackupCheckValue1) ; BANK(sBackupCheckValue2) call GetSRAMBank - ld a, [s0_b208] - cp 99 + ld a, [sBackupCheckValue1] + cp SAVE_CHECK_VALUE_1 jr nz, .nope - ld a, [s0_bf0f] - cp " " + ld a, [sBackupCheckValue2] + cp SAVE_CHECK_VALUE_2 jr nz, .nope ld hl, sBackupOptions ld de, Options diff --git a/engine/selectmenu.asm b/engine/select_menu.asm index 5d3b5ff0a..5d3b5ff0a 100755 --- a/engine/selectmenu.asm +++ b/engine/select_menu.asm diff --git a/engine/sgb_layouts.asm b/engine/sgb_layouts.asm new file mode 100644 index 000000000..e59fb19d8 --- /dev/null +++ b/engine/sgb_layouts.asm @@ -0,0 +1,636 @@ +Predef_LoadSGBLayout: ; 864c +; LoadSGBLayout + call CheckCGB + jp nz, Predef_LoadSGBLayoutCGB + + ld a, b + cp SCGB_RAM + jr nz, .not_ram + ld a, [SGBPredef] +.not_ram + cp SCGB_PARTY_MENU_HP_PALS + jp z, SGB_ApplyPartyMenuHPPals + ld l, a + ld h, 0 + add hl, hl + ld de, .Jumptable + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .Finish + push de + jp hl +; 866f + +.Jumptable: ; 866f + dw .SGB_BattleGrayscale + dw .SGB_BattleColors + dw .SGB_PokegearPals + dw .SGB_StatsScreenHPPals + dw .SGB_Pokedex + dw .SGB_SlotMachine + dw .SGB06 + dw .SGB07 + dw .SGB_Diploma + dw .SGB_MapPals + dw .SGB_PartyMenu + dw .SGB_Evolution + dw .SGB0c + dw .SGB0d + dw .SGB_MoveList + dw .SGB0f + dw .SGB_PokedexSearchOption + dw .SGB11 + dw .SGB12 + dw .SGB13 + dw .SGB_PackPals + dw .SGB_TrainerCard + dw .SGB_PokedexUnownMode + dw .SGB_BillsPC + dw .SGB_UnownPuzzle + dw .SGB19 + dw .SGB_PlayerOrMonFrontpicPals + dw .SGB_TradeTube + dw .SGB_TrainerOrMonFrontpicPals + dw .SGB_MysteryGift + dw .SGB1e +; 86ad + +.SGB_BattleGrayscale: ; 86ad + ld hl, PalPacket_9c66 + ld de, BlkPacket_9aa6 + ret +; 86b4 + +.SGB_BattleColors: ; 86b4 + ld hl, BlkPacket_9aa6 + call PushSGBPals_ + + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + + ld a, [PlayerHPPal] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, HPBarPals + add hl, de + + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + + ld a, [EnemyHPPal] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + + ld de, HPBarPals + add hl, de + ld a, [hli] + ld [wSGBPals + 9], a + ld a, [hli] + ld [wSGBPals + 10], a + ld a, [hli] + ld [wSGBPals + 11], a + ld a, [hl] + ld [wSGBPals + 12], a + + ld hl, PalPacket_9cf6 + ld de, wSGBPals + $10 + ld bc, $10 + call CopyBytes + + call GetBattlemonBackpicPalettePointer + + ld a, [hli] + ld [wSGBPals + $13], a + ld a, [hli] + ld [wSGBPals + $14], a + ld a, [hli] + ld [wSGBPals + $15], a + ld a, [hl] + ld [wSGBPals + $16], a + call GetEnemyFrontpicPalettePointer + ld a, [hli] + ld [wSGBPals + $19], a + ld a, [hli] + ld [wSGBPals + $1a], a + ld a, [hli] + ld [wSGBPals + $1b], a + ld a, [hl] + ld [wSGBPals + $1c], a + + ld hl, wSGBPals + ld de, wSGBPals + $10 + ld a, SCGB_BATTLE_COLORS + ld [SGBPredef], a + ret +; 873c + +.SGB_MoveList: ; 873c + ld hl, PalPacket_9bd6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + + ld hl, wSGBPals + 1 + ld [hl], $10 + inc hl + inc hl + + ld a, [PlayerHPPal] + add $2f + ld [hl], a + ld hl, wSGBPals + ld de, BlkPacket_9ad6 + ret +; 875c + +.SGB_PokegearPals: ; 875c + ld hl, PalPacket_9c76 + ld de, BlkPacket_9a86 + ret +; 8763 + +.SGB_StatsScreenHPPals: ; 8763 + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + ld a, [wCurHPPal] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + ld de, HPBarPals + add hl, de + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + ld a, [CurPartySpecies] + ld bc, TempMonDVs + call GetPlayerOrMonPalettePointer + ld a, [hli] + ld [wSGBPals + 9], a + ld a, [hli] + ld [wSGBPals + 10], a + ld a, [hli] + ld [wSGBPals + 11], a + ld a, [hl] + ld [wSGBPals + 12], a + ld hl, wSGBPals + ld de, BlkPacket_9ac6 + ret +; 87ab + +.SGB_PartyMenu: ; 87ab + ld hl, PalPacket_9c56 + ld de, wSGBPals + 1 + ret +; 87b2 + +.SGB_Pokedex: ; 87b2 + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + ld hl, wSGBPals + 3 + ld [hl], $9f + inc hl + ld [hl], $2a + inc hl + ld [hl], $5a + inc hl + ld [hl], $19 + ld a, [CurPartySpecies] + call GetMonPalettePointer_ + ld a, [hli] + ld [wSGBPals + 9], a + ld a, [hli] + ld [wSGBPals + 10], a + ld a, [hli] + ld [wSGBPals + 11], a + ld a, [hl] + ld [wSGBPals + 12], a + ld hl, wSGBPals + ld de, BlkPacket_9ae6 + ret +; 87e9 + +.SGB_BillsPC: ; 87e9 + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + ld hl, wSGBPals + 3 + ld [hl], $9f + inc hl + ld [hl], $2a + inc hl + ld [hl], $5a + inc hl + ld [hl], $19 + ld a, [CurPartySpecies] + ld bc, TempMonDVs + call GetPlayerOrMonPalettePointer + ld a, [hli] + ld [wSGBPals + 9], a + ld a, [hli] + ld [wSGBPals + 10], a + ld a, [hli] + ld [wSGBPals + 11], a + ld a, [hl] + ld [wSGBPals + 12], a + ld hl, wSGBPals + ld de, BlkPacket_9ae6 + ret +; 8823 + +.SGB_PokedexUnownMode: ; 8823 + call .SGB_Pokedex + ld de, BlkPacket_9af6 + ret +; 882a + +.SGB_PokedexSearchOption: ; 882a + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + ld hl, wSGBPals + 3 + ld [hl], $9f + inc hl + ld [hl], $2a + inc hl + ld [hl], $5a + inc hl + ld [hl], $19 + ld hl, wSGBPals + ld de, BlkPacket_9a86 + ret +; 884b + +.SGB_PackPals: ; 884b + ld hl, PalPacket_9c36 + ld de, BlkPacket_9a86 + ret +; 8852 + +.SGB_SlotMachine: ; 8852 + ld hl, PalPacket_9c96 + ld de, BlkPacket_9b06 + ret +; 8859 + +.SGB06: ; 8859 + ld hl, PalPacket_9ca6 + ld de, BlkPacket_9b76 + ret +; 8860 + +.SGB_Diploma: +.SGB_MysteryGift: ; 8860 + ld hl, PalPacket_9cb6 + ld de, BlkPacket_9a86 + ret +; 8867 + +.SGB07: ; 8867 + ld b, 0 + ld hl, .BlkPacketTable_SGB07 +rept 4 + add hl, bc +endr + ld e, [hl] + inc hl + ld d, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + ret +; 8878 + +.BlkPacketTable_SGB07: ; 8878 + dw BlkPacket_9a86, PalPacket_9be6 + dw BlkPacket_9a96, PalPacket_9c06 + dw BlkPacket_9a86, PalPacket_9c16 +; 8884 + +.SGB0c: ; 8884 + ld hl, PalPacket_9b96 + ld de, BlkPacket_9b56 + ld a, SCGB_DIPLOMA + ld [SGBPredef], a + ret +; 8890 + +.SGB13: ; 8890 + ld hl, PalPacket_9ba6 + ld de, BlkPacket_9b86 + ret +; 8897 + +.SGB0f: ; 8897 + ld hl, PalPacket_9c46 + ld de, BlkPacket_9a86 + ret +; 889e + +.SGB11: ; 889e + ld hl, BlkPacket_9a86 + ld de, PlayerLightScreenCount + ld bc, $10 + call CopyBytes + ld hl, PalPacket_9bb6 + ld de, BlkPacket_9a86 + ret +; 88b1 + +.SGB_MapPals: ; 88b1 + ld hl, PalPacket_9bd6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + call .GetMapPalsIndex + ld hl, wSGBPals + 1 + ld [hld], a + ld de, BlkPacket_9a86 + ld a, SCGB_MAPPALS + ld [SGBPredef], a + ret +; 88cd + +.SGB_Evolution: ; 88cd + push bc + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + pop bc + ld a, c + and a + jr z, .partymon + ; Egg + ld hl, wSGBPals + 3 + ; RGB 7, 7, 7 + ld [hl], $e7 + inc hl + ld [hl], $1c + inc hl + ; RGB 2, 3, 3 + ld [hl], $62 + inc hl + ld [hl], $c + jr .done + +.partymon + ld hl, PartyMon1DVs + ld bc, PARTYMON_STRUCT_LENGTH + ld a, [CurPartyMon] + call AddNTimes + ld c, l + ld b, h + ld a, [PlayerHPPal] + call GetPlayerOrMonPalettePointer + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + +.done + ld hl, wSGBPals + ld de, BlkPacket_9a86 + ret +; 891a + +.SGB0d: +.SGB_TrainerCard: ; 891a + ld hl, PalPacket_9cb6 + ld de, BlkPacket_9a86 + ret +; 8921 + +.SGB_UnownPuzzle: ; 8921 + ld hl, PalPacket_9bc6 + ld de, BlkPacket_9a86 + ret +; 8928 + +.SGB12: ; 8928 + ld hl, PalPacket_9bd6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + ld hl, BlkPacket_9a86 + ld de, wSGBPals + $10 + ld bc, $10 + call CopyBytes + call .GetMapPalsIndex + ld hl, wSGBPals + 1 + ld [hl], a + ld hl, wSGBPals + 3 + ld [hl], $2e + ld hl, wSGBPals + $13 + ld a, 5 + ld [hli], a + ld a, [wMenuBorderLeftCoord] + ld [hli], a + ld a, [wMenuBorderTopCoord] + ld [hli], a + ld a, [wMenuBorderRightCoord] + ld [hli], a + ld a, [wMenuBorderBottomCoord] + ld [hl], a + ld hl, wSGBPals + ld de, wSGBPals + $10 + ret +; 8969 + +.SGB1e: ; 8969 + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + ld a, [CurPartySpecies] + ld l, a + ld h, 0 + add hl, hl + add hl, hl + add hl, hl + ld de, PokemonPalettes + add hl, de + ld a, [wcf65] + and 3 + sla a + sla a + ld c, a + ld b, 0 + add hl, bc + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + ld hl, wSGBPals + ld de, BlkPacket_9a86 + ret +; 89a6 + +.SGB19: ; 89a6 + ld hl, PalPacket_9cd6 + ld de, BlkPacket_9a86 + ret +; 89ad + +.SGB_PlayerOrMonFrontpicPals: ; 89ad + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + ld a, [CurPartySpecies] + ld bc, TempMonDVs + call GetPlayerOrMonPalettePointer + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + ld hl, wSGBPals + ld de, BlkPacket_9a86 + ret +; 89d9 + +.SGB_TradeTube: ; 89d9 + ld hl, PalPacket_9cc6 + ld de, BlkPacket_9a86 + ret +; 89e0 + +.SGB_TrainerOrMonFrontpicPals: ; 89e0 + ld hl, PalPacket_9ce6 + ld de, wSGBPals + ld bc, $10 + call CopyBytes + ld a, [CurPartySpecies] + ld bc, TempMonDVs + call GetFrontpicPalettePointer + ld a, [hli] + ld [wSGBPals + 3], a + ld a, [hli] + ld [wSGBPals + 4], a + ld a, [hli] + ld [wSGBPals + 5], a + ld a, [hl] + ld [wSGBPals + 6], a + ld hl, wSGBPals + ld de, BlkPacket_9a86 + ret +; 8a0c + +.GetMapPalsIndex: ; 8a0c + ld a, [TimeOfDayPal] + cp NITE_F + jr c, .morn_day + ld a, $19 + ret + +.morn_day + ld a, [wPermission] + cp ROUTE + jr z, .route + cp CAVE + jr z, .cave + cp DUNGEON + jr z, .cave + cp PERM_5 + jr z, .perm5 + cp GATE + jr z, .gate + ld a, [MapGroup] + ld e, a + ld d, 0 + ld hl, .SGBRoofPalInds + add hl, de + ld a, [hl] + ret + +.route + ld a, $00 + ret + +.cave + ld a, $18 + ret + +.perm5 + ld a, $06 + ret + +.gate + ld a, $03 + ret +; 8a45 + +.SGBRoofPalInds: ; 8a45 + db $00 ; Unused + db $12 ; Olivine + db $14 ; Mahogany + db $18 ; Various Dungeons + db $11 ; Ecruteak + db $15 ; Blackthorn + db $09 ; Cinnabar + db $04 ; Cerulean + db $0f ; Azalea + db $16 ; Lake Of Rage + db $0e ; Violet + db $10 ; Goldenrod + db $06 ; Vermilion + db $01 ; Palette + db $03 ; Pewter + db $06 ; Fast Ship + db $0b ; Indigo Plateau + db $08 ; Fuchsia + db $05 ; Lavender + db $17 ; Silver Cave Outside + db $08 ; Pokemon Center 2F + db $07 ; Celadon + db $13 ; Cianwood + db $02 ; Viridian + db $0c ; New Bark + db $0a ; Saffron + db $0d ; Cherrygrove +; 8a60 + +.Finish: ; 8a60 + push de + call PushSGBPals_ + pop hl + jp PushSGBPals_ +; 8a68 diff --git a/engine/spawn_points.asm b/engine/spawn_points.asm index 5f9c07558..b8637da17 100644 --- a/engine/spawn_points.asm +++ b/engine/spawn_points.asm @@ -1,5 +1,5 @@ -INCLUDE "data/spawn_points.asm" +INCLUDE "data/maps/spawn_points.asm" LoadSpawnPoint: ; 1531f diff --git a/engine/square_root.asm b/engine/square_root.asm new file mode 100644 index 000000000..496f66c83 --- /dev/null +++ b/engine/square_root.asm @@ -0,0 +1,30 @@ +GetSquareRoot: ; 13b87 +; Return the square root of de in b. + +; Rather than calculating the result, we take the index of the +; first value in a table of squares that isn't lower than de. + + ld hl, Squares + ld b, 0 +.loop +; Make sure we don't go past the end of the table. + inc b + ld a, b + cp $ff + ret z + +; Iterate over the table until b**2 >= de. + ld a, [hli] + sub e + ld a, [hli] + sbc d + + jr c, .loop + ret + +Squares: ; 13b98 +root set 1 + rept $ff + dw root*root +root set root+1 + endr diff --git a/engine/start_battle.asm b/engine/start_battle.asm new file mode 100644 index 000000000..51f46b3f2 --- /dev/null +++ b/engine/start_battle.asm @@ -0,0 +1,197 @@ +ShowLinkBattleParticipants: ; 2ee18 +; If we're not in a communications room, +; we don't need to be here. + ld a, [wLinkMode] + and a + ret z + + callba _ShowLinkBattleParticipants + ld c, 150 + call DelayFrames + call ClearTileMap + call ClearSprites + ret + +FindFirstAliveMonAndStartBattle: ; 2ee2f + xor a + ld [hMapAnims], a + call DelayFrame + ld b, 6 + ld hl, PartyMon1HP + ld de, PARTYMON_STRUCT_LENGTH - 1 + +.loop + ld a, [hli] + or [hl] + jr nz, .okay + add hl, de + dec b + jr nz, .loop + +.okay + ld de, MON_LEVEL - MON_HP + add hl, de + ld a, [hl] + ld [BattleMonLevel], a + predef Predef_StartBattle + callba _LoadBattleFontsHPBar + ld a, 1 + ld [hBGMapMode], a + call ClearSprites + call ClearTileMap + xor a + ld [hBGMapMode], a + ld [hWY], a + ld [rWY], a + ld [hMapAnims], a + ret + +PlayBattleMusic: ; 2ee6c + push hl + push de + push bc + + xor a + ld [MusicFade], a + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + call MaxVolume + + ld a, [BattleType] + cp BATTLETYPE_SUICUNE + ld de, MUSIC_SUICUNE_BATTLE + jp z, .done + cp BATTLETYPE_ROAMING + jp z, .done + + ; Are we fighting a trainer? + ld a, [OtherTrainerClass] + and a + jr nz, .trainermusic + + callba RegionCheck + ld a, e + and a + jr nz, .kantowild + + ld de, MUSIC_JOHTO_WILD_BATTLE + ld a, [TimeOfDay] + cp NITE_F + jr nz, .done + ld de, MUSIC_JOHTO_WILD_BATTLE_NIGHT + jr .done + +.kantowild + ld de, MUSIC_KANTO_WILD_BATTLE + jr .done + +.trainermusic + ld de, MUSIC_CHAMPION_BATTLE + cp CHAMPION + jr z, .done + cp RED + jr z, .done + + ; really, they should have included admins and scientists here too... + ld de, MUSIC_ROCKET_BATTLE + cp GRUNTM + jr z, .done + cp GRUNTF + jr z, .done + + ld de, MUSIC_KANTO_GYM_LEADER_BATTLE + callba IsKantoGymLeader + jr c, .done + + ld de, MUSIC_JOHTO_GYM_LEADER_BATTLE + callba IsJohtoGymLeader + jr c, .done + + ld de, MUSIC_RIVAL_BATTLE + ld a, [OtherTrainerClass] + cp RIVAL1 + jr z, .done + cp RIVAL2 + jr nz, .othertrainer + + ld a, [OtherTrainerID] + cp RIVAL2_2_CHIKORITA ; Rival in Indigo Plateau + jr c, .done + ld de, MUSIC_CHAMPION_BATTLE + jr .done + +.othertrainer + ld a, [wLinkMode] + and a + jr nz, .johtotrainer + + callba RegionCheck + ld a, e + and a + jr nz, .kantotrainer + +.johtotrainer + ld de, MUSIC_JOHTO_TRAINER_BATTLE + jr .done + +.kantotrainer + ld de, MUSIC_KANTO_TRAINER_BATTLE + +.done + call PlayMusic + + pop bc + pop de + pop hl + ret + +ClearBattleRAM: ; 2ef18 + xor a + ld [wPlayerAction], a + ld [wBattleResult], a + + ld hl, wPartyMenuCursor + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + + ld [wMenuScrollPosition], a + ld [CriticalHit], a + ld [BattleMonSpecies], a + ld [wBattleParticipantsNotFainted], a + ld [CurBattleMon], a + ld [wForcedSwitch], a + ld [TimeOfDayPal], a + ld [PlayerTurnsTaken], a + ld [EnemyTurnsTaken], a + ld [EvolvableFlags], a + + ld hl, PlayerHPPal + ld [hli], a + ld [hl], a + + ld hl, BattleMonDVs + ld [hli], a + ld [hl], a + + ld hl, EnemyMonDVs + ld [hli], a + ld [hl], a + +; Clear the entire BattleMons area + ld hl, wBattle + ld bc, wBattleEnd - wBattle + xor a + call ByteFill + + callab ResetEnemyStatLevels + + call ClearWindowData + + ld hl, hBGMapAddress + xor a + ld [hli], a + ld [hl], VBGMap0 / $100 + ret diff --git a/engine/startmenu.asm b/engine/start_menu.asm index 871da86be..871da86be 100755 --- a/engine/startmenu.asm +++ b/engine/start_menu.asm diff --git a/engine/switch_party_mons.asm b/engine/switch_party_mons.asm new file mode 100644 index 000000000..cde9c82b2 --- /dev/null +++ b/engine/switch_party_mons.asm @@ -0,0 +1,145 @@ +_SwitchPartyMons: + ld a, [wd0e3] + dec a + ld [Buffer3], a + ld b, a + ld a, [wMenuCursorY] + dec a + ld [Buffer2], a + cp b + jr z, .skip + call .SwapMonAndMail + ld a, [Buffer3] + call .ClearSprite + ld a, [Buffer2] + call .ClearSprite +.skip + ret + +.ClearSprite: ; 50f34 (14:4f34) + push af + hlcoord 0, 1 + ld bc, 2 * SCREEN_WIDTH + call AddNTimes + ld bc, 2 * SCREEN_WIDTH + ld a, " " + call ByteFill + pop af + ld hl, Sprites + ld bc, $10 + call AddNTimes + ld de, $4 + ld c, $4 +.gfx_loop + ld [hl], $a0 + add hl, de + dec c + jr nz, .gfx_loop + ld de, SFX_SWITCH_POKEMON + call WaitPlaySFX + ret + +.SwapMonAndMail: ; 50f62 (14:4f62) + push hl + push de + push bc + ld bc, PartySpecies + ld a, [Buffer2] + ld l, a + ld h, $0 + add hl, bc + ld d, h + ld e, l + ld a, [Buffer3] + ld l, a + ld h, $0 + add hl, bc + ld a, [hl] + push af + ld a, [de] + ld [hl], a + pop af + ld [de], a + ld a, [Buffer2] + ld hl, PartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + push hl + ld de, wd002 + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + ld a, [Buffer3] + ld hl, PartyMon1 + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop de + push hl + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + pop de + ld hl, wd002 + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + ld a, [Buffer2] + ld hl, PartyMonOT + call SkipNames + push hl + call .CopyNameTowd002 + ld a, [Buffer3] + ld hl, PartyMonOT + call SkipNames + pop de + push hl + call .CopyName + pop de + ld hl, wd002 + call .CopyName + ld hl, PartyMonNicknames + ld a, [Buffer2] + call SkipNames + push hl + call .CopyNameTowd002 + ld hl, PartyMonNicknames + ld a, [Buffer3] + call SkipNames + pop de + push hl + call .CopyName + pop de + ld hl, wd002 + call .CopyName + ld hl, sPartyMail + ld a, [Buffer2] + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + push hl + ld de, wd002 + ld bc, MAIL_STRUCT_LENGTH + ld a, BANK(sPartyMail) + call GetSRAMBank + call CopyBytes + ld hl, sPartyMail + ld a, [Buffer3] + ld bc, MAIL_STRUCT_LENGTH + call AddNTimes + pop de + push hl + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + pop de + ld hl, wd002 + ld bc, MAIL_STRUCT_LENGTH + call CopyBytes + call CloseSRAM + pop bc + pop de + pop hl + ret + +.CopyNameTowd002: ; 51036 (14:5036) + ld de, wd002 + +.CopyName: ; 51039 (14:5039) + ld bc, NAME_LENGTH + call CopyBytes + ret diff --git a/engine/tempmon.asm b/engine/tempmon.asm new file mode 100644 index 000000000..332cb0c6c --- /dev/null +++ b/engine/tempmon.asm @@ -0,0 +1,127 @@ +CopyPkmnToTempMon: ; 5084a +; gets the BaseData of a Pkmn +; and copys the PkmnStructure to TempMon + + ld a, [CurPartyMon] + ld e, a + call GetPkmnSpecies + ld a, [CurPartySpecies] + ld [CurSpecies], a + call GetBaseData + + ld a, [MonType] + ld hl, PartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + and a + jr z, .copywholestruct + ld hl, OTPartyMon1Species + ld bc, PARTYMON_STRUCT_LENGTH + cp OTPARTYMON + jr z, .copywholestruct + ld bc, BOXMON_STRUCT_LENGTH + callab CopyBoxmonToTempMon + jr .done + +.copywholestruct + ld a, [CurPartyMon] + call AddNTimes + ld de, TempMon + ld bc, PARTYMON_STRUCT_LENGTH + call CopyBytes + +.done + ret + +CalcwBufferMonStats: ; 5088b + ld bc, wBufferMon + jr _TempMonStatsCalculation + +CalcTempmonStats: ; 50890 + ld bc, TempMon +_TempMonStatsCalculation: ; 50893 + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + ld [CurPartyLevel], a + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_STAT_EXP - 1 + add hl, bc + push bc + ld b, $1 + predef CalcPkmnStats + pop bc + ld hl, MON_HP + add hl, bc + ld d, h + ld e, l + ld a, [CurPartySpecies] + cp EGG + jr nz, .not_egg + xor a + ld [de], a + inc de + ld [de], a + jr .zero_status + +.not_egg + push bc + ld hl, MON_MAXHP + add hl, bc + ld bc, 2 + call CopyBytes + pop bc + +.zero_status + ld hl, MON_STATUS + add hl, bc + xor a + ld [hli], a + ld [hl], a + ret + +GetPkmnSpecies: ; 508d5 +; [MonType] has the type of the Pkmn +; e = Nr. of Pkmn (i.e. [CurPartyMon]) + + ld a, [MonType] + and a ; PARTYMON + jr z, .partymon + cp OTPARTYMON + jr z, .otpartymon + cp BOXMON + jr z, .boxmon + cp TEMPMON + jr z, .breedmon + ; WILDMON + +.partymon + ld hl, PartySpecies + jr .done + +.otpartymon + ld hl, OTPartySpecies + jr .done + +.boxmon + ld a, BANK(sBoxSpecies) + call GetSRAMBank + ld hl, sBoxSpecies + call .done + call CloseSRAM + ret + +.breedmon + ld a, [wBreedMon1Species] + jr .done2 + +.done + ld d, 0 + add hl, de + ld a, [hl] + +.done2 + ld [CurPartySpecies], a + ret diff --git a/engine/time_capsule.asm b/engine/time_capsule.asm new file mode 100755 index 000000000..577b2dce8 --- /dev/null +++ b/engine/time_capsule.asm @@ -0,0 +1,147 @@ +; These functions seem to be related to backwards compatibility + +ValidateOTTrademon: ; fb57e + ld a, [wd003] + ld hl, OTPartyMon1Species + call GetPartyLocation + push hl + ld a, [wd003] + inc a + ld c, a + ld b, 0 + ld hl, OTPartyCount + add hl, bc + ld a, [hl] + pop hl + cp EGG + jr z, .matching_or_egg + cp [hl] + jr nz, .abnormal + +.matching_or_egg + ld b, h + ld c, l + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + cp MAX_LEVEL + 1 + jr nc, .abnormal + ld a, [wLinkMode] + cp LINK_TIMECAPSULE + jr nz, .normal + ld hl, OTPartySpecies + ld a, [wd003] + ld c, a + ld b, 0 + add hl, bc + ld a, [hl] + + ; Magnemite and Magneton's types changed + ; from Electric to Electric/Steel. + cp MAGNEMITE + jr z, .normal + cp MAGNETON + jr z, .normal + + ld [CurSpecies], a + call GetBaseData + ld hl, wLinkOTPartyMonTypes + add hl, bc + add hl, bc + ld a, [BaseType1] + cp [hl] + jr nz, .abnormal + inc hl + ld a, [BaseType2] + cp [hl] + jr nz, .abnormal + +.normal + and a + ret + +.abnormal + scf + ret +; fb5dd + +Functionfb5dd: ; fb5dd + ld a, [wd002] + ld d, a + ld a, [PartyCount] + ld b, a + ld c, $0 +.loop + ld a, c + cp d + jr z, .next + push bc + ld a, c + ld hl, PartyMon1HP + call GetPartyLocation + pop bc + ld a, [hli] + or [hl] + jr nz, .done + +.next + inc c + dec b + jr nz, .loop + ld a, [wd003] + ld hl, OTPartyMon1HP + call GetPartyLocation + ld a, [hli] + or [hl] + jr nz, .done + scf + ret + +.done + and a + ret +; fb60d + +PlaceTradePartnerNamesAndParty: ; fb60d + hlcoord 4, 0 + ld de, PlayerName + call PlaceString + ld a, $14 + ld [bc], a + hlcoord 4, 8 + ld de, OTPlayerName + call PlaceString + ld a, $14 + ld [bc], a + hlcoord 7, 1 + ld de, PartySpecies + call .PlaceSpeciesNames + hlcoord 7, 9 + ld de, OTPartySpecies +.PlaceSpeciesNames: ; fb634 + ld c, $0 +.loop + ld a, [de] + cp -1 + ret z + ld [wd265], a + push bc + push hl + push de + push hl + ld a, c + ld [hProduct], a + call GetPokemonName + pop hl + call PlaceString + pop de + inc de + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + inc c + jr .loop +; fb656 + +INCLUDE "data/time_capsule/special_stats.asm" diff --git a/engine/time_capsule/conversion.asm b/engine/time_capsule/conversion.asm deleted file mode 100755 index eb8896355..000000000 --- a/engine/time_capsule/conversion.asm +++ /dev/null @@ -1,277 +0,0 @@ -; These functions seem to be related to backwards compatibility - -ValidateOTTrademon: ; fb57e - ld a, [wd003] - ld hl, OTPartyMon1Species - call GetPartyLocation - push hl - ld a, [wd003] - inc a - ld c, a - ld b, 0 - ld hl, OTPartyCount - add hl, bc - ld a, [hl] - pop hl - cp EGG - jr z, .matching_or_egg - cp [hl] - jr nz, .abnormal - -.matching_or_egg - ld b, h - ld c, l - ld hl, MON_LEVEL - add hl, bc - ld a, [hl] - cp MAX_LEVEL + 1 - jr nc, .abnormal - ld a, [wLinkMode] - cp LINK_TIMECAPSULE - jr nz, .normal - ld hl, OTPartySpecies - ld a, [wd003] - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - - ; Magnemite and Magneton's types changed - ; from Electric to Electric/Steel. - cp MAGNEMITE - jr z, .normal - cp MAGNETON - jr z, .normal - - ld [CurSpecies], a - call GetBaseData - ld hl, wLinkOTPartyMonTypes - add hl, bc - add hl, bc - ld a, [BaseType1] - cp [hl] - jr nz, .abnormal - inc hl - ld a, [BaseType2] - cp [hl] - jr nz, .abnormal - -.normal - and a - ret - -.abnormal - scf - ret -; fb5dd - -Functionfb5dd: ; fb5dd - ld a, [wd002] - ld d, a - ld a, [PartyCount] - ld b, a - ld c, $0 -.loop - ld a, c - cp d - jr z, .next - push bc - ld a, c - ld hl, PartyMon1HP - call GetPartyLocation - pop bc - ld a, [hli] - or [hl] - jr nz, .done - -.next - inc c - dec b - jr nz, .loop - ld a, [wd003] - ld hl, OTPartyMon1HP - call GetPartyLocation - ld a, [hli] - or [hl] - jr nz, .done - scf - ret - -.done - and a - ret -; fb60d - -PlaceTradePartnerNamesAndParty: ; fb60d - hlcoord 4, 0 - ld de, PlayerName - call PlaceString - ld a, $14 - ld [bc], a - hlcoord 4, 8 - ld de, OTPlayerName - call PlaceString - ld a, $14 - ld [bc], a - hlcoord 7, 1 - ld de, PartySpecies - call .PlaceSpeciesNames - hlcoord 7, 9 - ld de, OTPartySpecies -.PlaceSpeciesNames: ; fb634 - ld c, $0 -.loop - ld a, [de] - cp -1 - ret z - ld [wd265], a - push bc - push hl - push de - push hl - ld a, c - ld [hProduct], a - call GetPokemonName - pop hl - call PlaceString - pop de - inc de - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - inc c - jr .loop -; fb656 - - -INCLUDE "data/time_capsule/special_stats.asm" - - -INCLUDE "event/name_rater.asm" - - -PlaySlowCry: ; fb841 - ld a, [ScriptVar] - call LoadCryHeader - jr c, .done - - ld hl, CryPitch - ld a, [hli] - ld h, [hl] - ld l, a - ld bc, -$140 - add hl, bc - ld a, l - ld [CryPitch], a - ld a, h - ld [CryPitch + 1], a - ld hl, CryLength - ld a, [hli] - ld h, [hl] - ld l, a - ld bc, $60 - add hl, bc - ld a, l - ld [CryLength], a - ld a, h - ld [CryLength + 1], a - callba _PlayCryHeader - call WaitSFX - -.done - ret -; fb877 - -NewPokedexEntry: ; fb877 - ld a, [hMapAnims] - push af - xor a - ld [hMapAnims], a - call LowVolume - call ClearBGPalettes - call ClearTileMap - call UpdateSprites - call ClearSprites - ld a, [wPokedexStatus] - push af - ld a, [hSCX] - add $5 - ld [hSCX], a - xor a - ld [wPokedexStatus], a - callba _NewPokedexEntry - call WaitPressAorB_BlinkCursor - ld a, $1 - ld [wPokedexStatus], a - callba DisplayDexEntry - call WaitPressAorB_BlinkCursor - pop af - ld [wPokedexStatus], a - call MaxVolume - call RotateThreePalettesRight - ld a, [hSCX] - add -5 ; 251 ; NUM_POKEMON - ld [hSCX], a - call .ReturnFromDexRegistration - pop af - ld [hMapAnims], a - ret -; fb8c8 - -.ReturnFromDexRegistration: ; fb8c8 - call ClearTileMap - call LoadFontsExtra - call LoadStandardFont - callba Pokedex_PlaceFrontpicTopLeftCorner - call WaitBGMap2 - callba GetEnemyMonDVs - ld a, [hli] - ld [TempMonDVs], a - ld a, [hl] - ld [TempMonDVs + 1], a - ld b, SCGB_TRAINER_OR_MON_FRONTPIC_PALS - call GetSGBLayout - call SetPalettes - ret -; fb8f1 - -ConvertMon_2to1: ; fb8f1 -; Takes the Gen-2 Pokemon number stored in wd265, finds it in the Pokered_MonIndices table, and returns its index in wd265. - push bc - push hl - ld a, [wd265] - ld b, a - ld c, 0 - ld hl, Pokered_MonIndices -.loop - inc c - ld a, [hli] - cp b - jr nz, .loop - ld a, c - ld [wd265], a - pop hl - pop bc - ret -; fb908 - -ConvertMon_1to2: ; fb908 -; Takes the Gen-1 Pokemon number stored in wd265 and returns the corresponding value from Pokered_MonIndices in wd265. - push bc - push hl - ld a, [wd265] - dec a - ld hl, Pokered_MonIndices - ld b, 0 - ld c, a - add hl, bc - ld a, [hl] - ld [wd265], a - pop hl - pop bc - ret -; fb91c - - -INCLUDE "data/time_capsule/mon_order.asm" diff --git a/engine/time_capsule_2.asm b/engine/time_capsule_2.asm new file mode 100644 index 000000000..5da72e7c8 --- /dev/null +++ b/engine/time_capsule_2.asm @@ -0,0 +1,39 @@ +ConvertMon_2to1: ; fb8f1 +; Takes the Gen-2 Pokemon number stored in wd265, finds it in the Pokered_MonIndices table, and returns its index in wd265. + push bc + push hl + ld a, [wd265] + ld b, a + ld c, 0 + ld hl, Pokered_MonIndices +.loop + inc c + ld a, [hli] + cp b + jr nz, .loop + ld a, c + ld [wd265], a + pop hl + pop bc + ret +; fb908 + +ConvertMon_1to2: ; fb908 +; Takes the Gen-1 Pokemon number stored in wd265 and returns the corresponding value from Pokered_MonIndices in wd265. + push bc + push hl + ld a, [wd265] + dec a + ld hl, Pokered_MonIndices + ld b, 0 + ld c, a + add hl, bc + ld a, [hl] + ld [wd265], a + pop hl + pop bc + ret +; fb91c + + +INCLUDE "data/time_capsule/mon_order.asm" diff --git a/engine/timeofdaypals.asm b/engine/timeofdaypals.asm index 263a83fc1..a4a07bc4d 100644 --- a/engine/timeofdaypals.asm +++ b/engine/timeofdaypals.asm @@ -1,3 +1,7 @@ +Predef35: ; 8c000 +Predef36: + ret + UpdateTimeOfDayPal:: ; 8c001 call UpdateTime ld a, [TimeOfDay] @@ -196,10 +200,6 @@ endr ret ; 8c0e5 -brightlevel: MACRO - db (\1 << 6) | (\2 << 4) | (\3 << 2) | \4 -ENDM - ReplaceTimeOfDayPals: ; 8c0e5 ld hl, .BrightnessLevels ld a, [wMapTimeOfDay] @@ -230,14 +230,14 @@ ReplaceTimeOfDayPals: ; 8c0e5 ; 8c10f (23:410f) .BrightnessLevels: ; 8c10f - brightlevel 3, 2, 1, 0 - brightlevel 1, 1, 1, 1 - brightlevel 2, 2, 2, 2 - brightlevel 0, 0, 0, 0 - brightlevel 3, 3, 3, 3 - brightlevel 3, 2, 1, 0 - brightlevel 3, 2, 1, 0 - brightlevel 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 1, 1, 1, 1 + dc 2, 2, 2, 2 + dc 0, 0, 0, 0 + dc 3, 3, 3, 3 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 ; 8c117 GetTimePalette: ; 8c117 diff --git a/engine/timeset.asm b/engine/timeset.asm index 2a578f998..09c5b3a75 100755 --- a/engine/timeset.asm +++ b/engine/timeset.asm @@ -40,7 +40,7 @@ InitClock: ; 90672 (24:4672) call RotateFourPalettesRight ld hl, Text_WokeUpOak call PrintText - ld hl, wc608 + ld hl, wTimeSetBuffer ld bc, 50 xor a call ByteFill diff --git a/engine/title.asm b/engine/title.asm index 2073fdf58..ba7f34764 100644 --- a/engine/title.asm +++ b/engine/title.asm @@ -399,84 +399,4 @@ INCBIN "gfx/title/crystal.2bpp.lz" ; 10fede TitleScreenPalettes: -; BG - RGB 00, 00, 00 - RGB 19, 00, 00 - RGB 15, 08, 31 - RGB 15, 08, 31 - - RGB 00, 00, 00 - RGB 31, 31, 31 - RGB 15, 16, 31 - RGB 31, 01, 13 - - RGB 00, 00, 00 - RGB 07, 07, 07 - RGB 31, 31, 31 - RGB 02, 03, 30 - - RGB 00, 00, 00 - RGB 13, 13, 13 - RGB 31, 31, 18 - RGB 02, 03, 30 - - RGB 00, 00, 00 - RGB 19, 19, 19 - RGB 29, 28, 12 - RGB 02, 03, 30 - - RGB 00, 00, 00 - RGB 25, 25, 25 - RGB 28, 25, 06 - RGB 02, 03, 30 - - RGB 00, 00, 00 - RGB 31, 31, 31 - RGB 26, 21, 00 - RGB 02, 03, 30 - - RGB 00, 00, 00 - RGB 11, 11, 19 - RGB 31, 31, 31 - RGB 00, 00, 00 - -; OBJ - RGB 00, 00, 00 - RGB 10, 00, 15 - RGB 17, 05, 22 - RGB 19, 09, 31 - - RGB 31, 31, 31 - RGB 00, 00, 00 - RGB 00, 00, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 00, 00, 00 - RGB 00, 00, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 00, 00, 00 - RGB 00, 00, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 00, 00, 00 - RGB 00, 00, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 00, 00, 00 - RGB 00, 00, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 00, 00, 00 - RGB 00, 00, 00 - RGB 00, 00, 00 - - RGB 31, 31, 31 - RGB 00, 00, 00 - RGB 00, 00, 00 - RGB 00, 00, 00 +INCLUDE "data/palettes/title.pal" diff --git a/engine/trade/animation.asm b/engine/trade_animation.asm index 7100bd558..7100bd558 100755 --- a/engine/trade/animation.asm +++ b/engine/trade_animation.asm diff --git a/engine/trademon_frontpic.asm b/engine/trademon_frontpic.asm new file mode 100644 index 000000000..1641443ea --- /dev/null +++ b/engine/trademon_frontpic.asm @@ -0,0 +1,38 @@ +GetTrademonFrontpic: ; 4d7fd + ld a, [wOTTrademonSpecies] + ld hl, wOTTrademonDVs + ld de, VTiles2 + push de + push af + predef GetUnownLetter + pop af + ld [CurPartySpecies], a + ld [CurSpecies], a + call GetBaseData + pop de + predef FrontpicPredef + ret + +AnimateTrademonFrontpic: ; 4d81e + ld a, [wOTTrademonSpecies] + call IsAPokemon + ret c + callba ShowOTTrademonStats + ld a, [wOTTrademonSpecies] + ld [CurPartySpecies], a + ld a, [wOTTrademonDVs] + ld [TempMonDVs], a + ld a, [wOTTrademonDVs + 1] + ld [TempMonDVs + 1], a + ld b, SCGB_PLAYER_OR_MON_FRONTPIC_PALS + call GetSGBLayout + ld a, %11100100 ; 3,2,1,0 + call DmgToCgbBGPals + callba TradeAnim_ShowGetmonFrontpic + ld a, [wOTTrademonSpecies] + ld [CurPartySpecies], a + hlcoord 7, 2 + ld d, $0 + ld e, ANIM_MON_TRADE + predef AnimateFrontpic + ret diff --git a/engine/trainer_card.asm b/engine/trainer_card.asm index fdf17acc9..6ed9f6ea6 100755 --- a/engine/trainer_card.asm +++ b/engine/trainer_card.asm @@ -448,7 +448,7 @@ TrainerCard_Page1_PrintGameTime: ; 25415 (9:5415) ret nz hlcoord 15, 12 ld a, [hl] - xor $7f ^ $2e ; $7F (space) <--> $2E (colon) + xor " " ^ $2e ; alternate between space and small colon ($2e) tiles ld [hl], a ret diff --git a/engine/trainer_scripts.asm b/engine/trainer_scripts.asm new file mode 100644 index 000000000..33dab3b9e --- /dev/null +++ b/engine/trainer_scripts.asm @@ -0,0 +1,31 @@ +TalkToTrainerScript:: ; 0xbe66a + faceplayer + trainerflagaction CHECK_FLAG + iftrue AlreadyBeatenTrainerScript + loadmemtrainer + encountermusic + jump StartBattleWithMapTrainerScript + +SeenByTrainerScript:: ; 0xbe675 + loadmemtrainer + encountermusic + showemote EMOTE_SHOCK, LAST_TALKED, 30 + callasm TrainerWalkToPlayer + applymovement2 MovementBuffer + writepersonxy LAST_TALKED + faceperson PLAYER, LAST_TALKED + jump StartBattleWithMapTrainerScript + +StartBattleWithMapTrainerScript: ; 0xbe68a + opentext + trainertext $0 + waitbutton + closetext + loadmemtrainer + startbattle + reloadmapafterbattle + trainerflagaction SET_FLAG + loadvar wRunningTrainerBattleScript, -1 + +AlreadyBeatenTrainerScript: + scripttalkafter diff --git a/engine/unown_dex.asm b/engine/unown_dex.asm new file mode 100755 index 000000000..6d14f8b3c --- /dev/null +++ b/engine/unown_dex.asm @@ -0,0 +1,51 @@ +UpdateUnownDex: ; fba18 + ld a, [UnownLetter] + ld c, a + ld b, NUM_UNOWN + ld hl, UnownDex +.loop + ld a, [hli] + and a + jr z, .done + cp c + ret z + dec b + jr nz, .loop + ret + +.done + dec hl + ld [hl], c + ret +; fba2e + +PrintUnownWord: ; fba2e (3e:7a2e) + hlcoord 4, 15 + ld bc, 12 + ld a, " " + call ByteFill + ld a, [wDexCurrentUnownIndex] + ld e, a + ld d, 0 + ld hl, UnownDex + add hl, de + ld a, [hl] + ld e, a + ld d, 0 + ld hl, UnownWords + add hl, de + add hl, de + ld a, [hli] + ld e, a + ld d, [hl] + hlcoord 4, 15 +.loop + ld a, [de] + cp -1 + ret z + inc de + ld [hli], a + jr .loop +; fba5a (3e:7a5a) + +INCLUDE "data/unown_words.asm" diff --git a/engine/unown_puzzle.asm b/engine/unown_puzzle.asm index a1fed2520..3afe8a17d 100755 --- a/engine/unown_puzzle.asm +++ b/engine/unown_puzzle.asm @@ -1,7 +1,8 @@ -puzcoord EQUS "* 6 +" PUZZLE_BORDER EQU $ee PUZZLE_VOID EQU $ef +puzcoord EQUS "* 6 +" + UnownPuzzle: ; e1190 ld a, [hInMenu] push af @@ -13,7 +14,7 @@ UnownPuzzle: ; e1190 xor a ld [hBGMapMode], a call DisableLCD - ld hl, wMisc + ld hl, wMisc ; includes wPuzzlePieces ld bc, wMiscEnd - wMisc xor a call ByteFill diff --git a/engine/unowndex.asm b/engine/unowndex.asm deleted file mode 100755 index 007dd9790..000000000 --- a/engine/unowndex.asm +++ /dev/null @@ -1,118 +0,0 @@ -UpdateUnownDex: ; fba18 - ld a, [UnownLetter] - ld c, a - ld b, NUM_UNOWN - ld hl, UnownDex -.loop - ld a, [hli] - and a - jr z, .done - cp c - ret z - dec b - jr nz, .loop - ret - -.done - dec hl - ld [hl], c - ret -; fba2e - - -PrintUnownWord: ; fba2e (3e:7a2e) - hlcoord 4, 15 - ld bc, 12 - ld a, " " - call ByteFill - ld a, [wDexCurrentUnownIndex] - ld e, a - ld d, 0 - ld hl, UnownDex - add hl, de - ld a, [hl] - ld e, a - ld d, 0 - ld hl, UnownWords - add hl, de - add hl, de - ld a, [hli] - ld e, a - ld d, [hl] - hlcoord 4, 15 -.loop - ld a, [de] - cp -1 - ret z - inc de - ld [hli], a - jr .loop -; fba5a (3e:7a5a) - -UnownWords: ; fba5a - dw UnownWord1 - dw UnownWord1 - dw UnownWord2 - dw UnownWord3 - dw UnownWord4 - dw UnownWord5 - dw UnownWord6 - dw UnownWord7 - dw UnownWord8 - dw UnownWord9 - dw UnownWord10 - dw UnownWord11 - dw UnownWord12 - dw UnownWord13 - dw UnownWord14 - dw UnownWord15 - dw UnownWord16 - dw UnownWord17 - dw UnownWord18 - dw UnownWord19 - dw UnownWord20 - dw UnownWord21 - dw UnownWord22 - dw UnownWord23 - dw UnownWord24 - dw UnownWord25 - dw UnownWord26 -; fba90 - -unownword: macro -x = 1 - rept STRLEN(\1) - db STRSUB(\1, x, 1) - $40 -x = x + 1 - endr - db -1 -endm - - -UnownWord1: unownword "ANGRY" -UnownWord2: unownword "BEAR" -UnownWord3: unownword "CHASE" -UnownWord4: unownword "DIRECT" -UnownWord5: unownword "ENGAGE" -UnownWord6: unownword "FIND" -UnownWord7: unownword "GIVE" -UnownWord8: unownword "HELP" -UnownWord9: unownword "INCREASE" -UnownWord10: unownword "JOIN" -UnownWord11: unownword "KEEP" -UnownWord12: unownword "LAUGH" -UnownWord13: unownword "MAKE" -UnownWord14: unownword "NUZZLE" -UnownWord15: unownword "OBSERVE" -UnownWord16: unownword "PERFORM" -UnownWord17: unownword "QUICKEN" -UnownWord18: unownword "REASSURE" -UnownWord19: unownword "SEARCH" -UnownWord20: unownword "TELL" -UnownWord21: unownword "UNDO" -UnownWord22: unownword "VANISH" -UnownWord23: unownword "WANT" -UnownWord24: unownword "XXXXX" -UnownWord25: unownword "YIELD" -UnownWord26: unownword "ZOOM" -; fbb32 diff --git a/engine/unused_correct_party.asm b/engine/unused_correct_party.asm new file mode 100644 index 000000000..dd2e1111c --- /dev/null +++ b/engine/unused_correct_party.asm @@ -0,0 +1,229 @@ +CorrectErrorsInPlayerParty: ; unreferenced + ld hl, PartyCount + ld a, [hl] + and a + ret z + + cp PARTY_LENGTH + 1 + jr c, .party_length_okay + ld a, PARTY_LENGTH + ld [hl], a +.party_length_okay + inc hl + + ld b, a + ld c, 0 +.loop1 + ld a, [hl] + and a + jr z, .invalid_species + cp NUM_POKEMON + 1 + jr z, .invalid_species + cp EGG + 1 + jr c, .next_species + +.invalid_species + ld [hl], SMEARGLE + push hl + push bc + ld a, c + ld hl, PartyMon1Species + call GetPartyLocation + ld [hl], SMEARGLE + pop bc + pop hl + +.next_species + inc hl + inc c + dec b + jr nz, .loop1 + ld [hl], $ff + + ld hl, PartyMon1 + ld a, [PartyCount] + ld d, a + ld e, 0 +.loop2 + push de + push hl + ld b, h + ld c, l + ld a, [hl] + and a + jr z, .invalid_species_2 + cp NUM_POKEMON + 1 + jr c, .check_level + +.invalid_species_2 + ld [hl], SMEARGLE + push de + ld d, 0 + ld hl, PartySpecies + add hl, de + pop de + ld a, SMEARGLE + ld [hl], a + +.check_level + ld [CurSpecies], a + call GetBaseData + ld hl, MON_LEVEL + add hl, bc + ld a, [hl] + cp MIN_LEVEL + ld a, MIN_LEVEL + jr c, .invalid_level + ld a, [hl] + cp MAX_LEVEL + jr c, .load_level + ld a, MAX_LEVEL +.invalid_level + ld [hl], a +.load_level + ld [CurPartyLevel], a + + ld hl, MON_MAXHP + add hl, bc + ld d, h + ld e, l + ld hl, MON_STAT_EXP - 1 + add hl, bc + ld b, $1 + predef CalcPkmnStats + pop hl + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop de + inc e + dec d + jr nz, .loop2 + + ld de, PartyMonNicknames + ld a, [PartyCount] + ld b, a + ld c, 0 +.loop3 + push bc + call .GetLengthOfStringWith6CharCap + push de + callba CheckStringForErrors + pop hl + pop bc + jr nc, .valid_nickname + + push bc + push hl + ld hl, PartySpecies + push bc + ld b, 0 + add hl, bc + pop bc + ld a, [hl] + cp EGG + ld hl, .TAMAGO + jr z, .got_nickname + ld [wd265], a + call GetPokemonName + ld hl, StringBuffer1 +.got_nickname + pop de + ld bc, PKMN_NAME_LENGTH + call CopyBytes + pop bc + +.valid_nickname + inc c + dec b + jr nz, .loop3 + + ld de, PartyMonOT + ld a, [PartyCount] + ld b, a + ld c, 0 +.loop4 + push bc + call .GetLengthOfStringWith6CharCap + push de + callba CheckStringForErrors + pop hl + jr nc, .valid_ot_name + ld d, h + ld e, l + ld hl, PlayerName + ld bc, NAME_LENGTH + call CopyBytes +.valid_ot_name + pop bc + inc c + dec b + jr nz, .loop4 + + ld hl, PartyMon1Moves + ld a, [PartyCount] + ld b, a +.loop5 + push hl + ld c, NUM_MOVES + ld a, [hl] + and a + jr z, .invalid_move + cp NUM_ATTACKS + 1 + jr c, .moves_loop +.invalid_move + ld [hl], POUND + +.moves_loop + ld a, [hl] + and a + jr z, .fill_invalid_moves + cp NUM_ATTACKS + 1 + jr c, .next_move + +.fill_invalid_moves + xor a + ld [hli], a + dec c + jr nz, .fill_invalid_moves + jr .next_pokemon + +.next_move + inc hl + dec c + jr nz, .moves_loop + +.next_pokemon + pop hl + push bc + ld bc, PARTYMON_STRUCT_LENGTH + add hl, bc + pop bc + dec b + jr nz, .loop5 + ret +; 13b6b + +.TAMAGO: ; 13b6b + db "タマゴ@@@" +; 13b71 + +.GetLengthOfStringWith6CharCap: ; 13b71 + push de + ld c, 1 + ld b, NAME_LENGTH_JAPANESE +.search_loop + ld a, [de] + cp "@" + jr z, .done + inc de + inc c + dec b + jr nz, .search_loop + dec c + dec de + ld a, "@" + ld [de], a +.done + pop de + ret +; 13b87 diff --git a/engine/unused_title.asm b/engine/unused_title.asm new file mode 100644 index 000000000..2075d86d9 --- /dev/null +++ b/engine/unused_title.asm @@ -0,0 +1,201 @@ +UnusedTitleScreen: ; 10c000 + + call ClearBGPalettes + call ClearTileMap + call DisableLCD + +; Turn BG Map update off + xor a + ld [hBGMapMode], a + +; Reset timing variables + ld hl, wJumptableIndex + ld [hli], a ; wJumptableIndex + ld [hli], a ; wIntroSceneFrameCounter + ld [hli], a ; wTitleScreenTimer + ld [hl], a ; wTitleScreenTimer + 1 + + ld hl, UnusedTitleBG_GFX + ld de, VTiles2 + ld bc, VBGMap0 - VTiles2 + call CopyBytes + + ld hl, UnusedTitleBG_GFX + $80 tiles + ld de, VTiles1 + ld bc, VTiles2 - VTiles1 + call CopyBytes + + ld hl, UnusedTitleFG_GFX + ld de, VTiles0 + ld bc, VTiles1 - VTiles0 + call CopyBytes + + ld hl, UnusedTitleBG_Tilemap + debgcoord 0, 0 + ld bc, 32 * 32 +.copy + ld a, 0 + ld [rVBK], a + ld a, [hli] + ld [de], a + ld a, 1 + ld [rVBK], a + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .copy + + ld hl, UnusedTitleFG_OAM + ld de, Sprites + ld bc, $a0 + call CopyBytes + + call EnableLCD + ld a, [rLCDC] + set 1, a + set 2, a + ld [rLCDC], a + + call DelayFrame + + ld a, [rSVBK] + push af + ld a, $5 + ld [rSVBK], a + + ld hl, UnusedTitleBG_Palettes + ld de, UnknBGPals + ld bc, 8 palettes + call CopyBytes + + ld hl, UnusedTitleFG_Palettes + ld de, UnknOBPals + ld bc, 8 palettes + call CopyBytes + + ld hl, UnusedTitleBG_Palettes + ld de, BGPals + ld bc, 8 palettes + call CopyBytes + + ld hl, UnusedTitleFG_Palettes + ld de, OBPals + ld bc, 8 palettes + call CopyBytes + + pop af + ld [rSVBK], a + + ld a, $1 + ld [hCGBPalUpdate], a + + ld de, MUSIC_TITLE + call PlayMusic + + ret +; 10c0b1 + +UnusedTitleBG_GFX: ; 10c0b1 +INCBIN "gfx/title/old_bg.2bpp" +; 10d0b1 + +UnusedTitleBG_Tilemap: ; 10d0b1 +; 32x32 (tile, attributes) + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $01,$00, $02,$01, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $03,$00, $04,$00, $05,$01, $06,$01, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $07,$05, $08,$05, $09,$05, $0a,$05, $0b,$00, $0c,$00, $0d,$00, $0e,$00, $0f,$01, $10,$01, $11,$01, $12,$01, $13,$05, $14,$05, $15,$05, $16,$05, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $17,$04, $18,$04, $19,$04, $1a,$04, $1b,$00, $1c,$00, $1d,$02, $1e,$02, $1f,$07, $20,$07, $21,$01, $22,$01, $23,$04, $24,$04, $25,$04, $26,$04, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $27,$04, $28,$04, $29,$04, $2a,$04, $2b,$00, $2c,$00, $2d,$03, $2e,$01, $2f,$01, $30,$01, $31,$01, $32,$01, $33,$04, $34,$04, $35,$04, $36,$04, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $37,$04, $38,$04, $39,$04, $3a,$04, $3b,$00, $3c,$00, $3d,$01, $00,$00, $00,$00, $3e,$07, $3f,$01, $40,$01, $41,$04, $42,$04, $43,$04, $44,$04, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $45,$04, $46,$04, $47,$04, $48,$04, $49,$00, $3c,$00, $4a,$01, $00,$00, $00,$00, $4b,$07, $3f,$01, $4c,$01, $4d,$06, $4e,$06, $4f,$06, $50,$06, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $51,$04, $52,$06, $53,$06, $54,$06, $55,$00, $3c,$00, $56,$01, $00,$00, $00,$00, $57,$07, $58,$01, $59,$01, $5a,$06, $5b,$06, $5c,$06, $5d,$06, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $5e,$06, $5f,$06, $60,$06, $61,$06, $62,$00, $63,$00, $64,$03, $65,$01, $66,$01, $67,$07, $68,$01, $69,$01, $26,$04, $6a,$06, $26,$04, $26,$04, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $6b,$00, $6c,$05, $6d,$05, $6e,$05, $6f,$00, $70,$02, $71,$02, $72,$01, $73,$00, $74,$02, $75,$01, $76,$01, $77,$05, $78,$05, $79,$05, $6b,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $7a,$00, $7b,$00, $7c,$00, $7d,$00, $0f,$01, $7e,$01, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $a2,$00, $80,$00, $81,$00, $82,$00, $83,$00, $84,$07, $85,$01, $86,$01, $87,$01, $88,$01, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $89,$00, $8a,$00, $8b,$00, $8c,$07, $8d,$01, $8e,$01, $8f,$01, $90,$01, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $91,$01, $92,$01, $93,$01, $94,$01, $95,$01, $00,$00, $00,$00, $00,$00, $96,$05, $97,$05, $98,$05, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $99,$05, $9a,$05, $9b,$05, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $9c,$05, $9d,$05, $9e,$05, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $9f,$05, $a0,$05, $a1,$05, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $6b,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 + db $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00, $00,$00 +; 10d8b1 + +UnusedTitleBG_Palettes: ; 10d8b1 +INCLUDE "data/palettes/unused_title/bg.pal" + + RGB 31, 31, 31 + RGB 31, 31, 31 + RGB 31, 31, 31 + RGB 31, 31, 31 + + RGB 31, 31, 31 + RGB 20, 04, 20 + RGB 16, 08, 16 + RGB 24, 00, 24 + +rept 54 + RGB 31, 31, 31 + RGB 31, 31, 31 + RGB 31, 31, 31 + RGB 31, 31, 31 +endr +; 10dab1 + +UnusedTitleFG_GFX: ; 10dab1 +INCBIN "gfx/title/old_fg.2bpp" +; 10eab1 + +UnusedTitleFG_Palettes: ; 10eab1 +INCLUDE "data/palettes/unused_title/ob.pal" +; 10ecb1 + +UnusedTitleFG_OAM: ; 10ecb1 + db $18, $38, $00, $01, $18, $40, $02, $01, $18, $48, $04, $01, $18, $50, $06, $01 + db $18, $58, $08, $01, $18, $60, $0a, $01, $18, $68, $0c, $01, $18, $70, $0e, $01 + + db $28, $38, $10, $00, $28, $40, $12, $00, $28, $48, $14, $00, $28, $50, $16, $00 + db $28, $58, $18, $00, $28, $60, $1a, $00, $28, $68, $1c, $00, $28, $70, $1e, $00 + + db $38, $38, $20, $00, $38, $40, $22, $00, $38, $48, $24, $00, $38, $50, $26, $00 + db $38, $58, $28, $00, $38, $60, $2a, $00, $38, $68, $2c, $00, $38, $70, $2e, $00 + + db $48, $38, $30, $02, $48, $40, $32, $02, $48, $48, $34, $02, $48, $50, $36, $02 + db $48, $58, $38, $02, $48, $60, $3a, $02, $48, $68, $3c, $02, $48, $70, $3e, $02 + + db $58, $38, $40, $01, $58, $40, $42, $01, $58, $48, $44, $01, $58, $50, $46, $01 + db $58, $58, $48, $01, $58, $60, $4a, $01, $58, $68, $4c, $01, $58, $70, $4e, $01 +; 10ed51 + + +Function10ed51: ; 10ed51 + call _TitleScreen +.loop + call JoyTextDelay + ld a, [hJoyLast] + ld b, a + and 1 + jr nz, .done + call SuicuneFrameIterator + call DelayFrame + jr .loop +.done + ret +; 10ed67 |