mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-09-09 09:51:34 -07:00
705 lines
10 KiB
NASM
705 lines
10 KiB
NASM
Option:
|
|
farcall _Option
|
|
ret
|
|
|
|
NewGame:
|
|
xor a
|
|
ld [wDebugFlags], a
|
|
call ResetWRAM
|
|
xor a
|
|
ldh [hMapAnims], a
|
|
call ClearTilemap
|
|
call LoadFrame
|
|
call LoadStandardFont
|
|
call ClearMenuAndWindowData
|
|
call InitTime ; set wStartDay through wStartSecond to $00
|
|
farcall InitGender
|
|
ld b, NAME_PLAYER
|
|
ld de, wPlayerName
|
|
farcall NamingScreen
|
|
if DEF(_DEBUG)
|
|
ld a, MEW
|
|
ld [wCurPartySpecies], a
|
|
ld a, 100
|
|
ld [wCurPartyLevel], a
|
|
predef TryAddMonToParty
|
|
ld a, -1
|
|
ld [wUnlockedLevels], a ; debug
|
|
endc
|
|
xor a ; LANDMARK_LEVEL_1
|
|
ld [wDefaultLevelSelectionMenuLandmark], a
|
|
farcall AutoSaveGameOutsideOverworld
|
|
jp GameMenu
|
|
|
|
ResetWRAM:
|
|
xor a
|
|
ldh [hBGMapMode], a
|
|
call _ResetWRAM
|
|
ret
|
|
|
|
_ResetWRAM:
|
|
ld hl, wShadowOAM
|
|
ld bc, wOptions - wShadowOAM
|
|
xor a
|
|
call ByteFill
|
|
|
|
ld hl, STARTOF(WRAMX)
|
|
ld bc, wGameData - STARTOF(WRAMX)
|
|
xor a
|
|
call ByteFill
|
|
|
|
ld hl, wGameData
|
|
ld bc, wGameDataEnd - wGameData
|
|
xor a
|
|
call ByteFill
|
|
|
|
call DelayFrame
|
|
ldh a, [hRandomSub]
|
|
ld [wPlayerID], a
|
|
|
|
call DelayFrame
|
|
ldh a, [hRandomAdd]
|
|
ld [wPlayerID + 1], a
|
|
|
|
call Random
|
|
ld [wSecretID], a
|
|
call DelayFrame
|
|
call Random
|
|
ld [wSecretID + 1], a
|
|
|
|
ld hl, wPartyCount
|
|
call .InitList
|
|
|
|
xor a
|
|
ld [wCurBox], a
|
|
ld [wSavedAtLeastOnce], a
|
|
|
|
call SetDefaultBoxNames
|
|
|
|
ld a, BANK(sBoxCount)
|
|
call OpenSRAM
|
|
ld hl, sBoxCount
|
|
call .InitList
|
|
call CloseSRAM
|
|
|
|
ld hl, wNumItems
|
|
call .InitList
|
|
|
|
ld hl, wNumKeyItems
|
|
call .InitList
|
|
|
|
ld hl, wNumBalls
|
|
call .InitList
|
|
|
|
ld hl, wNumPCItems
|
|
call .InitList
|
|
|
|
xor a
|
|
ld [wRoamMon1Species], a
|
|
ld [wRoamMon2Species], a
|
|
ld [wRoamMon3Species], a
|
|
ld a, -1
|
|
ld [wRoamMon1MapGroup], a
|
|
ld [wRoamMon2MapGroup], a
|
|
ld [wRoamMon3MapGroup], a
|
|
ld [wRoamMon1MapNumber], a
|
|
ld [wRoamMon2MapNumber], a
|
|
ld [wRoamMon3MapNumber], a
|
|
|
|
call LoadOrRegenerateLuckyIDNumber
|
|
call InitializeMagikarpHouse
|
|
|
|
xor a
|
|
ld [wMonType], a
|
|
|
|
ld [wJohtoBadges], a
|
|
ld [wKantoBadges], a
|
|
|
|
ld [wChips], a
|
|
ld [wChips + 1], a
|
|
|
|
if START_COINS >= $10000
|
|
ld a, HIGH(START_COINS >> 8)
|
|
endc
|
|
ld [wCoins], a
|
|
ld a, HIGH(START_COINS) ; mid
|
|
ld [wCoins + 1], a
|
|
ld a, LOW(START_COINS)
|
|
ld [wCoins + 2], a
|
|
|
|
xor a
|
|
ld [wWhichMomItem], a
|
|
|
|
ld hl, wMomItemTriggerBalance
|
|
ld [hl], HIGH(MOM_COINS >> 8)
|
|
inc hl
|
|
ld [hl], HIGH(MOM_COINS) ; mid
|
|
inc hl
|
|
ld [hl], LOW(MOM_COINS)
|
|
|
|
call InitializeNPCNames
|
|
|
|
farcall InitDecorations
|
|
|
|
farcall DeletePartyMonMail
|
|
|
|
call ResetGameTime
|
|
ret
|
|
|
|
.InitList:
|
|
; Loads 0 in the count and -1 in the first item or mon slot.
|
|
xor a
|
|
ld [hli], a
|
|
dec a
|
|
ld [hl], a
|
|
ret
|
|
|
|
SetDefaultBoxNames:
|
|
ld hl, wBoxNames
|
|
ld c, 0
|
|
.loop
|
|
push hl
|
|
ld de, .Box
|
|
call CopyName2
|
|
dec hl
|
|
ld a, c
|
|
inc a
|
|
cp 10
|
|
jr c, .less
|
|
sub 10
|
|
ld [hl], "1"
|
|
inc hl
|
|
|
|
.less
|
|
add "0"
|
|
ld [hli], a
|
|
ld [hl], "@"
|
|
pop hl
|
|
ld de, 9
|
|
add hl, de
|
|
inc c
|
|
ld a, c
|
|
cp NUM_BOXES
|
|
jr c, .loop
|
|
ret
|
|
|
|
.Box:
|
|
db "BOX@"
|
|
|
|
InitializeMagikarpHouse:
|
|
ld hl, wBestMagikarpLengthFeet
|
|
ld a, $3
|
|
ld [hli], a
|
|
ld a, $6
|
|
ld [hli], a
|
|
ld de, .Ralph
|
|
call CopyName2
|
|
ret
|
|
|
|
.Ralph:
|
|
db "RALPH@"
|
|
|
|
InitializeNPCNames:
|
|
ld hl, .Rival
|
|
ld de, wRivalName
|
|
call .Copy
|
|
|
|
ld hl, .Mom
|
|
ld de, wMomsName
|
|
call .Copy
|
|
|
|
ld hl, .Red
|
|
ld de, wRedsName
|
|
call .Copy
|
|
|
|
ld hl, .Green
|
|
ld de, wGreensName
|
|
|
|
.Copy:
|
|
ld bc, NAME_LENGTH
|
|
call CopyBytes
|
|
ret
|
|
|
|
.Rival: db "???@"
|
|
.Red: db "RED@"
|
|
.Green: db "GREEN@"
|
|
.Mom: db "MOM@"
|
|
|
|
LoadOrRegenerateLuckyIDNumber:
|
|
ld a, BANK(sLuckyIDNumber)
|
|
call OpenSRAM
|
|
ld a, [wCurDay]
|
|
inc a
|
|
ld b, a
|
|
ld a, [sLuckyNumberDay]
|
|
cp b
|
|
ld a, [sLuckyIDNumber + 1]
|
|
ld c, a
|
|
ld a, [sLuckyIDNumber]
|
|
jr z, .skip
|
|
ld a, b
|
|
ld [sLuckyNumberDay], a
|
|
call Random
|
|
ld c, a
|
|
call Random
|
|
|
|
.skip
|
|
ld [wLuckyIDNumber], a
|
|
ld [sLuckyIDNumber], a
|
|
ld a, c
|
|
ld [wLuckyIDNumber + 1], a
|
|
ld [sLuckyIDNumber + 1], a
|
|
jp CloseSRAM
|
|
|
|
Continue:
|
|
farcall TryLoadSaveFile
|
|
jr c, .FailToLoad
|
|
jp GameMenu_KeepMusic
|
|
|
|
.FailToLoad:
|
|
ret
|
|
|
|
DisplaySaveInfoOnContinue:
|
|
lb de, 4, 8
|
|
call DisplayNormalContinueData
|
|
ret
|
|
|
|
DisplaySaveInfoOnSave:
|
|
lb de, 4, 0
|
|
jr DisplayNormalContinueData
|
|
|
|
DisplayNormalContinueData:
|
|
call Continue_LoadMenuHeader
|
|
call Continue_DisplayBadgesDexPlayerName
|
|
call Continue_PrintGameTime
|
|
call LoadFrame
|
|
call UpdateSprites
|
|
ret
|
|
|
|
Continue_LoadMenuHeader:
|
|
xor a
|
|
ldh [hBGMapMode], a
|
|
ld hl, .MenuHeader_Dex
|
|
ld a, [wStatusFlags]
|
|
bit STATUSFLAGS_POKEDEX_F, a
|
|
jr nz, .show_menu
|
|
ld hl, .MenuHeader_NoDex
|
|
|
|
.show_menu
|
|
call _OffsetMenuHeader
|
|
call MenuBox
|
|
call PlaceVerticalMenuItems
|
|
ret
|
|
|
|
.MenuHeader_Dex:
|
|
db MENU_BACKUP_TILES ; flags
|
|
menu_coords 0, 0, 15, 9
|
|
dw .MenuData_Dex
|
|
db 1 ; default option
|
|
|
|
.MenuData_Dex:
|
|
db 0 ; flags
|
|
db 4 ; items
|
|
db "PLAYER@"
|
|
db "BADGES@"
|
|
db "#DEX@"
|
|
db "TIME@"
|
|
|
|
.MenuHeader_NoDex:
|
|
db MENU_BACKUP_TILES ; flags
|
|
menu_coords 0, 0, 15, 9
|
|
dw .MenuData_NoDex
|
|
db 1 ; default option
|
|
|
|
.MenuData_NoDex:
|
|
db 0 ; flags
|
|
db 4 ; items
|
|
db "PLAYER <PLAYER>@"
|
|
db "BADGES@"
|
|
db " @"
|
|
db "TIME@"
|
|
|
|
Continue_DisplayBadgesDexPlayerName:
|
|
call MenuBoxCoord2Tile
|
|
push hl
|
|
decoord 13, 4, 0
|
|
add hl, de
|
|
call Continue_DisplayBadgeCount
|
|
pop hl
|
|
push hl
|
|
decoord 12, 6, 0
|
|
add hl, de
|
|
call Continue_DisplayPokedexNumCaught
|
|
pop hl
|
|
push hl
|
|
decoord 8, 2, 0
|
|
add hl, de
|
|
ld de, .Player
|
|
call PlaceString
|
|
pop hl
|
|
ret
|
|
|
|
.Player:
|
|
db "<PLAYER>@"
|
|
|
|
Continue_PrintGameTime:
|
|
decoord 9, 8, 0
|
|
add hl, de
|
|
call Continue_DisplayGameTime
|
|
ret
|
|
|
|
Continue_DisplayBadgeCount:
|
|
push hl
|
|
ld hl, wJohtoBadges
|
|
ld b, 2
|
|
call CountSetBits
|
|
pop hl
|
|
ld de, wNumSetBits
|
|
lb bc, 1, 2
|
|
jp PrintNum
|
|
|
|
Continue_DisplayPokedexNumCaught:
|
|
ld a, [wStatusFlags]
|
|
bit STATUSFLAGS_POKEDEX_F, a
|
|
ret z
|
|
push hl
|
|
ld hl, wPokedexCaught
|
|
if NUM_POKEMON % 8
|
|
ld b, NUM_POKEMON / 8 + 1
|
|
else
|
|
ld b, NUM_POKEMON / 8
|
|
endc
|
|
call CountSetBits
|
|
pop hl
|
|
ld de, wNumSetBits
|
|
lb bc, 1, 3
|
|
jp PrintNum
|
|
|
|
Continue_DisplayGameTime:
|
|
ld de, wGameTimeHours
|
|
lb bc, 2, 3
|
|
call PrintNum
|
|
ld [hl], ":"
|
|
inc hl
|
|
ld de, wGameTimeMinutes
|
|
lb bc, PRINTNUM_LEADINGZEROS | 1, 2
|
|
jp PrintNum
|
|
|
|
OakSpeech:
|
|
call RotateFourPalettesLeft
|
|
call ClearTilemap
|
|
|
|
ld de, MUSIC_ROUTE_30
|
|
call PlayMusic
|
|
|
|
call RotateFourPalettesRight
|
|
call RotateThreePalettesRight
|
|
xor a
|
|
ld [wCurPartySpecies], a
|
|
ld a, POKEMON_PROF
|
|
ld [wTrainerClass], a
|
|
call Intro_PrepTrainerPic
|
|
|
|
ld b, CGB_TRAINER_OR_MON_FRONTPIC_PALS
|
|
call GetCGBLayout
|
|
call Intro_RotatePalettesLeftFrontpic
|
|
|
|
ld hl, OakText1
|
|
call PrintText1bpp
|
|
call RotateThreePalettesRight
|
|
call ClearTilemap
|
|
|
|
ld a, WOOPER
|
|
ld [wCurSpecies], a
|
|
ld [wCurPartySpecies], a
|
|
call GetBaseData
|
|
|
|
hlcoord 6, 4
|
|
call PrepMonFrontpic
|
|
|
|
xor a
|
|
ld [wTempMonDVs], a
|
|
ld [wTempMonDVs + 1], a
|
|
|
|
ld b, CGB_TRAINER_OR_MON_FRONTPIC_PALS
|
|
call GetCGBLayout
|
|
call Intro_WipeInFrontpic
|
|
|
|
ld hl, OakText2
|
|
call PrintText1bpp
|
|
ld hl, OakText4
|
|
call PrintText1bpp
|
|
call RotateThreePalettesRight
|
|
call ClearTilemap
|
|
|
|
xor a
|
|
ld [wCurPartySpecies], a
|
|
ld a, POKEMON_PROF
|
|
ld [wTrainerClass], a
|
|
call Intro_PrepTrainerPic
|
|
|
|
ld b, CGB_TRAINER_OR_MON_FRONTPIC_PALS
|
|
call GetCGBLayout
|
|
call Intro_RotatePalettesLeftFrontpic
|
|
|
|
ld hl, OakText5
|
|
call PrintText1bpp
|
|
call RotateThreePalettesRight
|
|
call ClearTilemap
|
|
|
|
xor a
|
|
ld [wCurPartySpecies], a
|
|
farcall DrawIntroPlayerPic
|
|
|
|
ld b, CGB_TRAINER_OR_MON_FRONTPIC_PALS
|
|
call GetCGBLayout
|
|
call Intro_RotatePalettesLeftFrontpic
|
|
|
|
ld hl, OakText6
|
|
call PrintText1bpp
|
|
call NamePlayer
|
|
ld hl, OakText7
|
|
call PrintText1bpp
|
|
ret
|
|
|
|
OakText1:
|
|
text_far _OakText1
|
|
text_end
|
|
|
|
OakText2:
|
|
text_far _OakText2
|
|
text_asm
|
|
ld a, WOOPER
|
|
call PlayMonCry
|
|
call WaitSFX
|
|
ld hl, OakText3
|
|
ret
|
|
|
|
OakText3:
|
|
text_far _OakText3
|
|
text_end
|
|
|
|
OakText4:
|
|
text_far _OakText4
|
|
text_end
|
|
|
|
OakText5:
|
|
text_far _OakText5
|
|
text_end
|
|
|
|
OakText6:
|
|
text_far _OakText6
|
|
text_end
|
|
|
|
OakText7:
|
|
text_far _OakText7
|
|
text_end
|
|
|
|
NamePlayer:
|
|
farcall MovePlayerPicRight
|
|
farcall ShowPlayerNamingChoices
|
|
ld a, [wMenuCursorY]
|
|
dec a
|
|
jr z, .NewName
|
|
call StorePlayerName
|
|
farcall ApplyMonOrTrainerPals
|
|
farcall MovePlayerPicLeft
|
|
ret
|
|
|
|
.NewName:
|
|
ld b, NAME_PLAYER
|
|
ld de, wPlayerName
|
|
farcall NamingScreen
|
|
|
|
call RotateThreePalettesRight
|
|
call ClearTilemap
|
|
|
|
call LoadFrame
|
|
call WaitBGMap
|
|
|
|
xor a
|
|
ld [wCurPartySpecies], a
|
|
farcall DrawIntroPlayerPic
|
|
|
|
ld b, CGB_TRAINER_OR_MON_FRONTPIC_PALS
|
|
call GetCGBLayout
|
|
call RotateThreePalettesLeft
|
|
|
|
ld hl, wPlayerName
|
|
ld de, .Chris
|
|
ld a, [wPlayerGender]
|
|
bit PLAYERGENDER_FEMALE_F, a
|
|
jr z, .Male
|
|
ld de, .Kris
|
|
.Male:
|
|
call InitName
|
|
ret
|
|
|
|
.Chris:
|
|
db "CHRIS@@@@@@"
|
|
.Kris:
|
|
db "KRIS@@@@@@@"
|
|
|
|
StorePlayerName:
|
|
ld a, "@"
|
|
ld bc, NAME_LENGTH
|
|
ld hl, wPlayerName
|
|
call ByteFill
|
|
ld hl, wPlayerName
|
|
ld de, wStringBuffer2
|
|
call CopyName2
|
|
ret
|
|
|
|
ShrinkPlayer:
|
|
ldh a, [hROMBank]
|
|
push af
|
|
|
|
ld a, 32 ; fade time
|
|
ld [wMusicFade], a
|
|
ld de, MUSIC_NONE
|
|
ld a, e
|
|
ld [wMusicFadeID], a
|
|
ld a, d
|
|
ld [wMusicFadeID + 1], a
|
|
|
|
ld de, SFX_ESCAPE_ROPE
|
|
call PlaySFX
|
|
pop af
|
|
rst Bankswitch
|
|
|
|
ld c, 8
|
|
call DelayFrames
|
|
|
|
ld hl, Shrink1Pic
|
|
ld b, BANK(Shrink1Pic)
|
|
call ShrinkFrame
|
|
|
|
ld c, 8
|
|
call DelayFrames
|
|
|
|
ld hl, Shrink2Pic
|
|
ld b, BANK(Shrink2Pic)
|
|
call ShrinkFrame
|
|
|
|
ld c, 8
|
|
call DelayFrames
|
|
|
|
hlcoord 6, 5
|
|
ld b, 7
|
|
ld c, 7
|
|
call ClearBox
|
|
|
|
ld c, 3
|
|
call DelayFrames
|
|
|
|
call Intro_PlacePlayerSprite
|
|
call LoadFrame
|
|
|
|
ld c, 50
|
|
call DelayFrames
|
|
|
|
call RotateThreePalettesRight
|
|
call ClearTilemap
|
|
ret
|
|
|
|
Intro_RotatePalettesLeftFrontpic:
|
|
ld hl, IntroFadePalettes
|
|
ld b, IntroFadePalettes.End - IntroFadePalettes
|
|
.loop
|
|
ld a, [hli]
|
|
call DmgToCgbBGPals
|
|
ld c, 10
|
|
call DelayFrames
|
|
dec b
|
|
jr nz, .loop
|
|
ret
|
|
|
|
IntroFadePalettes:
|
|
dc 1, 1, 1, 0
|
|
dc 2, 2, 2, 0
|
|
dc 3, 3, 3, 0
|
|
dc 3, 3, 2, 0
|
|
dc 3, 3, 1, 0
|
|
dc 3, 2, 1, 0
|
|
.End
|
|
|
|
Intro_WipeInFrontpic:
|
|
ld a, $77
|
|
ldh [hWX], a
|
|
call DelayFrame
|
|
ld a, %11100100
|
|
call DmgToCgbBGPals
|
|
.loop
|
|
call DelayFrame
|
|
ldh a, [hWX]
|
|
sub $8
|
|
cp -1
|
|
ret z
|
|
ldh [hWX], a
|
|
jr .loop
|
|
|
|
Intro_PrepTrainerPic:
|
|
ld de, vTiles2
|
|
farcall GetTrainerPic
|
|
xor a
|
|
ldh [hGraphicStartTile], a
|
|
hlcoord 6, 4
|
|
lb bc, 7, 7
|
|
predef PlaceGraphic
|
|
ret
|
|
|
|
ShrinkFrame:
|
|
ld de, vTiles2
|
|
ld c, 7 * 7
|
|
predef DecompressGet2bpp
|
|
xor a
|
|
ldh [hGraphicStartTile], a
|
|
hlcoord 6, 4
|
|
lb bc, 7, 7
|
|
predef PlaceGraphic
|
|
ret
|
|
|
|
Intro_PlacePlayerSprite:
|
|
farcall GetPlayerIcon
|
|
ld c, 12
|
|
ld hl, vTiles0
|
|
call Request2bpp
|
|
|
|
ld hl, wShadowOAMSprite00
|
|
ld de, .sprites
|
|
ld a, [de]
|
|
inc de
|
|
|
|
ld c, a
|
|
.loop
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a ; y
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a ; x
|
|
ld a, [de]
|
|
inc de
|
|
ld [hli], a ; tile id
|
|
|
|
ld b, PAL_OW_RED
|
|
ld a, [wPlayerGender]
|
|
bit PLAYERGENDER_FEMALE_F, a
|
|
jr z, .male
|
|
ld b, PAL_OW_BLUE
|
|
.male
|
|
ld a, b
|
|
|
|
ld [hli], a ; attributes
|
|
dec c
|
|
jr nz, .loop
|
|
ret
|
|
|
|
.sprites
|
|
db 4
|
|
; y pxl, x pxl, tile offset
|
|
db 9 * TILE_WIDTH + 4, 9 * TILE_WIDTH, 0
|
|
db 9 * TILE_WIDTH + 4, 10 * TILE_WIDTH, 1
|
|
db 10 * TILE_WIDTH + 4, 9 * TILE_WIDTH, 2
|
|
db 10 * TILE_WIDTH + 4, 10 * TILE_WIDTH, 3
|