mirror of https://github.com/pret/pokecrystal.git
11624 lines
172 KiB
NASM
11624 lines
172 KiB
NASM
INCLUDE "includes.asm"
|
||
|
||
SECTION "bank1", ROMX, BANK[$1]
|
||
|
||
PlaceWaitingText:: ; 4000
|
||
hlcoord 3, 10
|
||
ld b, 1
|
||
ld c, 11
|
||
|
||
ld a, [wBattleMode]
|
||
and a
|
||
jr z, .notinbattle
|
||
|
||
call TextBox
|
||
jr .proceed
|
||
|
||
.notinbattle
|
||
predef Predef_LinkTextbox
|
||
|
||
.proceed
|
||
hlcoord 4, 11
|
||
ld de, .Waiting
|
||
call PlaceString
|
||
ld c, 50
|
||
jp DelayFrames
|
||
|
||
.Waiting ; 4025
|
||
db "Waiting...!@"
|
||
|
||
LoadPushOAM:: ; 4031
|
||
ld c, hPushOAM - $ff00
|
||
ld b, PushOAMEnd - PushOAM
|
||
ld hl, PushOAM
|
||
.loop
|
||
ld a, [hli]
|
||
ld [$ff00+c], a
|
||
inc c
|
||
dec b
|
||
jr nz, .loop
|
||
ret
|
||
|
||
PushOAM: ; 403f
|
||
ld a, Sprites / $100
|
||
ld [rDMA], a
|
||
ld a, 40
|
||
.loop
|
||
dec a
|
||
jr nz, .loop
|
||
ret
|
||
PushOAMEnd
|
||
|
||
INCLUDE "engine/map_objects.asm"
|
||
|
||
INCLUDE "engine/intro_menu.asm"
|
||
|
||
Function6454:: ; 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 .Function6473
|
||
|
||
pop af
|
||
ld [hBGMapMode], a
|
||
pop af
|
||
ld [hOAMUpdate], a
|
||
ld hl, VramState
|
||
set 6, [hl]
|
||
ret
|
||
|
||
.Function6473
|
||
xor a
|
||
ld [hFFC6], a
|
||
ld [hBGMapMode], a
|
||
ld a, $90
|
||
ld [hWY], a
|
||
call OverworldTextModeSwitch
|
||
ld a, VBGMap1 / $100
|
||
call .Function64b9
|
||
call Function2e20
|
||
callba LoadOW_BGPal7
|
||
callba ApplyPals
|
||
ld a, $1
|
||
ld [hCGBPalUpdate], a
|
||
xor a
|
||
ld [hBGMapMode], a
|
||
ld [hWY], a
|
||
callba Function64db ; no need to farcall
|
||
ld a, VBGMap0 / $100
|
||
call .Function64b9
|
||
xor a
|
||
ld [wBGMapAnchor], a
|
||
ld a, VBGMap0 / $100
|
||
ld [wBGMapAnchor + 1], a
|
||
xor a
|
||
ld [hSCX], a
|
||
ld [hSCY], a
|
||
call Function5958
|
||
ret
|
||
|
||
.Function64b9: ; 64b9
|
||
ld [hBGMapAddress + 1], a
|
||
xor a
|
||
ld [hBGMapAddress], a
|
||
ret
|
||
|
||
Function64bf:: ; 64bf
|
||
ld a, [hOAMUpdate]
|
||
push af
|
||
ld a, $1
|
||
ld [hOAMUpdate], a
|
||
|
||
call .Function64cd
|
||
|
||
pop af
|
||
ld [hOAMUpdate], a
|
||
ret
|
||
|
||
.Function64cd
|
||
call LoadFontsExtra
|
||
ld a, $90
|
||
ld [hWY], a
|
||
call Function2e31
|
||
call LoadStandardFont
|
||
ret
|
||
|
||
Function64db: ; 64db
|
||
ld a, [rSVBK]
|
||
push af
|
||
ld a, $6
|
||
ld [rSVBK], a
|
||
|
||
ld a, $60
|
||
ld hl, wDecompressScratch
|
||
ld bc, wBackupAttrMap - 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
|
||
|
||
INCLUDE "engine/learn.asm"
|
||
|
||
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 a, -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>", $04 + 1
|
||
db "<PLAY_G>", $18 + 1
|
||
db $1d, "%" + 1
|
||
db $35, "<GREEN>" + 1
|
||
db "<ENEMY>", "<ENEMY>" + 1
|
||
db $49, "<TM>" + 1
|
||
db "<ROCKET>", "┘" + 1
|
||
db -1 ; end
|
||
|
||
INCLUDE "engine/math.asm"
|
||
|
||
ItemAttributes: ; 67c1
|
||
INCLUDE "items/item_attributes.asm"
|
||
INCLUDE "engine/npc_movement.asm"
|
||
|
||
GetFirstPokemonHappiness: ; 718d
|
||
ld hl, PartyMon1Happiness
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
ld de, PartySpecies
|
||
.loop
|
||
ld a, [de]
|
||
cp EGG
|
||
jr nz, .done
|
||
inc de
|
||
add hl, bc
|
||
jr .loop
|
||
|
||
.done
|
||
ld [wd265], a
|
||
ld a, [hl]
|
||
ld [ScriptVar], a
|
||
call GetPokemonName
|
||
jp CopyPokemonName_Buffer1_Buffer3
|
||
|
||
CheckFirstMonIsEgg: ; 71ac
|
||
ld a, [PartySpecies]
|
||
ld [wd265], a
|
||
cp EGG
|
||
ld a, $1
|
||
jr z, .egg
|
||
xor a
|
||
|
||
.egg
|
||
ld [ScriptVar], a
|
||
call GetPokemonName
|
||
jp CopyPokemonName_Buffer1_Buffer3
|
||
|
||
ChangeHappiness: ; 71c2
|
||
; Perform happiness action c on CurPartyMon
|
||
|
||
ld a, [CurPartyMon]
|
||
inc a
|
||
ld e, a
|
||
ld d, 0
|
||
ld hl, PartySpecies - 1
|
||
add hl, de
|
||
ld a, [hl]
|
||
cp EGG
|
||
ret z
|
||
|
||
push bc
|
||
ld hl, PartyMon1Happiness
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
ld a, [CurPartyMon]
|
||
call AddNTimes
|
||
pop bc
|
||
|
||
ld d, h
|
||
ld e, l
|
||
|
||
push de
|
||
ld a, [de]
|
||
cp 100
|
||
ld e, 0
|
||
jr c, .ok
|
||
inc e
|
||
cp 200
|
||
jr c, .ok
|
||
inc e
|
||
|
||
.ok
|
||
dec c
|
||
ld b, 0
|
||
ld hl, .Actions
|
||
rept 3
|
||
add hl, bc
|
||
endr
|
||
ld d, 0
|
||
add hl, de
|
||
ld a, [hl]
|
||
cp 100
|
||
pop de
|
||
|
||
ld a, [de]
|
||
jr nc, .negative
|
||
add [hl]
|
||
jr nc, .done
|
||
ld a, -1
|
||
jr .done
|
||
|
||
.negative
|
||
add [hl]
|
||
jr c, .done
|
||
xor a
|
||
|
||
.done
|
||
ld [de], a
|
||
ld a, [wBattleMode]
|
||
and a
|
||
ret z
|
||
ld a, [CurPartyMon]
|
||
ld b, a
|
||
ld a, [wPartyMenuCursor]
|
||
cp b
|
||
ret nz
|
||
ld a, [de]
|
||
ld [BattleMonHappiness], a
|
||
ret
|
||
|
||
.Actions
|
||
db +5, +3, +2 ; Gained a level
|
||
db +5, +3, +2 ; Vitamin
|
||
db +1, +1, +0 ; X Item
|
||
db +3, +2, +1 ; Battled a Gym Leader
|
||
db +1, +1, +0 ; Learned a move
|
||
db -1, -1, -1 ; Lost to an enemy
|
||
db -5, -5, -10 ; Fainted due to poison
|
||
db -5, -5, -10 ; Lost to a much stronger enemy
|
||
db +1, +1, +1 ; Haircut (Y1)
|
||
db +3, +3, +1 ; Haircut (Y2)
|
||
db +5, +5, +2 ; Haircut (Y3)
|
||
db +1, +1, +1 ; Haircut (O1)
|
||
db +3, +3, +1 ; Haircut (O2)
|
||
db +10, +10, +4 ; Haircut (O3)
|
||
db -5, -5, -10 ; Used Heal Powder or Energypowder (bitter)
|
||
db -10, -10, -15 ; Used Energy Root (bitter)
|
||
db -15, -15, -20 ; Used Revival Herb (bitter)
|
||
db +3, +3, +1 ; Grooming
|
||
db +10, +6, +4 ; Gained a level in the place where it was caught
|
||
|
||
StepHappiness:: ; 725a
|
||
; Raise the party's happiness by 1 point every other step cycle.
|
||
|
||
ld hl, wHappinessStepCount
|
||
ld a, [hl]
|
||
inc a
|
||
and 1
|
||
ld [hl], a
|
||
ret nz
|
||
|
||
ld de, PartyCount
|
||
ld a, [de]
|
||
and a
|
||
ret z
|
||
|
||
ld c, a
|
||
ld hl, PartyMon1Happiness
|
||
.loop
|
||
inc de
|
||
ld a, [de]
|
||
cp EGG
|
||
jr z, .next
|
||
inc [hl]
|
||
jr nz, .next
|
||
ld [hl], $ff
|
||
|
||
.next
|
||
push de
|
||
ld de, PARTYMON_STRUCT_LENGTH
|
||
add hl, de
|
||
pop de
|
||
dec c
|
||
jr nz, .loop
|
||
ret
|
||
|
||
DaycareStep:: ; 7282
|
||
|
||
ld a, [wDaycareMan]
|
||
bit 0, a
|
||
jr z, .daycare_lady
|
||
|
||
ld a, [wBreedMon1Level] ; level
|
||
cp 100
|
||
jr nc, .daycare_lady
|
||
ld hl, wBreedMon1Exp + 2 ; exp
|
||
inc [hl]
|
||
jr nz, .daycare_lady
|
||
dec hl
|
||
inc [hl]
|
||
jr nz, .daycare_lady
|
||
dec hl
|
||
inc [hl]
|
||
ld a, [hl]
|
||
cp 5242880 / $10000
|
||
jr c, .daycare_lady
|
||
ld a, 5242880 / $10000
|
||
ld [hl], a
|
||
|
||
.daycare_lady
|
||
ld a, [wDaycareLady]
|
||
bit 0, a
|
||
jr z, .check_egg
|
||
|
||
ld a, [wBreedMon2Level] ; level
|
||
cp 100
|
||
jr nc, .check_egg
|
||
ld hl, wBreedMon2Exp + 2 ; exp
|
||
inc [hl]
|
||
jr nz, .check_egg
|
||
dec hl
|
||
inc [hl]
|
||
jr nz, .check_egg
|
||
dec hl
|
||
inc [hl]
|
||
ld a, [hl]
|
||
cp 5242880 / $10000
|
||
jr c, .check_egg
|
||
ld a, 5242880 / $10000
|
||
ld [hl], a
|
||
|
||
.check_egg
|
||
ld hl, wDaycareMan
|
||
bit 5, [hl] ; egg
|
||
ret z
|
||
ld hl, wStepsToEgg
|
||
dec [hl]
|
||
ret nz
|
||
|
||
call Random
|
||
ld [hl], a
|
||
callab CheckBreedmonCompatibility
|
||
ld a, [wd265]
|
||
cp 230
|
||
ld b, -1 + 32 percent
|
||
jr nc, .okay
|
||
ld a, [wd265]
|
||
cp 170
|
||
ld b, 16 percent
|
||
jr nc, .okay
|
||
ld a, [wd265]
|
||
cp 110
|
||
ld b, 12 percent
|
||
jr nc, .okay
|
||
ld b, 4 percent
|
||
|
||
.okay
|
||
call Random
|
||
cp b
|
||
ret nc
|
||
ld hl, wDaycareMan
|
||
res 5, [hl]
|
||
set 6, [hl]
|
||
ret
|
||
|
||
SpecialGiveShuckle: ; 7305
|
||
|
||
; Adding to the party.
|
||
xor a
|
||
ld [MonType], a
|
||
|
||
; Level 15 Shuckle.
|
||
ld a, SHUCKLE
|
||
ld [CurPartySpecies], a
|
||
ld a, 15
|
||
ld [CurPartyLevel], a
|
||
|
||
predef TryAddMonToParty
|
||
jr nc, .NotGiven
|
||
|
||
; Caught data.
|
||
ld b, 0
|
||
callba SetGiftPartyMonCaughtData
|
||
|
||
; Holding a Berry.
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
ld a, [PartyCount]
|
||
dec a
|
||
push af
|
||
push bc
|
||
ld hl, PartyMon1Item
|
||
call AddNTimes
|
||
ld [hl], BERRY
|
||
pop bc
|
||
pop af
|
||
|
||
; OT ID.
|
||
ld hl, PartyMon1ID
|
||
call AddNTimes
|
||
ld a, $2
|
||
ld [hli], a
|
||
ld [hl], $6
|
||
|
||
; Nickname.
|
||
ld a, [PartyCount]
|
||
dec a
|
||
ld hl, PartyMonNicknames
|
||
call SkipNames
|
||
ld de, SpecialShuckleNick
|
||
call CopyName2
|
||
|
||
; OT.
|
||
ld a, [PartyCount]
|
||
dec a
|
||
ld hl, PartyMonOT
|
||
call SkipNames
|
||
ld de, SpecialShuckleOT
|
||
call CopyName2
|
||
|
||
; Engine flag for this event.
|
||
ld hl, DailyFlags
|
||
set 5, [hl]
|
||
; setflag ENGINE_SHUCKLE_GIVEN
|
||
ld a, 1
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
.NotGiven
|
||
xor a
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
SpecialShuckleOT:
|
||
db "MANIA@"
|
||
SpecialShuckleNick:
|
||
db "SHUCKIE@"
|
||
|
||
SpecialReturnShuckle: ; 737e
|
||
callba SelectMonFromParty
|
||
jr c, .refused
|
||
|
||
ld a, [CurPartySpecies]
|
||
cp SHUCKLE
|
||
jr nz, .DontReturn
|
||
|
||
ld a, [CurPartyMon]
|
||
ld hl, PartyMon1ID
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
call AddNTimes
|
||
|
||
; OT ID
|
||
ld a, [hli]
|
||
cp 00518 / $100
|
||
jr nz, .DontReturn
|
||
ld a, [hl]
|
||
cp 00518 % $100
|
||
jr nz, .DontReturn
|
||
|
||
; OT
|
||
ld a, [CurPartyMon]
|
||
ld hl, PartyMonOT
|
||
call SkipNames
|
||
ld de, SpecialShuckleOT
|
||
.CheckOT
|
||
ld a, [de]
|
||
cp [hl]
|
||
jr nz, .DontReturn
|
||
cp "@"
|
||
jr z, .done
|
||
inc de
|
||
inc hl
|
||
jr .CheckOT
|
||
|
||
.done
|
||
callba CheckCurPartyMonFainted
|
||
jr c, .fainted
|
||
ld a, [CurPartyMon]
|
||
ld hl, PartyMon1Happiness
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
call AddNTimes
|
||
ld a, [hl]
|
||
cp 150
|
||
ld a, $3
|
||
jr nc, .HappyToStayWithYou
|
||
xor a ; take from pc
|
||
ld [wPokemonWithdrawDepositParameter], a
|
||
callab RemoveMonFromPartyOrBox
|
||
ld a, $2
|
||
.HappyToStayWithYou
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
.refused
|
||
ld a, $1
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
.DontReturn
|
||
xor a
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
.fainted
|
||
ld a, $4
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
Special_BillsGrandfather: ; 73f7
|
||
callba SelectMonFromParty
|
||
jr c, .cancel
|
||
ld a, [CurPartySpecies]
|
||
ld [ScriptVar], a
|
||
ld [wNamedObjectIndexBuffer], a
|
||
call GetPokemonName
|
||
jp CopyPokemonName_Buffer1_Buffer3
|
||
|
||
.cancel
|
||
xor a
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
Special_YoungerHaircutBrother: ; 7413
|
||
ld hl, Data_YoungerHaircutBrother
|
||
jr MassageOrHaircut
|
||
|
||
Special_OlderHaircutBrother: ; 7418
|
||
ld hl, Data_OlderHaircutBrother
|
||
jr MassageOrHaircut
|
||
|
||
Special_DaisyMassage: ; 741d
|
||
ld hl, Data_DaisyMassage
|
||
|
||
MassageOrHaircut: ; 7420
|
||
push hl
|
||
callba SelectMonFromParty
|
||
pop hl
|
||
jr c, .nope
|
||
ld a, [CurPartySpecies]
|
||
cp EGG
|
||
jr z, .egg
|
||
push hl
|
||
call GetCurNick
|
||
call CopyPokemonName_Buffer1_Buffer3
|
||
pop hl
|
||
call Random
|
||
; Bug: Subtracting $ff from $ff fails to set c.
|
||
; This can result in overflow into the next data array.
|
||
; In the case of getting a massage from Daisy, we bleed
|
||
; into CopyPokemonName_Buffer1_Buffer3, which passes
|
||
; $d0 to ChangeHappiness and returns $73 to the script.
|
||
; The end result is that there is a 0.4% chance your
|
||
; Pokemon's happiness will not change at all.
|
||
.loop
|
||
sub [hl]
|
||
jr c, .ok
|
||
rept 3
|
||
inc hl
|
||
endr
|
||
jr .loop
|
||
|
||
.ok
|
||
inc hl
|
||
ld a, [hli]
|
||
ld [ScriptVar], a
|
||
ld c, [hl]
|
||
call ChangeHappiness
|
||
ret
|
||
|
||
.nope
|
||
xor a
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
.egg
|
||
ld a, 1
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
Data_YoungerHaircutBrother: ; 7459
|
||
db $4c, 2, HAPPINESS_YOUNGCUT1 ; 30% chance
|
||
db $80, 3, HAPPINESS_YOUNGCUT2 ; 20% chance
|
||
db $ff, 4, HAPPINESS_YOUNGCUT3 ; 50% chance
|
||
|
||
Data_OlderHaircutBrother: ; 7462
|
||
db $9a, 2, HAPPINESS_OLDERCUT1 ; 60% chance
|
||
db $4c, 3, HAPPINESS_OLDERCUT2 ; 10% chance
|
||
db $ff, 4, HAPPINESS_OLDERCUT3 ; 30% chance
|
||
|
||
Data_DaisyMassage: ; 746b
|
||
db $ff, 2, HAPPINESS_MASSAGE ; 99.6% chance
|
||
|
||
CopyPokemonName_Buffer1_Buffer3: ; 746e
|
||
ld hl, StringBuffer1
|
||
ld de, StringBuffer3
|
||
ld bc, PKMN_NAME_LENGTH
|
||
jp CopyBytes
|
||
|
||
Predef1: ; 747a
|
||
; not used
|
||
ret
|
||
|
||
SECTION "bank2", ROMX, BANK[$2]
|
||
|
||
BlankScreen: ; 8000
|
||
call DisableSpriteUpdates
|
||
xor a
|
||
ld [hBGMapMode], a
|
||
call ClearBGPalettes
|
||
call ClearSprites
|
||
hlcoord 0, 0
|
||
ld bc, TileMapEnd - TileMap
|
||
ld a, " "
|
||
call ByteFill
|
||
hlcoord 0, 0, AttrMap
|
||
ld bc, AttrMapEnd - AttrMap
|
||
ld a, $7
|
||
call ByteFill
|
||
call WaitBGMap2
|
||
call SetPalettes
|
||
ret
|
||
|
||
SpawnPlayer: ; 8029
|
||
ld a, -1
|
||
ld [wObjectFollow_Leader], a
|
||
ld [wObjectFollow_Follower], a
|
||
ld a, $0
|
||
ld hl, PlayerObjectTemplate
|
||
call CopyPlayerObjectTemplate
|
||
ld b, $0
|
||
call PlayerSpawn_ConvertCoords
|
||
ld a, $0
|
||
call GetMapObject
|
||
ld hl, MAPOBJECT_COLOR
|
||
add hl, bc
|
||
ln e, (1 << 3) | PAL_OW_RED, PERSONTYPE_SCRIPT
|
||
ld a, [wPlayerSpriteSetupFlags]
|
||
bit 2, a
|
||
jr nz, .ok
|
||
ld a, [PlayerGender]
|
||
bit 0, a
|
||
jr z, .ok
|
||
ln e, (1 << 3) | PAL_OW_BLUE, PERSONTYPE_SCRIPT
|
||
|
||
.ok
|
||
ld [hl], e
|
||
ld a, $0
|
||
ld [hMapObjectIndexBuffer], a
|
||
ld bc, MapObjects
|
||
ld a, $0
|
||
ld [hObjectStructIndexBuffer], a
|
||
ld de, ObjectStructs
|
||
call CopyMapObjectToObjectStruct
|
||
ld a, PLAYER
|
||
ld [wCenteredObject], a
|
||
ret
|
||
|
||
PlayerObjectTemplate: ; 8071
|
||
; A dummy map object used to initialize the player object.
|
||
; Shorter than the actual amount copied by two bytes.
|
||
; Said bytes seem to be unused.
|
||
person_event SPRITE_CHRIS, -4, -4, SPRITEMOVEDATA_PLAYER, 15, 15, -1, -1, 0, PERSONTYPE_SCRIPT, 0, 0, -1
|
||
|
||
CopyDECoordsToMapObject:: ; 807e
|
||
push de
|
||
ld a, b
|
||
call GetMapObject
|
||
pop de
|
||
ld hl, MAPOBJECT_X_COORD
|
||
add hl, bc
|
||
ld [hl], d
|
||
ld hl, MAPOBJECT_Y_COORD
|
||
add hl, bc
|
||
ld [hl], e
|
||
ret
|
||
|
||
PlayerSpawn_ConvertCoords: ; 808f
|
||
push bc
|
||
ld a, [XCoord]
|
||
add 4
|
||
ld d, a
|
||
ld a, [YCoord]
|
||
add 4
|
||
ld e, a
|
||
pop bc
|
||
call CopyDECoordsToMapObject
|
||
ret
|
||
|
||
WritePersonXY:: ; 80a1
|
||
ld a, b
|
||
call CheckObjectVisibility
|
||
ret c
|
||
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, bc
|
||
ld d, [hl]
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, bc
|
||
ld e, [hl]
|
||
ld a, [hMapObjectIndexBuffer]
|
||
ld b, a
|
||
call CopyDECoordsToMapObject
|
||
and a
|
||
ret
|
||
|
||
RefreshPlayerCoords: ; 80b8
|
||
ld a, [XCoord]
|
||
add 4
|
||
ld d, a
|
||
ld hl, PlayerStandingMapX
|
||
sub [hl]
|
||
ld [hl], d
|
||
ld hl, MapObjects + MAPOBJECT_X_COORD
|
||
ld [hl], d
|
||
ld hl, PlayerLastMapX
|
||
ld [hl], d
|
||
ld d, a
|
||
ld a, [YCoord]
|
||
add 4
|
||
ld e, a
|
||
ld hl, PlayerStandingMapY
|
||
sub [hl]
|
||
ld [hl], e
|
||
ld hl, MapObjects + MAPOBJECT_Y_COORD
|
||
ld [hl], e
|
||
ld hl, PlayerLastMapY
|
||
ld [hl], e
|
||
ld e, a
|
||
ld a, [wObjectFollow_Leader]
|
||
cp $0
|
||
ret nz ; wtf
|
||
ret
|
||
|
||
CopyObjectStruct:: ; 80e7
|
||
call CheckObjectMask
|
||
and a
|
||
ret nz ; masked
|
||
|
||
ld hl, ObjectStructs + OBJECT_STRUCT_LENGTH * 1
|
||
ld a, 1
|
||
ld de, OBJECT_STRUCT_LENGTH
|
||
.loop
|
||
ld [hObjectStructIndexBuffer], a
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .done
|
||
add hl, de
|
||
ld a, [hObjectStructIndexBuffer]
|
||
inc a
|
||
cp NUM_OBJECT_STRUCTS
|
||
jr nz, .loop
|
||
scf
|
||
ret ; overflow
|
||
|
||
.done
|
||
ld d, h
|
||
ld e, l
|
||
call CopyMapObjectToObjectStruct
|
||
ld hl, VramState
|
||
bit 7, [hl]
|
||
ret z
|
||
|
||
ld hl, OBJECT_FLAGS2
|
||
add hl, de
|
||
set 5, [hl]
|
||
ret
|
||
|
||
CopyMapObjectToObjectStruct: ; 8116
|
||
call .CopyMapObjectToTempObject
|
||
call CopyTempObjectToObjectStruct
|
||
ret
|
||
|
||
.CopyMapObjectToTempObject: ; 811d
|
||
ld a, [hObjectStructIndexBuffer]
|
||
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
||
add hl, bc
|
||
ld [hl], a
|
||
|
||
ld a, [hMapObjectIndexBuffer]
|
||
ld [wTempObjectCopyMapObjectIndex], a
|
||
|
||
ld hl, MAPOBJECT_SPRITE
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld [wTempObjectCopySprite], a
|
||
|
||
call GetSpriteVTile
|
||
ld [wTempObjectCopySpriteVTile], a
|
||
|
||
ld a, [hl]
|
||
call GetSpritePalette
|
||
ld [wTempObjectCopyPalette], a
|
||
|
||
ld hl, MAPOBJECT_COLOR
|
||
add hl, bc
|
||
ld a, [hl]
|
||
and $f0
|
||
jr z, .skip_color_override
|
||
swap a
|
||
and $7 ; OAM_PALETTE
|
||
ld [wTempObjectCopyPalette], a
|
||
|
||
.skip_color_override
|
||
ld hl, MAPOBJECT_MOVEMENT
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld [wTempObjectCopyMovement], a
|
||
|
||
ld hl, MAPOBJECT_RANGE
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld [wTempObjectCopyRange], a
|
||
|
||
ld hl, MAPOBJECT_X_COORD
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld [wTempObjectCopyX], a
|
||
|
||
ld hl, MAPOBJECT_Y_COORD
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld [wTempObjectCopyY], a
|
||
|
||
ld hl, MAPOBJECT_RADIUS
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld [wTempObjectCopyRadius], a
|
||
ret
|
||
|
||
InitializeVisibleSprites: ; 8177
|
||
ld bc, MapObjects + OBJECT_LENGTH
|
||
ld a, 1
|
||
.loop
|
||
ld [hMapObjectIndexBuffer], a
|
||
ld hl, MAPOBJECT_SPRITE
|
||
add hl, bc
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .next
|
||
|
||
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
||
add hl, bc
|
||
ld a, [hl]
|
||
cp -1
|
||
jr nz, .next
|
||
|
||
ld a, [XCoord]
|
||
ld d, a
|
||
ld a, [YCoord]
|
||
ld e, a
|
||
|
||
ld hl, MAPOBJECT_X_COORD
|
||
add hl, bc
|
||
ld a, [hl]
|
||
add 1
|
||
sub d
|
||
jr c, .next
|
||
|
||
cp MAPOBJECT_SCREEN_WIDTH
|
||
jr nc, .next
|
||
|
||
ld hl, MAPOBJECT_Y_COORD
|
||
add hl, bc
|
||
ld a, [hl]
|
||
add 1
|
||
sub e
|
||
jr c, .next
|
||
|
||
cp MAPOBJECT_SCREEN_HEIGHT
|
||
jr nc, .next
|
||
|
||
push bc
|
||
call CopyObjectStruct
|
||
pop bc
|
||
jp c, .ret
|
||
|
||
.next
|
||
ld hl, OBJECT_LENGTH
|
||
add hl, bc
|
||
ld b, h
|
||
ld c, l
|
||
ld a, [hMapObjectIndexBuffer]
|
||
inc a
|
||
cp NUM_OBJECTS
|
||
jr nz, .loop
|
||
ret
|
||
|
||
.ret: ; 81c9
|
||
ret
|
||
|
||
CheckObjectEnteringVisibleRange:: ; 81ca
|
||
nop
|
||
ld a, [wPlayerStepDirection]
|
||
cp STANDING
|
||
ret z
|
||
ld hl, .dw
|
||
rst JumpTable
|
||
ret
|
||
|
||
.dw: ; 81d6
|
||
dw .Down
|
||
dw .Up
|
||
dw .Left
|
||
dw .Right
|
||
|
||
.Up: ; 81de
|
||
ld a, [YCoord]
|
||
sub 1
|
||
jr .Vertical
|
||
|
||
.Down: ; 81e5
|
||
ld a, [YCoord]
|
||
add 9
|
||
.Vertical: ; 81ea
|
||
ld d, a
|
||
ld a, [XCoord]
|
||
ld e, a
|
||
ld bc, MapObjects + OBJECT_LENGTH
|
||
ld a, 1
|
||
.loop_v
|
||
ld [hMapObjectIndexBuffer], a
|
||
ld hl, MAPOBJECT_SPRITE
|
||
add hl, bc
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .next_v
|
||
ld hl, MAPOBJECT_Y_COORD
|
||
add hl, bc
|
||
ld a, d
|
||
cp [hl]
|
||
jr nz, .next_v
|
||
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
||
add hl, bc
|
||
ld a, [hl]
|
||
cp -1
|
||
jr nz, .next_v
|
||
ld hl, MAPOBJECT_X_COORD
|
||
add hl, bc
|
||
ld a, [hl]
|
||
add 1
|
||
sub e
|
||
jr c, .next_v
|
||
cp MAPOBJECT_SCREEN_WIDTH
|
||
jr nc, .next_v
|
||
push de
|
||
push bc
|
||
call CopyObjectStruct
|
||
pop bc
|
||
pop de
|
||
|
||
.next_v
|
||
ld hl, OBJECT_LENGTH
|
||
add hl, bc
|
||
ld b, h
|
||
ld c, l
|
||
ld a, [hMapObjectIndexBuffer]
|
||
inc a
|
||
cp NUM_OBJECTS
|
||
jr nz, .loop_v
|
||
ret
|
||
|
||
.Left: ; 8232
|
||
ld a, [XCoord]
|
||
sub 1
|
||
jr .Horizontal
|
||
|
||
.Right: ; 8239
|
||
ld a, [XCoord]
|
||
add 10
|
||
.Horizontal: ; 823e
|
||
ld e, a
|
||
ld a, [YCoord]
|
||
ld d, a
|
||
ld bc, MapObjects + OBJECT_LENGTH
|
||
ld a, 1
|
||
.loop_h
|
||
ld [hMapObjectIndexBuffer], a
|
||
ld hl, MAPOBJECT_SPRITE
|
||
add hl, bc
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .next_h
|
||
ld hl, MAPOBJECT_X_COORD
|
||
add hl, bc
|
||
ld a, e
|
||
cp [hl]
|
||
jr nz, .next_h
|
||
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
||
add hl, bc
|
||
ld a, [hl]
|
||
cp -1
|
||
jr nz, .next_h
|
||
ld hl, MAPOBJECT_Y_COORD
|
||
add hl, bc
|
||
ld a, [hl]
|
||
add 1
|
||
sub d
|
||
jr c, .next_h
|
||
cp MAPOBJECT_SCREEN_HEIGHT
|
||
jr nc, .next_h
|
||
push de
|
||
push bc
|
||
call CopyObjectStruct
|
||
pop bc
|
||
pop de
|
||
|
||
.next_h
|
||
ld hl, OBJECT_LENGTH
|
||
add hl, bc
|
||
ld b, h
|
||
ld c, l
|
||
ld a, [hMapObjectIndexBuffer]
|
||
inc a
|
||
cp NUM_OBJECTS
|
||
jr nz, .loop_h
|
||
ret
|
||
|
||
CopyTempObjectToObjectStruct: ; 8286
|
||
ld a, [wTempObjectCopyMapObjectIndex]
|
||
ld hl, OBJECT_MAP_OBJECT_INDEX
|
||
add hl, de
|
||
ld [hl], a
|
||
|
||
ld a, [wTempObjectCopyMovement]
|
||
call CopySpriteMovementData
|
||
|
||
ld a, [wTempObjectCopyPalette]
|
||
ld hl, OBJECT_PALETTE
|
||
add hl, de
|
||
or [hl]
|
||
ld [hl], a
|
||
|
||
ld a, [wTempObjectCopyY]
|
||
call .InitYCoord
|
||
|
||
ld a, [wTempObjectCopyX]
|
||
call .InitXCoord
|
||
|
||
ld a, [wTempObjectCopySprite]
|
||
ld hl, OBJECT_SPRITE
|
||
add hl, de
|
||
ld [hl], a
|
||
|
||
ld a, [wTempObjectCopySpriteVTile]
|
||
ld hl, OBJECT_SPRITE_TILE
|
||
add hl, de
|
||
ld [hl], a
|
||
|
||
ld hl, OBJECT_STEP_TYPE
|
||
add hl, de
|
||
ld [hl], STEP_TYPE_00
|
||
|
||
ld hl, OBJECT_FACING_STEP
|
||
add hl, de
|
||
ld [hl], STANDING
|
||
|
||
ld a, [wTempObjectCopyRadius]
|
||
call .InitRadius
|
||
|
||
ld a, [wTempObjectCopyRange]
|
||
ld hl, OBJECT_RANGE
|
||
add hl, de
|
||
ld [hl], a
|
||
|
||
and a
|
||
ret
|
||
|
||
.InitYCoord: ; 82d5
|
||
ld hl, OBJECT_INIT_Y
|
||
add hl, de
|
||
ld [hl], a
|
||
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, de
|
||
ld [hl], a
|
||
|
||
ld hl, YCoord
|
||
sub [hl]
|
||
and $f
|
||
swap a
|
||
ld hl, wFollowNotExactPersonY
|
||
sub [hl]
|
||
ld hl, OBJECT_SPRITE_Y
|
||
add hl, de
|
||
ld [hl], a
|
||
ret
|
||
|
||
.InitXCoord: ; 82f1
|
||
ld hl, OBJECT_INIT_X
|
||
add hl, de
|
||
ld [hl], a
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, de
|
||
ld [hl], a
|
||
ld hl, XCoord
|
||
sub [hl]
|
||
and $f
|
||
swap a
|
||
ld hl, wFollowNotExactPersonX
|
||
sub [hl]
|
||
ld hl, OBJECT_SPRITE_X
|
||
add hl, de
|
||
ld [hl], a
|
||
ret
|
||
|
||
.InitRadius: ; 830d
|
||
ld h, a
|
||
inc a
|
||
and $f
|
||
ld l, a
|
||
ld a, h
|
||
add $10
|
||
and $f0
|
||
or l
|
||
ld hl, OBJECT_RADIUS
|
||
add hl, de
|
||
ld [hl], a
|
||
ret
|
||
|
||
TrainerWalkToPlayer: ; 831e
|
||
ld a, [hLastTalked]
|
||
call InitMovementBuffer
|
||
ld a, movement_step_sleep_1
|
||
call AppendToMovementBuffer
|
||
ld a, [wd03f]
|
||
dec a
|
||
jr z, .TerminateStep
|
||
ld a, [hLastTalked]
|
||
ld b, a
|
||
ld c, PLAYER
|
||
ld d, 1
|
||
call .GetPathToPlayer
|
||
call DecrementMovementBufferCount
|
||
|
||
.TerminateStep
|
||
ld a, movement_step_end
|
||
call AppendToMovementBuffer
|
||
ret
|
||
|
||
.GetPathToPlayer: ; 8341
|
||
push de
|
||
push bc
|
||
; get player object struct, load to de
|
||
ld a, c
|
||
call GetMapObject
|
||
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
||
add hl, bc
|
||
ld a, [hl]
|
||
call GetObjectStruct
|
||
ld d, b
|
||
ld e, c
|
||
|
||
; get last talked object struct, load to bc
|
||
pop bc
|
||
ld a, b
|
||
call GetMapObject
|
||
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
||
add hl, bc
|
||
ld a, [hl]
|
||
call GetObjectStruct
|
||
|
||
; get last talked coords, load to bc
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, bc
|
||
ld c, [hl]
|
||
ld b, a
|
||
|
||
; get player coords, load to de
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, de
|
||
ld a, [hl]
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, de
|
||
ld e, [hl]
|
||
ld d, a
|
||
|
||
pop af
|
||
call ComputePathToWalkToPlayer
|
||
ret
|
||
|
||
Special_SurfStartStep: ; 8379
|
||
call InitMovementBuffer
|
||
call .GetMovementData
|
||
call AppendToMovementBuffer
|
||
ld a, movement_step_end
|
||
call AppendToMovementBuffer
|
||
ret
|
||
|
||
.GetMovementData: ; 8388
|
||
ld a, [PlayerDirection]
|
||
srl a
|
||
srl a
|
||
and 3
|
||
ld e, a
|
||
ld d, 0
|
||
ld hl, .movement_data
|
||
add hl, de
|
||
ld a, [hl]
|
||
ret
|
||
|
||
.movement_data
|
||
slow_step_down
|
||
slow_step_up
|
||
slow_step_left
|
||
slow_step_right
|
||
|
||
FollowNotExact:: ; 839e
|
||
push bc
|
||
ld a, c
|
||
call CheckObjectVisibility
|
||
ld d, b
|
||
ld e, c
|
||
pop bc
|
||
ret c
|
||
|
||
ld a, b
|
||
call CheckObjectVisibility
|
||
ret c
|
||
|
||
; Person 2 is now in bc, person 1 is now in de
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, bc
|
||
ld c, [hl]
|
||
ld b, a
|
||
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, de
|
||
ld a, [hl]
|
||
cp b
|
||
jr z, .same_x
|
||
jr c, .to_the_left
|
||
inc b
|
||
jr .continue
|
||
|
||
.to_the_left
|
||
dec b
|
||
jr .continue
|
||
|
||
.same_x
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, de
|
||
ld a, [hl]
|
||
cp c
|
||
jr z, .continue
|
||
jr c, .below
|
||
inc c
|
||
jr .continue
|
||
|
||
.below
|
||
dec c
|
||
|
||
.continue
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, de
|
||
ld [hl], b
|
||
ld a, b
|
||
ld hl, XCoord
|
||
sub [hl]
|
||
and $f
|
||
swap a
|
||
ld hl, wFollowNotExactPersonX
|
||
sub [hl]
|
||
ld hl, OBJECT_SPRITE_X
|
||
add hl, de
|
||
ld [hl], a
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, de
|
||
ld [hl], c
|
||
ld a, c
|
||
ld hl, YCoord
|
||
sub [hl]
|
||
and $f
|
||
swap a
|
||
ld hl, wFollowNotExactPersonY
|
||
sub [hl]
|
||
ld hl, OBJECT_SPRITE_Y
|
||
add hl, de
|
||
ld [hl], a
|
||
ld a, [hObjectStructIndexBuffer]
|
||
ld hl, OBJECT_RANGE
|
||
add hl, de
|
||
ld [hl], a
|
||
ld hl, OBJECT_MOVEMENTTYPE
|
||
add hl, de
|
||
ld [hl], SPRITEMOVEDATA_FOLLOWNOTEXACT
|
||
ld hl, OBJECT_STEP_TYPE
|
||
add hl, de
|
||
ld [hl], STEP_TYPE_00
|
||
ret
|
||
|
||
GetRelativeFacing:: ; 8417
|
||
; Determines which way map object e would have to turn to face map object d. Returns carry if it's impossible for whatever reason.
|
||
ld a, d
|
||
call GetMapObject
|
||
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
||
add hl, bc
|
||
ld a, [hl]
|
||
cp NUM_OBJECT_STRUCTS
|
||
jr nc, .carry
|
||
ld d, a
|
||
ld a, e
|
||
call GetMapObject
|
||
ld hl, MAPOBJECT_OBJECT_STRUCT_ID
|
||
add hl, bc
|
||
ld a, [hl]
|
||
cp NUM_OBJECT_STRUCTS
|
||
jr nc, .carry
|
||
ld e, a
|
||
call .GetFacing_e_relativeto_d
|
||
ret
|
||
|
||
.carry
|
||
scf
|
||
ret
|
||
|
||
.GetFacing_e_relativeto_d: ; 8439
|
||
; Determines which way object e would have to turn to face object d. Returns carry if it's impossible.
|
||
; load the coordinates of object d into bc
|
||
ld a, d
|
||
call GetObjectStruct
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, bc
|
||
ld c, [hl]
|
||
ld b, a
|
||
push bc
|
||
; load the coordinates of object e into de
|
||
ld a, e
|
||
call GetObjectStruct
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, bc
|
||
ld d, [hl]
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, bc
|
||
ld e, [hl]
|
||
pop bc
|
||
; |x1 - x2|
|
||
ld a, b
|
||
sub d
|
||
jr z, .same_x_1
|
||
jr nc, .b_right_of_d_1
|
||
cpl
|
||
inc a
|
||
|
||
.b_right_of_d_1
|
||
; |y1 - y2|
|
||
ld h, a
|
||
ld a, c
|
||
sub e
|
||
jr z, .same_y_1
|
||
jr nc, .c_below_e_1
|
||
cpl
|
||
inc a
|
||
|
||
.c_below_e_1
|
||
; |y1 - y2| - |x1 - x2|
|
||
sub h
|
||
jr c, .same_y_1
|
||
|
||
.same_x_1
|
||
; compare the y coordinates
|
||
ld a, c
|
||
cp e
|
||
jr z, .same_x_and_y
|
||
jr c, .c_directly_below_e
|
||
; c directly above e
|
||
ld d, DOWN
|
||
and a
|
||
ret
|
||
|
||
.c_directly_below_e
|
||
ld d, UP
|
||
and a
|
||
ret
|
||
|
||
.same_y_1
|
||
ld a, b
|
||
cp d
|
||
jr z, .same_x_and_y
|
||
jr c, .b_directly_right_of_d
|
||
; b directly left of d
|
||
ld d, RIGHT
|
||
and a
|
||
ret
|
||
|
||
.b_directly_right_of_d
|
||
ld d, LEFT
|
||
and a
|
||
ret
|
||
|
||
.same_x_and_y
|
||
scf
|
||
ret
|
||
|
||
QueueFollowerFirstStep: ; 848a
|
||
call .QueueFirstStep
|
||
jr c, .same
|
||
ld [wFollowMovementQueue], a
|
||
xor a
|
||
ld [wFollowerMovementQueueLength], a
|
||
ret
|
||
|
||
.same
|
||
ld a, -1
|
||
ld [wFollowerMovementQueueLength], a
|
||
ret
|
||
|
||
.QueueFirstStep
|
||
ld a, [wObjectFollow_Leader]
|
||
call GetObjectStruct
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, bc
|
||
ld d, [hl]
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, bc
|
||
ld e, [hl]
|
||
ld a, [wObjectFollow_Follower]
|
||
call GetObjectStruct
|
||
ld hl, OBJECT_NEXT_MAP_X
|
||
add hl, bc
|
||
ld a, d
|
||
cp [hl]
|
||
jr z, .check_y
|
||
jr c, .left
|
||
and a
|
||
ld a, movement_step_right
|
||
ret
|
||
|
||
.left
|
||
and a
|
||
ld a, movement_step_left
|
||
ret
|
||
|
||
.check_y
|
||
ld hl, OBJECT_NEXT_MAP_Y
|
||
add hl, bc
|
||
ld a, e
|
||
cp [hl]
|
||
jr z, .same_xy
|
||
jr c, .up
|
||
and a
|
||
ld a, movement_step_down
|
||
ret
|
||
|
||
.up
|
||
and a
|
||
ld a, movement_step_up
|
||
ret
|
||
|
||
.same_xy
|
||
scf
|
||
ret
|
||
|
||
_Sine:: ; 84d9
|
||
; A simple sine function.
|
||
; Return d * sin(e) in hl.
|
||
|
||
; e is a signed 6-bit value.
|
||
ld a, e
|
||
and %111111
|
||
cp %100000
|
||
jr nc, .negative
|
||
|
||
call .ApplySineWave
|
||
ld a, h
|
||
ret
|
||
|
||
.negative
|
||
and %011111
|
||
call .ApplySineWave
|
||
ld a, h
|
||
xor -1
|
||
inc a
|
||
ret
|
||
|
||
.ApplySineWave: ; 84ef
|
||
ld e, a
|
||
ld a, d
|
||
ld d, 0
|
||
ld hl, .sinewave
|
||
add hl, de
|
||
add hl, de
|
||
ld e, [hl]
|
||
inc hl
|
||
ld d, [hl]
|
||
ld hl, 0
|
||
|
||
; Factor amplitude
|
||
.multiply
|
||
srl a
|
||
jr nc, .even
|
||
add hl, de
|
||
.even
|
||
sla e
|
||
rl d
|
||
and a
|
||
jr nz, .multiply
|
||
ret
|
||
|
||
.sinewave: ; 850b
|
||
; A $20-word table representing a sine wave.
|
||
; 90 degrees is index $10 at a base amplitude of $100.
|
||
sine_wave $100
|
||
|
||
INCLUDE "engine/predef.asm"
|
||
|
||
INCLUDE "engine/color.asm"
|
||
|
||
SECTION "bank3", ROMX, BANK[$3]
|
||
|
||
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, 1 << MORN
|
||
db DAY, 1 << DAY
|
||
db NITE, 1 << NITE
|
||
db NITE, 1 << NITE
|
||
db -1
|
||
|
||
INCLUDE "engine/specials.asm"
|
||
|
||
_PrintNum:: ; c4c7
|
||
; Print c digits of the b-byte value from de to hl.
|
||
; Allows 2 to 7 digits. For 1-digit numbers, add
|
||
; the value to char "0" instead of calling PrintNum.
|
||
; Some extra flags can be given in bits 5-7 of b.
|
||
; Bit 5: money if set (unless left-aligned without leading zeros)
|
||
; Bit 6: right-aligned if set
|
||
; Bit 7: print leading zeros if set
|
||
|
||
push bc
|
||
|
||
bit 5, b
|
||
jr z, .main
|
||
bit 7, b
|
||
jr nz, .moneyflag
|
||
bit 6, b
|
||
jr z, .main
|
||
|
||
.moneyflag ; 101xxxxx or 011xxxxx
|
||
ld a, "¥"
|
||
ld [hli], a
|
||
res 5, b ; 100xxxxx or 010xxxxx
|
||
|
||
.main
|
||
xor a
|
||
ld [hPrintNum1], a
|
||
ld [hPrintNum2], a
|
||
ld [hPrintNum3], a
|
||
ld a, b
|
||
and $f
|
||
cp 1
|
||
jr z, .byte
|
||
cp 2
|
||
jr z, .word
|
||
; maximum 3 bytes
|
||
.long
|
||
ld a, [de]
|
||
ld [hPrintNum2], a
|
||
inc de
|
||
ld a, [de]
|
||
ld [hPrintNum3], a
|
||
inc de
|
||
ld a, [de]
|
||
ld [hPrintNum4], a
|
||
jr .start
|
||
|
||
.word
|
||
ld a, [de]
|
||
ld [hPrintNum3], a
|
||
inc de
|
||
ld a, [de]
|
||
ld [hPrintNum4], a
|
||
jr .start
|
||
|
||
.byte
|
||
ld a, [de]
|
||
ld [hPrintNum4], a
|
||
|
||
.start
|
||
push de
|
||
|
||
ld d, b
|
||
ld a, c
|
||
swap a
|
||
and $f
|
||
ld e, a
|
||
ld a, c
|
||
and $f
|
||
ld b, a
|
||
ld c, 0
|
||
cp 2
|
||
jr z, .two
|
||
cp 3
|
||
jr z, .three
|
||
cp 4
|
||
jr z, .four
|
||
cp 5
|
||
jr z, .five
|
||
cp 6
|
||
jr z, .six
|
||
|
||
.seven
|
||
ld a, 1000000 / $10000 % $100
|
||
ld [hPrintNum5], a
|
||
ld a, 1000000 / $100 % $100
|
||
ld [hPrintNum6], a
|
||
ld a, 1000000 % $100
|
||
ld [hPrintNum7], a
|
||
call .PrintDigit
|
||
call .AdvancePointer
|
||
|
||
.six
|
||
ld a, 100000 / $10000 % $100
|
||
ld [hPrintNum5], a
|
||
ld a, 100000 / $100 % $100
|
||
ld [hPrintNum6], a
|
||
ld a, 100000 % $100
|
||
ld [hPrintNum7], a
|
||
call .PrintDigit
|
||
call .AdvancePointer
|
||
|
||
.five
|
||
xor a
|
||
ld [hPrintNum5], a
|
||
ld a, 10000 / $100
|
||
ld [hPrintNum6], a
|
||
ld a, 10000 % $100
|
||
ld [hPrintNum7], a
|
||
call .PrintDigit
|
||
call .AdvancePointer
|
||
|
||
.four
|
||
xor a
|
||
ld [hPrintNum5], a
|
||
ld a, 1000 / $100
|
||
ld [hPrintNum6], a
|
||
ld a, 1000 % $100
|
||
ld [hPrintNum7], a
|
||
call .PrintDigit
|
||
call .AdvancePointer
|
||
|
||
.three
|
||
xor a
|
||
ld [hPrintNum5], a
|
||
xor a
|
||
ld [hPrintNum6], a
|
||
ld a, 100
|
||
ld [hPrintNum7], a
|
||
call .PrintDigit
|
||
call .AdvancePointer
|
||
|
||
.two
|
||
dec e
|
||
jr nz, .two_skip
|
||
ld a, "0"
|
||
ld [hPrintNum1], a
|
||
.two_skip
|
||
|
||
ld c, 0
|
||
ld a, [hPrintNum4]
|
||
.mod_10
|
||
cp 10
|
||
jr c, .modded_10
|
||
sub 10
|
||
inc c
|
||
jr .mod_10
|
||
.modded_10
|
||
|
||
ld b, a
|
||
ld a, [hPrintNum1]
|
||
or c
|
||
jr nz, .money
|
||
call .PrintLeadingZero
|
||
jr .money_leading_zero
|
||
|
||
.money
|
||
call .PrintYen
|
||
push af
|
||
ld a, "0"
|
||
add c
|
||
ld [hl], a
|
||
pop af
|
||
ld [hPrintNum1], a
|
||
inc e
|
||
dec e
|
||
jr nz, .money_leading_zero
|
||
inc hl
|
||
ld [hl], $f2 ; XXX
|
||
|
||
.money_leading_zero
|
||
call .AdvancePointer
|
||
call .PrintYen
|
||
ld a, "0"
|
||
add b
|
||
ld [hli], a
|
||
|
||
pop de
|
||
pop bc
|
||
ret
|
||
|
||
.PrintYen: ; c5ba
|
||
push af
|
||
ld a, [hPrintNum1]
|
||
and a
|
||
jr nz, .stop
|
||
bit 5, d
|
||
jr z, .stop
|
||
ld a, "¥"
|
||
ld [hli], a
|
||
res 5, d
|
||
|
||
.stop
|
||
pop af
|
||
ret
|
||
|
||
.PrintDigit: ; c5cb (3:45cb)
|
||
dec e
|
||
jr nz, .ok
|
||
ld a, "0"
|
||
ld [hPrintNum1], a
|
||
.ok
|
||
ld c, 0
|
||
.loop
|
||
ld a, [hPrintNum5]
|
||
ld b, a
|
||
ld a, [hPrintNum2]
|
||
ld [hPrintNum8], a
|
||
cp b
|
||
jr c, .skip1
|
||
sub b
|
||
ld [hPrintNum2], a
|
||
ld a, [hPrintNum6]
|
||
ld b, a
|
||
ld a, [hPrintNum3]
|
||
ld [hPrintNum9], a
|
||
cp b
|
||
jr nc, .skip2
|
||
ld a, [hPrintNum2]
|
||
or 0
|
||
jr z, .skip3
|
||
dec a
|
||
ld [hPrintNum2], a
|
||
ld a, [hPrintNum3]
|
||
.skip2
|
||
sub b
|
||
ld [hPrintNum3], a
|
||
ld a, [hPrintNum7]
|
||
ld b, a
|
||
ld a, [hPrintNum4]
|
||
ld [hPrintNum10], a
|
||
cp b
|
||
jr nc, .skip4
|
||
ld a, [hPrintNum3]
|
||
and a
|
||
jr nz, .skip5
|
||
ld a, [hPrintNum2]
|
||
and a
|
||
jr z, .skip6
|
||
dec a
|
||
ld [hPrintNum2], a
|
||
xor a
|
||
.skip5
|
||
dec a
|
||
ld [hPrintNum3], a
|
||
ld a, [hPrintNum4]
|
||
.skip4
|
||
sub b
|
||
ld [hPrintNum4], a
|
||
inc c
|
||
jr .loop
|
||
.skip6
|
||
ld a, [hPrintNum9]
|
||
ld [hPrintNum3], a
|
||
.skip3
|
||
ld a, [hPrintNum8]
|
||
ld [hPrintNum2], a
|
||
.skip1
|
||
ld a, [hPrintNum1]
|
||
or c
|
||
jr z, .PrintLeadingZero
|
||
ld a, [hPrintNum1]
|
||
and a
|
||
jr nz, .done
|
||
bit 5, d
|
||
jr z, .done
|
||
ld a, "¥"
|
||
ld [hli], a
|
||
res 5, d
|
||
.done
|
||
ld a, "0"
|
||
add c
|
||
ld [hl], a
|
||
ld [hPrintNum1], a
|
||
inc e
|
||
dec e
|
||
ret nz
|
||
inc hl
|
||
ld [hl], "·"
|
||
ret
|
||
|
||
.PrintLeadingZero: ; c644
|
||
; prints a leading zero unless they are turned off in the flags
|
||
bit 7, d ; print leading zeroes?
|
||
ret z
|
||
ld [hl], "0"
|
||
ret
|
||
|
||
.AdvancePointer: ; c64a
|
||
; increments the pointer unless leading zeroes are not being printed,
|
||
; the number is left-aligned, and no nonzero digits have been printed yet
|
||
bit 7, d ; print leading zeroes?
|
||
jr nz, .inc
|
||
bit 6, d ; left alignment or right alignment?
|
||
jr z, .inc
|
||
ld a, [hPrintNum1]
|
||
and a
|
||
ret z
|
||
.inc
|
||
inc hl
|
||
ret
|
||
|
||
HealParty: ; c658
|
||
xor a
|
||
ld [CurPartyMon], a
|
||
ld hl, PartySpecies
|
||
.loop
|
||
ld a, [hli]
|
||
cp -1
|
||
jr z, .done
|
||
cp EGG
|
||
jr z, .next
|
||
|
||
push hl
|
||
call HealPartyMon
|
||
pop hl
|
||
|
||
.next
|
||
ld a, [CurPartyMon]
|
||
inc a
|
||
ld [CurPartyMon], a
|
||
jr .loop
|
||
|
||
.done
|
||
ret
|
||
|
||
HealPartyMon: ; c677
|
||
ld a, MON_SPECIES
|
||
call GetPartyParamLocation
|
||
ld d, h
|
||
ld e, l
|
||
|
||
ld hl, MON_STATUS
|
||
add hl, de
|
||
xor a
|
||
ld [hli], a
|
||
ld [hl], a
|
||
|
||
ld hl, MON_MAXHP
|
||
add hl, de
|
||
|
||
; bc = MON_HP
|
||
ld b, h
|
||
ld c, l
|
||
dec bc
|
||
dec bc
|
||
|
||
ld a, [hli]
|
||
ld [bc], a
|
||
inc bc
|
||
ld a, [hl]
|
||
ld [bc], a
|
||
|
||
callba RestoreAllPP
|
||
ret
|
||
|
||
ComputeHPBarPixels: ; c699
|
||
; bc * (6 * 8) / de
|
||
ld a, b
|
||
or c
|
||
jr z, .zero
|
||
push hl
|
||
xor a
|
||
ld [hMultiplicand + 0], a
|
||
ld a, b
|
||
ld [hMultiplicand + 1], a
|
||
ld a, c
|
||
ld [hMultiplicand + 2], a
|
||
ld a, 6 * 8
|
||
ld [hMultiplier], a
|
||
call Multiply
|
||
; We need de to be under 256 because hDivisor is only 1 byte.
|
||
ld a, d
|
||
and a
|
||
jr z, .divide
|
||
; divide de and hProduct by 4
|
||
srl d
|
||
rr e
|
||
srl d
|
||
rr e
|
||
ld a, [hProduct + 2]
|
||
ld b, a
|
||
ld a, [hProduct + 3]
|
||
srl b
|
||
rr a
|
||
srl b
|
||
rr a
|
||
ld [hDividend + 3], a
|
||
ld a, b
|
||
ld [hDividend + 2], a
|
||
.divide
|
||
ld a, e
|
||
ld [hDivisor], a
|
||
ld b, 4
|
||
call Divide
|
||
ld a, [hQuotient + 2]
|
||
ld e, a
|
||
pop hl
|
||
and a
|
||
ret nz
|
||
ld e, 1
|
||
ret
|
||
|
||
.zero
|
||
ld e, 0
|
||
ret
|
||
|
||
AnimateHPBar: ; c6e0
|
||
call WaitBGMap
|
||
call _AnimateHPBar
|
||
call WaitBGMap
|
||
ret
|
||
|
||
ClearBuffer1: ; c6ea
|
||
xor a
|
||
ld hl, Buffer1
|
||
ld bc, 7
|
||
call ByteFill
|
||
ret
|
||
|
||
FieldMoveJumptable: ; c6f5
|
||
ld a, [Buffer1]
|
||
rst JumpTable
|
||
ld [Buffer1], a
|
||
bit 7, a
|
||
jr nz, .okay
|
||
and a
|
||
ret
|
||
|
||
.okay
|
||
and $7f
|
||
scf
|
||
ret
|
||
|
||
GetPartyNick: ; c706
|
||
; write CurPartyMon nickname to StringBuffer1-3
|
||
ld hl, PartyMonNicknames
|
||
ld a, BOXMON
|
||
ld [MonType], a
|
||
ld a, [CurPartyMon]
|
||
call GetNick
|
||
call CopyName1
|
||
; copy text from StringBuffer2 to StringBuffer3
|
||
ld de, StringBuffer2
|
||
ld hl, StringBuffer3
|
||
call CopyName2
|
||
ret
|
||
|
||
CheckEngineFlag: ; c721
|
||
; Check engine flag de
|
||
; Return carry if flag is not set
|
||
ld b, CHECK_FLAG
|
||
callba EngineFlagAction
|
||
ld a, c
|
||
and a
|
||
jr nz, .isset
|
||
scf
|
||
ret
|
||
.isset
|
||
xor a
|
||
ret
|
||
|
||
CheckBadge: ; c731
|
||
; Check engine flag a (ENGINE_ZEPHYRBADGE thru ENGINE_EARTHBADGE)
|
||
; Display "Badge required" text and return carry if the badge is not owned
|
||
call CheckEngineFlag
|
||
ret nc
|
||
ld hl, .BadgeRequiredText
|
||
call MenuTextBoxBackup ; push text to queue
|
||
scf
|
||
ret
|
||
|
||
.BadgeRequiredText: ; c73d
|
||
; Sorry! A new BADGE
|
||
; is required.
|
||
text_jump _BadgeRequiredText
|
||
db "@"
|
||
|
||
CheckPartyMove: ; c742
|
||
; Check if a monster in your party has move d.
|
||
|
||
ld e, 0
|
||
xor a
|
||
ld [CurPartyMon], a
|
||
.loop
|
||
ld c, e
|
||
ld b, 0
|
||
ld hl, PartySpecies
|
||
add hl, bc
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .no
|
||
cp a, -1
|
||
jr z, .no
|
||
cp a, EGG
|
||
jr z, .next
|
||
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
ld hl, PartyMon1Moves
|
||
ld a, e
|
||
call AddNTimes
|
||
ld b, NUM_MOVES
|
||
.check
|
||
ld a, [hli]
|
||
cp d
|
||
jr z, .yes
|
||
dec b
|
||
jr nz, .check
|
||
|
||
.next
|
||
inc e
|
||
jr .loop
|
||
|
||
.yes
|
||
ld a, e
|
||
ld [CurPartyMon], a ; which mon has the move
|
||
xor a
|
||
ret
|
||
.no
|
||
scf
|
||
ret
|
||
|
||
FieldMoveFailed: ; c779
|
||
ld hl, .CantUseHere
|
||
call MenuTextBoxBackup
|
||
ret
|
||
|
||
.CantUseHere: ; 0xc780
|
||
; Can't use that here.
|
||
text_jump UnknownText_0x1c05c8
|
||
db "@"
|
||
|
||
CutFunction: ; c785
|
||
call ClearBuffer1
|
||
.loop
|
||
ld hl, .Jumptable
|
||
call FieldMoveJumptable
|
||
jr nc, .loop
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
.Jumptable: ; c796 (3:4796)
|
||
|
||
dw .CheckAble
|
||
dw .DoCut
|
||
dw .FailCut
|
||
|
||
.CheckAble: ; c79c (3:479c)
|
||
ld de, ENGINE_HIVEBADGE
|
||
call CheckBadge
|
||
jr c, .nohivebadge
|
||
call CheckMapForSomethingToCut
|
||
jr c, .nothingtocut
|
||
ld a, $1
|
||
ret
|
||
|
||
.nohivebadge
|
||
ld a, $80
|
||
ret
|
||
|
||
.nothingtocut
|
||
ld a, $2
|
||
ret
|
||
|
||
.DoCut: ; c7b2 (3:47b2)
|
||
ld hl, Script_CutFromMenu
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.FailCut: ; c7bb (3:47bb)
|
||
ld hl, Text_NothingToCut
|
||
call MenuTextBoxBackup
|
||
ld a, $80
|
||
ret
|
||
|
||
Text_UsedCut: ; 0xc7c4
|
||
; used CUT!
|
||
text_jump UnknownText_0x1c05dd
|
||
db "@"
|
||
|
||
Text_NothingToCut: ; 0xc7c9
|
||
; There's nothing to CUT here.
|
||
text_jump UnknownText_0x1c05ec
|
||
db "@"
|
||
|
||
CheckMapForSomethingToCut: ; c7ce
|
||
; Does the collision data of the facing tile permit cutting?
|
||
call GetFacingTileCoord
|
||
ld c, a
|
||
push de
|
||
callba CheckCutCollision
|
||
pop de
|
||
jr nc, .fail
|
||
; Get the location of the current block in OverworldMap.
|
||
call GetBlockLocation
|
||
ld c, [hl]
|
||
; See if that block contains something that can be cut.
|
||
push hl
|
||
ld hl, CutTreeBlockPointers
|
||
call CheckOverworldTileArrays
|
||
pop hl
|
||
jr nc, .fail
|
||
; Back up the OverworldMap address to Buffer3
|
||
ld a, l
|
||
ld [Buffer3], a
|
||
ld a, h
|
||
ld [Buffer4], a
|
||
; Back up the replacement tile to Buffer5
|
||
ld a, b
|
||
ld [Buffer5], a
|
||
; Back up the animation index to Buffer6
|
||
ld a, c
|
||
ld [Buffer6], a
|
||
xor a
|
||
ret
|
||
|
||
.fail
|
||
scf
|
||
ret
|
||
|
||
Script_CutFromMenu: ; c7fe
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
|
||
Script_Cut: ; 0xc802
|
||
callasm GetPartyNick
|
||
writetext Text_UsedCut
|
||
reloadmappart
|
||
callasm CutDownTreeOrGrass
|
||
closetext
|
||
end
|
||
|
||
CutDownTreeOrGrass: ; c810
|
||
ld hl, Buffer3 ; OverworldMapTile
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
ld a, [Buffer5] ; ReplacementTile
|
||
ld [hl], a
|
||
xor a
|
||
ld [hBGMapMode], a
|
||
call OverworldTextModeSwitch
|
||
call UpdateSprites
|
||
call DelayFrame
|
||
ld a, [Buffer6] ; Animation type
|
||
ld e, a
|
||
callba OWCutAnimation
|
||
call BufferScreen
|
||
call GetMovementPermissions
|
||
call UpdateSprites
|
||
call DelayFrame
|
||
call LoadStandardFont
|
||
ret
|
||
|
||
CheckOverworldTileArrays: ; c840
|
||
; Input: c contains the tile you're facing
|
||
; Output: Replacement tile in b and effect on wild encounters in c, plus carry set.
|
||
; Carry is not set if the facing tile cannot be replaced, or if the tileset
|
||
; does not contain a tile you can replace.
|
||
|
||
; Dictionary lookup for pointer to tile replacement table
|
||
push bc
|
||
ld a, [wTileset]
|
||
ld de, 3
|
||
call IsInArray
|
||
pop bc
|
||
jr nc, .nope
|
||
; Load the pointer
|
||
inc hl
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
; Look up the tile you're facing
|
||
ld de, 3
|
||
ld a, c
|
||
call IsInArray
|
||
jr nc, .nope
|
||
; Load the replacement to b
|
||
inc hl
|
||
ld b, [hl]
|
||
; Load the animation type parameter to c
|
||
inc hl
|
||
ld c, [hl]
|
||
scf
|
||
ret
|
||
|
||
.nope
|
||
xor a
|
||
ret
|
||
|
||
CutTreeBlockPointers: ; c862
|
||
; Which tileset are we in?
|
||
dbw TILESET_JOHTO_1, .johto1
|
||
dbw TILESET_JOHTO_2, .johto2
|
||
dbw TILESET_KANTO, .kanto
|
||
dbw TILESET_PARK, .park
|
||
dbw TILESET_ILEX_FOREST, .ilex
|
||
db -1
|
||
|
||
.johto1: ; Johto OW
|
||
; Which meta tile are we facing, which should we replace it with, and which animation?
|
||
db $03, $02, $01 ; grass
|
||
db $5b, $3c, $00 ; tree
|
||
db $5f, $3d, $00 ; tree
|
||
db $63, $3f, $00 ; tree
|
||
db $67, $3e, $00 ; tree
|
||
db -1
|
||
|
||
.johto2: ; Goldenrod area
|
||
db $03, $02, $01 ; grass
|
||
db -1
|
||
|
||
.kanto: ; Kanto OW
|
||
db $0b, $0a, $01 ; grass
|
||
db $32, $6d, $00 ; tree
|
||
db $33, $6c, $00 ; tree
|
||
db $34, $6f, $00 ; tree
|
||
db $35, $4c, $00 ; tree
|
||
db $60, $6e, $00 ; tree
|
||
db -1
|
||
|
||
.park: ; National Park
|
||
db $13, $03, $01 ; grass
|
||
db $03, $04, $01 ; grass
|
||
db -1
|
||
|
||
.ilex: ; Ilex Forest
|
||
db $0f, $17, $00
|
||
db -1
|
||
|
||
WhirlpoolBlockPointers: ; c8a4
|
||
dbw TILESET_JOHTO_1, .johto
|
||
db -1
|
||
|
||
.johto: ; c8a8
|
||
db $07, $36, $00
|
||
db -1
|
||
|
||
OWFlash: ; c8ac
|
||
call .CheckUseFlash
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
.CheckUseFlash: ; c8b5
|
||
; Flash
|
||
ld de, ENGINE_ZEPHYRBADGE
|
||
callba CheckBadge
|
||
jr c, .nozephyrbadge
|
||
push hl
|
||
callba SpecialAerodactylChamber
|
||
pop hl
|
||
jr c, .useflash
|
||
ld a, [wTimeOfDayPalset]
|
||
cp %11111111 ; 3, 3, 3, 3
|
||
jr nz, .notadarkcave
|
||
.useflash
|
||
call UseFlash
|
||
ld a, $81
|
||
ret
|
||
|
||
.notadarkcave
|
||
call FieldMoveFailed
|
||
ld a, $80
|
||
ret
|
||
|
||
.nozephyrbadge
|
||
ld a, $80
|
||
ret
|
||
|
||
UseFlash: ; c8e0
|
||
ld hl, Script_UseFlash
|
||
jp QueueScript
|
||
|
||
Script_UseFlash: ; 0xc8e6
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
writetext UnknownText_0xc8f3
|
||
callasm BlindingFlash
|
||
closetext
|
||
end
|
||
|
||
UnknownText_0xc8f3: ; 0xc8f3
|
||
text_jump UnknownText_0x1c0609
|
||
start_asm
|
||
call WaitSFX
|
||
ld de, SFX_FLASH
|
||
call PlaySFX
|
||
call WaitSFX
|
||
ld hl, .BlankText
|
||
ret
|
||
|
||
.BlankText: ; 0xc908
|
||
db "@"
|
||
|
||
SurfFunction: ; c909
|
||
call ClearBuffer1
|
||
.loop
|
||
ld hl, .Jumptable
|
||
call FieldMoveJumptable
|
||
jr nc, .loop
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
.Jumptable: ; c91a (3:491a)
|
||
dw .TrySurf
|
||
dw .DoSurf
|
||
dw .FailSurf
|
||
dw .AlreadySurfing
|
||
|
||
.TrySurf: ; c922 (3:4922)
|
||
ld de, ENGINE_FOGBADGE
|
||
call CheckBadge
|
||
jr c, .asm_c956
|
||
ld hl, BikeFlags
|
||
bit 1, [hl] ; always on bike
|
||
jr nz, .cannotsurf
|
||
ld a, [PlayerState]
|
||
cp PLAYER_SURF
|
||
jr z, .alreadyfail
|
||
cp PLAYER_SURF_PIKA
|
||
jr z, .alreadyfail
|
||
call GetFacingTileCoord
|
||
call GetTileCollision
|
||
cp $1
|
||
jr nz, .cannotsurf
|
||
call CheckDirection
|
||
jr c, .cannotsurf
|
||
callba CheckFacingObject
|
||
jr c, .cannotsurf
|
||
ld a, $1
|
||
ret
|
||
.asm_c956
|
||
ld a, $80
|
||
ret
|
||
.alreadyfail
|
||
ld a, $3
|
||
ret
|
||
.cannotsurf
|
||
ld a, $2
|
||
ret
|
||
|
||
.DoSurf: ; c95f (3:495f)
|
||
call GetSurfType
|
||
ld [Buffer2], a ; wd1eb (aliases: MovementType)
|
||
call GetPartyNick
|
||
ld hl, SurfFromMenuScript
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.FailSurf: ; c971 (3:4971)
|
||
ld hl, CantSurfText
|
||
call MenuTextBoxBackup
|
||
ld a, $80
|
||
ret
|
||
|
||
.AlreadySurfing: ; c97a (3:497a)
|
||
ld hl, AlreadySurfingText
|
||
call MenuTextBoxBackup
|
||
ld a, $80
|
||
ret
|
||
|
||
SurfFromMenuScript: ; c983
|
||
special UpdateTimePals
|
||
|
||
UsedSurfScript: ; c986
|
||
writetext UsedSurfText ; "used SURF!"
|
||
waitbutton
|
||
closetext
|
||
|
||
callasm .empty_fn ; empty function
|
||
|
||
copybytetovar Buffer2
|
||
writevarcode VAR_MOVEMENT
|
||
|
||
special ReplaceKrisSprite
|
||
special PlayMapMusic
|
||
; step into the water
|
||
special Special_SurfStartStep ; (slow_step_x, step_end)
|
||
applymovement PLAYER, MovementBuffer ; PLAYER, MovementBuffer
|
||
end
|
||
|
||
.empty_fn: ; c9a2
|
||
callba MobileFn_1060bb ; empty
|
||
ret
|
||
|
||
UsedSurfText: ; c9a9
|
||
text_jump _UsedSurfText
|
||
db "@"
|
||
|
||
CantSurfText: ; c9ae
|
||
text_jump _CantSurfText
|
||
db "@"
|
||
|
||
AlreadySurfingText: ; c9b3
|
||
text_jump _AlreadySurfingText
|
||
db "@"
|
||
|
||
GetSurfType: ; c9b8
|
||
; Surfing on Pikachu uses an alternate sprite.
|
||
; This is done by using a separate movement type.
|
||
|
||
ld a, [CurPartyMon]
|
||
ld e, a
|
||
ld d, 0
|
||
ld hl, PartySpecies
|
||
add hl, de
|
||
|
||
ld a, [hl]
|
||
cp PIKACHU
|
||
ld a, PLAYER_SURF_PIKA
|
||
ret z
|
||
ld a, PLAYER_SURF
|
||
ret
|
||
|
||
CheckDirection: ; c9cb
|
||
; Return carry if a tile permission prevents you
|
||
; from moving in the direction you're facing.
|
||
|
||
; Get player direction
|
||
ld a, [PlayerDirection]
|
||
and a, %00001100 ; bits 2 and 3 contain direction
|
||
rrca
|
||
rrca
|
||
ld e, a
|
||
ld d, 0
|
||
ld hl, .Directions
|
||
add hl, de
|
||
|
||
; Can you walk in this direction?
|
||
ld a, [TilePermissions]
|
||
and [hl]
|
||
jr nz, .quit
|
||
xor a
|
||
ret
|
||
|
||
.quit
|
||
scf
|
||
ret
|
||
|
||
.Directions
|
||
db FACE_DOWN
|
||
db FACE_UP
|
||
db FACE_LEFT
|
||
db FACE_RIGHT
|
||
|
||
TrySurfOW:: ; c9e7
|
||
; Checking a tile in the overworld.
|
||
; Return carry if fail is allowed.
|
||
|
||
; Don't ask to surf if already fail.
|
||
ld a, [PlayerState]
|
||
cp PLAYER_SURF_PIKA
|
||
jr z, .quit
|
||
cp PLAYER_SURF
|
||
jr z, .quit
|
||
|
||
; Must be facing water.
|
||
ld a, [EngineBuffer1]
|
||
call GetTileCollision
|
||
cp 1 ; surfable
|
||
jr nz, .quit
|
||
|
||
; Check tile permissions.
|
||
call CheckDirection
|
||
jr c, .quit
|
||
|
||
ld de, ENGINE_FOGBADGE
|
||
call CheckEngineFlag
|
||
jr c, .quit
|
||
|
||
ld d, SURF
|
||
call CheckPartyMove
|
||
jr c, .quit
|
||
|
||
ld hl, BikeFlags
|
||
bit 1, [hl] ; always on bike (can't surf)
|
||
jr nz, .quit
|
||
|
||
call GetSurfType
|
||
ld [MovementType], a
|
||
call GetPartyNick
|
||
|
||
ld a, BANK(AskSurfScript)
|
||
ld hl, AskSurfScript
|
||
call CallScript
|
||
|
||
scf
|
||
ret
|
||
|
||
.quit
|
||
xor a
|
||
ret
|
||
|
||
AskSurfScript: ; ca2c
|
||
opentext
|
||
writetext AskSurfText
|
||
yesorno
|
||
iftrue UsedSurfScript
|
||
closetext
|
||
end
|
||
|
||
AskSurfText: ; ca36
|
||
text_jump _AskSurfText ; The water is calm.
|
||
db "@" ; Want to SURF?
|
||
|
||
FlyFunction: ; ca3b
|
||
call ClearBuffer1
|
||
.loop
|
||
ld hl, .Jumptable
|
||
call FieldMoveJumptable
|
||
jr nc, .loop
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
.Jumptable
|
||
dw .TryFly
|
||
dw .DoFly
|
||
dw .FailFly
|
||
|
||
.TryFly: ; ca52
|
||
; Fly
|
||
ld de, ENGINE_STORMBADGE
|
||
call CheckBadge
|
||
jr c, .nostormbadge
|
||
call GetMapPermission
|
||
call CheckOutdoorMap
|
||
jr z, .outdoors
|
||
jr .indoors
|
||
|
||
.outdoors
|
||
xor a
|
||
ld [hMapAnims], a
|
||
call LoadStandardMenuDataHeader
|
||
call ClearSprites
|
||
callba _FlyMap
|
||
ld a, e
|
||
cp -1
|
||
jr z, .illegal
|
||
cp NUM_SPAWNS
|
||
jr nc, .illegal
|
||
|
||
ld [wd001], a
|
||
call CloseWindow
|
||
ld a, $1
|
||
ret
|
||
|
||
.nostormbadge
|
||
ld a, $82
|
||
ret
|
||
|
||
.indoors
|
||
ld a, $2
|
||
ret
|
||
|
||
.illegal
|
||
call CloseWindow
|
||
call WaitBGMap
|
||
ld a, $80
|
||
ret
|
||
|
||
.DoFly: ; ca94
|
||
ld hl, .FlyScript
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.FailFly: ; ca9d
|
||
call FieldMoveFailed
|
||
ld a, $82
|
||
ret
|
||
|
||
.FlyScript: ; 0xcaa3
|
||
reloadmappart
|
||
callasm HideSprites
|
||
special UpdateTimePals
|
||
callasm FlyFromAnim
|
||
farscall Script_AbortBugContest
|
||
special WarpToSpawnPoint
|
||
callasm DelayLoadingNewSprites
|
||
writecode VAR_MOVEMENT, PLAYER_NORMAL
|
||
newloadmap MAPSETUP_FLY
|
||
callasm FlyToAnim
|
||
special WaitSFX
|
||
callasm .ReturnFromFly
|
||
end
|
||
|
||
.ReturnFromFly: ; cacb
|
||
callba Function561d
|
||
call DelayFrame
|
||
call ReplaceKrisSprite
|
||
callba LoadOverworldFont
|
||
ret
|
||
|
||
WaterfallFunction: ; cade
|
||
call .TryWaterfall
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
.TryWaterfall: ; cae7
|
||
; Waterfall
|
||
ld de, ENGINE_RISINGBADGE
|
||
callba CheckBadge
|
||
ld a, $80
|
||
ret c
|
||
call CheckMapCanWaterfall
|
||
jr c, .failed
|
||
ld hl, Script_WaterfallFromMenu
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.failed
|
||
call FieldMoveFailed
|
||
ld a, $80
|
||
ret
|
||
|
||
CheckMapCanWaterfall: ; cb07
|
||
ld a, [PlayerDirection]
|
||
and $c
|
||
cp FACE_UP
|
||
jr nz, .failed
|
||
ld a, [TileUp]
|
||
call CheckWaterfallTile
|
||
jr nz, .failed
|
||
xor a
|
||
ret
|
||
|
||
.failed
|
||
scf
|
||
ret
|
||
|
||
Script_WaterfallFromMenu: ; 0xcb1c
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
|
||
Script_UsedWaterfall: ; 0xcb20
|
||
callasm GetPartyNick
|
||
writetext .Text_UsedWaterfall
|
||
waitbutton
|
||
closetext
|
||
playsound SFX_BUBBLEBEAM
|
||
.loop
|
||
applymovement PLAYER, .WaterfallStep
|
||
callasm .CheckContinueWaterfall
|
||
iffalse .loop
|
||
end
|
||
|
||
.CheckContinueWaterfall: ; cb38
|
||
xor a
|
||
ld [ScriptVar], a
|
||
ld a, [PlayerStandingTile]
|
||
call CheckWaterfallTile
|
||
ret z
|
||
callba MobileFn_1060c1
|
||
ld a, $1
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
.WaterfallStep: ; cb4f
|
||
turn_waterfall_up
|
||
step_end
|
||
|
||
.Text_UsedWaterfall: ; 0xcb51
|
||
; used WATERFALL!
|
||
text_jump UnknownText_0x1c068e
|
||
db "@"
|
||
|
||
TryWaterfallOW:: ; cb56
|
||
ld d, WATERFALL
|
||
call CheckPartyMove
|
||
jr c, .failed
|
||
ld de, ENGINE_RISINGBADGE
|
||
call CheckEngineFlag
|
||
jr c, .failed
|
||
call CheckMapCanWaterfall
|
||
jr c, .failed
|
||
ld a, BANK(Script_AskWaterfall)
|
||
ld hl, Script_AskWaterfall
|
||
call CallScript
|
||
scf
|
||
ret
|
||
|
||
.failed
|
||
ld a, BANK(Script_CantDoWaterfall)
|
||
ld hl, Script_CantDoWaterfall
|
||
call CallScript
|
||
scf
|
||
ret
|
||
|
||
Script_CantDoWaterfall: ; 0xcb7e
|
||
jumptext .Text_CantDoWaterfall
|
||
|
||
.Text_CantDoWaterfall: ; 0xcb81
|
||
; Wow, it's a huge waterfall.
|
||
text_jump UnknownText_0x1c06a3
|
||
db "@"
|
||
|
||
Script_AskWaterfall: ; 0xcb86
|
||
opentext
|
||
writetext .AskUseWaterfall
|
||
yesorno
|
||
iftrue Script_UsedWaterfall
|
||
closetext
|
||
end
|
||
|
||
.AskUseWaterfall: ; 0xcb90
|
||
; Do you want to use WATERFALL?
|
||
text_jump UnknownText_0x1c06bf
|
||
db "@"
|
||
|
||
EscapeRopeFunction: ; cb95
|
||
call ClearBuffer1
|
||
ld a, $1
|
||
jr dig_incave
|
||
|
||
DigFunction: ; cb9c
|
||
call ClearBuffer1
|
||
ld a, $2
|
||
|
||
dig_incave
|
||
ld [Buffer2], a
|
||
.loop
|
||
ld hl, .DigTable
|
||
call FieldMoveJumptable
|
||
jr nc, .loop
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
.DigTable: ; cbb2
|
||
dw .CheckCanDig
|
||
dw .DoDig
|
||
dw .FailDig
|
||
|
||
.CheckCanDig: ; cbb8
|
||
call GetMapPermission
|
||
cp CAVE
|
||
jr z, .incave
|
||
cp DUNGEON
|
||
jr z, .incave
|
||
.fail
|
||
ld a, $2
|
||
ret
|
||
|
||
.incave
|
||
ld hl, wDigWarp
|
||
ld a, [hli]
|
||
and a
|
||
jr z, .fail
|
||
ld a, [hli]
|
||
and a
|
||
jr z, .fail
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .fail
|
||
ld a, $1
|
||
ret
|
||
|
||
.DoDig: ; cbd8
|
||
ld hl, wDigWarp
|
||
ld de, wNextWarp
|
||
ld bc, 3
|
||
call CopyBytes
|
||
call GetPartyNick
|
||
ld a, [Buffer2]
|
||
cp $2
|
||
jr nz, .escaperope
|
||
ld hl, .UsedDigScript
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.escaperope
|
||
callba SpecialKabutoChamber
|
||
ld hl, .UsedEscapeRopeScript
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.FailDig: ; cc06
|
||
ld a, [Buffer2]
|
||
cp $2
|
||
jr nz, .failescaperope
|
||
ld hl, .Text_CantUseHere
|
||
call MenuTextBox
|
||
call WaitPressAorB_BlinkCursor
|
||
call CloseWindow
|
||
|
||
.failescaperope
|
||
ld a, $80
|
||
ret
|
||
|
||
.Text_UsedDig: ; 0xcc1c
|
||
; used DIG!
|
||
text_jump UnknownText_0x1c06de
|
||
db "@"
|
||
|
||
.Text_UsedEscapeRope: ; 0xcc21
|
||
; used an ESCAPE ROPE.
|
||
text_jump UnknownText_0x1c06ed
|
||
db "@"
|
||
|
||
.Text_CantUseHere: ; 0xcc26
|
||
; Can't use that here.
|
||
text_jump UnknownText_0x1c0705
|
||
db "@"
|
||
|
||
.UsedEscapeRopeScript: ; 0xcc2b
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
writetext .Text_UsedEscapeRope
|
||
jump .UsedDigOrEscapeRopeScript
|
||
|
||
.UsedDigScript: ; 0xcc35
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
writetext .Text_UsedDig
|
||
|
||
.UsedDigOrEscapeRopeScript: ; 0xcc3c
|
||
waitbutton
|
||
closetext
|
||
playsound SFX_WARP_TO
|
||
applymovement PLAYER, .DigOut
|
||
farscall Script_AbortBugContest
|
||
special WarpToSpawnPoint
|
||
writecode VAR_MOVEMENT, PLAYER_NORMAL
|
||
newloadmap MAPSETUP_DOOR
|
||
playsound SFX_WARP_FROM
|
||
applymovement PLAYER, .DigReturn
|
||
end
|
||
|
||
.DigOut: ; 0xcc59
|
||
step_dig 32
|
||
hide_person
|
||
step_end
|
||
|
||
.DigReturn: ; 0xcc5d
|
||
show_person
|
||
return_dig 32
|
||
step_end
|
||
|
||
TeleportFunction: ; cc61
|
||
call ClearBuffer1
|
||
.loop
|
||
ld hl, .Jumptable
|
||
call FieldMoveJumptable
|
||
jr nc, .loop
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
.Jumptable: ; cc72
|
||
dw .TryTeleport
|
||
dw .DoTeleport
|
||
dw .FailTeleport
|
||
|
||
.TryTeleport: ; cc78
|
||
call GetMapPermission
|
||
call CheckOutdoorMap
|
||
jr z, .CheckIfSpawnPoint
|
||
jr .nope
|
||
|
||
.CheckIfSpawnPoint
|
||
ld a, [wLastSpawnMapGroup]
|
||
ld d, a
|
||
ld a, [wLastSpawnMapNumber]
|
||
ld e, a
|
||
callba IsSpawnPoint
|
||
jr nc, .nope
|
||
ld a, c
|
||
ld [wd001], a
|
||
ld a, $1
|
||
ret
|
||
|
||
.nope
|
||
ld a, $2
|
||
ret
|
||
|
||
.DoTeleport: ; cc9c
|
||
call GetPartyNick
|
||
ld hl, .TeleportScript
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.FailTeleport: ; cca8
|
||
ld hl, .Text_CantUseHere
|
||
call MenuTextBoxBackup
|
||
ld a, $80
|
||
ret
|
||
|
||
.Text_ReturnToLastMonCenter: ; 0xccb1
|
||
; Return to the last #MON CENTER.
|
||
text_jump UnknownText_0x1c071a
|
||
db "@"
|
||
|
||
.Text_CantUseHere: ; 0xccb6
|
||
; Can't use that here.
|
||
text_jump UnknownText_0x1c073b
|
||
db "@"
|
||
|
||
.TeleportScript: ; 0xccbb
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
writetext .Text_ReturnToLastMonCenter
|
||
pause 60
|
||
reloadmappart
|
||
closetext
|
||
playsound SFX_WARP_TO
|
||
applymovement PLAYER, .TeleportFrom
|
||
farscall Script_AbortBugContest
|
||
special WarpToSpawnPoint
|
||
writecode VAR_MOVEMENT, PLAYER_NORMAL
|
||
newloadmap MAPSETUP_TELEPORT
|
||
playsound SFX_WARP_FROM
|
||
applymovement PLAYER, .TeleportTo
|
||
end
|
||
|
||
.TeleportFrom: ; cce1
|
||
teleport_from
|
||
step_end
|
||
|
||
.TeleportTo: ; cce3
|
||
teleport_to
|
||
step_end
|
||
|
||
StrengthFunction: ; cce5
|
||
call .TryStrength
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
.TryStrength: ; ccee
|
||
; Strength
|
||
ld de, ENGINE_PLAINBADGE
|
||
call CheckBadge
|
||
jr c, .Failed
|
||
jr .UseStrength
|
||
|
||
.AlreadyUsing: ; unreferenced
|
||
ld hl, .JumpText
|
||
call MenuTextBoxBackup
|
||
ld a, $80
|
||
ret
|
||
|
||
.JumpText: ; 0xcd01
|
||
text_jump UnknownText_0x1c0751
|
||
db "@"
|
||
|
||
.Failed: ; cd06
|
||
ld a, $80
|
||
ret
|
||
|
||
.UseStrength: ; cd09
|
||
ld hl, Script_StrengthFromMenu
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
SetStrengthFlag: ; cd12
|
||
ld hl, BikeFlags
|
||
set 0, [hl]
|
||
ld a, [CurPartyMon]
|
||
ld e, a
|
||
ld d, 0
|
||
ld hl, PartySpecies
|
||
add hl, de
|
||
ld a, [hl]
|
||
ld [Buffer6], a
|
||
call GetPartyNick
|
||
ret
|
||
|
||
Script_StrengthFromMenu: ; 0xcd29
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
|
||
Script_UsedStrength: ; 0xcd2d
|
||
callasm SetStrengthFlag
|
||
writetext .UsedStrength
|
||
copybytetovar Buffer6
|
||
cry 0
|
||
pause 3
|
||
writetext .StrengthAllowedItToMoveBoulders
|
||
closetext
|
||
end
|
||
|
||
.UsedStrength: ; 0xcd41
|
||
text_jump UnknownText_0x1c0774
|
||
db "@"
|
||
|
||
.StrengthAllowedItToMoveBoulders: ; 0xcd46
|
||
text_jump UnknownText_0x1c0788
|
||
db "@"
|
||
|
||
AskStrengthScript:
|
||
callasm TryStrengthOW
|
||
iffalse .AskStrength
|
||
if_equal $1, .DontMeetRequirements
|
||
jump .AlreadyUsedStrength
|
||
|
||
.DontMeetRequirements: ; 0xcd59
|
||
jumptext UnknownText_0xcd73
|
||
|
||
.AlreadyUsedStrength: ; 0xcd5c
|
||
jumptext UnknownText_0xcd6e
|
||
|
||
.AskStrength: ; 0xcd5f
|
||
opentext
|
||
writetext UnknownText_0xcd69
|
||
yesorno
|
||
iftrue Script_UsedStrength
|
||
closetext
|
||
end
|
||
|
||
UnknownText_0xcd69: ; 0xcd69
|
||
; A #MON may be able to move this. Want to use STRENGTH?
|
||
text_jump UnknownText_0x1c07a0
|
||
db "@"
|
||
|
||
UnknownText_0xcd6e: ; 0xcd6e
|
||
; Boulders may now be moved!
|
||
text_jump UnknownText_0x1c07d8
|
||
db "@"
|
||
|
||
UnknownText_0xcd73: ; 0xcd73
|
||
; A #MON may be able to move this.
|
||
text_jump UnknownText_0x1c07f4
|
||
db "@"
|
||
|
||
TryStrengthOW: ; cd78
|
||
ld d, STRENGTH
|
||
call CheckPartyMove
|
||
jr c, .nope
|
||
|
||
ld de, ENGINE_PLAINBADGE
|
||
call CheckEngineFlag
|
||
jr c, .nope
|
||
|
||
ld hl, BikeFlags
|
||
bit 0, [hl]
|
||
jr z, .already_using
|
||
|
||
ld a, 2
|
||
jr .done
|
||
|
||
.nope
|
||
ld a, 1
|
||
jr .done
|
||
|
||
.already_using
|
||
xor a
|
||
jr .done
|
||
|
||
.done
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
WhirlpoolFunction: ; cd9d
|
||
call ClearBuffer1
|
||
.loop
|
||
ld hl, Jumptable_cdae
|
||
call FieldMoveJumptable
|
||
jr nc, .loop
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
Jumptable_cdae: ; cdae
|
||
dw .TryWhirlpool
|
||
dw .DoWhirlpool
|
||
dw .FailWhirlpool
|
||
|
||
.TryWhirlpool: ; cdb4
|
||
ld de, ENGINE_GLACIERBADGE
|
||
call CheckBadge
|
||
jr c, .noglacierbadge
|
||
call TryWhirlpoolMenu
|
||
jr c, .failed
|
||
ld a, $1
|
||
ret
|
||
|
||
.failed
|
||
ld a, $2
|
||
ret
|
||
|
||
.noglacierbadge
|
||
ld a, $80
|
||
ret
|
||
|
||
.DoWhirlpool: ; cdca
|
||
ld hl, Script_WhirlpoolFromMenu
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.FailWhirlpool: ; cdd3
|
||
call FieldMoveFailed
|
||
ld a, $80
|
||
ret
|
||
|
||
Text_UsedWhirlpool: ; 0xcdd9
|
||
; used WHIRLPOOL!
|
||
text_jump UnknownText_0x1c0816
|
||
db "@"
|
||
|
||
TryWhirlpoolMenu: ; cdde
|
||
call GetFacingTileCoord
|
||
ld c, a
|
||
push de
|
||
call CheckWhirlpoolTile
|
||
pop de
|
||
jr c, .failed
|
||
call GetBlockLocation
|
||
ld c, [hl]
|
||
push hl
|
||
ld hl, WhirlpoolBlockPointers
|
||
call CheckOverworldTileArrays
|
||
pop hl
|
||
jr nc, .failed
|
||
ld a, l
|
||
ld [Buffer3], a
|
||
ld a, h
|
||
ld [Buffer4], a
|
||
ld a, b
|
||
ld [Buffer5], a
|
||
ld a, c
|
||
ld [Buffer6], a
|
||
xor a
|
||
ret
|
||
|
||
.failed
|
||
scf
|
||
ret
|
||
|
||
Script_WhirlpoolFromMenu: ; 0xce0b
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
|
||
Script_UsedWhirlpool: ; 0xce0f
|
||
callasm GetPartyNick
|
||
writetext Text_UsedWhirlpool
|
||
reloadmappart
|
||
callasm DisappearWhirlpool
|
||
closetext
|
||
end
|
||
|
||
DisappearWhirlpool: ; ce1d
|
||
ld hl, Buffer3
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
ld a, [Buffer5]
|
||
ld [hl], a
|
||
xor a
|
||
ld [hBGMapMode], a
|
||
call OverworldTextModeSwitch
|
||
ld a, [Buffer6]
|
||
ld e, a
|
||
callba PlayWhirlpoolSound
|
||
call BufferScreen
|
||
call GetMovementPermissions
|
||
ret
|
||
|
||
TryWhirlpoolOW:: ; ce3e
|
||
ld d, WHIRLPOOL
|
||
call CheckPartyMove
|
||
jr c, .failed
|
||
ld de, ENGINE_GLACIERBADGE
|
||
call CheckEngineFlag
|
||
jr c, .failed
|
||
call TryWhirlpoolMenu
|
||
jr c, .failed
|
||
ld a, BANK(Script_AskWhirlpoolOW)
|
||
ld hl, Script_AskWhirlpoolOW
|
||
call CallScript
|
||
scf
|
||
ret
|
||
|
||
.failed
|
||
ld a, BANK(Script_MightyWhirlpool)
|
||
ld hl, Script_MightyWhirlpool
|
||
call CallScript
|
||
scf
|
||
ret
|
||
|
||
Script_MightyWhirlpool: ; 0xce66
|
||
jumptext .MightyWhirlpoolText
|
||
|
||
.MightyWhirlpoolText: ; 0xce69
|
||
text_jump UnknownText_0x1c082b
|
||
db "@"
|
||
|
||
Script_AskWhirlpoolOW: ; 0xce6e
|
||
opentext
|
||
writetext UnknownText_0xce78
|
||
yesorno
|
||
iftrue Script_UsedWhirlpool
|
||
closetext
|
||
end
|
||
|
||
UnknownText_0xce78: ; 0xce78
|
||
text_jump UnknownText_0x1c0864
|
||
db "@"
|
||
|
||
HeadbuttFunction: ; ce7d
|
||
call TryHeadbuttFromMenu
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
TryHeadbuttFromMenu: ; ce86
|
||
call GetFacingTileCoord
|
||
call CheckHeadbuttTreeTile
|
||
jr nz, .no_tree
|
||
|
||
ld hl, HeadbuttFromMenuScript
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.no_tree
|
||
call FieldMoveFailed
|
||
ld a, $80
|
||
ret
|
||
|
||
UnknownText_0xce9d: ; 0xce9d
|
||
; did a HEADBUTT!
|
||
text_jump UnknownText_0x1c0897
|
||
db "@"
|
||
|
||
UnknownText_0xcea2: ; 0xcea2
|
||
; Nope. Nothing…
|
||
text_jump UnknownText_0x1c08ac
|
||
db "@"
|
||
|
||
HeadbuttFromMenuScript: ; 0xcea7
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
|
||
HeadbuttScript: ; 0xceab
|
||
callasm GetPartyNick
|
||
writetext UnknownText_0xce9d
|
||
|
||
reloadmappart
|
||
callasm ShakeHeadbuttTree
|
||
|
||
callasm TreeMonEncounter
|
||
iffalse .no_battle
|
||
closetext
|
||
randomwildmon
|
||
startbattle
|
||
reloadmapafterbattle
|
||
end
|
||
|
||
.no_battle
|
||
writetext UnknownText_0xcea2
|
||
waitbutton
|
||
closetext
|
||
end
|
||
|
||
TryHeadbuttOW:: ; cec9
|
||
ld d, HEADBUTT
|
||
call CheckPartyMove
|
||
jr c, .no
|
||
|
||
ld a, BANK(AskHeadbuttScript)
|
||
ld hl, AskHeadbuttScript
|
||
call CallScript
|
||
scf
|
||
ret
|
||
|
||
.no
|
||
xor a
|
||
ret
|
||
|
||
AskHeadbuttScript: ; 0xcedc
|
||
opentext
|
||
writetext UnknownText_0xcee6
|
||
yesorno
|
||
iftrue HeadbuttScript
|
||
closetext
|
||
end
|
||
|
||
UnknownText_0xcee6: ; 0xcee6
|
||
; A #MON could be in this tree. Want to HEADBUTT it?
|
||
text_jump UnknownText_0x1c08bc
|
||
db "@"
|
||
|
||
RockSmashFunction: ; ceeb
|
||
call TryRockSmashFromMenu
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
TryRockSmashFromMenu: ; cef4
|
||
call GetFacingObject
|
||
jr c, .no_rock
|
||
ld a, d
|
||
cp $18
|
||
jr nz, .no_rock
|
||
|
||
ld hl, RockSmashFromMenuScript
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.no_rock
|
||
call FieldMoveFailed
|
||
ld a, $80
|
||
ret
|
||
|
||
GetFacingObject: ; cf0d
|
||
callba CheckFacingObject
|
||
jr nc, .fail
|
||
|
||
ld a, [hObjectStructIndexBuffer]
|
||
call GetObjectStruct
|
||
ld hl, OBJECT_MAP_OBJECT_INDEX
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld [hLastTalked], a
|
||
call GetMapObject
|
||
ld hl, MAPOBJECT_MOVEMENT
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ld d, a
|
||
and a
|
||
ret
|
||
|
||
.fail
|
||
scf
|
||
ret
|
||
|
||
RockSmashFromMenuScript: ; 0xcf2e
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
|
||
RockSmashScript: ; cf32
|
||
callasm GetPartyNick
|
||
writetext UnknownText_0xcf58
|
||
closetext
|
||
special WaitSFX
|
||
playsound SFX_STRENGTH
|
||
earthquake 84
|
||
applymovement2 MovementData_0xcf55
|
||
disappear -2
|
||
|
||
callasm RockMonEncounter
|
||
copybytetovar TempWildMonSpecies
|
||
iffalse .done
|
||
randomwildmon
|
||
startbattle
|
||
reloadmapafterbattle
|
||
.done
|
||
end
|
||
|
||
MovementData_0xcf55: ; 0xcf55
|
||
rock_smash 10
|
||
step_end
|
||
|
||
UnknownText_0xcf58: ; 0xcf58
|
||
text_jump UnknownText_0x1c08f0
|
||
db "@"
|
||
|
||
AskRockSmashScript: ; 0xcf5d
|
||
callasm HasRockSmash
|
||
if_equal 1, .no
|
||
|
||
opentext
|
||
writetext UnknownText_0xcf77
|
||
yesorno
|
||
iftrue RockSmashScript
|
||
closetext
|
||
end
|
||
.no
|
||
jumptext UnknownText_0xcf72
|
||
|
||
UnknownText_0xcf72: ; 0xcf72
|
||
; Maybe a #MON can break this.
|
||
text_jump UnknownText_0x1c0906
|
||
db "@"
|
||
|
||
UnknownText_0xcf77: ; 0xcf77
|
||
; This rock looks breakable. Want to use ROCK SMASH?
|
||
text_jump UnknownText_0x1c0924
|
||
db "@"
|
||
|
||
HasRockSmash: ; cf7c
|
||
ld d, ROCK_SMASH
|
||
call CheckPartyMove
|
||
jr nc, .yes
|
||
.no
|
||
ld a, 1
|
||
jr .done
|
||
.yes
|
||
xor a
|
||
jr .done
|
||
.done
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
FishFunction: ; cf8e
|
||
ld a, e
|
||
push af
|
||
call ClearBuffer1
|
||
pop af
|
||
ld [Buffer2], a
|
||
.loop
|
||
ld hl, .FishTable
|
||
call FieldMoveJumptable
|
||
jr nc, .loop
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
.FishTable: ; cfa5
|
||
dw .TryFish
|
||
dw .FishNoBite
|
||
dw .FishGotSomething
|
||
dw .FailFish
|
||
dw .FishNoFish
|
||
|
||
.TryFish: ; cfaf
|
||
ld a, [PlayerState]
|
||
cp PLAYER_SURF
|
||
jr z, .fail
|
||
cp PLAYER_SURF_PIKA
|
||
jr z, .fail
|
||
call GetFacingTileCoord
|
||
call GetTileCollision
|
||
cp $1
|
||
jr z, .facingwater
|
||
.fail
|
||
ld a, $3
|
||
ret
|
||
|
||
.facingwater
|
||
call GetFishingGroup
|
||
and a
|
||
jr nz, .goodtofish
|
||
ld a, $4
|
||
ret
|
||
|
||
.goodtofish
|
||
ld d, a
|
||
ld a, [Buffer2]
|
||
ld e, a
|
||
callba FishAction
|
||
ld a, d
|
||
and a
|
||
jr z, .nonibble
|
||
ld [TempWildMonSpecies], a
|
||
ld a, e
|
||
ld [CurPartyLevel], a
|
||
ld a, BATTLETYPE_FISH
|
||
ld [BattleType], a
|
||
ld a, $2
|
||
ret
|
||
|
||
.nonibble
|
||
ld a, $1
|
||
ret
|
||
|
||
.FailFish: ; cff1
|
||
ld a, $80
|
||
ret
|
||
|
||
.FishGotSomething: ; cff4
|
||
ld a, $1
|
||
ld [Buffer6], a
|
||
ld hl, Script_GotABite
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.FishNoBite: ; d002
|
||
ld a, $2
|
||
ld [Buffer6], a
|
||
ld hl, Script_NotEvenANibble
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
.FishNoFish: ; d010
|
||
ld a, $0
|
||
ld [Buffer6], a
|
||
ld hl, Script_NotEvenANibble2
|
||
call QueueScript
|
||
ld a, $81
|
||
ret
|
||
|
||
Script_NotEvenANibble: ; 0xd01e
|
||
scall Script_FishCastRod
|
||
writetext UnknownText_0xd0a9
|
||
jump Script_NotEvenANibble_FallThrough
|
||
|
||
Script_NotEvenANibble2: ; 0xd027
|
||
scall Script_FishCastRod
|
||
writetext UnknownText_0xd0a9
|
||
|
||
Script_NotEvenANibble_FallThrough: ; 0xd02d
|
||
loademote EMOTE_SHADOW
|
||
callasm PutTheRodAway
|
||
closetext
|
||
end
|
||
|
||
Script_GotABite: ; 0xd035
|
||
scall Script_FishCastRod
|
||
callasm Fishing_CheckFacingUp
|
||
iffalse .NotFacingUp
|
||
applymovement PLAYER, .Movement_FacingUp
|
||
jump .FightTheHookedPokemon
|
||
|
||
.NotFacingUp: ; 0xd046
|
||
applymovement PLAYER, .Movement_NotFacingUp
|
||
|
||
.FightTheHookedPokemon: ; 0xd04a
|
||
pause 40
|
||
applymovement PLAYER, .Movement_RestoreRod
|
||
writetext UnknownText_0xd0a4
|
||
callasm PutTheRodAway
|
||
closetext
|
||
randomwildmon
|
||
startbattle
|
||
reloadmapafterbattle
|
||
end
|
||
|
||
.Movement_NotFacingUp: ; d05c
|
||
fish_got_bite
|
||
fish_got_bite
|
||
fish_got_bite
|
||
fish_got_bite
|
||
show_emote
|
||
step_end
|
||
|
||
.Movement_FacingUp: ; d062
|
||
fish_got_bite
|
||
fish_got_bite
|
||
fish_got_bite
|
||
fish_got_bite
|
||
step_sleep_1
|
||
show_emote
|
||
step_end
|
||
|
||
.Movement_RestoreRod: ; d069
|
||
hide_emote
|
||
fish_cast_rod
|
||
step_end
|
||
|
||
Fishing_CheckFacingUp: ; d06c
|
||
ld a, [PlayerDirection]
|
||
and $c
|
||
cp OW_UP
|
||
ld a, $1
|
||
jr z, .up
|
||
xor a
|
||
|
||
.up
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
Script_FishCastRod: ; 0xd07c
|
||
reloadmappart
|
||
loadvar hBGMapMode, $0
|
||
special UpdateTimePals
|
||
loademote EMOTE_ROD
|
||
callasm LoadFishingGFX
|
||
loademote EMOTE_SHOCK
|
||
applymovement PLAYER, MovementData_0xd093
|
||
pause 40
|
||
end
|
||
|
||
MovementData_0xd093: ; d093
|
||
fish_cast_rod
|
||
step_end
|
||
|
||
PutTheRodAway: ; d095
|
||
xor a
|
||
ld [hBGMapMode], a
|
||
ld a, $1
|
||
ld [PlayerAction], a
|
||
call UpdateSprites
|
||
call ReplaceKrisSprite
|
||
ret
|
||
|
||
UnknownText_0xd0a4: ; 0xd0a4
|
||
; Oh! A bite!
|
||
text_jump UnknownText_0x1c0958
|
||
db "@"
|
||
|
||
UnknownText_0xd0a9: ; 0xd0a9
|
||
; Not even a nibble!
|
||
text_jump UnknownText_0x1c0965
|
||
db "@"
|
||
|
||
UnknownText_0xd0ae: ; unused
|
||
; Looks like there's nothing here.
|
||
text_jump UnknownText_0x1c0979
|
||
db "@"
|
||
|
||
BikeFunction: ; d0b3
|
||
call .TryBike
|
||
and $7f
|
||
ld [wFieldMoveSucceeded], a
|
||
ret
|
||
|
||
.TryBike: ; d0bc
|
||
call .CheckEnvironment
|
||
jr c, .CannotUseBike
|
||
ld a, [PlayerState]
|
||
cp PLAYER_NORMAL
|
||
jr z, .GetOnBike
|
||
cp PLAYER_BIKE
|
||
jr z, .GetOffBike
|
||
jr .CannotUseBike
|
||
|
||
.GetOnBike
|
||
ld hl, Script_GetOnBike
|
||
ld de, Script_GetOnBike_Register
|
||
call .CheckIfRegistered
|
||
call QueueScript
|
||
xor a
|
||
ld [MusicFade], a
|
||
ld de, MUSIC_NONE
|
||
call PlayMusic
|
||
call DelayFrame
|
||
call MaxVolume
|
||
ld de, MUSIC_BICYCLE
|
||
ld a, e
|
||
ld [wMapMusic], a
|
||
call PlayMusic
|
||
ld a, $1
|
||
ret
|
||
|
||
.GetOffBike
|
||
ld hl, BikeFlags
|
||
bit 1, [hl]
|
||
jr nz, .CantGetOffBike
|
||
ld hl, Script_GetOffBike
|
||
ld de, Script_GetOffBike_Register
|
||
call .CheckIfRegistered
|
||
ld a, $3
|
||
jr .done
|
||
|
||
.CantGetOffBike
|
||
ld hl, Script_CantGetOffBike
|
||
jr .done
|
||
|
||
.CannotUseBike
|
||
ld a, $0
|
||
ret
|
||
|
||
.done
|
||
call QueueScript
|
||
ld a, $1
|
||
ret
|
||
|
||
.CheckIfRegistered: ; d119
|
||
ld a, [wUsingItemWithSelect]
|
||
and a
|
||
ret z
|
||
ld h, d
|
||
ld l, e
|
||
ret
|
||
|
||
.CheckEnvironment: ; d121
|
||
call GetMapPermission
|
||
call CheckOutdoorMap
|
||
jr z, .ok
|
||
cp CAVE
|
||
jr z, .ok
|
||
cp GATE
|
||
jr z, .ok
|
||
jr .nope
|
||
|
||
.ok
|
||
call GetPlayerStandingTile
|
||
and $f ; can't use our bike in a wall or on water
|
||
jr nz, .nope
|
||
xor a
|
||
ret
|
||
|
||
.nope
|
||
scf
|
||
ret
|
||
|
||
Script_GetOnBike: ; 0xd13e
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
writecode VAR_MOVEMENT, PLAYER_BIKE
|
||
writetext GotOnTheBikeText
|
||
waitbutton
|
||
closetext
|
||
special ReplaceKrisSprite
|
||
end
|
||
|
||
Script_GetOnBike_Register: ; 0xd14e
|
||
writecode VAR_MOVEMENT, PLAYER_BIKE
|
||
closetext
|
||
special ReplaceKrisSprite
|
||
end
|
||
|
||
; XXX
|
||
nop
|
||
ret
|
||
|
||
Script_GetOffBike: ; 0xd158
|
||
reloadmappart
|
||
special UpdateTimePals
|
||
writecode VAR_MOVEMENT, PLAYER_NORMAL
|
||
writetext GotOffTheBikeText
|
||
waitbutton
|
||
|
||
FinishGettingOffBike:
|
||
closetext
|
||
special ReplaceKrisSprite
|
||
special PlayMapMusic
|
||
end
|
||
|
||
Script_GetOffBike_Register: ; 0xd16b
|
||
writecode VAR_MOVEMENT, PLAYER_NORMAL
|
||
jump FinishGettingOffBike
|
||
|
||
Script_CantGetOffBike: ; 0xd171
|
||
writetext .CantGetOffBikeText
|
||
waitbutton
|
||
closetext
|
||
end
|
||
|
||
.CantGetOffBikeText: ; 0xd177
|
||
; You can't get off here!
|
||
text_jump UnknownText_0x1c099a
|
||
db "@"
|
||
|
||
GotOnTheBikeText: ; 0xd17c
|
||
; got on the @ .
|
||
text_jump UnknownText_0x1c09b2
|
||
db "@"
|
||
|
||
GotOffTheBikeText: ; 0xd181
|
||
; got off the @ .
|
||
text_jump UnknownText_0x1c09c7
|
||
db "@"
|
||
|
||
TryCutOW:: ; d186
|
||
ld d, CUT
|
||
call CheckPartyMove
|
||
jr c, .cant_cut
|
||
|
||
ld de, ENGINE_HIVEBADGE
|
||
call CheckEngineFlag
|
||
jr c, .cant_cut
|
||
|
||
ld a, BANK(AskCutScript)
|
||
ld hl, AskCutScript
|
||
call CallScript
|
||
scf
|
||
ret
|
||
|
||
.cant_cut
|
||
ld a, BANK(CantCutScript)
|
||
ld hl, CantCutScript
|
||
call CallScript
|
||
scf
|
||
ret
|
||
|
||
AskCutScript: ; 0xd1a9
|
||
opentext
|
||
writetext UnknownText_0xd1c8
|
||
yesorno
|
||
iffalse .script_d1b8
|
||
callasm .CheckMap
|
||
iftrue Script_Cut
|
||
.script_d1b8
|
||
closetext
|
||
end
|
||
|
||
.CheckMap: ; d1ba
|
||
xor a
|
||
ld [ScriptVar], a
|
||
call CheckMapForSomethingToCut
|
||
ret c
|
||
ld a, TRUE
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
UnknownText_0xd1c8: ; 0xd1c8
|
||
text_jump UnknownText_0x1c09dd
|
||
db "@"
|
||
|
||
CantCutScript: ; 0xd1cd
|
||
jumptext UnknownText_0xd1d0
|
||
|
||
UnknownText_0xd1d0: ; 0xd1d0
|
||
text_jump UnknownText_0x1c0a05
|
||
db "@"
|
||
|
||
_ReceiveItem:: ; d1d5
|
||
call DoesHLEqualNumItems
|
||
jp nz, PutItemInPocket
|
||
push hl
|
||
call CheckItemPocket
|
||
pop de
|
||
ld a, [wItemAttributeParamBuffer]
|
||
dec a
|
||
ld hl, .Pockets
|
||
rst JumpTable
|
||
ret
|
||
|
||
.Pockets: ; d1e9
|
||
dw .Item
|
||
dw .KeyItem
|
||
dw .Ball
|
||
dw .TMHM
|
||
|
||
.Item: ; d1f1
|
||
ld h, d
|
||
ld l, e
|
||
jp PutItemInPocket
|
||
|
||
.KeyItem: ; d1f6
|
||
ld h, d
|
||
ld l, e
|
||
jp ReceiveKeyItem
|
||
|
||
.Ball: ; d1fb
|
||
ld hl, NumBalls
|
||
jp PutItemInPocket
|
||
|
||
.TMHM: ; d201
|
||
ld h, d
|
||
ld l, e
|
||
ld a, [CurItem]
|
||
ld c, a
|
||
call GetTMHMNumber
|
||
jp ReceiveTMHM
|
||
|
||
_TossItem:: ; d20d
|
||
call DoesHLEqualNumItems
|
||
jr nz, .remove
|
||
push hl
|
||
call CheckItemPocket
|
||
pop de
|
||
ld a, [wItemAttributeParamBuffer]
|
||
dec a
|
||
ld hl, .Pockets
|
||
rst JumpTable
|
||
ret
|
||
|
||
.Pockets
|
||
dw .Item
|
||
dw .KeyItem
|
||
dw .Ball
|
||
dw .TMHM
|
||
|
||
.Ball ; d228
|
||
ld hl, NumBalls
|
||
jp RemoveItemFromPocket
|
||
|
||
.TMHM ; d22e
|
||
ld h, d
|
||
ld l, e
|
||
ld a, [CurItem]
|
||
ld c, a
|
||
call GetTMHMNumber
|
||
jp TossTMHM
|
||
|
||
.KeyItem ; d23a
|
||
ld h, d
|
||
ld l, e
|
||
jp TossKeyItem
|
||
|
||
.Item ; d23f
|
||
ld h, d
|
||
ld l, e
|
||
|
||
.remove
|
||
jp RemoveItemFromPocket
|
||
|
||
_CheckItem:: ; d244
|
||
call DoesHLEqualNumItems
|
||
jr nz, .nope
|
||
push hl
|
||
call CheckItemPocket
|
||
pop de
|
||
ld a, [wItemAttributeParamBuffer]
|
||
dec a
|
||
ld hl, .Pockets
|
||
rst JumpTable
|
||
ret
|
||
|
||
.Pockets
|
||
dw .Item
|
||
dw .KeyItem
|
||
dw .Ball
|
||
dw .TMHM
|
||
|
||
.Ball ; d25f
|
||
ld hl, NumBalls
|
||
jp CheckTheItem
|
||
|
||
.TMHM ; d265
|
||
ld h, d
|
||
ld l, e
|
||
ld a, [CurItem]
|
||
ld c, a
|
||
call GetTMHMNumber
|
||
jp CheckTMHM
|
||
|
||
.KeyItem ; d271
|
||
ld h, d
|
||
ld l, e
|
||
jp CheckKeyItems
|
||
|
||
.Item ; d276
|
||
ld h, d
|
||
ld l, e
|
||
|
||
.nope
|
||
jp CheckTheItem
|
||
|
||
DoesHLEqualNumItems: ; d27b
|
||
ld a, l
|
||
cp NumItems % $100
|
||
ret nz
|
||
ld a, h
|
||
cp NumItems / $100
|
||
ret
|
||
|
||
GetPocketCapacity: ; d283
|
||
ld c, MAX_ITEMS
|
||
ld a, e
|
||
cp NumItems % $100
|
||
jr nz, .not_bag
|
||
ld a, d
|
||
cp NumItems / $100
|
||
ret z
|
||
|
||
.not_bag
|
||
ld c, MAX_PC_ITEMS
|
||
ld a, e
|
||
cp PCItems % $100
|
||
jr nz, .not_pc
|
||
ld a, d
|
||
cp PCItems / $100
|
||
ret z
|
||
|
||
.not_pc
|
||
ld c, MAX_BALLS
|
||
ret
|
||
|
||
PutItemInPocket: ; d29c
|
||
ld d, h
|
||
ld e, l
|
||
inc hl
|
||
ld a, [CurItem]
|
||
ld c, a
|
||
ld b, 0
|
||
.loop
|
||
ld a, [hli]
|
||
cp -1
|
||
jr z, .terminator
|
||
cp c
|
||
jr nz, .next
|
||
ld a, 99
|
||
sub [hl]
|
||
add b
|
||
ld b, a
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
cp b
|
||
jr z, .ok
|
||
jr c, .ok
|
||
|
||
.next
|
||
inc hl
|
||
jr .loop
|
||
|
||
.terminator
|
||
call GetPocketCapacity
|
||
ld a, [de]
|
||
cp c
|
||
jr c, .ok
|
||
and a
|
||
ret
|
||
|
||
.ok
|
||
ld h, d
|
||
ld l, e
|
||
ld a, [CurItem]
|
||
ld c, a
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
ld [wItemQuantityBuffer], a
|
||
.loop2
|
||
inc hl
|
||
ld a, [hli]
|
||
cp -1
|
||
jr z, .terminator2
|
||
cp c
|
||
jr nz, .loop2
|
||
ld a, [wItemQuantityBuffer]
|
||
add [hl]
|
||
cp 100
|
||
jr nc, .newstack
|
||
ld [hl], a
|
||
jr .done
|
||
|
||
.newstack
|
||
ld [hl], 99
|
||
sub 99
|
||
ld [wItemQuantityBuffer], a
|
||
jr .loop2
|
||
|
||
.terminator2
|
||
dec hl
|
||
ld a, [CurItem]
|
||
ld [hli], a
|
||
ld a, [wItemQuantityBuffer]
|
||
ld [hli], a
|
||
ld [hl], -1
|
||
ld h, d
|
||
ld l, e
|
||
inc [hl]
|
||
|
||
.done
|
||
scf
|
||
ret
|
||
|
||
RemoveItemFromPocket: ; d2ff
|
||
ld d, h
|
||
ld e, l
|
||
ld a, [hli]
|
||
ld c, a
|
||
ld a, [CurItemQuantity]
|
||
cp c
|
||
jr nc, .ok ; memory
|
||
ld c, a
|
||
ld b, $0
|
||
add hl, bc
|
||
add hl, bc
|
||
ld a, [CurItem]
|
||
cp [hl]
|
||
inc hl
|
||
jr z, .skip
|
||
ld h, d
|
||
ld l, e
|
||
inc hl
|
||
|
||
.ok
|
||
ld a, [CurItem]
|
||
ld b, a
|
||
.loop
|
||
ld a, [hli]
|
||
cp b
|
||
jr z, .skip
|
||
cp -1
|
||
jr z, .nope
|
||
inc hl
|
||
jr .loop
|
||
|
||
.skip
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
ld b, a
|
||
ld a, [hl]
|
||
sub b
|
||
jr c, .nope
|
||
ld [hl], a
|
||
ld [wItemQuantityBuffer], a
|
||
and a
|
||
jr nz, .yup
|
||
dec hl
|
||
ld b, h
|
||
ld c, l
|
||
inc hl
|
||
inc hl
|
||
.loop2
|
||
ld a, [hli]
|
||
ld [bc], a
|
||
inc bc
|
||
cp -1
|
||
jr nz, .loop2
|
||
ld h, d
|
||
ld l, e
|
||
dec [hl]
|
||
|
||
.yup
|
||
scf
|
||
ret
|
||
|
||
.nope
|
||
and a
|
||
ret
|
||
|
||
CheckTheItem: ; d349
|
||
ld a, [CurItem]
|
||
ld c, a
|
||
.loop
|
||
inc hl
|
||
ld a, [hli]
|
||
cp -1
|
||
jr z, .done
|
||
cp c
|
||
jr nz, .loop
|
||
scf
|
||
ret
|
||
|
||
.done
|
||
and a
|
||
ret
|
||
|
||
ReceiveKeyItem: ; d35a
|
||
ld hl, NumKeyItems
|
||
ld a, [hli]
|
||
cp MAX_KEY_ITEMS
|
||
jr nc, .nope
|
||
ld c, a
|
||
ld b, 0
|
||
add hl, bc
|
||
ld a, [CurItem]
|
||
ld [hli], a
|
||
ld [hl], -1
|
||
ld hl, NumKeyItems
|
||
inc [hl]
|
||
scf
|
||
ret
|
||
|
||
.nope
|
||
and a
|
||
ret
|
||
|
||
TossKeyItem: ; d374
|
||
ld a, [wd107]
|
||
ld e, a
|
||
ld d, 0
|
||
ld hl, NumKeyItems
|
||
ld a, [hl]
|
||
cp e
|
||
jr nc, .ok
|
||
call .Toss
|
||
ret nc
|
||
jr .ok2
|
||
|
||
.ok
|
||
dec [hl]
|
||
inc hl
|
||
add hl, de
|
||
|
||
.ok2
|
||
ld d, h
|
||
ld e, l
|
||
inc hl
|
||
.loop
|
||
ld a, [hli]
|
||
ld [de], a
|
||
inc de
|
||
cp -1
|
||
jr nz, .loop
|
||
scf
|
||
ret
|
||
|
||
.Toss: ; d396
|
||
ld hl, NumKeyItems
|
||
ld a, [CurItem]
|
||
ld c, a
|
||
.loop3
|
||
inc hl
|
||
ld a, [hl]
|
||
cp c
|
||
jr z, .ok3
|
||
cp -1
|
||
jr nz, .loop3
|
||
xor a
|
||
ret
|
||
|
||
.ok3
|
||
ld a, [NumKeyItems]
|
||
dec a
|
||
ld [NumKeyItems], a
|
||
scf
|
||
ret
|
||
|
||
CheckKeyItems: ; d3b1
|
||
ld a, [CurItem]
|
||
ld c, a
|
||
ld hl, KeyItems
|
||
.loop
|
||
ld a, [hli]
|
||
cp c
|
||
jr z, .done
|
||
cp -1
|
||
jr nz, .loop
|
||
and a
|
||
ret
|
||
|
||
.done
|
||
scf
|
||
ret
|
||
|
||
ReceiveTMHM: ; d3c4
|
||
dec c
|
||
ld b, 0
|
||
ld hl, TMsHMs
|
||
add hl, bc
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
add [hl]
|
||
cp 100
|
||
jr nc, .toomany
|
||
ld [hl], a
|
||
scf
|
||
ret
|
||
|
||
.toomany
|
||
and a
|
||
ret
|
||
|
||
TossTMHM: ; d3d8
|
||
dec c
|
||
ld b, 0
|
||
ld hl, TMsHMs
|
||
add hl, bc
|
||
ld a, [wItemQuantityChangeBuffer]
|
||
ld b, a
|
||
ld a, [hl]
|
||
sub b
|
||
jr c, .nope
|
||
ld [hl], a
|
||
ld [wItemQuantityBuffer], a
|
||
jr nz, .yup
|
||
ld a, [wTMHMPocketScrollPosition]
|
||
and a
|
||
jr z, .yup
|
||
dec a
|
||
ld [wTMHMPocketScrollPosition], a
|
||
|
||
.yup
|
||
scf
|
||
ret
|
||
|
||
.nope
|
||
and a
|
||
ret
|
||
|
||
CheckTMHM: ; d3fb
|
||
dec c
|
||
ld b, $0
|
||
ld hl, TMsHMs
|
||
add hl, bc
|
||
ld a, [hl]
|
||
and a
|
||
ret z
|
||
scf
|
||
ret
|
||
|
||
GetTMHMNumber:: ; d407
|
||
; Return the number of a TM/HM by item id c.
|
||
|
||
ld a, c
|
||
|
||
; Skip any dummy items.
|
||
cp ITEM_C3 ; TM04-05
|
||
jr c, .done
|
||
cp ITEM_DC ; TM28-29
|
||
jr c, .skip
|
||
|
||
dec a
|
||
.skip
|
||
dec a
|
||
.done
|
||
sub TM01
|
||
inc a
|
||
ld c, a
|
||
ret
|
||
|
||
GetNumberedTMHM: ; d417
|
||
; Return the item id of a TM/HM by number c.
|
||
|
||
ld a, c
|
||
|
||
; Skip any gaps.
|
||
cp ITEM_C3 - (TM01 - 1)
|
||
jr c, .done
|
||
cp ITEM_DC - (TM01 - 1) - 1
|
||
jr c, .skip_one
|
||
|
||
.skip_two
|
||
inc a
|
||
.skip_one
|
||
inc a
|
||
.done
|
||
add TM01
|
||
dec a
|
||
ld c, a
|
||
ret
|
||
|
||
_CheckTossableItem:: ; d427
|
||
; Return 1 in wItemAttributeParamBuffer and carry if CurItem can't be removed from the bag.
|
||
ld a, ITEMATTR_PERMISSIONS
|
||
call GetItemAttr
|
||
bit 7, a
|
||
jr nz, ItemAttr_ReturnCarry
|
||
and a
|
||
ret
|
||
|
||
CheckSelectableItem: ; d432
|
||
; Return 1 in wItemAttributeParamBuffer and carry if CurItem can't be selected.
|
||
ld a, ITEMATTR_PERMISSIONS
|
||
call GetItemAttr
|
||
bit 6, a
|
||
jr nz, ItemAttr_ReturnCarry
|
||
and a
|
||
ret
|
||
|
||
CheckItemPocket:: ; d43d
|
||
; Return the pocket for CurItem in wItemAttributeParamBuffer.
|
||
ld a, ITEMATTR_POCKET
|
||
call GetItemAttr
|
||
and $f
|
||
ld [wItemAttributeParamBuffer], a
|
||
ret
|
||
|
||
CheckItemContext: ; d448
|
||
; Return the context for CurItem in wItemAttributeParamBuffer.
|
||
ld a, ITEMATTR_HELP
|
||
call GetItemAttr
|
||
and $f
|
||
ld [wItemAttributeParamBuffer], a
|
||
ret
|
||
|
||
CheckItemMenu: ; d453
|
||
; Return the menu for CurItem in wItemAttributeParamBuffer.
|
||
ld a, ITEMATTR_HELP
|
||
call GetItemAttr
|
||
swap a
|
||
and $f
|
||
ld [wItemAttributeParamBuffer], a
|
||
ret
|
||
|
||
GetItemAttr: ; d460
|
||
; Get attribute a of CurItem.
|
||
|
||
push hl
|
||
push bc
|
||
|
||
ld hl, ItemAttributes
|
||
ld c, a
|
||
ld b, 0
|
||
add hl, bc
|
||
|
||
xor a
|
||
ld [wItemAttributeParamBuffer], a
|
||
|
||
ld a, [CurItem]
|
||
dec a
|
||
ld c, a
|
||
ld a, NUM_ITEMATTRS
|
||
call AddNTimes
|
||
ld a, BANK(ItemAttributes)
|
||
call GetFarByte
|
||
|
||
pop bc
|
||
pop hl
|
||
ret
|
||
|
||
ItemAttr_ReturnCarry: ; d47f
|
||
ld a, 1
|
||
ld [wItemAttributeParamBuffer], a
|
||
scf
|
||
ret
|
||
|
||
GetItemPrice: ; d486
|
||
; Return the price of CurItem in de.
|
||
push hl
|
||
push bc
|
||
ld a, ITEMATTR_PRICE
|
||
call GetItemAttr
|
||
ld e, a
|
||
ld a, ITEMATTR_PRICE_HI
|
||
call GetItemAttr
|
||
ld d, a
|
||
pop bc
|
||
pop hl
|
||
ret
|
||
|
||
INCLUDE "engine/player_step.asm"
|
||
INCLUDE "engine/anim_hp_bar.asm"
|
||
INCLUDE "engine/move_mon.asm"
|
||
|
||
_BillsPC: ; e3fd
|
||
call .CheckCanUsePC
|
||
ret c
|
||
call .LogIn
|
||
call .UseBillsPC
|
||
jp .LogOut
|
||
|
||
.CheckCanUsePC: ; e40a (3:640a)
|
||
ld a, [PartyCount]
|
||
and a
|
||
ret nz
|
||
ld hl, .Text_GottaHavePokemon
|
||
call MenuTextBoxBackup
|
||
scf
|
||
ret
|
||
|
||
.Text_GottaHavePokemon: ; 0xe417
|
||
; You gotta have #MON to call!
|
||
text_jump UnknownText_0x1c1006
|
||
db "@"
|
||
|
||
.LogIn: ; e41c (3:641c)
|
||
xor a
|
||
ld [hBGMapMode], a
|
||
call LoadStandardMenuDataHeader
|
||
call ClearPCItemScreen
|
||
ld hl, Options
|
||
ld a, [hl]
|
||
push af
|
||
set NO_TEXT_SCROLL, [hl]
|
||
ld hl, .Text_What
|
||
call PrintText
|
||
pop af
|
||
ld [Options], a
|
||
call LoadFontsBattleExtra
|
||
ret
|
||
|
||
.Text_What: ; 0xe43a
|
||
; What?
|
||
text_jump UnknownText_0x1c1024
|
||
db "@"
|
||
|
||
.LogOut: ; e43f (3:643f)
|
||
call CloseSubmenu
|
||
ret
|
||
|
||
.UseBillsPC: ; e443 (3:6443)
|
||
ld hl, .MenuDataHeader
|
||
call LoadMenuDataHeader
|
||
ld a, $1
|
||
.loop
|
||
ld [wMenuCursorBuffer], a
|
||
call SetPalettes
|
||
xor a
|
||
ld [wWhichIndexSet], a
|
||
ld [hBGMapMode], a
|
||
call DoNthMenu
|
||
jr c, .cancel
|
||
ld a, [wMenuCursorBuffer]
|
||
push af
|
||
ld a, [MenuSelection]
|
||
ld hl, .Jumptable
|
||
rst JumpTable
|
||
pop bc
|
||
ld a, b
|
||
jr nc, .loop
|
||
.cancel
|
||
call CloseWindow
|
||
ret
|
||
|
||
.MenuDataHeader: ; 0xe46f
|
||
db $40 ; flags
|
||
db 00, 00 ; start coords
|
||
db 17, 19 ; end coords
|
||
dw .MenuData2
|
||
db 1 ; default option
|
||
|
||
.MenuData2: ; 0xe477
|
||
db $80 ; flags
|
||
db 0 ; items
|
||
dw .items
|
||
dw PlaceMenuStrings
|
||
dw .strings
|
||
|
||
.strings: ; e47f
|
||
db "WITHDRAW <PK><MN>@"
|
||
db "DEPOSIT <PK><MN>@"
|
||
db "CHANGE BOX@"
|
||
db "MOVE <PK><MN> W/O MAIL@"
|
||
db "SEE YA!@"
|
||
|
||
.Jumptable: ; e4ba (3:64ba)
|
||
dw BillsPC_WithdrawMenu
|
||
dw BillsPC_DepositMenu
|
||
dw BillsPC_ChangeBoxMenu
|
||
dw BillsPC_MovePKMNMenu
|
||
dw BillsPC_SeeYa
|
||
|
||
.items: ; e4c4
|
||
db 5
|
||
db 0 ; WITHDRAW
|
||
db 1; DEPOSIT
|
||
db 2 ; CHANGE BOX
|
||
db 3 ; MOVE PKMN
|
||
db 4 ; SEE YA!
|
||
db -1
|
||
|
||
BillsPC_SeeYa: ; e4cb
|
||
scf
|
||
ret
|
||
|
||
BillsPC_MovePKMNMenu: ; e4cd
|
||
call LoadStandardMenuDataHeader
|
||
callba IsAnyMonHoldingMail
|
||
jr nc, .no_mail
|
||
ld hl, .Text_MonHoldingMail
|
||
call PrintText
|
||
jr .quit
|
||
|
||
.no_mail
|
||
callba StartMovePkmnWOMail_SaveGame
|
||
jr c, .quit
|
||
callba _MovePKMNWithoutMail
|
||
call ReturnToMapFromSubmenu
|
||
call ClearPCItemScreen
|
||
|
||
.quit
|
||
call CloseWindow
|
||
and a
|
||
ret
|
||
|
||
.Text_MonHoldingMail: ; 0xe4f9
|
||
; There is a #MON holding MAIL. Please remove the MAIL.
|
||
text_jump UnknownText_0x1c102b
|
||
db "@"
|
||
|
||
BillsPC_DepositMenu: ; e4fe (3:64fe)
|
||
call LoadStandardMenuDataHeader
|
||
callba _DepositPKMN
|
||
call ReturnToMapFromSubmenu
|
||
call ClearPCItemScreen
|
||
call CloseWindow
|
||
and a
|
||
ret
|
||
|
||
Functione512: ; unused
|
||
ld a, [PartyCount]
|
||
and a
|
||
jr z, .no_pkmn
|
||
cp 2
|
||
jr c, .only_one_pkmn
|
||
and a
|
||
ret
|
||
|
||
.no_pkmn
|
||
ld hl, .Text_NoPKMN
|
||
call MenuTextBoxBackup
|
||
scf
|
||
ret
|
||
|
||
.only_one_pkmn
|
||
ld hl, .Text_ItsYourLastPKMN
|
||
call MenuTextBoxBackup
|
||
scf
|
||
ret
|
||
|
||
.Text_NoPKMN: ; 0xe52e
|
||
; You don't have a single #MON!
|
||
text_jump UnknownText_0x1c1062
|
||
db "@"
|
||
|
||
.Text_ItsYourLastPKMN: ; 0xe533
|
||
; You can't deposit your last #MON!
|
||
text_jump UnknownText_0x1c1080
|
||
db "@"
|
||
|
||
CheckCurPartyMonFainted: ; e538
|
||
ld hl, PartyMon1HP
|
||
ld de, PARTYMON_STRUCT_LENGTH
|
||
ld b, $0
|
||
.loop
|
||
ld a, [CurPartyMon]
|
||
cp b
|
||
jr z, .skip
|
||
ld a, [hli]
|
||
or [hl]
|
||
jr nz, .notfainted
|
||
dec hl
|
||
|
||
.skip
|
||
inc b
|
||
ld a, [PartyCount]
|
||
cp b
|
||
jr z, .done
|
||
add hl, de
|
||
jr .loop
|
||
|
||
.done
|
||
scf
|
||
ret
|
||
|
||
.notfainted
|
||
and a
|
||
ret
|
||
|
||
BillsPC_WithdrawMenu: ; e559 (3:6559)
|
||
call LoadStandardMenuDataHeader
|
||
callba _WithdrawPKMN
|
||
call ReturnToMapFromSubmenu
|
||
call ClearPCItemScreen
|
||
call CloseWindow
|
||
and a
|
||
ret
|
||
|
||
Functione56d: ; unused
|
||
ld a, [PartyCount]
|
||
cp PARTY_LENGTH
|
||
jr nc, .asm_e576
|
||
and a
|
||
ret
|
||
|
||
.asm_e576
|
||
ld hl, UnknownText_0xe57e
|
||
call MenuTextBoxBackup
|
||
scf
|
||
ret
|
||
|
||
UnknownText_0xe57e: ; 0xe57e
|
||
; You can't take any more #MON.
|
||
text_jump UnknownText_0x1c10a2
|
||
db "@"
|
||
|
||
BillsPC_ChangeBoxMenu: ; e583 (3:6583)
|
||
callba _ChangeBox
|
||
and a
|
||
ret
|
||
|
||
ClearPCItemScreen: ; e58b
|
||
call DisableSpriteUpdates
|
||
xor a
|
||
ld [hBGMapMode], a
|
||
call ClearBGPalettes
|
||
call ClearSprites
|
||
hlcoord 0, 0
|
||
ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
|
||
ld a, " "
|
||
call ByteFill
|
||
hlcoord 0,0
|
||
lb bc, 10, 18
|
||
call TextBox
|
||
hlcoord 0,12
|
||
lb bc, 4, 18
|
||
call TextBox
|
||
call WaitBGMap2
|
||
call SetPalettes ; load regular palettes?
|
||
ret
|
||
|
||
CopyBoxmonToTempMon: ; e5bb
|
||
ld a, [CurPartyMon]
|
||
ld hl, sBoxMon1Species
|
||
ld bc, BOXMON_STRUCT_LENGTH
|
||
call AddNTimes
|
||
ld de, TempMonSpecies
|
||
ld bc, BOXMON_STRUCT_LENGTH
|
||
ld a, BANK(sBoxMon1Species)
|
||
call GetSRAMBank
|
||
call CopyBytes
|
||
call CloseSRAM
|
||
ret
|
||
|
||
Functione5d9: ; unreferenced
|
||
ld a, [wCurBox]
|
||
cp b
|
||
jr z, .same_box
|
||
ld a, b
|
||
ld hl, .BoxAddrs
|
||
ld bc, 3
|
||
call AddNTimes
|
||
ld a, [hli]
|
||
push af
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
pop af
|
||
jr .okay
|
||
|
||
.same_box
|
||
ld a, BANK(sBoxCount)
|
||
ld hl, sBoxCount
|
||
|
||
.okay
|
||
call GetSRAMBank
|
||
ld a, [hl]
|
||
ld bc, 1 + MONS_PER_BOX + 1
|
||
add hl, bc
|
||
ld b, a
|
||
ld c, $0
|
||
ld de, wc608
|
||
ld a, b
|
||
and a
|
||
jr z, .empty_box
|
||
.loop
|
||
push hl
|
||
push bc
|
||
ld a, c
|
||
ld bc, 0
|
||
add hl, bc
|
||
ld bc, BOXMON_STRUCT_LENGTH
|
||
call AddNTimes
|
||
ld a, [hl]
|
||
ld [de], a
|
||
inc de
|
||
ld [CurSpecies], a
|
||
call GetBaseData
|
||
pop bc
|
||
pop hl
|
||
|
||
push hl
|
||
push bc
|
||
ld a, c
|
||
ld bc, MONS_PER_BOX * (BOXMON_STRUCT_LENGTH + NAME_LENGTH)
|
||
add hl, bc
|
||
call SkipNames
|
||
call CopyBytes
|
||
pop bc
|
||
pop hl
|
||
|
||
push hl
|
||
push bc
|
||
ld a, c
|
||
ld bc, MON_LEVEL
|
||
add hl, bc
|
||
ld bc, BOXMON_STRUCT_LENGTH
|
||
call AddNTimes
|
||
ld a, [hl]
|
||
ld [de], a
|
||
inc de
|
||
pop bc
|
||
pop hl
|
||
|
||
push hl
|
||
push bc
|
||
ld a, c
|
||
ld bc, MON_DVS
|
||
add hl, bc
|
||
ld bc, BOXMON_STRUCT_LENGTH
|
||
call AddNTimes
|
||
ld a, [hli]
|
||
and $f0
|
||
ld b, a
|
||
ld a, [hl]
|
||
and $f0
|
||
swap a
|
||
or b
|
||
ld b, a
|
||
ld a, [BaseGender]
|
||
cp b
|
||
ld a, $1
|
||
jr c, .okay2
|
||
xor a
|
||
.okay2
|
||
ld [de], a
|
||
inc de
|
||
pop bc
|
||
pop hl
|
||
|
||
inc c
|
||
dec b
|
||
jr nz, .loop
|
||
.empty_box
|
||
call CloseSRAM
|
||
ret
|
||
|
||
.BoxAddrs: ; e66e
|
||
dba sBox1
|
||
dba sBox2
|
||
dba sBox3
|
||
dba sBox4
|
||
dba sBox5
|
||
dba sBox6
|
||
dba sBox7
|
||
dba sBox8
|
||
dba sBox9
|
||
dba sBox10
|
||
dba sBox11
|
||
dba sBox12
|
||
dba sBox13
|
||
dba sBox14
|
||
|
||
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
|
||
|
||
BugContest_SetCaughtContestMon: ; e6ce
|
||
ld a, [wContestMon]
|
||
and a
|
||
jr z, .firstcatch
|
||
ld [wd265], a
|
||
callba DisplayAlreadyCaughtText
|
||
callba DisplayCaughtContestMonStats
|
||
lb bc, 14, 7
|
||
call PlaceYesNoBox
|
||
ret c
|
||
|
||
.firstcatch
|
||
call .generatestats
|
||
ld a, [TempEnemyMonSpecies]
|
||
ld [wd265], a
|
||
call GetPokemonName
|
||
ld hl, .caughttext
|
||
call PrintText
|
||
ret
|
||
|
||
.generatestats: ; e6fd
|
||
ld a, [TempEnemyMonSpecies]
|
||
ld [CurSpecies], a
|
||
ld [CurPartySpecies], a
|
||
call GetBaseData
|
||
xor a
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
ld hl, wContestMon
|
||
call ByteFill
|
||
xor a
|
||
ld [MonType], a
|
||
ld hl, wContestMon
|
||
jp GeneratePartyMonStats
|
||
|
||
.caughttext: ; 0xe71d
|
||
; Caught @ !
|
||
text_jump UnknownText_0x1c10c0
|
||
db "@"
|
||
|
||
INCLUDE "items/item_effects.asm"
|
||
|
||
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
|
||
|
||
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 "@"
|
||
|
||
SECTION "bank4", ROMX, BANK[$4]
|
||
|
||
INCLUDE "engine/pack.asm"
|
||
INCLUDE "engine/time.asm"
|
||
INCLUDE "engine/tmhm.asm"
|
||
INCLUDE "engine/namingscreen.asm"
|
||
|
||
Script_AbortBugContest: ; 0x122c1
|
||
checkflag ENGINE_BUG_CONTEST_TIMER
|
||
iffalse .finish
|
||
setflag ENGINE_DAILY_BUG_CONTEST
|
||
special ContestReturnMons
|
||
.finish
|
||
end
|
||
|
||
INCLUDE "event/itemball.asm"
|
||
INCLUDE "engine/healmachineanim.asm"
|
||
INCLUDE "event/whiteout.asm"
|
||
INCLUDE "event/forced_movement.asm"
|
||
INCLUDE "event/itemfinder.asm"
|
||
INCLUDE "engine/startmenu.asm"
|
||
INCLUDE "engine/selectmenu.asm"
|
||
INCLUDE "event/elevator.asm"
|
||
|
||
Special_GiveParkBalls: ; 135db
|
||
xor a
|
||
ld [wContestMon], a
|
||
ld a, 20
|
||
ld [wParkBallsRemaining], a
|
||
callba StartBugContestTimer
|
||
ret
|
||
|
||
BugCatchingContestBattleScript:: ; 0x135eb
|
||
writecode VAR_BATTLETYPE, BATTLETYPE_CONTEST
|
||
randomwildmon
|
||
startbattle
|
||
reloadmapafterbattle
|
||
copybytetovar wParkBallsRemaining
|
||
iffalse BugCatchingContestOutOfBallsScript
|
||
end
|
||
|
||
BugCatchingContestOverScript:: ; 0x135f8
|
||
playsound SFX_ELEVATOR_END
|
||
opentext
|
||
writetext BugCatchingContestText_BeeepTimesUp
|
||
waitbutton
|
||
jump BugCatchingContestReturnToGateScript
|
||
|
||
BugCatchingContestOutOfBallsScript: ; 0x13603
|
||
playsound SFX_ELEVATOR_END
|
||
opentext
|
||
writetext BugCatchingContestText_ContestIsOver
|
||
waitbutton
|
||
|
||
BugCatchingContestReturnToGateScript: ; 0x1360b
|
||
closetext
|
||
jumpstd bugcontestresultswarp
|
||
|
||
BugCatchingContestText_BeeepTimesUp: ; 0x1360f
|
||
; ANNOUNCER: BEEEP! Time's up!
|
||
text_jump UnknownText_0x1bd2ca
|
||
db "@"
|
||
|
||
BugCatchingContestText_ContestIsOver: ; 0x13614
|
||
; ANNOUNCER: The Contest is over!
|
||
text_jump UnknownText_0x1bd2e7
|
||
db "@"
|
||
|
||
RepelWoreOffScript:: ; 0x13619
|
||
opentext
|
||
writetext .text
|
||
waitbutton
|
||
closetext
|
||
end
|
||
|
||
.text: ; 0x13620
|
||
; REPEL's effect wore off.
|
||
text_jump UnknownText_0x1bd308
|
||
db "@"
|
||
|
||
HiddenItemScript:: ; 0x13625
|
||
opentext
|
||
copybytetovar EngineBuffer3
|
||
itemtotext 0, 0
|
||
writetext .found_text
|
||
giveitem ITEM_FROM_MEM
|
||
iffalse .bag_full
|
||
callasm SetMemEvent
|
||
specialsound
|
||
itemnotify
|
||
jump .finish
|
||
|
||
.bag_full: ; 0x1363e
|
||
buttonsound
|
||
writetext .no_room_text
|
||
waitbutton
|
||
|
||
.finish: ; 13643
|
||
closetext
|
||
end
|
||
|
||
.found_text: ; 0x13645
|
||
; found @ !
|
||
text_jump UnknownText_0x1bd321
|
||
db "@"
|
||
|
||
.no_room_text: ; 0x1364a
|
||
; But has no space left…
|
||
text_jump UnknownText_0x1bd331
|
||
db "@"
|
||
|
||
SetMemEvent: ; 1364f
|
||
ld hl, EngineBuffer1 ; wd03e (aliases: MenuItemsList, CurFruitTree, CurInput)
|
||
ld a, [hli]
|
||
ld d, [hl]
|
||
ld e, a
|
||
ld b, SET_FLAG
|
||
call EventFlagAction
|
||
ret
|
||
|
||
CheckFacingTileForStd:: ; 1365b
|
||
; Checks to see if the tile you're facing has a std script associated with it. If so, executes the script and returns carry.
|
||
ld a, c
|
||
ld de, 3
|
||
ld hl, .table1
|
||
call IsInArray
|
||
jr nc, .notintable
|
||
|
||
ld a, jumpstd_command
|
||
ld [wJumpStdScriptBuffer], a
|
||
inc hl
|
||
ld a, [hli]
|
||
ld [wJumpStdScriptBuffer + 1], a
|
||
ld a, [hli]
|
||
ld [wJumpStdScriptBuffer + 2], a
|
||
ld a, BANK(Script_JumpStdFromRAM)
|
||
ld hl, Script_JumpStdFromRAM
|
||
call CallScript
|
||
scf
|
||
ret
|
||
|
||
.notintable
|
||
xor a
|
||
ret
|
||
|
||
.table1
|
||
dbw $91, magazinebookshelf
|
||
dbw $93, pcscript
|
||
dbw $94, radio1
|
||
dbw $95, townmap
|
||
dbw $96, merchandiseshelf
|
||
dbw $97, tv
|
||
dbw $9d, window
|
||
dbw $9f, incenseburner
|
||
db -1 ; end
|
||
|
||
Script_JumpStdFromRAM: ; 0x1369a
|
||
jump wJumpStdScriptBuffer
|
||
|
||
INCLUDE "event/bug_contest_judging.asm"
|
||
|
||
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
|
||
|
||
INCLUDE "event/bug_contest_2.asm"
|
||
|
||
INCLUDE "unknown/013a47.asm"
|
||
|
||
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
|
||
|
||
SECTION "bank5", ROMX, BANK[$5]
|
||
|
||
INCLUDE "engine/rtc.asm"
|
||
INCLUDE "engine/overworld.asm"
|
||
INCLUDE "engine/tile_events.asm"
|
||
INCLUDE "engine/save.asm"
|
||
INCLUDE "engine/spawn_points.asm"
|
||
INCLUDE "engine/map_setup.asm"
|
||
INCLUDE "engine/pokecenter_pc.asm"
|
||
INCLUDE "engine/mart.asm"
|
||
INCLUDE "engine/money.asm"
|
||
INCLUDE "items/marts.asm"
|
||
INCLUDE "event/mom.asm"
|
||
INCLUDE "event/daycare.asm"
|
||
INCLUDE "event/photo.asm"
|
||
INCLUDE "engine/breeding/egg.asm"
|
||
|
||
SECTION "Tileset Data 1", ROMX, BANK[TILESETS_1]
|
||
|
||
INCLUDE "tilesets/data_1.asm"
|
||
|
||
SECTION "Roofs", ROMX, BANK[ROOFS]
|
||
|
||
INCLUDE "tilesets/roofs.asm"
|
||
|
||
SECTION "Tileset Data 2", ROMX, BANK[TILESETS_2]
|
||
|
||
INCLUDE "tilesets/data_2.asm"
|
||
|
||
SECTION "bank8", ROMX, BANK[$8]
|
||
|
||
INCLUDE "engine/clock_reset.asm"
|
||
|
||
SECTION "Tileset Data 3", ROMX, BANK[TILESETS_3]
|
||
|
||
INCLUDE "tilesets/data_3.asm"
|
||
|
||
SECTION "bank9", ROMX, BANK[$9]
|
||
|
||
StringBufferPointers:: ; 24000
|
||
dw StringBuffer3
|
||
dw StringBuffer4
|
||
dw StringBuffer5
|
||
dw StringBuffer2
|
||
dw StringBuffer1
|
||
dw EnemyMonNick
|
||
dw BattleMonNick
|
||
|
||
INCLUDE "engine/menu.asm"
|
||
|
||
UpdateItemDescription: ; 0x244c3
|
||
ld a, [MenuSelection]
|
||
ld [CurSpecies], a
|
||
hlcoord 0, 12
|
||
ld b, 4
|
||
ld c, SCREEN_WIDTH - 2
|
||
call TextBox
|
||
ld a, [MenuSelection]
|
||
cp -1
|
||
ret z
|
||
decoord 1, 14
|
||
callba PrintItemDescription
|
||
ret
|
||
|
||
INCLUDE "engine/pokepic.asm"
|
||
|
||
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
|
||
|
||
INCLUDE "engine/scrolling_menu.asm"
|
||
INCLUDE "engine/switch_items.asm"
|
||
|
||
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 Function3842
|
||
|
||
.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
|
||
|
||
INCLUDE "engine/mon_menu.asm"
|
||
INCLUDE "battle/menu.asm"
|
||
INCLUDE "engine/buy_sell_toss.asm"
|
||
INCLUDE "engine/trainer_card.asm"
|
||
INCLUDE "engine/prof_oaks_pc.asm"
|
||
INCLUDE "engine/decorations.asm"
|
||
|
||
PadCoords_de: ; 27092
|
||
ld a, d
|
||
add 4
|
||
ld d, a
|
||
ld a, e
|
||
add 4
|
||
ld e, a
|
||
call GetBlockLocation
|
||
ret
|
||
|
||
LevelUpHappinessMod: ; 2709e
|
||
ld a, [CurPartyMon]
|
||
ld hl, PartyMon1CaughtLocation
|
||
call GetPartyLocation
|
||
ld a, [hl]
|
||
and $7f
|
||
ld d, a
|
||
ld a, [MapGroup]
|
||
ld b, a
|
||
ld a, [MapNumber]
|
||
ld c, a
|
||
call GetWorldMapLocation
|
||
cp d
|
||
ld c, HAPPINESS_GAINLEVEL
|
||
jr nz, .ok
|
||
ld c, HAPPINESS_GAINLEVELATHOME
|
||
|
||
.ok
|
||
callab ChangeHappiness
|
||
ret
|
||
|
||
INCLUDE "trainers/dvs.asm"
|
||
|
||
_ReturnToBattle_UseBall: ; 2715c
|
||
call ClearBGPalettes
|
||
call ClearTileMap
|
||
ld a, [BattleType]
|
||
cp BATTLETYPE_TUTORIAL
|
||
jr z, .gettutorialbackpic
|
||
callba GetMonBackpic
|
||
jr .continue
|
||
|
||
.gettutorialbackpic
|
||
callba GetTrainerBackpic
|
||
.continue
|
||
callba GetMonFrontpic
|
||
callba _LoadBattleFontsHPBar
|
||
call GetMemSGBLayout
|
||
call CloseWindow
|
||
call LoadStandardMenuDataHeader
|
||
call WaitBGMap
|
||
jp SetPalettes
|
||
|
||
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
|
||
|
||
MoveEffectsPointers: ; 271f4
|
||
INCLUDE "battle/moves/move_effects_pointers.asm"
|
||
|
||
MoveEffects: ; 2732e
|
||
INCLUDE "battle/moves/move_effects.asm"
|
||
|
||
Kurt_SelectQuantity_InterpretJoypad: ; 27a28
|
||
call BuySellToss_InterpretJoypad
|
||
ld b, a
|
||
ret
|
||
|
||
SECTION "bankA", ROMX, BANK[$A]
|
||
|
||
INCLUDE "engine/link.asm"
|
||
|
||
Function29fe4: ; unreferenced
|
||
ld a, $0
|
||
call GetSRAMBank
|
||
ld d, $0
|
||
ld b, CHECK_FLAG
|
||
predef FlagPredef
|
||
call CloseSRAM
|
||
ld a, c
|
||
and a
|
||
ret
|
||
|
||
INCLUDE "engine/wildmons.asm"
|
||
|
||
DetermineLinkBattleResult: ; 2b930
|
||
callba UpdateEnemyMonInParty
|
||
ld hl, PartyMon1HP
|
||
call .CountMonsRemaining
|
||
push bc
|
||
ld hl, OTPartyMon1HP
|
||
call .CountMonsRemaining
|
||
ld a, c
|
||
pop bc
|
||
cp c
|
||
jr z, .even_number_of_mons_remaining
|
||
jr c, .defeat
|
||
jr .victory
|
||
|
||
.even_number_of_mons_remaining
|
||
call .BothSides_CheckNumberMonsAtFullHealth
|
||
jr z, .drawn
|
||
ld a, e
|
||
cp $1
|
||
jr z, .victory
|
||
cp $2
|
||
jr z, .defeat
|
||
ld hl, PartyMon1HP
|
||
call .CalcPercentHPRemaining
|
||
push de
|
||
ld hl, OTPartyMon1HP
|
||
call .CalcPercentHPRemaining
|
||
pop hl
|
||
ld a, d
|
||
cp h
|
||
jr c, .victory
|
||
jr z, .compare_lo
|
||
jr .defeat
|
||
|
||
.compare_lo
|
||
ld a, e
|
||
cp l
|
||
jr z, .drawn
|
||
jr nc, .defeat
|
||
|
||
.victory
|
||
ld a, [wBattleResult]
|
||
and $f0
|
||
ld [wBattleResult], a
|
||
ret
|
||
|
||
.defeat
|
||
ld a, [wBattleResult]
|
||
and $f0
|
||
add $1
|
||
ld [wBattleResult], a
|
||
ret
|
||
|
||
.drawn
|
||
ld a, [wBattleResult]
|
||
and $f0
|
||
add $2
|
||
ld [wBattleResult], a
|
||
ret
|
||
|
||
.CountMonsRemaining: ; 2b995
|
||
ld c, 0
|
||
ld b, 3
|
||
ld de, PARTYMON_STRUCT_LENGTH - 1
|
||
.loop
|
||
ld a, [hli]
|
||
or [hl]
|
||
jr nz, .not_fainted
|
||
inc c
|
||
|
||
.not_fainted
|
||
add hl, de
|
||
dec b
|
||
jr nz, .loop
|
||
ret
|
||
|
||
.CalcPercentHPRemaining: ; 2b9a6
|
||
ld de, 0
|
||
ld c, $3
|
||
.loop2
|
||
ld a, [hli]
|
||
or [hl]
|
||
jr z, .next
|
||
dec hl
|
||
xor a
|
||
ld [hDividend + 0], a
|
||
ld a, [hli]
|
||
ld [hDividend + 1], a
|
||
ld a, [hli]
|
||
ld [hDividend + 2], a
|
||
xor a
|
||
ld [hDividend + 3], a
|
||
ld a, [hli]
|
||
ld b, a
|
||
ld a, [hld]
|
||
srl b
|
||
rr a
|
||
srl b
|
||
rr a
|
||
ld [hDivisor], a
|
||
ld b, $4
|
||
call Divide
|
||
ld a, [hQuotient + 2]
|
||
add e
|
||
ld e, a
|
||
ld a, [hQuotient + 1]
|
||
adc d
|
||
ld d, a
|
||
dec hl
|
||
|
||
.next
|
||
push de
|
||
ld de, $2f
|
||
add hl, de
|
||
pop de
|
||
dec c
|
||
jr nz, .loop2
|
||
ret
|
||
|
||
.BothSides_CheckNumberMonsAtFullHealth: ; 2b9e1
|
||
ld hl, PartyMon1HP
|
||
call .CheckFaintedOrFullHealth
|
||
jr nz, .finish ; we have a pokemon that's neither fainted nor at full health
|
||
ld hl, OTPartyMon1HP
|
||
call .CheckFaintedOrFullHealth
|
||
ld e, $1
|
||
ret
|
||
|
||
.finish
|
||
ld hl, OTPartyMon1HP
|
||
call .CheckFaintedOrFullHealth
|
||
ld e, $0
|
||
ret nz ; we both have pokemon that are neither fainted nor at full health
|
||
ld e, $2
|
||
ld a, $1
|
||
and a
|
||
ret
|
||
|
||
.CheckFaintedOrFullHealth: ; 2ba01
|
||
ld d, 3
|
||
.loop3
|
||
ld a, [hli]
|
||
ld b, a
|
||
ld a, [hli]
|
||
ld c, a
|
||
or b
|
||
jr z, .fainted_or_full_health
|
||
ld a, [hli]
|
||
cp b
|
||
ret nz
|
||
ld a, [hld]
|
||
cp c
|
||
ret nz
|
||
|
||
.fainted_or_full_health
|
||
push de
|
||
ld de, PARTYMON_STRUCT_LENGTH - 2
|
||
add hl, de
|
||
pop de
|
||
dec d
|
||
jr nz, .loop3
|
||
ret
|
||
|
||
ChrisBackpic: ; 2ba1a
|
||
INCBIN "gfx/misc/player.6x6.2bpp.lz"
|
||
|
||
DudeBackpic: ; 2bbaa
|
||
INCBIN "gfx/misc/dude.6x6.2bpp.lz"
|
||
|
||
SECTION "bankB", ROMX, BANK[$B]
|
||
|
||
INCLUDE "battle/trainer_huds.asm"
|
||
|
||
TrainerClassNames:: ; 2c1ef
|
||
INCLUDE "text/trainer_class_names.asm"
|
||
|
||
INCLUDE "battle/ai/redundant.asm"
|
||
|
||
INCLUDE "event/move_deleter.asm"
|
||
|
||
INCLUDE "engine/mysterygift2.asm"
|
||
|
||
INCLUDE "engine/tmhm2.asm"
|
||
|
||
MoveDescriptions:: ; 2cb52
|
||
INCLUDE "battle/moves/move_descriptions.asm"
|
||
|
||
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
|
||
|
||
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
|
||
|
||
FindFirstAliveMon: ; 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
|
||
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 4 ; 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
|
||
rept 3
|
||
ld [hli], a
|
||
endr
|
||
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
|
||
|
||
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
|
||
|
||
SECTION "Tileset Data 4", ROMX, BANK[TILESETS_4]
|
||
|
||
INCLUDE "tilesets/data_4.asm"
|
||
|
||
SECTION "Effect Commands", ROMX, BANK[$D]
|
||
|
||
INCLUDE "battle/effect_commands.asm"
|
||
|
||
SECTION "Enemy Trainers", ROMX, BANK[$E]
|
||
|
||
INCLUDE "battle/ai/items.asm"
|
||
|
||
AIScoring: ; 38591
|
||
INCLUDE "battle/ai/scoring.asm"
|
||
|
||
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
|
||
|
||
INCLUDE "trainers/attributes.asm"
|
||
|
||
INCLUDE "trainers/read_party.asm"
|
||
|
||
INCLUDE "trainers/trainer_pointers.asm"
|
||
|
||
INCLUDE "trainers/trainers.asm"
|
||
|
||
SECTION "Battle Core", ROMX, BANK[$F]
|
||
|
||
INCLUDE "battle/core.asm"
|
||
|
||
INCLUDE "battle/effect_command_pointers.asm"
|
||
|
||
SECTION "bank10", ROMX, BANK[$10]
|
||
|
||
INCLUDE "engine/pokedex.asm"
|
||
|
||
INCLUDE "battle/moves/moves.asm"
|
||
|
||
INCLUDE "engine/evolve.asm"
|
||
|
||
SECTION "bank11", ROMX, BANK[$11]
|
||
|
||
INCLUDE "engine/fruit_trees.asm"
|
||
|
||
INCLUDE "battle/ai/move.asm"
|
||
|
||
AnimateDexSearchSlowpoke: ; 441cf
|
||
ld hl, .FrameIDs
|
||
ld b, 25
|
||
.loop
|
||
ld a, [hli]
|
||
|
||
; Wrap around
|
||
cp $fe
|
||
jr nz, .ok
|
||
ld hl, .FrameIDs
|
||
ld a, [hli]
|
||
.ok
|
||
|
||
ld [wDexSearchSlowpokeFrame], a
|
||
ld a, [hli]
|
||
ld c, a
|
||
push bc
|
||
push hl
|
||
call DoDexSearchSlowpokeFrame
|
||
pop hl
|
||
pop bc
|
||
call DelayFrames
|
||
dec b
|
||
jr nz, .loop
|
||
xor a
|
||
ld [wDexSearchSlowpokeFrame], a
|
||
call DoDexSearchSlowpokeFrame
|
||
ld c, 32
|
||
call DelayFrames
|
||
ret
|
||
|
||
.FrameIDs: ; 441fc
|
||
; frame ID, duration
|
||
db 0, 7
|
||
db 1, 7
|
||
db 2, 7
|
||
db 3, 7
|
||
db 4, 7
|
||
db -2
|
||
|
||
DoDexSearchSlowpokeFrame: ; 44207
|
||
ld a, [wDexSearchSlowpokeFrame]
|
||
ld hl, .SpriteData
|
||
ld de, Sprites
|
||
.loop
|
||
ld a, [hli]
|
||
cp -1
|
||
ret z
|
||
ld [de], a
|
||
inc de
|
||
ld a, [hli]
|
||
ld [de], a
|
||
inc de
|
||
ld a, [wDexSearchSlowpokeFrame]
|
||
ld b, a
|
||
add a
|
||
add b
|
||
add [hl]
|
||
inc hl
|
||
ld [de], a
|
||
inc de
|
||
ld a, [hli]
|
||
ld [de], a
|
||
inc de
|
||
jr .loop
|
||
|
||
.SpriteData: ; 44228
|
||
dsprite 11, 0, 9, 0, $00, $00
|
||
dsprite 11, 0, 10, 0, $01, $00
|
||
dsprite 11, 0, 11, 0, $02, $00
|
||
dsprite 12, 0, 9, 0, $10, $00
|
||
dsprite 12, 0, 10, 0, $11, $00
|
||
dsprite 12, 0, 11, 0, $12, $00
|
||
dsprite 13, 0, 9, 0, $20, $00
|
||
dsprite 13, 0, 10, 0, $21, $00
|
||
dsprite 13, 0, 11, 0, $22, $00
|
||
db -1
|
||
|
||
DisplayDexEntry: ; 4424d
|
||
call GetPokemonName
|
||
hlcoord 9, 3
|
||
call PlaceString ; mon species
|
||
ld a, [wd265]
|
||
ld b, a
|
||
call GetDexEntryPointer
|
||
ld a, b
|
||
push af
|
||
hlcoord 9, 5
|
||
call FarString ; dex species
|
||
ld h, b
|
||
ld l, c
|
||
push de
|
||
; Print dex number
|
||
hlcoord 2, 8
|
||
ld a, $5c ; No
|
||
ld [hli], a
|
||
ld a, $5d ; .
|
||
ld [hli], a
|
||
ld de, wd265
|
||
lb bc, PRINTNUM_LEADINGZEROS | 1, 3
|
||
call PrintNum
|
||
; Check to see if we caught it. Get out of here if we haven't.
|
||
ld a, [wd265]
|
||
dec a
|
||
call CheckCaughtMon
|
||
pop hl
|
||
pop bc
|
||
ret z
|
||
; Get the height of the Pokemon.
|
||
ld a, [CurPartySpecies]
|
||
ld [CurSpecies], a
|
||
inc hl
|
||
ld a, b
|
||
push af
|
||
push hl
|
||
call GetFarHalfword
|
||
ld d, l
|
||
ld e, h
|
||
pop hl
|
||
inc hl
|
||
inc hl
|
||
ld a, d
|
||
or e
|
||
jr z, .skip_height
|
||
push hl
|
||
push de
|
||
ld hl, [sp+$0]
|
||
ld d, h
|
||
ld e, l
|
||
hlcoord 12, 7
|
||
lb bc, 2, PRINTNUM_MONEY | 4
|
||
call PrintNum
|
||
hlcoord 14, 7
|
||
ld [hl], $5e ; ft symbol
|
||
pop af
|
||
pop hl
|
||
|
||
.skip_height
|
||
pop af
|
||
push af
|
||
inc hl
|
||
push hl
|
||
dec hl
|
||
call GetFarHalfword
|
||
ld d, l
|
||
ld e, h
|
||
ld a, e
|
||
or d
|
||
jr z, .skip_weight
|
||
push de
|
||
ld hl, [sp+$0]
|
||
ld d, h
|
||
ld e, l
|
||
hlcoord 11, 9
|
||
lb bc, 2, PRINTNUM_RIGHTALIGN | 5
|
||
call PrintNum
|
||
pop de
|
||
|
||
.skip_weight
|
||
; Page 1
|
||
lb bc, 5, SCREEN_WIDTH - 2
|
||
hlcoord 2, 11
|
||
call ClearBox
|
||
hlcoord 1, 10
|
||
ld bc, SCREEN_WIDTH - 1
|
||
ld a, $61 ; horizontal divider
|
||
call ByteFill
|
||
; page number
|
||
hlcoord 1, 9
|
||
ld [hl], $55
|
||
inc hl
|
||
ld [hl], $55
|
||
hlcoord 1, 10
|
||
ld [hl], $56 ; P.
|
||
inc hl
|
||
ld [hl], $57 ; 1
|
||
pop de
|
||
inc de
|
||
pop af
|
||
hlcoord 2, 11
|
||
push af
|
||
call FarString
|
||
pop bc
|
||
ld a, [wPokedexStatus]
|
||
or a
|
||
ret z
|
||
|
||
; Page 2
|
||
push bc
|
||
push de
|
||
lb bc, 5, SCREEN_WIDTH - 2
|
||
hlcoord 2, 11
|
||
call ClearBox
|
||
hlcoord 1, 10
|
||
ld bc, SCREEN_WIDTH - 1
|
||
ld a, $61
|
||
call ByteFill
|
||
; page number
|
||
hlcoord 1, 9
|
||
ld [hl], $55
|
||
inc hl
|
||
ld [hl], $55
|
||
hlcoord 1, 10
|
||
ld [hl], $56 ; P.
|
||
inc hl
|
||
ld [hl], $58 ; 2
|
||
pop de
|
||
inc de
|
||
pop af
|
||
hlcoord 2, 11
|
||
call FarString
|
||
ret
|
||
|
||
String_44331: ; 44331
|
||
db "#@"
|
||
|
||
GetDexEntryPointer: ; 44333
|
||
; return dex entry pointer b:de
|
||
push hl
|
||
ld hl, PokedexDataPointerTable
|
||
ld a, b
|
||
dec a
|
||
ld d, 0
|
||
ld e, a
|
||
add hl, de
|
||
add hl, de
|
||
ld e, [hl]
|
||
inc hl
|
||
ld d, [hl]
|
||
push de
|
||
rlca
|
||
rlca
|
||
and $3
|
||
ld hl, .PokedexEntryBanks
|
||
ld d, 0
|
||
ld e, a
|
||
add hl, de
|
||
ld b, [hl]
|
||
pop de
|
||
pop hl
|
||
ret
|
||
|
||
.PokedexEntryBanks: ; 44351
|
||
|
||
GLOBAL PokedexEntries1
|
||
GLOBAL PokedexEntries2
|
||
GLOBAL PokedexEntries3
|
||
GLOBAL PokedexEntries4
|
||
|
||
db BANK(PokedexEntries1)
|
||
db BANK(PokedexEntries2)
|
||
db BANK(PokedexEntries3)
|
||
db BANK(PokedexEntries4)
|
||
|
||
GetDexEntryPagePointer: ; 44355
|
||
call GetDexEntryPointer ; b:de
|
||
push hl
|
||
ld h, d
|
||
ld l, e
|
||
; skip species name
|
||
.loop1
|
||
ld a, b
|
||
call GetFarByte
|
||
inc hl
|
||
cp "@"
|
||
jr nz, .loop1
|
||
; skip height and weight
|
||
rept 4
|
||
inc hl
|
||
endr
|
||
; if c != 1: skip entry
|
||
dec c
|
||
jr z, .done
|
||
; skip entry
|
||
.loop2
|
||
ld a, b
|
||
call GetFarByte
|
||
inc hl
|
||
cp "@"
|
||
jr nz, .loop2
|
||
|
||
.done
|
||
ld d, h
|
||
ld e, l
|
||
pop hl
|
||
ret
|
||
|
||
PokedexDataPointerTable: ; 0x44378
|
||
INCLUDE "data/pokedex/entry_pointers.asm"
|
||
|
||
INCLUDE "engine/mail.asm"
|
||
|
||
SECTION "Crystal Unique", ROMX, BANK[$12]
|
||
|
||
INCLUDE "engine/init_gender.asm"
|
||
|
||
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/misc/pack_f.2bpp"
|
||
|
||
Special_MoveTutor: ; 4925b
|
||
call FadeToMenu
|
||
call ClearBGPalettes
|
||
call ClearScreen
|
||
call DelayFrame
|
||
ld b, SCGB_PACKPALS
|
||
call GetSGBLayout
|
||
xor a
|
||
ld [wItemAttributeParamBuffer], a
|
||
call .GetMoveTutorMove
|
||
ld [wd265], a
|
||
ld [wPutativeTMHMMove], a
|
||
call GetMoveName
|
||
call CopyName1
|
||
callba ChooseMonToLearnTMHM
|
||
jr c, .cancel
|
||
jr .enter_loop
|
||
|
||
.loop
|
||
callba ChooseMonToLearnTMHM_NoRefresh
|
||
jr c, .cancel
|
||
.enter_loop
|
||
call CheckCanLearnMoveTutorMove
|
||
jr nc, .loop
|
||
xor a
|
||
ld [ScriptVar], a
|
||
jr .quit
|
||
|
||
.cancel
|
||
ld a, -1
|
||
ld [ScriptVar], a
|
||
.quit
|
||
call CloseSubmenu
|
||
ret
|
||
|
||
.GetMoveTutorMove: ; 492a5
|
||
ld a, [ScriptVar]
|
||
cp 1
|
||
jr z, .flamethrower
|
||
cp 2
|
||
jr z, .thunderbolt
|
||
ld a, ICE_BEAM
|
||
ret
|
||
|
||
.flamethrower
|
||
ld a, FLAMETHROWER
|
||
ret
|
||
|
||
.thunderbolt
|
||
ld a, THUNDERBOLT
|
||
ret
|
||
|
||
CheckCanLearnMoveTutorMove: ; 492b9
|
||
ld hl, .MenuDataHeader
|
||
call LoadMenuDataHeader
|
||
|
||
predef CanLearnTMHMMove
|
||
|
||
push bc
|
||
ld a, [CurPartyMon]
|
||
ld hl, PartyMonNicknames
|
||
call GetNick
|
||
pop bc
|
||
|
||
ld a, c
|
||
and a
|
||
jr nz, .can_learn
|
||
push de
|
||
ld de, SFX_WRONG
|
||
call PlaySFX
|
||
pop de
|
||
ld a, BANK(Text_TMHMNotCompatible)
|
||
ld hl, Text_TMHMNotCompatible
|
||
call FarPrintText
|
||
jr .didnt_learn
|
||
|
||
.can_learn
|
||
callab KnowsMove
|
||
jr c, .didnt_learn
|
||
|
||
predef LearnMove
|
||
ld a, b
|
||
and a
|
||
jr z, .didnt_learn
|
||
|
||
ld c, HAPPINESS_LEARNMOVE
|
||
callab ChangeHappiness
|
||
jr .learned
|
||
|
||
.didnt_learn
|
||
call ExitMenu
|
||
and a
|
||
ret
|
||
|
||
.learned
|
||
call ExitMenu
|
||
scf
|
||
ret
|
||
|
||
.MenuDataHeader: ; 0x4930a
|
||
db $40 ; flags
|
||
db 12, 00 ; start coords
|
||
db 17, 19 ; end coords
|
||
|
||
INCLUDE "predef/crystal.asm"
|
||
|
||
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
|
||
|
||
INCLUDE "event/celebi.asm"
|
||
INCLUDE "engine/main_menu.asm"
|
||
INCLUDE "misc/mobile_menu.asm"
|
||
INCLUDE "engine/search.asm"
|
||
INCLUDE "misc/mobile_12_2.asm"
|
||
; mobile battle selection
|
||
|
||
AskRememberPassword: ; 4ae12
|
||
call .DoMenu
|
||
ld a, $0
|
||
jr c, .okay
|
||
ld a, $1
|
||
|
||
.okay
|
||
ld [ScriptVar], a
|
||
ret
|
||
|
||
.DoMenu: ; 4ae1f
|
||
lb bc, 14, 7
|
||
push bc
|
||
ld hl, YesNoMenuDataHeader
|
||
call CopyMenuDataHeader
|
||
pop bc
|
||
ld a, b
|
||
ld [wMenuBorderLeftCoord], a
|
||
add $5
|
||
ld [wMenuBorderRightCoord], a
|
||
ld a, c
|
||
ld [wMenuBorderTopCoord], a
|
||
add $4
|
||
ld [wMenuBorderBottomCoord], a
|
||
call PushWindow
|
||
call VerticalMenu
|
||
push af
|
||
ld c, 15
|
||
call DelayFrames
|
||
call Buena_ExitMenu
|
||
pop af
|
||
jr c, .refused
|
||
ld a, [wMenuCursorY]
|
||
cp $2
|
||
jr z, .refused
|
||
and a
|
||
ret
|
||
|
||
.refused
|
||
ld a, $2
|
||
ld [wMenuCursorY], a
|
||
scf
|
||
ret
|
||
|
||
Buena_ExitMenu: ; 4ae5e
|
||
ld a, [hOAMUpdate]
|
||
push af
|
||
call ExitMenu
|
||
call UpdateSprites
|
||
xor a
|
||
ld [hOAMUpdate], a
|
||
call DelayFrame
|
||
ld a, $1
|
||
ld [hOAMUpdate], a
|
||
call ApplyTilemap
|
||
pop af
|
||
ld [hOAMUpdate], a
|
||
ret
|
||
|
||
SECTION "bank13", ROMX, BANK[$13]
|
||
|
||
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
|
||
|
||
INCLUDE "tilesets/palette_maps.asm"
|
||
|
||
TileCollisionTable:: ; 4ce1f
|
||
INCLUDE "tilesets/collision.asm"
|
||
|
||
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
|
||
|
||
SaveMenu_LoadEDTile: ; 4cf45 (13:4f45)
|
||
ld a, [hCGB]
|
||
and a
|
||
jp z, WaitBGMap
|
||
|
||
; The following is a modified version of Function3246.
|
||
ld a, [hBGMapMode]
|
||
push af
|
||
xor a
|
||
ld [hBGMapMode], a
|
||
ld a, [hMapAnims]
|
||
push af
|
||
xor a
|
||
ld [hMapAnims], a
|
||
.WaitLY
|
||
ld a, [rLY]
|
||
cp $60
|
||
jr c, .WaitLY
|
||
|
||
di
|
||
ld a, 1 ; BANK(VBGMap2)
|
||
ld [rVBK], a
|
||
hlcoord 0, 0, AttrMap
|
||
call .LoadEDTile
|
||
ld a, 0 ; BANK(VBGMap0)
|
||
ld [rVBK], a
|
||
hlcoord 0, 0
|
||
call .LoadEDTile
|
||
.WaitLY2
|
||
ld a, [rLY]
|
||
cp $60
|
||
jr c, .WaitLY2
|
||
ei
|
||
|
||
pop af
|
||
ld [hMapAnims], a
|
||
pop af
|
||
ld [hBGMapMode], a
|
||
ret
|
||
|
||
.LoadEDTile: ; 4cf80 (13:4f80)
|
||
ld [hSPBuffer], sp ; $ffd9
|
||
ld sp, hl
|
||
ld a, [hBGMapAddress + 1]
|
||
ld h, a
|
||
ld l, 0
|
||
ld a, SCREEN_HEIGHT
|
||
ld [hTilesPerCycle], a
|
||
ld b, 1 << 1
|
||
ld c, rSTAT % $100
|
||
|
||
.loop
|
||
rept SCREEN_WIDTH / 2
|
||
pop de
|
||
.loop\@
|
||
ld a, [$ff00+c]
|
||
and b
|
||
jr nz, .loop\@
|
||
ld [hl], e
|
||
inc l
|
||
ld [hl], d
|
||
inc l
|
||
endr
|
||
|
||
ld de, $20 - SCREEN_WIDTH
|
||
add hl, de
|
||
ld a, [hTilesPerCycle]
|
||
dec a
|
||
ld [hTilesPerCycle], a
|
||
jr nz, .loop
|
||
|
||
ld a, [hSPBuffer]
|
||
ld l, a
|
||
ld a, [hSPBuffer + 1]
|
||
ld h, a
|
||
ld sp, hl
|
||
ret
|
||
|
||
CheckSave:: ; 4cffe
|
||
ld a, BANK(s1_a008)
|
||
call GetSRAMBank
|
||
ld a, [s1_a008]
|
||
ld b, a
|
||
ld a, [s1_ad0f]
|
||
ld c, a
|
||
call CloseSRAM
|
||
ld a, b
|
||
cp 99
|
||
jr nz, .ok
|
||
ld a, c
|
||
cp " "
|
||
jr nz, .ok
|
||
ld c, $1
|
||
ret
|
||
|
||
.ok
|
||
ld c, $0
|
||
ret
|
||
|
||
INCLUDE "engine/map_triggers.asm"
|
||
|
||
_LoadMapPart:: ; 4d15b
|
||
ld hl, wMisc
|
||
ld a, [wMetatileStandingY]
|
||
and a
|
||
jr z, .top_row
|
||
ld bc, WMISC_WIDTH * 2
|
||
add hl, bc
|
||
|
||
.top_row
|
||
ld a, [wMetatileStandingX]
|
||
and a
|
||
jr z, .left_column
|
||
inc hl
|
||
inc hl
|
||
|
||
.left_column
|
||
decoord 0, 0
|
||
ld b, SCREEN_HEIGHT
|
||
.loop
|
||
ld c, SCREEN_WIDTH
|
||
.loop2
|
||
ld a, [hli]
|
||
ld [de], a
|
||
inc de
|
||
dec c
|
||
jr nz, .loop2
|
||
ld a, l
|
||
add 4
|
||
ld l, a
|
||
jr nc, .carry
|
||
inc h
|
||
|
||
.carry
|
||
dec b
|
||
jr nz, .loop
|
||
ret
|
||
|
||
PhoneRing_LoadEDTile: ; 4d188
|
||
ld a, [hCGB]
|
||
and a
|
||
jp z, WaitBGMap
|
||
ld a, [wSpriteUpdatesEnabled]
|
||
cp $0
|
||
jp z, WaitBGMap
|
||
|
||
; What follows is a modified version of Function3246 (LoadEDTile).
|
||
ld a, [hBGMapMode]
|
||
push af
|
||
xor a
|
||
ld [hBGMapMode], a
|
||
ld a, [hMapAnims]
|
||
push af
|
||
xor a
|
||
ld [hMapAnims], a
|
||
.wait
|
||
ld a, [rLY]
|
||
cp $8f
|
||
jr c, .wait
|
||
|
||
di
|
||
ld a, 1 ; BANK(VBGMap2)
|
||
ld [rVBK], a
|
||
hlcoord 0, 0, AttrMap
|
||
call .LoadEDTile
|
||
ld a, 0 ; BANK(VBGMap0)
|
||
ld [rVBK], a
|
||
hlcoord 0, 0
|
||
call .LoadEDTile
|
||
.wait2
|
||
ld a, [rLY]
|
||
cp $8f
|
||
jr c, .wait2
|
||
ei
|
||
|
||
pop af
|
||
ld [hMapAnims], a
|
||
pop af
|
||
ld [hBGMapMode], a
|
||
ret
|
||
|
||
.LoadEDTile: ; 4d1cb
|
||
ld [hSPBuffer], sp
|
||
ld sp, hl
|
||
ld a, [hBGMapAddress + 1]
|
||
ld h, a
|
||
ld l, 0
|
||
ld a, SCREEN_HEIGHT
|
||
ld [hTilesPerCycle], a
|
||
ld b, 1 << 1 ; not in v/hblank
|
||
ld c, rSTAT % $100
|
||
|
||
.loop
|
||
rept SCREEN_WIDTH / 2
|
||
pop de
|
||
.loop\@
|
||
ld a, [$ff00+c]
|
||
and b
|
||
jr nz, .loop\@
|
||
ld [hl], e
|
||
inc l
|
||
ld [hl], d
|
||
inc l
|
||
endr
|
||
|
||
ld de, $20 - SCREEN_WIDTH
|
||
add hl, de
|
||
ld a, [hTilesPerCycle]
|
||
dec a
|
||
ld [hTilesPerCycle], a
|
||
jr nz, .loop
|
||
|
||
ld a, [hSPBuffer]
|
||
ld l, a
|
||
ld a, [hSPBuffer + 1]
|
||
ld h, a
|
||
ld sp, hl
|
||
ret
|
||
|
||
Shrink1Pic: ; 4d249
|
||
INCBIN "gfx/shrink1.2bpp.lz"
|
||
|
||
Shrink2Pic: ; 4d2d9
|
||
INCBIN "gfx/shrink2.2bpp.lz"
|
||
|
||
LinkMonStatsScreen: ; 4d319
|
||
ld a, [wMenuCursorY]
|
||
dec a
|
||
ld [CurPartyMon], a
|
||
call LowVolume
|
||
predef StatsScreenInit
|
||
ld a, [CurPartyMon]
|
||
inc a
|
||
ld [wMenuCursorY], a
|
||
call ClearScreen
|
||
call ClearBGPalettes
|
||
call MaxVolume
|
||
callba LoadTradeScreenBorder
|
||
callba Link_WaitBGMap
|
||
callba InitTradeSpeciesList
|
||
callba Function28eff
|
||
call WaitBGMap2
|
||
ret
|
||
|
||
Link_WaitBGMap: ; 4d354
|
||
call WaitBGMap
|
||
call WaitBGMap2
|
||
ret
|
||
|
||
LinkTextbox2: ; 4d35b
|
||
ld h, d
|
||
ld l, e
|
||
push bc
|
||
push hl
|
||
call .PlaceBorder
|
||
pop hl
|
||
pop bc
|
||
ld de, AttrMap - TileMap
|
||
add hl, de
|
||
inc b
|
||
inc b
|
||
inc c
|
||
inc c
|
||
ld a, $7
|
||
.row
|
||
push bc
|
||
push hl
|
||
.col
|
||
ld [hli], a
|
||
dec c
|
||
jr nz, .col
|
||
pop hl
|
||
ld de, SCREEN_WIDTH
|
||
add hl, de
|
||
pop bc
|
||
dec b
|
||
jr nz, .row
|
||
ret
|
||
|
||
.PlaceBorder: ; 4d37e
|
||
push hl
|
||
ld a, $76
|
||
ld [hli], a
|
||
inc a
|
||
call .PlaceRow
|
||
inc a
|
||
ld [hl], a
|
||
pop hl
|
||
ld de, SCREEN_WIDTH
|
||
add hl, de
|
||
.loop
|
||
push hl
|
||
ld a, "┌"
|
||
ld [hli], a
|
||
ld a, " "
|
||
call .PlaceRow
|
||
ld [hl], "─"
|
||
pop hl
|
||
ld de, SCREEN_WIDTH
|
||
add hl, de
|
||
dec b
|
||
jr nz, .loop
|
||
ld a, "┐"
|
||
ld [hli], a
|
||
ld a, "│"
|
||
call .PlaceRow
|
||
ld [hl], "└"
|
||
ret
|
||
|
||
.PlaceRow: ; 4d3ab
|
||
ld d, c
|
||
.row_loop
|
||
ld [hli], a
|
||
dec d
|
||
jr nz, .row_loop
|
||
ret
|
||
|
||
_ResetClock: ; 4d3b1
|
||
callba BlankScreen
|
||
ld b, SCGB_08
|
||
call GetSGBLayout
|
||
call LoadStandardFont
|
||
call LoadFontsExtra
|
||
ld de, MUSIC_MAIN_MENU
|
||
call PlayMusic
|
||
ld hl, .text_askreset
|
||
call PrintText
|
||
ld hl, .NoYes_MenuDataHeader
|
||
call CopyMenuDataHeader
|
||
call VerticalMenu
|
||
ret c
|
||
ld a, [wMenuCursorY]
|
||
cp $1
|
||
ret z
|
||
call ClockResetPassword
|
||
jr c, .wrongpassword
|
||
ld a, BANK(sRTCStatusFlags)
|
||
call GetSRAMBank
|
||
ld a, $80
|
||
ld [sRTCStatusFlags], a
|
||
call CloseSRAM
|
||
ld hl, .text_okay
|
||
call PrintText
|
||
ret
|
||
|
||
.wrongpassword
|
||
ld hl, .text_wrong
|
||
call PrintText
|
||
ret
|
||
|
||
.text_okay: ; 0x4d3fe
|
||
; Password OK. Select CONTINUE & reset settings.
|
||
text_jump UnknownText_0x1c55db
|
||
db "@"
|
||
|
||
.text_wrong: ; 0x4d403
|
||
; Wrong password!
|
||
text_jump UnknownText_0x1c560b
|
||
db "@"
|
||
|
||
.text_askreset: ; 0x4d408
|
||
; Reset the clock?
|
||
text_jump UnknownText_0x1c561c
|
||
db "@"
|
||
|
||
.NoYes_MenuDataHeader: ; 0x4d40d
|
||
db $00 ; flags
|
||
db 07, 14 ; start coords
|
||
db 11, 19 ; end coords
|
||
dw .NoYes_MenuData2
|
||
db 1 ; default option
|
||
|
||
.NoYes_MenuData2: ; 0x4d415
|
||
db $c0 ; flags
|
||
db 2 ; items
|
||
db "NO@"
|
||
db "YES@"
|
||
|
||
ClockResetPassword: ; 4d41e
|
||
call .CalculatePassword
|
||
push de
|
||
ld hl, StringBuffer2
|
||
ld bc, 5
|
||
xor a
|
||
call ByteFill
|
||
ld a, $4
|
||
ld [StringBuffer2 + 5], a
|
||
ld hl, .pleaseenterpasswordtext
|
||
call PrintText
|
||
.loop
|
||
call .updateIDdisplay
|
||
.loop2
|
||
call JoyTextDelay
|
||
ld a, [hJoyLast]
|
||
ld b, a
|
||
and A_BUTTON
|
||
jr nz, .confirm
|
||
ld a, b
|
||
and D_PAD
|
||
jr z, .loop2
|
||
call .dpadinput
|
||
ld c, 3
|
||
call DelayFrames
|
||
jr .loop
|
||
|
||
.confirm
|
||
call .ConvertDecIDToBytes
|
||
pop de
|
||
ld a, e
|
||
cp l
|
||
jr nz, .nope
|
||
ld a, d
|
||
cp h
|
||
jr nz, .nope
|
||
and a
|
||
ret
|
||
|
||
.nope
|
||
scf
|
||
ret
|
||
|
||
.pleaseenterpasswordtext: ; 0x4d463
|
||
; Please enter the password.
|
||
text_jump UnknownText_0x1c562e
|
||
db "@"
|
||
|
||
.updateIDdisplay: ; 4d468
|
||
hlcoord 14, 15
|
||
ld de, StringBuffer2
|
||
ld c, 5
|
||
.loop3
|
||
ld a, [de]
|
||
add "0"
|
||
ld [hli], a
|
||
inc de
|
||
dec c
|
||
jr nz, .loop3
|
||
hlcoord 14, 16
|
||
ld bc, 5
|
||
ld a, " "
|
||
call ByteFill
|
||
hlcoord 14, 16
|
||
ld a, [StringBuffer2 + 5]
|
||
ld e, a
|
||
ld d, $0
|
||
add hl, de
|
||
ld [hl], $61
|
||
ret
|
||
|
||
.dpadinput: ; 4d490
|
||
ld a, b
|
||
and D_LEFT
|
||
jr nz, .left
|
||
ld a, b
|
||
and D_RIGHT
|
||
jr nz, .right
|
||
ld a, b
|
||
and D_UP
|
||
jr nz, .up
|
||
ld a, b
|
||
and D_DOWN
|
||
jr nz, .down
|
||
ret
|
||
|
||
.left
|
||
ld a, [StringBuffer2 + 5]
|
||
and a
|
||
ret z
|
||
dec a
|
||
ld [StringBuffer2 + 5], a
|
||
ret
|
||
|
||
.right
|
||
ld a, [StringBuffer2 + 5]
|
||
cp $4
|
||
ret z
|
||
inc a
|
||
ld [StringBuffer2 + 5], a
|
||
ret
|
||
|
||
.up
|
||
call .getcurrentdigit
|
||
ld a, [hl]
|
||
cp 9
|
||
jr z, .wraparound_up
|
||
inc a
|
||
ld [hl], a
|
||
ret
|
||
|
||
.wraparound_up
|
||
ld [hl], $0
|
||
ret
|
||
|
||
.down
|
||
call .getcurrentdigit
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .wraparound_down
|
||
dec a
|
||
ld [hl], a
|
||
ret
|
||
|
||
.wraparound_down
|
||
ld [hl], 9
|
||
ret
|
||
|
||
.getcurrentdigit: ; 4d4d5
|
||
ld a, [StringBuffer2 + 5]
|
||
ld e, a
|
||
ld d, $0
|
||
ld hl, StringBuffer2
|
||
add hl, de
|
||
ret
|
||
|
||
.ConvertDecIDToBytes: ; 4d4e0
|
||
ld hl, 0
|
||
ld de, StringBuffer2 + 4
|
||
ld bc, 1
|
||
call .ConvertToBytes
|
||
ld bc, 10
|
||
call .ConvertToBytes
|
||
ld bc, 100
|
||
call .ConvertToBytes
|
||
ld bc, 1000
|
||
call .ConvertToBytes
|
||
ld bc, 10000
|
||
.ConvertToBytes: ; 4d501
|
||
ld a, [de]
|
||
dec de
|
||
push hl
|
||
ld hl, 0
|
||
call AddNTimes
|
||
ld c, l
|
||
ld b, h
|
||
pop hl
|
||
add hl, bc
|
||
ret
|
||
|
||
.CalculatePassword: ; 4d50f
|
||
ld a, BANK(sPlayerData)
|
||
call GetSRAMBank
|
||
ld de, 0
|
||
ld hl, sPlayerData + (PlayerID - wPlayerData)
|
||
ld c, $2
|
||
call .ComponentFromNumber
|
||
ld hl, sPlayerData + (PlayerName - wPlayerData)
|
||
ld c, $5 ; PLAYER_NAME_LENGTH_J
|
||
call .ComponentFromString
|
||
ld hl, sPlayerData + (Money - wPlayerData)
|
||
ld c, $3
|
||
call .ComponentFromNumber
|
||
call CloseSRAM
|
||
ret
|
||
|
||
.ComponentFromNumber: ; 4d533
|
||
ld a, [hli]
|
||
add e
|
||
ld e, a
|
||
ld a, $0
|
||
adc d
|
||
ld d, a
|
||
dec c
|
||
jr nz, .ComponentFromNumber
|
||
ret
|
||
|
||
.ComponentFromString: ; 4d53e
|
||
ld a, [hli]
|
||
cp "@"
|
||
ret z
|
||
add e
|
||
ld e, a
|
||
ld a, $0
|
||
adc d
|
||
ld d, a
|
||
dec c
|
||
jr nz, .ComponentFromString
|
||
ret
|
||
|
||
_DeleteSaveData: ; 4d54c
|
||
callba BlankScreen
|
||
ld b, SCGB_08
|
||
call GetSGBLayout
|
||
call LoadStandardFont
|
||
call LoadFontsExtra
|
||
ld de, MUSIC_MAIN_MENU
|
||
call PlayMusic
|
||
ld hl, .Text_ClearAllSaveData
|
||
call PrintText
|
||
ld hl, .NoYesMenuDataHeader
|
||
call CopyMenuDataHeader
|
||
call VerticalMenu
|
||
ret c
|
||
ld a, [wMenuCursorY]
|
||
cp $1
|
||
ret z
|
||
callba EmptyAllSRAMBanks
|
||
ret
|
||
|
||
.Text_ClearAllSaveData: ; 0x4d580
|
||
; Clear all save data?
|
||
text_jump UnknownText_0x1c564a
|
||
db "@"
|
||
|
||
.NoYesMenuDataHeader: ; 0x4d585
|
||
db $00 ; flags
|
||
db 07, 14 ; start coords
|
||
db 11, 19 ; end coords
|
||
dw .MenuData2
|
||
db 1 ; default option
|
||
|
||
.MenuData2: ; 0x4d58d
|
||
db $c0 ; flags
|
||
db 2 ; items
|
||
db "NO@"
|
||
db "YES@"
|
||
|
||
Tilesets::
|
||
INCLUDE "tilesets/tileset_headers.asm"
|
||
|
||
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
|
||
|
||
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 Function29549
|
||
ld a, [wOTTrademonSpecies]
|
||
ld [CurPartySpecies], a
|
||
ld a, [wOTTrademonDVs]
|
||
ld [TempMonDVs], a
|
||
ld a, [wOTTrademonDVs + 1]
|
||
ld [TempMonDVs + 1], a
|
||
ld b, SCGB_1A
|
||
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
|
||
|
||
CheckPokerus: ; 4d860
|
||
; Return carry if a monster in your party has Pokerus
|
||
|
||
; Get number of monsters to iterate over
|
||
ld a, [PartyCount]
|
||
and a
|
||
jr z, .NoPokerus
|
||
ld b, a
|
||
; Check each monster in the party for Pokerus
|
||
ld hl, PartyMon1PokerusStatus
|
||
ld de, PARTYMON_STRUCT_LENGTH
|
||
.Check
|
||
ld a, [hl]
|
||
and $0f ; only the bottom nybble is used
|
||
jr nz, .HasPokerus
|
||
; Next PartyMon
|
||
add hl, de
|
||
dec b
|
||
jr nz, .Check
|
||
.NoPokerus
|
||
and a
|
||
ret
|
||
.HasPokerus
|
||
scf
|
||
ret
|
||
|
||
Special_CheckForLuckyNumberWinners: ; 4d87a
|
||
xor a
|
||
ld [ScriptVar], a
|
||
ld [wFoundMatchingIDInParty], a
|
||
ld a, [PartyCount]
|
||
and a
|
||
ret z
|
||
ld d, a
|
||
ld hl, PartyMon1ID
|
||
ld bc, PartySpecies
|
||
.PartyLoop
|
||
ld a, [bc]
|
||
inc bc
|
||
cp EGG
|
||
call nz, .CompareLuckyNumberToMonID
|
||
push bc
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
add hl, bc
|
||
pop bc
|
||
dec d
|
||
jr nz, .PartyLoop
|
||
ld a, BANK(sBox)
|
||
call GetSRAMBank
|
||
ld a, [sBoxCount]
|
||
and a
|
||
jr z, .SkipOpenBox
|
||
ld d, a
|
||
ld hl, sBoxMon1ID
|
||
ld bc, sBoxSpecies
|
||
.OpenBoxLoop
|
||
ld a, [bc]
|
||
inc bc
|
||
cp EGG
|
||
jr z, .SkipOpenBoxMon
|
||
call .CompareLuckyNumberToMonID
|
||
jr nc, .SkipOpenBoxMon
|
||
ld a, 1
|
||
ld [wFoundMatchingIDInParty], a
|
||
|
||
.SkipOpenBoxMon
|
||
push bc
|
||
ld bc, BOXMON_STRUCT_LENGTH
|
||
add hl, bc
|
||
pop bc
|
||
dec d
|
||
jr nz, .OpenBoxLoop
|
||
|
||
.SkipOpenBox
|
||
call CloseSRAM
|
||
ld c, $0
|
||
.BoxesLoop
|
||
ld a, [wCurBox]
|
||
and $f
|
||
cp c
|
||
jr z, .SkipBox
|
||
ld hl, .BoxBankAddresses
|
||
ld b, 0
|
||
rept 3
|
||
add hl, bc
|
||
endr
|
||
ld a, [hli]
|
||
call GetSRAMBank
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a ; hl now contains the address of the loaded box in SRAM
|
||
ld a, [hl]
|
||
and a
|
||
jr z, .SkipBox ; no mons in this box
|
||
push bc
|
||
ld b, h
|
||
ld c, l
|
||
inc bc
|
||
ld de, sBoxMon1ID - sBox
|
||
add hl, de
|
||
ld d, a
|
||
.BoxNLoop
|
||
ld a, [bc]
|
||
inc bc
|
||
cp EGG
|
||
jr z, .SkipBoxMon
|
||
|
||
call .CompareLuckyNumberToMonID ; sets ScriptVar and CurPartySpecies appropriately
|
||
jr nc, .SkipBoxMon
|
||
ld a, 1
|
||
ld [wFoundMatchingIDInParty], a
|
||
|
||
.SkipBoxMon
|
||
push bc
|
||
ld bc, BOXMON_STRUCT_LENGTH
|
||
add hl, bc
|
||
pop bc
|
||
dec d
|
||
jr nz, .BoxNLoop
|
||
pop bc
|
||
|
||
.SkipBox
|
||
inc c
|
||
ld a, c
|
||
cp NUM_BOXES
|
||
jr c, .BoxesLoop
|
||
|
||
call CloseSRAM
|
||
ld a, [ScriptVar]
|
||
and a
|
||
ret z ; found nothing
|
||
callba MobileFn_1060cd
|
||
ld a, [wFoundMatchingIDInParty]
|
||
and a
|
||
push af
|
||
ld a, [CurPartySpecies]
|
||
ld [wNamedObjectIndexBuffer], a
|
||
call GetPokemonName
|
||
ld hl, .FoundPartymonText
|
||
pop af
|
||
jr z, .print
|
||
ld hl, .FoundBoxmonText
|
||
|
||
.print
|
||
jp PrintText
|
||
|
||
.CompareLuckyNumberToMonID: ; 4d939
|
||
push bc
|
||
push de
|
||
push hl
|
||
ld d, h
|
||
ld e, l
|
||
ld hl, Buffer1
|
||
lb bc, PRINTNUM_LEADINGZEROS | 2, 5
|
||
call PrintNum
|
||
ld hl, LuckyNumberDigit1Buffer
|
||
ld de, wLuckyIDNumber
|
||
lb bc, PRINTNUM_LEADINGZEROS | 2, 5
|
||
call PrintNum
|
||
ld b, 5
|
||
ld c, 0
|
||
ld hl, LuckyNumberDigit5Buffer
|
||
ld de, Buffer5
|
||
.loop
|
||
ld a, [de]
|
||
cp [hl]
|
||
jr nz, .done
|
||
dec de
|
||
dec hl
|
||
inc c
|
||
dec b
|
||
jr nz, .loop
|
||
|
||
.done
|
||
pop hl
|
||
push hl
|
||
ld de, -6
|
||
add hl, de
|
||
ld a, [hl]
|
||
pop hl
|
||
pop de
|
||
push af
|
||
ld a, c
|
||
ld b, 1
|
||
cp 5
|
||
jr z, .okay
|
||
ld b, 2
|
||
cp 3
|
||
jr nc, .okay
|
||
ld b, 3
|
||
cp 2
|
||
jr nz, .nomatch
|
||
|
||
.okay
|
||
inc b
|
||
ld a, [ScriptVar]
|
||
and a
|
||
jr z, .bettermatch
|
||
cp b
|
||
jr c, .nomatch
|
||
|
||
.bettermatch
|
||
dec b
|
||
ld a, b
|
||
ld [ScriptVar], a
|
||
pop bc
|
||
ld a, b
|
||
ld [CurPartySpecies], a
|
||
pop bc
|
||
scf
|
||
ret
|
||
|
||
.nomatch
|
||
pop bc
|
||
pop bc
|
||
and a
|
||
ret
|
||
|
||
.BoxBankAddresses: ; 4d99f
|
||
dba sBox1
|
||
dba sBox2
|
||
dba sBox3
|
||
dba sBox4
|
||
dba sBox5
|
||
dba sBox6
|
||
dba sBox7
|
||
dba sBox8
|
||
dba sBox9
|
||
dba sBox10
|
||
dba sBox11
|
||
dba sBox12
|
||
dba sBox13
|
||
dba sBox14
|
||
|
||
.FoundPartymonText: ; 0x4d9c9
|
||
; Congratulations! We have a match with the ID number of @ in your party.
|
||
text_jump UnknownText_0x1c1261
|
||
db "@"
|
||
|
||
.FoundBoxmonText: ; 0x4d9ce
|
||
; Congratulations! We have a match with the ID number of @ in your PC BOX.
|
||
text_jump UnknownText_0x1c12ae
|
||
db "@"
|
||
|
||
Special_PrintTodaysLuckyNumber: ; 4d9d3
|
||
ld hl, StringBuffer3
|
||
ld de, wLuckyIDNumber
|
||
lb bc, PRINTNUM_LEADINGZEROS | 2, 5
|
||
call PrintNum
|
||
ld a, "@"
|
||
ld [StringBuffer3 + 5], a
|
||
ret
|
||
|
||
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 Function51322
|
||
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
|
||
|
||
_FindGreaterThanThatLevel: ; 4dbd2
|
||
ld hl, PartyMon1Level
|
||
call FindGreaterThanThatLevel
|
||
ret
|
||
|
||
_FindAtLeastThatHappy: ; 4dbd9
|
||
ld hl, PartyMon1Happiness
|
||
call FindAtLeastThatHappy
|
||
ret
|
||
|
||
_FindThatSpecies: ; 4dbe0
|
||
ld hl, PartyMon1Species
|
||
jp FindThatSpecies
|
||
|
||
_FindThatSpeciesYourTrainerID: ; 4dbe6
|
||
ld hl, PartyMon1Species
|
||
call FindThatSpecies
|
||
ret z
|
||
ld a, c
|
||
ld hl, PartyMon1ID
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
call AddNTimes
|
||
ld a, [PlayerID]
|
||
cp [hl]
|
||
jr nz, .nope
|
||
inc hl
|
||
ld a, [PlayerID + 1]
|
||
cp [hl]
|
||
jr nz, .nope
|
||
ld a, $1
|
||
and a
|
||
ret
|
||
|
||
.nope
|
||
xor a
|
||
ret
|
||
|
||
FindAtLeastThatHappy: ; 4dc0a
|
||
; Sets the bits for the Pokemon that have a happiness greater than or equal to b.
|
||
; The lowest bits are used. Sets z if no Pokemon in your party is at least that happy.
|
||
ld c, $0
|
||
ld a, [PartyCount]
|
||
ld d, a
|
||
.loop
|
||
ld a, d
|
||
dec a
|
||
push hl
|
||
push bc
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
call AddNTimes
|
||
pop bc
|
||
ld a, b
|
||
cp [hl]
|
||
pop hl
|
||
jr z, .greater_equal
|
||
jr nc, .lower
|
||
|
||
.greater_equal
|
||
ld a, c
|
||
or $1
|
||
ld c, a
|
||
|
||
.lower
|
||
sla c
|
||
dec d
|
||
jr nz, .loop
|
||
call RetroactivelyIgnoreEggs
|
||
ld a, c
|
||
and a
|
||
ret
|
||
|
||
FindGreaterThanThatLevel: ; 4dc31
|
||
ld c, $0
|
||
ld a, [PartyCount]
|
||
ld d, a
|
||
.loop
|
||
ld a, d
|
||
dec a
|
||
push hl
|
||
push bc
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
call AddNTimes
|
||
pop bc
|
||
ld a, b
|
||
cp [hl]
|
||
pop hl
|
||
jr c, .greater
|
||
ld a, c
|
||
or $1
|
||
ld c, a
|
||
|
||
.greater
|
||
sla c
|
||
dec d
|
||
jr nz, .loop
|
||
call RetroactivelyIgnoreEggs
|
||
ld a, c
|
||
and a
|
||
ret
|
||
|
||
FindThatSpecies: ; 4dc56
|
||
; Find species b in your party.
|
||
; If you have no Pokemon, returns c = -1 and z.
|
||
; If that species is in your party, returns its location in c, and nz.
|
||
; Otherwise, returns z.
|
||
ld c, -1
|
||
ld hl, PartySpecies
|
||
.loop
|
||
ld a, [hli]
|
||
cp -1
|
||
ret z
|
||
inc c
|
||
cp b
|
||
jr nz, .loop
|
||
ld a, $1
|
||
and a
|
||
ret
|
||
|
||
RetroactivelyIgnoreEggs: ; 4dc67
|
||
ld e, -2
|
||
ld hl, PartySpecies
|
||
.loop
|
||
ld a, [hli]
|
||
cp -1
|
||
ret z
|
||
cp EGG
|
||
jr nz, .skip_notegg
|
||
ld a, c
|
||
and e
|
||
ld c, a
|
||
|
||
.skip_notegg
|
||
rlc e
|
||
jr .loop
|
||
|
||
INCLUDE "engine/stats_screen.asm"
|
||
|
||
CatchTutorial:: ; 4e554
|
||
ld a, [BattleType]
|
||
dec a
|
||
ld c, a
|
||
ld hl, .dw
|
||
ld b, 0
|
||
add hl, bc
|
||
add hl, bc
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
jp [hl]
|
||
|
||
.dw: ; 4e564 (13:6564)
|
||
dw .DudeTutorial
|
||
dw .DudeTutorial
|
||
dw .DudeTutorial
|
||
|
||
.DudeTutorial: ; 4e56a (13:656a)
|
||
; Back up your name to your Mom's name.
|
||
ld hl, PlayerName
|
||
ld de, MomsName
|
||
ld bc, NAME_LENGTH
|
||
call CopyBytes
|
||
; Copy Dude's name to your name
|
||
ld hl, .Dude
|
||
ld de, PlayerName
|
||
ld bc, NAME_LENGTH
|
||
call CopyBytes
|
||
|
||
call .LoadDudeData
|
||
|
||
xor a
|
||
ld [hJoyDown], a
|
||
ld [hJoyPressed], a
|
||
ld a, [Options]
|
||
push af
|
||
and $f8
|
||
add $3
|
||
ld [Options], a
|
||
ld hl, .AutoInput
|
||
ld a, BANK(.AutoInput)
|
||
call StartAutoInput
|
||
callab StartBattle
|
||
call StopAutoInput
|
||
pop af
|
||
|
||
ld [Options], a
|
||
ld hl, MomsName
|
||
ld de, PlayerName
|
||
ld bc, NAME_LENGTH
|
||
call CopyBytes
|
||
ret
|
||
|
||
.LoadDudeData: ; 4e5b7 (13:65b7)
|
||
ld hl, wDudeNumItems
|
||
ld [hl], 1
|
||
inc hl
|
||
ld [hl], POTION
|
||
inc hl
|
||
ld [hl], 1
|
||
inc hl
|
||
ld [hl], -1
|
||
ld hl, wDudeNumKeyItems
|
||
ld [hl], 0
|
||
inc hl
|
||
ld [hl], -1
|
||
ld hl, wDudeNumBalls
|
||
ld a, 1
|
||
ld [hli], a
|
||
ld a, POKE_BALL ; 5
|
||
ld [hli], a
|
||
ld [hli], a
|
||
ld [hl], -1
|
||
ret
|
||
|
||
.Dude: ; 4e5da
|
||
db "DUDE@"
|
||
|
||
.AutoInput: ; 4e5df
|
||
db NO_INPUT, $ff ; end
|
||
|
||
INCLUDE "engine/evolution_animation.asm"
|
||
|
||
Function4e881: ; 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 "@"
|
||
|
||
Function4e8c2: ; 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, wd000 ; UnknBGPals
|
||
ld c, 4 * $10
|
||
.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
|
||
|
||
Function4e906: ; 4e906
|
||
ld a, [rSVBK]
|
||
push af
|
||
ld a, $6
|
||
ld [rSVBK], a
|
||
ld hl, wDecompressScratch
|
||
ld bc, wBackupAttrMap - wDecompressScratch
|
||
ld a, " "
|
||
call ByteFill
|
||
hlbgcoord 0, 0
|
||
ld de, wDecompressScratch
|
||
ld b, $0
|
||
ld c, $40
|
||
call Request2bpp
|
||
pop af
|
||
ld [rSVBK], a
|
||
ret
|
||
|
||
Function4e929: ; mobile function
|
||
ld h, b
|
||
ld l, c
|
||
call Function4e930
|
||
ld c, a
|
||
ret
|
||
|
||
Function4e930: ; 4e930
|
||
ld a, [hli]
|
||
xor [hl]
|
||
ld c, a
|
||
jr z, .skip_male_trainers
|
||
srl c
|
||
srl c
|
||
.male_trainer_loop
|
||
srl c
|
||
ld a, c
|
||
cp MaleTrainersEnd - MaleTrainers - 1
|
||
jr nc, .male_trainer_loop
|
||
inc c
|
||
|
||
.skip_male_trainers
|
||
ld a, [de]
|
||
cp $1
|
||
ld hl, MaleTrainers
|
||
jr nz, .finished
|
||
|
||
ld hl, FemaleTrainers
|
||
ld a, c
|
||
and a
|
||
jr z, .finished
|
||
|
||
.female_trainer_loop
|
||
srl c
|
||
ld a, c
|
||
cp FemaleTrainersEnd - FemaleTrainers - 1
|
||
jr nc, .female_trainer_loop
|
||
inc c
|
||
|
||
.finished
|
||
ld b, $0
|
||
add hl, bc
|
||
ld a, [hl]
|
||
ret
|
||
|
||
MaleTrainers: ; 4e95d
|
||
db BURGLAR
|
||
db YOUNGSTER
|
||
db SCHOOLBOY
|
||
db BIRD_KEEPER
|
||
db POKEMANIAC
|
||
db GENTLEMAN
|
||
db BUG_CATCHER
|
||
db FISHER
|
||
db SWIMMERM
|
||
db SAILOR
|
||
db SUPER_NERD
|
||
db GUITARIST
|
||
db HIKER
|
||
db FIREBREATHER
|
||
db BLACKBELT_T
|
||
db PSYCHIC_T
|
||
db CAMPER
|
||
db COOLTRAINERM
|
||
db BOARDER
|
||
db JUGGLER
|
||
db POKEFANM
|
||
db OFFICER
|
||
db SAGE
|
||
db BIKER
|
||
db SCIENTIST
|
||
MaleTrainersEnd:
|
||
|
||
FemaleTrainers: ; 4e976
|
||
db MEDIUM
|
||
db LASS
|
||
db BEAUTY
|
||
db SKIER
|
||
db TEACHER
|
||
db SWIMMERF
|
||
db PICNICKER
|
||
db KIMONO_GIRL
|
||
db POKEFANF
|
||
db COOLTRAINERF
|
||
FemaleTrainersEnd:
|
||
|
||
INCLUDE "battle/sliding_intro.asm"
|
||
|
||
Function4ea0a: ; 4ea0a
|
||
ld a, c
|
||
push af
|
||
call SpeechTextBox
|
||
call MobileTextBorder
|
||
pop af
|
||
dec a
|
||
ld bc, $c
|
||
ld hl, w5_dc1a
|
||
call AddNTimes
|
||
ld de, wcd53
|
||
ld bc, $c
|
||
ld a, $5 ; BANK(w5_dc1a)
|
||
call FarCopyWRAM
|
||
|
||
ld a, [rSVBK]
|
||
push af
|
||
ld a, $1
|
||
ld [rSVBK], a
|
||
|
||
ld bc, wcd53
|
||
decoord 1, 14
|
||
callba Function11c0c6
|
||
|
||
pop af
|
||
ld [rSVBK], a
|
||
|
||
ld c, 180
|
||
call DelayFrames
|
||
ret
|
||
|
||
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, .asm_4ea72
|
||
|
||
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
|
||
|
||
.asm_4ea72
|
||
ld a, $5
|
||
ld hl, w5_dc00
|
||
call GetFarWRAMByte
|
||
bit 0, a
|
||
jr z, .off
|
||
|
||
and a
|
||
ret
|
||
|
||
.off
|
||
scf
|
||
ret
|
||
|
||
INCLUDE "misc/gbc_only.asm"
|
||
|
||
INCLUDE "event/poke_seer.asm"
|
||
|
||
SECTION "bank14", ROMX, BANK[$14]
|
||
|
||
INCLUDE "engine/party_menu.asm"
|
||
INCLUDE "event/poisonstep.asm"
|
||
INCLUDE "event/sweet_scent.asm"
|
||
INCLUDE "event/squirtbottle.asm"
|
||
INCLUDE "event/card_key.asm"
|
||
INCLUDE "event/basement_key.asm"
|
||
INCLUDE "event/sacred_ash.asm"
|
||
|
||
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 BREEDMON
|
||
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
|
||
|
||
INCLUDE "text/types.asm"
|
||
|
||
Function50a28: ; 50a28
|
||
ld hl, Strings50a42
|
||
ld a, [TrainerClass]
|
||
dec a
|
||
ld c, a
|
||
ld b, 0
|
||
add hl, bc
|
||
add hl, bc
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
ld de, StringBuffer1
|
||
.copy
|
||
ld a, [hli]
|
||
ld [de], a
|
||
inc de
|
||
cp "@"
|
||
jr nz, .copy
|
||
ret
|
||
|
||
Strings50a42: ; 50a42
|
||
; Untranslated trainer class names from Red.
|
||
dw .Youngster
|
||
dw .BugCatcher
|
||
dw .Lass
|
||
dw OTClassName
|
||
dw .JrTrainerM
|
||
dw .JrTrainerF
|
||
dw .Pokemaniac
|
||
dw .SuperNerd
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw .Burglar
|
||
dw .Engineer
|
||
dw .Jack
|
||
dw OTClassName
|
||
dw .Swimmer
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw .Beauty
|
||
dw OTClassName
|
||
dw .Rocker
|
||
dw .Juggler
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw .Blackbelt
|
||
dw OTClassName
|
||
dw .ProfOak
|
||
dw .Chief
|
||
dw .Scientist
|
||
dw OTClassName
|
||
dw .Rocket
|
||
dw .CooltrainerM
|
||
dw .CooltrainerF
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
dw OTClassName
|
||
|
||
.Youngster db "たんパン@"
|
||
.BugCatcher db "むしとり@"
|
||
.Lass db "ミニスカ@"
|
||
.JrTrainerM db "ボーイ@"
|
||
.JrTrainerF db "ガール@"
|
||
.Pokemaniac db "マニア@"
|
||
.SuperNerd db "りかけい@"
|
||
.Burglar db "どろぼう@"
|
||
.Engineer db "ォヤジ@"
|
||
.Jack db "ジャック@"
|
||
.Swimmer db "かいパン@"
|
||
.Beauty db "おねえさん@"
|
||
.Rocker db "グループ@"
|
||
.Juggler db "ジャグラー@"
|
||
.Blackbelt db "からて@"
|
||
.ProfOak db "ォーキド@"
|
||
.Chief db "チーフ@"
|
||
.Scientist db "けんきゅういん@"
|
||
.Rocket db "だんいん@"
|
||
.CooltrainerM db "エりート♂@"
|
||
.CooltrainerF db "エりート♀@"
|
||
|
||
DrawPlayerHP: ; 50b0a
|
||
ld a, $1
|
||
jr DrawHP
|
||
|
||
DrawEnemyHP: ; 50b0e
|
||
ld a, $2
|
||
|
||
DrawHP: ; 50b10
|
||
ld [wWhichHPBar], a
|
||
push hl
|
||
push bc
|
||
ld a, [MonType]
|
||
cp BOXMON
|
||
jr z, .asm_50b30
|
||
|
||
ld a, [TempMonHP]
|
||
ld b, a
|
||
ld a, [TempMonHP + 1]
|
||
ld c, a
|
||
|
||
; Any HP?
|
||
or b
|
||
jr nz, .asm_50b30
|
||
|
||
xor a
|
||
ld c, a
|
||
ld e, a
|
||
ld a, 6
|
||
ld d, a
|
||
jp .asm_50b4a
|
||
|
||
.asm_50b30
|
||
ld a, [TempMonMaxHP]
|
||
ld d, a
|
||
ld a, [TempMonMaxHP + 1]
|
||
ld e, a
|
||
ld a, [MonType]
|
||
cp BOXMON
|
||
jr nz, .asm_50b41
|
||
|
||
ld b, d
|
||
ld c, e
|
||
|
||
.asm_50b41
|
||
predef ComputeHPBarPixels
|
||
ld a, 6
|
||
ld d, a
|
||
ld c, a
|
||
|
||
.asm_50b4a
|
||
ld a, c
|
||
pop bc
|
||
ld c, a
|
||
pop hl
|
||
push de
|
||
push hl
|
||
push hl
|
||
call DrawBattleHPBar
|
||
pop hl
|
||
|
||
; Print HP
|
||
ld bc, $15 ; move (1,1)
|
||
add hl, bc
|
||
ld de, TempMonHP
|
||
ld a, [MonType]
|
||
cp BOXMON
|
||
jr nz, .asm_50b66
|
||
ld de, TempMonMaxHP
|
||
.asm_50b66
|
||
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 + BaseGender - CurBaseData
|
||
ld bc, BaseData1 - BaseData
|
||
call AddNTimes
|
||
pop bc
|
||
|
||
ld a, BANK(BaseData)
|
||
call GetFarByte
|
||
|
||
; The higher the ratio, the more likely the monster is to be female.
|
||
|
||
cp $ff
|
||
jr z, .Genderless
|
||
|
||
and a
|
||
jr z, .Male
|
||
|
||
cp $fe
|
||
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
|
||
rept 3
|
||
inc hl
|
||
endr
|
||
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
|
||
.asm_50cd0
|
||
ld [hl], $32
|
||
inc hl
|
||
ld [hl], $3e
|
||
dec hl
|
||
add hl, de
|
||
dec c
|
||
jr nz, .asm_50cd0
|
||
ret
|
||
|
||
Function50cdb: ; 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, .asm_50d09
|
||
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
|
||
|
||
.asm_50d09
|
||
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
|
||
|
||
Function50db9: ; 50db9
|
||
ld a, [wd263]
|
||
|
||
cp $1
|
||
jr nz, .check_party_ot_name
|
||
ld hl, OTPartyCount
|
||
ld de, OTPartyMonOT
|
||
ld a, ENEMY_OT_NAME
|
||
jr .done
|
||
.check_party_ot_name
|
||
|
||
cp $4
|
||
jr nz, .check_mon_name
|
||
ld hl, PartyCount
|
||
ld de, PartyMonOT
|
||
ld a, PARTY_OT_NAME
|
||
jr .done
|
||
.check_mon_name
|
||
|
||
cp $5
|
||
jr nz, .check_item_name
|
||
ld hl, CurMart
|
||
ld de, PokemonNames
|
||
ld a, PKMN_NAME
|
||
jr .done
|
||
.check_item_name
|
||
|
||
cp $2
|
||
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 [wd100], a
|
||
ld a, h
|
||
ld [wd101], a
|
||
ld a, e
|
||
ld [wd102], a
|
||
ld a, d
|
||
ld [wd103], a
|
||
ld bc, ItemAttributes
|
||
ld a, c
|
||
ld [wd104], a
|
||
ld a, b
|
||
ld [wd105], a
|
||
ret
|
||
|
||
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
|
||
|
||
GrowthRates: ; 50efa
|
||
|
||
growth_rate: MACRO
|
||
; [1]/[2]*n**3 + [3]*n**2 + [4]*n - [5]
|
||
dn \1, \2
|
||
if \3 & $80 ; signed
|
||
db -\3 | $80
|
||
else
|
||
db \3
|
||
endc
|
||
db \4, \5
|
||
ENDM
|
||
|
||
growth_rate 1, 1, 0, 0, 0 ; Medium Fast
|
||
growth_rate 3, 4, 10, 0, 30 ; Slightly Fast
|
||
growth_rate 3, 4, 20, 0, 70 ; Slightly Slow
|
||
growth_rate 6, 5, -15, 100, 140 ; Medium Slow
|
||
growth_rate 4, 5, 0, 0, 0 ; Fast
|
||
growth_rate 5, 4, 0, 0, 0 ; Slow
|
||
|
||
_SwitchPartyMons:
|
||
ld a, [wd0e3]
|
||
dec a
|
||
ld [Buffer3], a
|
||
ld b, a
|
||
ld a, [wMenuCursorY]
|
||
dec a
|
||
ld [Buffer2], a ; wd1eb (aliases: MovementType)
|
||
cp b
|
||
jr z, .skip
|
||
call .SwapMonAndMail
|
||
ld a, [Buffer3]
|
||
call .ClearSprite
|
||
ld a, [Buffer2] ; wd1eb (aliases: MovementType)
|
||
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] ; wd1eb (aliases: MovementType)
|
||
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] ; wd1eb (aliases: MovementType)
|
||
ld hl, PartyMons ; wdcdf (aliases: PartyMon1, 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, PartyMons ; wdcdf (aliases: PartyMon1, PartyMon1Species)
|
||
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] ; wd1eb (aliases: MovementType)
|
||
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] ; wd1eb (aliases: MovementType)
|
||
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] ; wd1eb (aliases: MovementType)
|
||
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
|
||
|
||
INCLUDE "gfx/load_pics.asm"
|
||
|
||
Function51322: ; 51322
|
||
ld a, BANK(sBoxCount)
|
||
call GetSRAMBank
|
||
ld hl, sBoxCount
|
||
call Function513cb
|
||
ld a, [sBoxCount]
|
||
dec a
|
||
ld [wd265], a
|
||
ld hl, sBoxMonNicknames
|
||
ld bc, PKMN_NAME_LENGTH
|
||
ld de, wBufferMonNick
|
||
call Function513e0
|
||
ld a, [sBoxCount]
|
||
dec a
|
||
ld [wd265], a
|
||
ld hl, sBoxMonOT
|
||
ld bc, NAME_LENGTH
|
||
ld de, wBufferMonOT
|
||
call Function513e0
|
||
ld a, [sBoxCount]
|
||
dec a
|
||
ld [wd265], a
|
||
ld hl, sBoxMons
|
||
ld bc, BOXMON_STRUCT_LENGTH
|
||
ld de, wBufferMon
|
||
call Function513e0
|
||
ld hl, wBufferMonMoves
|
||
ld de, TempMonMoves
|
||
ld bc, NUM_MOVES
|
||
call CopyBytes
|
||
ld hl, wBufferMonPP
|
||
ld de, TempMonPP
|
||
ld bc, NUM_MOVES
|
||
call CopyBytes
|
||
ld a, [CurPartyMon]
|
||
ld b, a
|
||
callba Functiondcb6
|
||
jp CloseSRAM
|
||
|
||
Function5138b: ; 5138b
|
||
ld hl, PartyCount
|
||
call Function513cb
|
||
ld a, [PartyCount]
|
||
dec a
|
||
ld [wd265], a
|
||
ld hl, PartyMonNicknames
|
||
ld bc, PKMN_NAME_LENGTH
|
||
ld de, wBufferMonNick
|
||
call Function513e0
|
||
ld a, [PartyCount]
|
||
dec a
|
||
ld [wd265], a
|
||
ld hl, PartyMonOT
|
||
ld bc, NAME_LENGTH
|
||
ld de, wBufferMonOT
|
||
call Function513e0
|
||
ld a, [PartyCount]
|
||
dec a
|
||
ld [wd265], a
|
||
ld hl, PartyMons
|
||
ld bc, PARTYMON_STRUCT_LENGTH
|
||
ld de, wBufferMon
|
||
call Function513e0
|
||
ret
|
||
|
||
Function513cb: ; 513cb
|
||
inc [hl]
|
||
inc hl
|
||
ld a, [CurPartyMon]
|
||
ld c, a
|
||
ld b, 0
|
||
add hl, bc
|
||
ld a, [CurPartySpecies]
|
||
ld c, a
|
||
.asm_513d8
|
||
ld a, [hl]
|
||
ld [hl], c
|
||
inc hl
|
||
inc c
|
||
ld c, a
|
||
jr nz, .asm_513d8
|
||
ret
|
||
|
||
Function513e0: ; 513e0
|
||
push de
|
||
push hl
|
||
push bc
|
||
ld a, [wd265]
|
||
dec a
|
||
call AddNTimes
|
||
push hl
|
||
add hl, bc
|
||
ld d, h
|
||
ld e, l
|
||
pop hl
|
||
.asm_513ef
|
||
push bc
|
||
ld a, [wd265]
|
||
ld b, a
|
||
ld a, [CurPartyMon]
|
||
cp b
|
||
pop bc
|
||
jr z, .asm_51415
|
||
push hl
|
||
push de
|
||
push bc
|
||
call CopyBytes
|
||
pop bc
|
||
pop de
|
||
pop hl
|
||
push hl
|
||
ld a, l
|
||
sub c
|
||
ld l, a
|
||
ld a, h
|
||
sbc b
|
||
ld h, a
|
||
pop de
|
||
ld a, [wd265]
|
||
dec a
|
||
ld [wd265], a
|
||
jr .asm_513ef
|
||
|
||
.asm_51415
|
||
pop bc
|
||
pop hl
|
||
ld a, [CurPartyMon]
|
||
call AddNTimes
|
||
ld d, h
|
||
ld e, l
|
||
pop hl
|
||
call CopyBytes
|
||
ret
|
||
|
||
BaseData::
|
||
INCLUDE "data/base_stats.asm"
|
||
|
||
PokemonNames::
|
||
INCLUDE "data/pokemon_names.asm"
|
||
|
||
Unknown_53d84: ; unreferenced
|
||
db $1a, $15
|
||
db $33, $16
|
||
db $4b, $17
|
||
db $62, $18
|
||
db $79, $19
|
||
db $90, $1a
|
||
db $a8, $1b
|
||
db $c4, $1c
|
||
db $e0, $1d
|
||
db $f6, $1e
|
||
db $ff, $1f
|
||
db $ff, $20
|
||
|
||
UnknownEggPic:: ; 53d9c
|
||
; Another egg pic. This is shifted up a few pixels.
|
||
INCBIN "gfx/misc/unknown_egg.5x5.2bpp.lz"
|
||
|
||
SECTION "bank19", ROMX, BANK[$19]
|
||
|
||
INCLUDE "text/phone/extra.asm"
|
||
|
||
SECTION "bank20", ROMX, BANK[$20]
|
||
|
||
INCLUDE "engine/player_movement.asm"
|
||
|
||
INCLUDE "engine/engine_flags.asm"
|
||
|
||
INCLUDE "engine/variables.asm"
|
||
|
||
BattleText::
|
||
INCLUDE "text/battle.asm"
|
||
|
||
INCLUDE "engine/debug.asm"
|
||
|
||
SECTION "bank21", ROMX, BANK[$21]
|
||
|
||
INCLUDE "engine/printer.asm"
|
||
|
||
INCLUDE "battle/anim_gfx.asm"
|
||
|
||
INCLUDE "event/halloffame.asm"
|
||
|
||
SECTION "bank22", ROMX, BANK[$22]
|
||
|
||
INCLUDE "event/kurt.asm"
|
||
|
||
Function88248: ; 88248
|
||
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/misc/chris_card.5x7.2bpp"
|
||
|
||
KrisCardPic: ; 88595
|
||
INCBIN "gfx/misc/kris_card.5x7.2bpp"
|
||
|
||
CardGFX: ; 887c5
|
||
INCBIN "gfx/misc/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/misc/chris.7x7.2bpp"
|
||
|
||
KrisPic: ; 88bb9
|
||
INCBIN "gfx/misc/kris.7x7.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/misc/kris_back.6x6.2bpp"
|
||
|
||
String_89116:
|
||
db "-----@"
|
||
|
||
INCLUDE "misc/mobile_22.asm"
|
||
INCLUDE "event/unown.asm"
|
||
INCLUDE "event/buena.asm"
|
||
INCLUDE "event/dratini.asm"
|
||
INCLUDE "event/battle_tower.asm"
|
||
INCLUDE "misc/mobile_22_2.asm"
|
||
|
||
SECTION "bank23", ROMX, BANK[$23]
|
||
|
||
Predef35: ; 8c000
|
||
Predef36:
|
||
ret
|
||
|
||
INCLUDE "engine/timeofdaypals.asm"
|
||
INCLUDE "engine/battle_start.asm"
|
||
|
||
Function8c7c9: ; unreferenced
|
||
ld a, $1
|
||
ld [hBGMapMode], a
|
||
call WaitBGMap
|
||
xor a
|
||
ld [hBGMapMode], a
|
||
ret
|
||
|
||
INCLUDE "event/field_moves.asm"
|
||
INCLUDE "event/magnet_train.asm"
|
||
|
||
Function8cf4f: ; 8cf4f
|
||
call Function3238
|
||
ret
|
||
|
||
INCLUDE "engine/sprites.asm"
|
||
|
||
INCLUDE "engine/mon_icons.asm"
|
||
|
||
SECTION "bank24", ROMX, BANK[$24]
|
||
|
||
INCLUDE "engine/phone.asm"
|
||
INCLUDE "engine/timeset.asm"
|
||
INCLUDE "engine/pokegear.asm"
|
||
|
||
INCLUDE "data/wild/fish.asm"
|
||
INCLUDE "engine/slot_machine.asm"
|
||
|
||
SECTION "Phone Engine", ROMX, BANK[$28]
|
||
|
||
INCLUDE "engine/more_phone_scripts.asm"
|
||
INCLUDE "engine/buena_phone_scripts.asm"
|
||
|
||
SECTION "Phone Text", ROMX, BANK[$29]
|
||
|
||
INCLUDE "text/phone/anthony_overworld.asm"
|
||
INCLUDE "text/phone/todd_overworld.asm"
|
||
INCLUDE "text/phone/gina_overworld.asm"
|
||
INCLUDE "text/phone/irwin_overworld.asm"
|
||
INCLUDE "text/phone/arnie_overworld.asm"
|
||
INCLUDE "text/phone/alan_overworld.asm"
|
||
INCLUDE "text/phone/dana_overworld.asm"
|
||
INCLUDE "text/phone/chad_overworld.asm"
|
||
INCLUDE "text/phone/derek_overworld.asm"
|
||
INCLUDE "text/phone/tully_overworld.asm"
|
||
INCLUDE "text/phone/brent_overworld.asm"
|
||
INCLUDE "text/phone/tiffany_overworld.asm"
|
||
INCLUDE "text/phone/vance_overworld.asm"
|
||
INCLUDE "text/phone/wilton_overworld.asm"
|
||
INCLUDE "text/phone/kenji_overworld.asm"
|
||
INCLUDE "text/phone/parry_overworld.asm"
|
||
INCLUDE "text/phone/erin_overworld.asm"
|
||
|
||
SECTION "Tileset Data 5", ROMX, BANK[TILESETS_5]
|
||
|
||
INCLUDE "tilesets/data_5.asm"
|
||
|
||
SECTION "bank2E", ROMX, BANK[$2E]
|
||
|
||
INCLUDE "engine/events_3.asm"
|
||
|
||
INCLUDE "engine/radio.asm"
|
||
|
||
INCLUDE "gfx/mail.asm"
|
||
|
||
SECTION "bank2F", ROMX, BANK[$2F]
|
||
|
||
INCLUDE "engine/std_scripts.asm"
|
||
|
||
INCLUDE "engine/phone_scripts.asm"
|
||
|
||
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
|
||
|
||
SECTION "bank30", ROMX, BANK[$30]
|
||
|
||
INCLUDE "gfx/overworld/sprites_1.asm"
|
||
|
||
SECTION "bank31", ROMX, BANK[$31]
|
||
|
||
INCLUDE "gfx/overworld/sprites_2.asm"
|
||
|
||
SECTION "bank32", ROMX, BANK[$32]
|
||
|
||
INCLUDE "battle/bg_effects.asm"
|
||
|
||
INCLUDE "battle/anims.asm"
|
||
|
||
LoadPoisonBGPals: ; cbcdd
|
||
call .LoadPals
|
||
ld a, [hCGB]
|
||
and a
|
||
ret nz
|
||
ret
|
||
|
||
.LoadPals: ; cbce5
|
||
ld a, [hCGB]
|
||
and a
|
||
jr nz, .cgb
|
||
ld a, [TimeOfDayPal]
|
||
and $3
|
||
cp $3
|
||
ld a, $0
|
||
jr z, .convert_pals
|
||
ld a, $aa
|
||
|
||
.convert_pals
|
||
call DmgToCgbBGPals
|
||
ld c, 4
|
||
call DelayFrames
|
||
callba _UpdateTimePals
|
||
ret
|
||
|
||
.cgb
|
||
ld a, [rSVBK]
|
||
push af
|
||
ld a, $5
|
||
ld [rSVBK], a
|
||
ld hl, BGPals
|
||
ld c, $20
|
||
.loop
|
||
; RGB 31, 21, 28
|
||
ld a, (palred 31 + palgreen 21 + palblue 28) % $100
|
||
ld [hli], a
|
||
ld a, (palred 31 + palgreen 21 + palblue 28) / $100
|
||
ld [hli], a
|
||
dec c
|
||
jr nz, .loop
|
||
pop af
|
||
ld [rSVBK], a
|
||
ld a, $1
|
||
ld [hCGBPalUpdate], a
|
||
ld c, 4
|
||
call DelayFrames
|
||
callba _UpdateTimePals
|
||
ret
|
||
|
||
TheEndGFX:: ; cbd2e
|
||
INCBIN "gfx/credits/theend.2bpp"
|
||
|
||
SECTION "bank33", ROMX, BANK[$33]
|
||
|
||
DisplayCaughtContestMonStats: ; cc000
|
||
|
||
call ClearBGPalettes
|
||
call ClearTileMap
|
||
call ClearSprites
|
||
call LoadFontsBattleExtra
|
||
|
||
ld hl, Options
|
||
ld a, [hl]
|
||
push af
|
||
set 4, [hl]
|
||
|
||
hlcoord 0, 0
|
||
ld b, 4
|
||
ld c, 13
|
||
call TextBox
|
||
|
||
hlcoord 0, 6
|
||
ld b, 4
|
||
ld c, 13
|
||
call TextBox
|
||
|
||
hlcoord 2, 0
|
||
ld de, .Stock
|
||
call PlaceString
|
||
|
||
hlcoord 2, 6
|
||
ld de, .This
|
||
call PlaceString
|
||
|
||
hlcoord 5, 4
|
||
ld de, .Health
|
||
call PlaceString
|
||
|
||
hlcoord 5, 10
|
||
ld de, .Health
|
||
call PlaceString
|
||
|
||
ld a, [wContestMon]
|
||
ld [wd265], a
|
||
call GetPokemonName
|
||
ld de, StringBuffer1
|
||
hlcoord 1, 2
|
||
call PlaceString
|
||
|
||
ld h, b
|
||
ld l, c
|
||
ld a, [wContestMonLevel]
|
||
ld [TempMonLevel], a
|
||
call PrintLevel
|
||
|
||
ld de, EnemyMonNick
|
||
hlcoord 1, 8
|
||
call PlaceString
|
||
|
||
ld h, b
|
||
ld l, c
|
||
ld a, [EnemyMonLevel]
|
||
ld [TempMonLevel], a
|
||
call PrintLevel
|
||
|
||
hlcoord 11, 4
|
||
ld de, wContestMonMaxHP
|
||
lb bc, 2, 3
|
||
call PrintNum
|
||
|
||
hlcoord 11, 10
|
||
ld de, EnemyMonMaxHP
|
||
call PrintNum
|
||
|
||
ld hl, SwitchMonText
|
||
call PrintText
|
||
|
||
pop af
|
||
ld [Options], a
|
||
|
||
call WaitBGMap
|
||
ld b, SCGB_08
|
||
call GetSGBLayout
|
||
call SetPalettes
|
||
ret
|
||
|
||
.Health
|
||
db "HEALTH@"
|
||
.Stock
|
||
db " STOCK ", $4a, " @"
|
||
.This
|
||
db " THIS ", $4a, " @"
|
||
|
||
SwitchMonText: ; cc0c2
|
||
; Switch #MON?
|
||
text_jump UnknownText_0x1c10cf
|
||
db "@"
|
||
|
||
DisplayAlreadyCaughtText: ; cc0c7
|
||
call GetPokemonName
|
||
ld hl, .AlreadyCaughtText
|
||
jp PrintText
|
||
|
||
.AlreadyCaughtText: ; 0xcc0d0
|
||
; You already caught a @ .
|
||
text_jump UnknownText_0x1c10dd
|
||
db "@"
|
||
|
||
Predef2F:
|
||
Predef38:
|
||
Predef39: ; cc0d5
|
||
ret
|
||
|
||
INCLUDE "battle/anim_commands.asm"
|
||
|
||
INCLUDE "battle/anim_objects.asm"
|
||
|
||
SECTION "Pic Animations 1", ROMX, BANK[$34]
|
||
|
||
INCLUDE "gfx/pics/animation.asm"
|
||
|
||
; Pic animations are assembled in 3 parts:
|
||
|
||
; Top-level animations:
|
||
; frame #, duration: Frame 0 is the original pic (no change)
|
||
; setrepeat #: Sets the number of times to repeat
|
||
; dorepeat #: Repeats from command # (starting from 0)
|
||
; end
|
||
|
||
; Bitmasks:
|
||
; Layered over the pic to designate affected tiles
|
||
|
||
; Frame definitions:
|
||
; first byte is the bitmask used for this frame
|
||
; following bytes are tile ids mapped to each bit in the mask
|
||
|
||
; Main animations (played everywhere)
|
||
INCLUDE "gfx/pics/anim_pointers.asm"
|
||
INCLUDE "gfx/pics/anims.asm"
|
||
|
||
; Extra animations, appended to the main animation
|
||
; Used in the status screen (blinking, tail wags etc.)
|
||
INCLUDE "gfx/pics/extra_pointers.asm"
|
||
INCLUDE "gfx/pics/extras.asm"
|
||
|
||
; Unown has its own animation data despite having an entry in the main tables
|
||
INCLUDE "gfx/pics/unown_anim_pointers.asm"
|
||
INCLUDE "gfx/pics/unown_anims.asm"
|
||
INCLUDE "gfx/pics/unown_extra_pointers.asm"
|
||
INCLUDE "gfx/pics/unown_extras.asm"
|
||
|
||
; Bitmasks
|
||
INCLUDE "gfx/pics/bitmask_pointers.asm"
|
||
INCLUDE "gfx/pics/bitmasks.asm"
|
||
INCLUDE "gfx/pics/unown_bitmask_pointers.asm"
|
||
INCLUDE "gfx/pics/unown_bitmasks.asm"
|
||
|
||
SECTION "Pic Animations 2", ROMX, BANK[$35]
|
||
|
||
INCLUDE "gfx/pics/frame_pointers.asm"
|
||
INCLUDE "gfx/pics/kanto_frames.asm"
|
||
|
||
SECTION "bank36", ROMX, BANK[$36]
|
||
|
||
FontInversed: INCBIN "gfx/misc/font_inversed.1bpp"
|
||
|
||
SECTION "Pic Animations 3", ROMX, BANK[$36]
|
||
|
||
INCLUDE "gfx/pics/johto_frames.asm"
|
||
INCLUDE "gfx/pics/unown_frame_pointers.asm"
|
||
INCLUDE "gfx/pics/unown_frames.asm"
|
||
|
||
SECTION "Tileset Data 6", ROMX, BANK[TILESETS_6]
|
||
|
||
INCLUDE "tilesets/data_6.asm"
|
||
|
||
SECTION "bank38", ROMX, BANK[$38]
|
||
|
||
Functione0000: ; e0000
|
||
; something to do with Unown printer
|
||
push de
|
||
xor a
|
||
call GetSRAMBank
|
||
ld hl, sScratch
|
||
ld bc, 0
|
||
.loop
|
||
push bc
|
||
push hl
|
||
push bc
|
||
ld de, wd002
|
||
call .Copy
|
||
call .Decompress
|
||
ld hl, Unknown_e008b
|
||
pop bc
|
||
add hl, bc
|
||
add hl, bc
|
||
ld a, [hli]
|
||
ld e, a
|
||
ld d, [hl]
|
||
ld hl, wd012
|
||
call .Copy
|
||
pop hl
|
||
ld bc, $10
|
||
add hl, bc
|
||
pop bc
|
||
inc c
|
||
ld a, c
|
||
cp $31
|
||
jr c, .loop
|
||
|
||
ld hl, OverworldMap
|
||
ld de, sScratch
|
||
ld bc, $31 tiles
|
||
call CopyBytes
|
||
pop hl
|
||
ld de, sScratch
|
||
ld c, $31
|
||
ld a, [hROMBank]
|
||
ld b, a
|
||
call Get2bpp
|
||
call CloseSRAM
|
||
ret
|
||
|
||
.Copy: ; e004e
|
||
ld c, $10
|
||
.loop_copy
|
||
ld a, [hli]
|
||
ld [de], a
|
||
inc de
|
||
dec c
|
||
jr nz, .loop_copy
|
||
ret
|
||
|
||
.Decompress: ; e0057
|
||
ld hl, wd012
|
||
ld e, %10000000
|
||
ld d, 8
|
||
.loop_decompress
|
||
push hl
|
||
ld hl, wd002
|
||
call .CountSetBit
|
||
pop hl
|
||
ld a, b
|
||
ld [hli], a
|
||
push hl
|
||
ld hl, wd003
|
||
call .CountSetBit
|
||
pop hl
|
||
ld a, b
|
||
ld [hli], a
|
||
srl e
|
||
dec d
|
||
jr nz, .loop_decompress
|
||
ret
|
||
|
||
.CountSetBit: ; e0078
|
||
ld b, 0
|
||
ld c, 8
|
||
.loop_count
|
||
ld a, [hli]
|
||
and e
|
||
jr z, .clear
|
||
scf
|
||
jr .apply
|
||
|
||
.clear
|
||
and a
|
||
|
||
.apply
|
||
rr b
|
||
inc hl
|
||
dec c
|
||
jr nz, .loop_count
|
||
ret
|
||
|
||
overworldmaptile EQUS "dw OverworldMap + $10 *"
|
||
overworldmaprect: MACRO
|
||
y = 0
|
||
rept \1
|
||
x = \1 * (\2 +- 1) + y
|
||
rept \2
|
||
overworldmaptile x
|
||
x = x +- \2
|
||
endr
|
||
y = y + 1
|
||
endr
|
||
endm
|
||
|
||
Unknown_e008b: ; e008b
|
||
overworldmaprect 7, 7
|
||
|
||
Unknown_e00ed:
|
||
; Graphics for an unused Game Corner
|
||
; game were meant to be here.
|
||
|
||
ret_e00ed: ; e00ed (38:40ed)
|
||
; How many coins?
|
||
ret
|
||
|
||
INCLUDE "engine/card_flip.asm"
|
||
INCLUDE "engine/unown_puzzle.asm"
|
||
INCLUDE "engine/dummy_game.asm"
|
||
INCLUDE "engine/billspc.asm"
|
||
|
||
SECTION "bank39", ROMX, BANK[$39]
|
||
|
||
CopyrightGFX:: ; e4000
|
||
INCBIN "gfx/misc/copyright.2bpp"
|
||
|
||
INCLUDE "engine/options_menu.asm"
|
||
INCLUDE "engine/crystal_intro.asm"
|
||
|
||
SECTION "bank3E", ROMX, BANK[$3E]
|
||
|
||
INCLUDE "gfx/font.asm"
|
||
INCLUDE "engine/time_capsule/conversion.asm"
|
||
INCLUDE "engine/unowndex.asm"
|
||
INCLUDE "event/magikarp.asm"
|
||
|
||
INCLUDE "battle/hidden_power.asm"
|
||
|
||
INCLUDE "battle/misc.asm"
|
||
|
||
SECTION "bank3F", ROMX, BANK[$3F]
|
||
|
||
INCLUDE "tilesets/animations.asm"
|
||
|
||
INCLUDE "engine/npctrade.asm"
|
||
|
||
INCLUDE "event/mom_phone.asm"
|
||
|
||
SECTION "bank40", ROMX, BANK[$40]
|
||
|
||
INCLUDE "misc/mobile_40.asm"
|
||
|
||
SECTION "bank41", ROMX, BANK[$41]
|
||
|
||
INCLUDE "misc/gfx_41.asm"
|
||
|
||
INCLUDE "engine/warp_connection.asm"
|
||
|
||
INCLUDE "engine/mysterygift.asm"
|
||
|
||
INCLUDE "battle/used_move_text.asm"
|
||
|
||
INCLUDE "misc/mobile_41.asm"
|
||
|
||
SECTION "bank42", ROMX, BANK[$42]
|
||
|
||
INCLUDE "misc/mobile_42.asm"
|
||
|
||
SECTION "Intro Logo", ROMX, BANK[$42]
|
||
|
||
IntroLogoGFX: ; 109407
|
||
INCBIN "gfx/intro/logo.2bpp.lz"
|
||
|
||
INCLUDE "misc/unused_title.asm"
|
||
|
||
INCLUDE "engine/title.asm"
|
||
|
||
INCLUDE "misc/mobile_45.asm"
|
||
INCLUDE "misc/mobile_46.asm"
|
||
|
||
SECTION "bank47", ROMX, BANK[$47]
|
||
|
||
INCLUDE "misc/battle_tower_47.asm"
|
||
|
||
SECTION "bank5B", ROMX, BANK[$5B]
|
||
|
||
INCLUDE "misc/mobile_5b.asm"
|
||
INCLUDE "engine/link_trade.asm"
|
||
|
||
SECTION "bank5C", ROMX, BANK[$5C]
|
||
|
||
INCLUDE "misc/mobile_5c.asm"
|
||
|
||
SECTION "bank5D", ROMX, BANK[$5D]
|
||
|
||
INCLUDE "text/phone/extra3.asm"
|
||
|
||
SECTION "bank5E", ROMX, BANK[$5E]
|
||
|
||
_UpdateBattleHUDs:
|
||
callba DrawPlayerHUD
|
||
ld hl, PlayerHPPal
|
||
call SetHPPal
|
||
callba DrawEnemyHUD
|
||
ld hl, EnemyHPPal
|
||
call SetHPPal
|
||
callba FinishBattleAnim
|
||
ret
|
||
|
||
INCLUDE "misc/mobile_5f.asm"
|
||
|
||
SECTION "Common Text 1", ROMX, BANK[$6C]
|
||
|
||
INCLUDE "text/stdtext.asm"
|
||
INCLUDE "text/phone/jack_overworld.asm"
|
||
INCLUDE "text/phone/beverly_overworld.asm"
|
||
INCLUDE "text/phone/huey_overworld.asm"
|
||
INCLUDE "text/phone/gaven_overworld.asm"
|
||
INCLUDE "text/phone/beth_overworld.asm"
|
||
INCLUDE "text/phone/jose_overworld.asm"
|
||
INCLUDE "text/phone/reena_overworld.asm"
|
||
INCLUDE "text/phone/joey_overworld.asm"
|
||
INCLUDE "text/phone/wade_overworld.asm"
|
||
INCLUDE "text/phone/ralph_overworld.asm"
|
||
INCLUDE "text/phone/liz_overworld.asm"
|
||
|
||
SECTION "bank6D", ROMX, BANK[$6D]
|
||
|
||
INCLUDE "text/phone/mom.asm"
|
||
INCLUDE "text/phone/bill.asm"
|
||
INCLUDE "text/phone/elm.asm"
|
||
INCLUDE "text/phone/trainers1.asm"
|
||
|
||
SECTION "bank72", ROMX, BANK[$72]
|
||
|
||
ItemNames::
|
||
INCLUDE "items/item_names.asm"
|
||
|
||
INCLUDE "items/item_descriptions.asm"
|
||
|
||
MoveNames::
|
||
INCLUDE "battle/move_names.asm"
|
||
|
||
INCLUDE "engine/landmarks.asm"
|
||
|
||
SECTION "bank77", ROMX, BANK[$77]
|
||
|
||
UnownFont: ; 1dc000
|
||
INCBIN "gfx/misc/unown_font.2bpp"
|
||
|
||
INCLUDE "misc/printer_77.asm"
|
||
|
||
MobileHPIcon: ; 1dc591
|
||
INCBIN "gfx/mobile/hp.1bpp"
|
||
|
||
MobileLvIcon: ; 1dc599
|
||
INCBIN "gfx/mobile/lv.1bpp"
|
||
|
||
SECTION "Tileset Data 7", ROMX, BANK[TILESETS_7]
|
||
|
||
INCLUDE "tilesets/data_7.asm"
|
||
|
||
SECTION "bank77_2", ROMX, BANK[$77]
|
||
|
||
Function1dd6a9: ; 1dd6a9
|
||
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
|
||
|
||
INCLUDE "engine/diploma.asm"
|
||
|
||
LoadSGBPokedexGFX: ; 1ddf1c
|
||
ld hl, LZ_1ddf33
|
||
ld de, VTiles2 tile $31
|
||
call Decompress
|
||
ret
|
||
|
||
Function1ddf26: ; 1ddf26 (77:5f26)
|
||
ld hl, LZ_1ddf33
|
||
ld de, VTiles2 tile $31
|
||
lb bc, BANK(LZ_1ddf33), $3a
|
||
call DecompressRequest2bpp
|
||
ret
|
||
|
||
LZ_1ddf33: ; 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
|
||
|
||
_DudeAutoInput_A:: ; 1de28a
|
||
ld hl, DudeAutoInput_A
|
||
jr _DudeAutoInput
|
||
|
||
_DudeAutoInput_RightA: ; 1de28f
|
||
ld hl, DudeAutoInput_RightA
|
||
jr _DudeAutoInput
|
||
|
||
_DudeAutoInput_DownA: ; 1de294
|
||
ld hl, DudeAutoInput_DownA
|
||
jr _DudeAutoInput
|
||
|
||
_DudeAutoInput: ; 1de299
|
||
ld a, BANK(DudeAutoInputs)
|
||
call StartAutoInput
|
||
ret
|
||
|
||
DudeAutoInputs:
|
||
|
||
DudeAutoInput_A: ; 1de29f
|
||
db NO_INPUT, $50
|
||
db A_BUTTON, $00
|
||
db NO_INPUT, $ff ; end
|
||
|
||
DudeAutoInput_RightA: ; 1de2a5
|
||
db NO_INPUT, $08
|
||
db D_RIGHT, $00
|
||
db NO_INPUT, $08
|
||
db A_BUTTON, $00
|
||
db NO_INPUT, $ff ; end
|
||
|
||
DudeAutoInput_DownA: ; 1de2af
|
||
db NO_INPUT, $fe
|
||
db NO_INPUT, $fe
|
||
db NO_INPUT, $fe
|
||
db NO_INPUT, $fe
|
||
db D_DOWN, $00
|
||
db NO_INPUT, $fe
|
||
db NO_INPUT, $fe
|
||
db NO_INPUT, $fe
|
||
db NO_INPUT, $fe
|
||
db A_BUTTON, $00
|
||
db NO_INPUT, $ff ; end
|
||
|
||
Function1de2c5: ; 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/misc/pokegear.2bpp.lz"
|
||
|
||
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
|
||
|
||
SECTION "Tileset Data 8", ROMX, BANK[TILESETS_8]
|
||
|
||
INCLUDE "tilesets/data_8.asm"
|
||
|
||
SECTION "bank7B", ROMX, BANK[$7B]
|
||
|
||
INCLUDE "text/battle_tower.asm"
|
||
|
||
SECTION "bank7C", ROMX, BANK[$7C]
|
||
|
||
INCLUDE "data/battle_tower_2.asm"
|
||
|
||
SECTION "bank7D", ROMX, BANK[$7D]
|
||
|
||
db $cc, $6b, $1e ; XXX
|
||
|
||
Function1f4003: ; 1f4003
|
||
ld a, $6
|
||
call GetSRAMBank
|
||
ld hl, Unknown_1f4018
|
||
ld de, $a000
|
||
ld bc, $1000
|
||
call CopyBytes
|
||
call CloseSRAM
|
||
ret
|
||
|
||
Unknown_1f4018:
|
||
INCBIN "unknown/1f4018.bin"
|
||
|
||
Function1f4dbe: ; 1f4dbe
|
||
ld a, $6
|
||
call GetSRAMBank
|
||
ld hl, Unknown_1f4dd3
|
||
ld de, $a000
|
||
ld bc, $1000
|
||
call CopyBytes
|
||
call CloseSRAM
|
||
ret
|
||
|
||
Unknown_1f4dd3:
|
||
INCBIN "unknown/1f4dd3.bin"
|
||
|
||
Function1f5d9f: ; 1f5d9f
|
||
ld a, $6
|
||
call GetSRAMBank
|
||
ld hl, Unknown_1f5db4
|
||
ld de, $a000
|
||
ld bc, $1000
|
||
call CopyBytes
|
||
call CloseSRAM
|
||
ret
|
||
|
||
Unknown_1f5db4:
|
||
INCBIN "unknown/1f5db4.bin"
|
||
|
||
SECTION "bank7E", ROMX, BANK[$7E]
|
||
|
||
INCLUDE "data/battle_tower.asm"
|
||
INCLUDE "data/odd_eggs.asm"
|
||
|
||
SECTION "bank7F", ROMX, BANK[$7F]
|
||
|
||
SECTION "stadium2", ROMX[$8000-$220], BANK[$7F]
|
||
|
||
IF DEF(CRYSTAL11)
|
||
INCBIN "misc/stadium2_2.bin"
|
||
ELSE
|
||
INCBIN "misc/stadium2_1.bin"
|
||
ENDC
|