This commit is contained in:
dannye 2016-07-18 01:32:24 -05:00
commit 7c01509b6b
75 changed files with 983 additions and 868 deletions

View File

@ -6,19 +6,8 @@ MD5 := md5sum -c --quiet
pic := $(PYTHON) extras/pokemontools/pic.py compress
includes := $(PYTHON) extras/pokemontools/scan_includes.py
base_obj := \
audio.o \
main.o \
text.o \
wram.o
red_obj := $(base_obj:.o=_red.o)
blue_obj := $(base_obj:.o=_blue.o)
all_obj := $(red_obj) $(blue_obj)
$(foreach obj, $(base_obj:.o=), \
$(eval $(obj)_dep := $(shell $(includes) $(obj).asm)) \
)
pokered_obj := audio_red.o main_red.o text_red.o wram_red.o
pokeblue_obj := audio_blue.o main_blue.o text_blue.o wram_blue.o
.SUFFIXES:
.SUFFIXES: .asm .o .gbc .png .2bpp .1bpp .pic
@ -38,21 +27,24 @@ compare: red blue
@$(MD5) roms.md5
clean:
rm -f $(roms) $(all_obj) $(roms:.gbc=.sym)
rm -f $(roms) $(pokered_obj) $(pokeblue_obj) $(roms:.gbc=.sym)
find . \( -iname '*.1bpp' -o -iname '*.2bpp' -o -iname '*.pic' \) -exec rm {} +
%.asm: ;
$(red_obj): %_red.o: %.asm $$(%_dep)
rgbasm -D "_RED" -h -o $@ $*.asm
$(blue_obj): %_blue.o: %.asm $$(%_dep)
rgbasm -D "_BLUE" -h -o $@ $*.asm
dmg_opt = -jsv -k 01 -l 0x33 -m 0x13 -p 0 -r 03
red_opt = $(dmg_opt) -t "POKEMON RED"
blue_opt = $(dmg_opt) -t "POKEMON BLUE"
%_red.o: dep = $(shell $(includes) $(@D)/$*.asm)
$(pokered_obj): %_red.o: %.asm $$(dep)
rgbasm -D _RED -h -o $@ $*.asm
poke%.gbc: $$(%_obj)
rgblink -n poke$*.sym -o $@ $^
%_blue.o: dep = $(shell $(includes) $(@D)/$*.asm)
$(pokeblue_obj): %_blue.o: %.asm $$(dep)
rgbasm -D _BLUE -h -o $@ $*.asm
pokered_opt = -jsv -k 01 -l 0x33 -m 0x13 -p 0 -r 03 -t "POKEMON RED"
pokeblue_opt = -jsv -k 01 -l 0x33 -m 0x13 -p 0 -r 03 -t "POKEMON BLUE"
%.gbc: $$(%_obj)
rgblink -n $*.sym -o $@ $^
rgbfix $($*_opt) $@
%.png: ;

View File

@ -147,9 +147,16 @@ charmap "ゅ", $E1
charmap "ょ", $E2
charmap "ー", $E3
charmap "<pkmn>", $4A ; PkMn
charmap "@", $50
charmap "<PLAYER>", $52
charmap "<RIVAL>", $53
charmap "#", $54
;charmap "POKé", $54
charmap "<TARGET>", $59
charmap "<USER>", $5A
charmap "", $71
charmap "″", $73
charmap "№", $74
charmap "…", $75

View File

@ -30,3 +30,4 @@ INCLUDE "constants/tilesets.asm"
INCLUDE "constants/starter_mons.asm"
INCLUDE "constants/event_constants.asm"
INCLUDE "constants/event_macros.asm"
INCLUDE "constants/text_constants.asm"

View File

@ -29,6 +29,16 @@ D_LEFT EQU %00100000
D_UP EQU %01000000
D_DOWN EQU %10000000
const_value set 0
const BIT_A_BUTTON
const BIT_B_BUTTON
const BIT_SELECT
const BIT_START
const BIT_D_RIGHT
const BIT_D_LEFT
const BIT_D_UP
const BIT_D_DOWN
SCREEN_WIDTH EQU 20
SCREEN_HEIGHT EQU 18
@ -152,20 +162,6 @@ FLAG_RESET EQU 0
FLAG_SET EQU 1
FLAG_TEST EQU 2
; special text IDs
TEXT_MON_FAINTED EQU $d0
TEXT_BLACKED_OUT EQU $d1
TEXT_REPEL_WORE_OFF EQU $d2
TEXT_SAFARI_GAME_OVER EQU $d3
; PrintNumber
BIT_LEFT_ALIGN EQU 6
BIT_LEADING_ZEROES EQU 7
LEFT_ALIGN EQU (1 << BIT_LEFT_ALIGN)
LEADING_ZEROES EQU (1 << BIT_LEADING_ZEROES)
; HP bar
HP_BAR_GREEN EQU 0
HP_BAR_YELLOW EQU 1

View File

@ -0,0 +1,14 @@
; special text IDs
TEXT_MON_FAINTED EQU $d0
TEXT_BLACKED_OUT EQU $d1
TEXT_REPEL_WORE_OFF EQU $d2
TEXT_SAFARI_GAME_OVER EQU $d3
; PrintNumber
BIT_MONEY_SIGN EQU 5
BIT_LEFT_ALIGN EQU 6
BIT_LEADING_ZEROES EQU 7
MONEY_SIGN EQU (1 << BIT_MONEY_SIGN)
LEFT_ALIGN EQU (1 << BIT_LEFT_ALIGN)
LEADING_ZEROES EQU (1 << BIT_LEADING_ZEROES)

View File

@ -18,7 +18,7 @@ HallOfFamePC:
call FillFourRowsWithBlack
coord hl, 0, 14
call FillFourRowsWithBlack
ld a, $c0
ld a, %11000000
ld [rBGP], a
call EnableLCD
ld a, $ff
@ -36,13 +36,13 @@ HallOfFamePC:
FadeInCreditsText:
ld hl, HoFGBPalettes
ld b, 4
.asm_740bf
.loop
ld a, [hli]
ld [rBGP], a
ld c, 5
call DelayFrames
dec b
jr nz, .asm_740bf
jr nz, .loop
ret
DisplayCreditsMon:

View File

@ -383,29 +383,29 @@ MoveAnimation:
call SetAnimationPalette
ld a,[wAnimationID]
and a
jr z,.AnimationFinished
jr z, .animationFinished
; if throwing a Poké Ball, skip the regular animation code
cp a,TOSS_ANIM
jr nz,.MoveAnimation
ld de,.AnimationFinished
jr nz, .moveAnimation
ld de, .animationFinished
push de
jp TossBallAnimation
.MoveAnimation
.moveAnimation
; check if battle animations are disabled in the options
ld a,[wOptions]
bit 7,a
jr nz,.AnimationsDisabled
jr nz, .animationsDisabled
call ShareMoveAnimations
call PlayAnimation
jr .next4
.AnimationsDisabled
.animationsDisabled
ld c,30
call DelayFrames
.next4
call PlayApplyingAttackAnimation ; shake the screen or flash the pic in and out (to show damage)
.AnimationFinished
.animationFinished
call WaitForSoundToFinish
xor a
ld [wSubAnimSubEntryAddr],a
@ -431,13 +431,13 @@ ShareMoveAnimations:
cp a,AMNESIA
ld b,CONF_ANIM
jr z,.Replace
jr z, .replaceAnim
cp a,REST
ld b,SLP_ANIM
ret nz
.Replace
.replaceAnim
ld a,b
ld [wAnimationID],a
ret
@ -1845,13 +1845,13 @@ AnimationMinimizeMon:
ld hl, wTempPic
push hl
xor a
ld bc, $310
ld bc, 7 * 7 * $10
call FillMemory
pop hl
ld de, $194
add hl, de
ld de, MinimizedMonSprite
ld c, $5
ld c, MinimizedMonSpriteEnd - MinimizedMonSprite
.loop
ld a, [de]
ld [hli], a
@ -1865,6 +1865,7 @@ AnimationMinimizeMon:
MinimizedMonSprite:
INCBIN "gfx/minimized_mon_sprite.1bpp"
MinimizedMonSpriteEnd:
AnimationSlideMonDownAndHide:
; Slides the mon's sprite down and disappears. Used in Acid Armor.
@ -2308,7 +2309,6 @@ GetMoveSoundB:
ld b, a
ret
; get the sound of the (move id - 1) in a
GetMoveSound:
ld hl,MoveSoundTable
ld e,a
@ -2363,6 +2363,7 @@ IsCryMove:
ret
MoveSoundTable:
; ID, pitch mod, tempo mod
db SFX_POUND, $00,$80 ; POUND
db SFX_BATTLE_0C, $10,$80 ; KARATE_CHOP
db SFX_DOUBLESLAP, $00,$80 ; DOUBLESLAP

View File

@ -443,7 +443,7 @@ MainInBattleLoop:
; the link battle enemy has switched mons
ld a, [wPlayerBattleStatus1]
bit UsingTrappingMove, a ; check if using multi-turn move like Wrap
jr z, .asm_3c2dd
jr z, .specialMoveNotUsed
ld a, [wPlayerMoveListIndex]
ld hl, wBattleMonMoves
ld c, a
@ -452,9 +452,9 @@ MainInBattleLoop:
ld a, [hl]
cp METRONOME ; a MIRROR MOVE check is missing, might lead to a desync in link battles
; when combined with multi-turn moves
jr nz, .asm_3c2dd
jr nz, .specialMoveNotUsed
ld [wPlayerSelectedMove], a
.asm_3c2dd
.specialMoveNotUsed
callab SwitchEnemyMon
.noLinkBattle
ld a, [wPlayerSelectedMove]
@ -665,7 +665,7 @@ HandlePoisonBurnLeechSeed_DecreaseOwnHP:
and a
jr z, .playersTurn
ld hl, wEnemyBattleStatus3
ld de, wEnemyToxcCounter
ld de, wEnemyToxicCounter
.playersTurn
bit BadlyPoisoned, [hl]
jr z, .noToxic
@ -884,6 +884,8 @@ FaintEnemyPokemon:
ld a, MUSIC_DEFEATED_WILD_MON
call PlayBattleVictoryMusic
.sfxplayed
; bug: win sfx is played for wild battles before checking for player mon HP
; this can lead to odd scenarios where both player and enemy faint, as the win sfx plays yet the player never won the battle
ld hl, wBattleMonHP
ld a, [hli]
or [hl]
@ -1285,7 +1287,7 @@ SlideDownFaintedMonPic:
call CopyData
pop de
pop hl
ld bc, -20
ld bc, -SCREEN_WIDTH
add hl, bc
push hl
ld h, d
@ -1297,7 +1299,7 @@ SlideDownFaintedMonPic:
pop bc
dec b
jr nz, .rowLoop
ld bc, 20
ld bc, SCREEN_WIDTH
add hl, bc
ld de, SevenSpacesText
call PlaceString
@ -1925,9 +1927,9 @@ DrawPlayerHUDAndHPBar:
ld de, wLoadedMonStatus
call PrintStatusConditionNotFainted
pop hl
jr nz, .asm_3cdae
jr nz, .doNotPrintLevel
call PrintLevel
.asm_3cdae
.doNotPrintLevel
ld a, [wLoadedMonSpecies]
ld [wcf91], a
coord hl, 10, 9
@ -1939,14 +1941,14 @@ DrawPlayerHUDAndHPBar:
ld hl, wBattleMonHP
ld a, [hli]
or [hl]
jr z, .asm_3cdd9
jr z, .fainted
ld a, [wLowHealthAlarmDisabled]
and a ; has the alarm been disabled because the player has already won?
ret nz ; if so, return
ld a, [wPlayerHPBarColor]
cp HP_BAR_RED
jr z, .asm_3cde6
.asm_3cdd9
jr z, .setLowHealthAlarm
.fainted
ld hl, wLowHealthAlarm
bit 7, [hl] ;low health alarm enabled?
ld [hl], $0
@ -1954,7 +1956,7 @@ DrawPlayerHUDAndHPBar:
xor a
ld [wChannelSoundIDs + CH4], a
ret
.asm_3cde6
.setLowHealthAlarm
ld hl, wLowHealthAlarm
set 7, [hl] ;enable low health alarm
ret
@ -2572,9 +2574,10 @@ MoveSelectionMenu:
ld hl, wBattleMonMoves
call .loadmoves
coord hl, 4, 12
ld b, $4
ld c, $e
di
ld b, 4
ld c, 14
di ; out of pure coincidence, it is possible for vblank to occur between the di and ei
; so it is necessary to put the di ei block to not cause tearing
call TextBoxBorder
coord hl, 4, 12
ld [hl], $7a
@ -2590,8 +2593,8 @@ MoveSelectionMenu:
ld hl, wEnemyMonMoves
call .loadmoves
coord hl, 0, 7
ld b, $4
ld c, $e
ld b, 4
ld c, 14
call TextBoxBorder
coord hl, 2, 8
call .writemoves
@ -2605,8 +2608,8 @@ MoveSelectionMenu:
call AddNTimes
call .loadmoves
coord hl, 4, 7
ld b, $4
ld c, $e
ld b, 4
ld c, 14
call TextBoxBorder
coord hl, 6, 8
call .writemoves
@ -2688,9 +2691,9 @@ SelectMenuItem:
ld hl, hFlags_0xFFF6
res 1, [hl]
bit 6, a
jp nz, CursorUp ; up
jp nz, SelectMenuItem_CursorUp ; up
bit 7, a
jp nz, CursorDown ; down
jp nz, SelectMenuItem_CursorDown ; down
bit 2, a
jp nz, SwapMovesInMenu ; select
bit 1, a ; B, but was it reset above?
@ -2703,10 +2706,10 @@ SelectMenuItem:
ld b, a
ld a, [wMoveMenuType]
dec a ; if not mimic
jr nz, .nob
jr nz, .notB
pop af
ret
.nob
.notB
dec a
ld a, b
ld [wPlayerMoveListIndex], a
@ -2723,7 +2726,7 @@ SelectMenuItem:
add hl, bc
ld a, [hl]
and $3f
jr z, .nopp
jr z, .noPP
ld a, [wPlayerDisabledMove]
swap a
and $f
@ -2746,7 +2749,7 @@ SelectMenuItem:
.disabled
ld hl, MoveDisabledText
jr .print
.nopp
.noPP
ld hl, MoveNoPPText
.print
call PrintText
@ -2764,7 +2767,7 @@ MoveDisabledText:
WhichTechniqueString:
db "WHICH TECHNIQUE?@"
CursorUp:
SelectMenuItem_CursorUp:
ld a, [wCurrentMenuItem]
and a
jp nz, SelectMenuItem
@ -2774,7 +2777,7 @@ CursorUp:
ld [wCurrentMenuItem], a
jp SelectMenuItem
CursorDown:
SelectMenuItem_CursorDown:
ld a, [wCurrentMenuItem]
ld b, a
ld a, [wNumMovesMinusOne]
@ -2794,7 +2797,7 @@ AnyMoveToSelect:
ld a, [wPlayerDisabledMove]
and a
ld hl, wBattleMonPP
jr nz, .asm_3d40e
jr nz, .handleDisabledMove
ld a, [hli]
or [hl]
inc hl
@ -2803,26 +2806,26 @@ AnyMoveToSelect:
or [hl]
and $3f
ret nz
jr .asm_3d423
.asm_3d40e
jr .noMovesLeft
.handleDisabledMove
swap a
and $f
and $f ; get disabled move
ld b, a
ld d, $5
ld d, NUM_MOVES + 1
xor a
.asm_3d416
.handleDisabledMovePPLoop
dec d
jr z, .asm_3d421
ld c, [hl]
jr z, .allMovesChecked
ld c, [hl] ; get move PP
inc hl
dec b
jr z, .asm_3d416
dec b ; is this the disabled move?
jr z, .handleDisabledMovePPLoop ; if so, ignore its PP value
or c
jr .asm_3d416
.asm_3d421
and a
ret nz
.asm_3d423
jr .handleDisabledMovePPLoop
.allMovesChecked
and a ; any PP left?
ret nz ; return if a move has PP left
.noMovesLeft
ld hl, NoMovesLeftText
call PrintText
ld c, 60
@ -2914,8 +2917,8 @@ PrintMenuItem:
xor a
ld [H_AUTOBGTRANSFERENABLED], a
coord hl, 0, 8
ld b, $3
ld c, $9
ld b, 3
ld c, 9
call TextBoxBorder
ld a, [wPlayerDisabledMove]
and a
@ -2997,7 +3000,7 @@ SelectEnemyMove:
call LoadScreenTilesFromBuffer1
ld a, [wSerialExchangeNybbleReceiveData]
cp $e
jp z, .asm_3d601
jp z, .linkedOpponentUsedStruggle
cp $d
jr z, .unableToSelectMove
cp $4
@ -3075,7 +3078,7 @@ SelectEnemyMove:
.done
ld [wEnemySelectedMove], a
ret
.asm_3d601
.linkedOpponentUsedStruggle
ld a, STRUGGLE
jr .done
@ -3205,7 +3208,7 @@ PlayerCalcMoveDamage:
call RandomizeDamage
.moveHitTest
call MoveHitTest
handleIfPlayerMoveMissed
handleIfPlayerMoveMissed:
ld a,[wMoveMissed]
and a
jr z,getPlayerAnimationType
@ -3213,13 +3216,13 @@ handleIfPlayerMoveMissed
sub a,EXPLODE_EFFECT
jr z,playPlayerMoveAnimation ; don't play any animation if the move missed, unless it was EXPLODE_EFFECT
jr playerCheckIfFlyOrChargeEffect
getPlayerAnimationType
getPlayerAnimationType:
ld a,[wPlayerMoveEffect]
and a
ld a,4 ; move has no effect other than dealing damage
jr z,playPlayerMoveAnimation
ld a,5 ; move has effect
playPlayerMoveAnimation
playPlayerMoveAnimation:
push af
ld a,[wPlayerBattleStatus2]
bit HasSubstituteUp,a
@ -3238,7 +3241,7 @@ playPlayerMoveAnimation
ld b,BANK(ReshowSubstituteAnim)
call nz,Bankswitch
jr MirrorMoveCheck
playerCheckIfFlyOrChargeEffect
playerCheckIfFlyOrChargeEffect:
ld c,30
call DelayFrames
ld a,[wPlayerMoveEffect]
@ -3252,7 +3255,7 @@ playerCheckIfFlyOrChargeEffect
ld [wAnimationType],a
ld a,STATUS_AFFECTED_ANIM
call PlayMoveAnimation
MirrorMoveCheck
MirrorMoveCheck:
ld a,[wPlayerMoveEffect]
cp a,MIRROR_MOVE_EFFECT
jr nz,.metronomeCheck
@ -3785,10 +3788,10 @@ MonName1Text:
and a
ld a, [wPlayerMoveNum]
ld hl, wPlayerUsedMove
jr z, .asm_3db11
jr z, .playerTurn
ld a, [wEnemyMoveNum]
ld hl, wEnemyUsedMove
.asm_3db11
.playerTurn
ld [hl], a
ld [wd11e], a
call DetermineExclamationPointTextNum
@ -4682,9 +4685,9 @@ CriticalHitTest:
ld a, [H_WHOSETURN]
and a
ld a, [wEnemyMonSpecies]
jr nz, .asm_3e032
jr nz, .handleEnemy
ld a, [wBattleMonSpecies]
.asm_3e032
.handleEnemy
ld [wd0b5], a
call GetMonHeader
ld a, [wMonHBaseSpeed]
@ -5051,7 +5054,7 @@ ApplyDamageToPlayerPokemon:
ld a,$01
ld [wHPBarType],a
predef UpdateHPBar2 ; animate the HP bar shortening
ApplyAttackToPlayerPokemonDone
ApplyAttackToPlayerPokemonDone:
jp DrawHUDsAndHPBars
AttackSubstitute:
@ -5751,12 +5754,12 @@ EnemyMoveHitTest:
handleIfEnemyMoveMissed:
ld a, [wMoveMissed]
and a
jr z, .asm_3e791
jr z, .moveDidNotMiss
ld a, [wEnemyMoveEffect]
cp EXPLODE_EFFECT
jr z, asm_3e7a0
jr z, handleExplosionMiss
jr EnemyCheckIfFlyOrChargeEffect
.asm_3e791
.moveDidNotMiss
call SwapPlayerAndEnemyLevels
GetEnemyAnimationType:
@ -5766,7 +5769,7 @@ GetEnemyAnimationType:
jr z, playEnemyMoveAnimation
ld a, $2
jr playEnemyMoveAnimation
asm_3e7a0:
handleExplosionMiss:
call SwapPlayerAndEnemyLevels
xor a
playEnemyMoveAnimation:
@ -5824,19 +5827,19 @@ EnemyCheckIfMirrorMoveEffect:
jp c, JumpMoveEffect
ld a, [wMoveMissed]
and a
jr z, .asm_3e82b
jr z, .moveDidNotMiss
call PrintMoveFailureText
ld a, [wEnemyMoveEffect]
cp EXPLODE_EFFECT
jr z, .asm_3e83e
jr z, .handleExplosionMiss
jp ExecuteEnemyMoveDone
.asm_3e82b
.moveDidNotMiss
call ApplyAttackToPlayerPokemon
call PrintCriticalOHKOText
callab DisplayEffectiveness
ld a, 1
ld [wMoveDidntMiss], a
.asm_3e83e
.handleExplosionMiss
ld a, [wEnemyMoveEffect]
ld hl, AlwaysHappenSideEffects
ld de, $1
@ -5850,7 +5853,7 @@ EnemyCheckIfMirrorMoveEffect:
call HandleBuildingRage
ld hl, wEnemyBattleStatus1
bit AttackingMultipleTimes, [hl] ; is mon hitting multiple times? (example: double kick)
jr z, .asm_3e873
jr z, .notMultiHitMove
push hl
ld hl, wEnemyNumAttacksLeft
dec [hl]
@ -5861,7 +5864,7 @@ EnemyCheckIfMirrorMoveEffect:
call PrintText
xor a
ld [wEnemyNumHits], a
.asm_3e873
.notMultiHitMove
ld a, [wEnemyMoveEffect]
and a
jr z, ExecuteEnemyMoveDone
@ -6801,16 +6804,16 @@ HandleExplodingAnimation:
ld hl, wEnemyMonType1
ld de, wEnemyBattleStatus1
ld a, [wPlayerMoveNum]
jr z, .asm_3eeea
jr z, .player
ld hl, wBattleMonType1
ld de, wEnemyBattleStatus1
ld a, [wEnemyMoveNum]
.asm_3eeea
.player
cp SELFDESTRUCT
jr z, .asm_3eef1
jr z, .isExplodingMove
cp EXPLOSION
ret nz
.asm_3eef1
.isExplodingMove
ld a, [de]
bit Invulnerable, a ; fly/dig
ret nz
@ -7333,7 +7336,7 @@ PoisonEffect:
jr nz, .ok
ld b, ANIM_A9
ld hl, wEnemyBattleStatus3
ld de, wEnemyToxcCounter
ld de, wEnemyToxicCounter
.ok
cp TOXIC
jr nz, .normalPoison ; done if move is not Toxic
@ -7341,18 +7344,18 @@ PoisonEffect:
xor a
ld [de], a
ld hl, BadlyPoisonedText
jr .asm_3f2c0
jr .continue
.normalPoison
ld hl, PoisonedText
.asm_3f2c0
.continue
pop de
ld a, [de]
cp POISON_EFFECT
jr z, .asm_3f2cd
jr z, .regularPoisonEffect
ld a, b
call PlayBattleAnimation2
jp PrintText
.asm_3f2cd
.regularPoisonEffect
call PlayCurrentMoveAnimation2
jp PrintText
.noEffect
@ -7717,9 +7720,9 @@ MonsStatsRoseText:
ld a, [H_WHOSETURN]
and a
ld a, [wPlayerMoveEffect]
jr z, .asm_3f53b
jr z, .playerTurn
ld a, [wEnemyMoveEffect]
.asm_3f53b
.playerTurn
cp ATTACK_DOWN1_EFFECT
ret nc
ld hl, RoseText
@ -7728,7 +7731,7 @@ MonsStatsRoseText:
GreatlyRoseText:
TX_DELAY
TX_FAR _GreatlyRoseText
; fallthrough
RoseText:
TX_FAR _RoseText
db "@"
@ -7817,9 +7820,9 @@ StatModifierDownEffect:
ld a, c
add e
ld e, a
jr nc, .asm_3f5e4
jr nc, .noCarry
inc d ; de = unmodified stat
.asm_3f5e4
.noCarry
pop bc
ld a, [hld]
sub $1 ; can't lower stat below 1 (-6)
@ -7919,12 +7922,13 @@ MonsStatsFellText:
ld a, [H_WHOSETURN]
and a
ld a, [wPlayerMoveEffect]
jr z, .asm_3f674
jr z, .playerTurn
ld a, [wEnemyMoveEffect]
.asm_3f674
cp $1a
.playerTurn
; check if the move's effect decreases a stat by 2
cp BIDE_EFFECT
ret c
cp $44
cp ATTACK_DOWN_SIDE_EFFECT
ret nc
ld hl, GreatlyFellText
ret
@ -7932,7 +7936,7 @@ MonsStatsFellText:
GreatlyFellText:
TX_DELAY
TX_FAR _GreatlyFellText
; fallthrough
FellText:
TX_FAR _FellText
db "@"
@ -7940,15 +7944,15 @@ FellText:
PrintStatText:
ld hl, StatsTextStrings
ld c, "@"
.asm_3f68d
.findStatName_outer
dec b
jr z, .asm_3f696
.asm_3f690
jr z, .foundStatName
.findStatName_inner
ld a, [hli]
cp c
jr z, .asm_3f68d
jr .asm_3f690
.asm_3f696
jr z, .findStatName_outer
jr .findStatName_inner
.foundStatName
ld de, wcf4b
ld bc, $a
jp CopyData
@ -8026,41 +8030,42 @@ ThrashPetalDanceEffect:
SwitchAndTeleportEffect:
ld a, [H_WHOSETURN]
and a
jr nz, .asm_3f791
jr nz, .handleEnemy
ld a, [wIsInBattle]
dec a
jr nz, .asm_3f77e
jr nz, .notWildBattle1
ld a, [wCurEnemyLVL]
ld b, a
ld a, [wBattleMonLevel]
cp b
jr nc, .asm_3f76e
cp b ; is the player's level greater than the enemy's level?
jr nc, .playerMoveWasSuccessful ; if so, teleport will always succeed
add b
ld c, a
inc c
.asm_3f751
inc c ; c = sum of player level and enemy level
.rejectionSampleLoop1
call BattleRandom
cp c
jr nc, .asm_3f751
cp c ; get a random number between 0 and c
jr nc, .rejectionSampleLoop1
srl b
srl b
cp b
jr nc, .asm_3f76e
srl b ; b = enemy level * 4
; bug: does not account for overflow, so levels above 63 can lead to erroneousness results
cp b ; is rand[0, playerLevel + enemyLevel] > enemyLevel?
jr nc, .playerMoveWasSuccessful ; if so, allow teleporting
ld c, 50
call DelayFrames
ld a, [wPlayerMoveNum]
cp TELEPORT
jp nz, PrintDidntAffectText
jp PrintButItFailedText_
.asm_3f76e
.playerMoveWasSuccessful
call ReadPlayerMonCurHPAndStatus
xor a
ld [wAnimationType], a
inc a
ld [wEscapedFromBattle], a
ld a, [wPlayerMoveNum]
jr .asm_3f7e4
.asm_3f77e
jr .playAnimAndPrintText
.notWildBattle1
ld c, 50
call DelayFrames
ld hl, IsUnaffectedText
@ -8068,41 +8073,41 @@ SwitchAndTeleportEffect:
cp TELEPORT
jp nz, PrintText
jp PrintButItFailedText_
.asm_3f791
.handleEnemy
ld a, [wIsInBattle]
dec a
jr nz, .asm_3f7d1
jr nz, .notWildBattle2
ld a, [wBattleMonLevel]
ld b, a
ld a, [wCurEnemyLVL]
cp b
jr nc, .asm_3f7c1
jr nc, .enemyMoveWasSuccessful
add b
ld c, a
inc c
.asm_3f7a4
.rejectionSampleLoop2
call BattleRandom
cp c
jr nc, .asm_3f7a4
jr nc, .rejectionSampleLoop2
srl b
srl b
cp b
jr nc, .asm_3f7c1
jr nc, .enemyMoveWasSuccessful
ld c, 50
call DelayFrames
ld a, [wEnemyMoveNum]
cp TELEPORT
jp nz, PrintDidntAffectText
jp PrintButItFailedText_
.asm_3f7c1
.enemyMoveWasSuccessful
call ReadPlayerMonCurHPAndStatus
xor a
ld [wAnimationType], a
inc a
ld [wEscapedFromBattle], a
ld a, [wEnemyMoveNum]
jr .asm_3f7e4
.asm_3f7d1
jr .playAnimAndPrintText
.notWildBattle2
ld c, 50
call DelayFrames
ld hl, IsUnaffectedText
@ -8110,7 +8115,7 @@ SwitchAndTeleportEffect:
cp TELEPORT
jp nz, PrintText
jp ConditionalPrintButItFailed
.asm_3f7e4
.playAnimAndPrintText
push af
call PlayBattleAnimation
ld c, 20
@ -8118,12 +8123,12 @@ SwitchAndTeleportEffect:
pop af
ld hl, RanFromBattleText
cp TELEPORT
jr z, .asm_3f7ff
jr z, .printText
ld hl, RanAwayScaredText
cp ROAR
jr z, .asm_3f7ff
jr z, .printText
ld hl, WasBlownAwayText
.asm_3f7ff
.printText
jp PrintText
RanFromBattleText:
@ -8168,10 +8173,11 @@ TwoToFiveAttacksEffect:
call BattleRandom
and $3
cp $2
jr c, .asm_3f851
jr c, .gotNumHits
; if the number of hits was greater than 2, re-roll again for a lower chance
call BattleRandom
and $3
.asm_3f851
.gotNumHits
inc a
inc a
.saveNumberOfHits
@ -8250,22 +8256,22 @@ ChargeMoveEffectText:
ld a, [wChargeMoveNum]
cp RAZOR_WIND
ld hl, MadeWhirlwindText
jr z, .asm_3f8f8
jr z, .gotText
cp SOLARBEAM
ld hl, TookInSunlightText
jr z, .asm_3f8f8
jr z, .gotText
cp SKULL_BASH
ld hl, LoweredItsHeadText
jr z, .asm_3f8f8
jr z, .gotText
cp SKY_ATTACK
ld hl, SkyAttackGlowingText
jr z, .asm_3f8f8
jr z, .gotText
cp FLY
ld hl, FlewUpHighText
jr z, .asm_3f8f8
jr z, .gotText
cp DIG
ld hl, DugAHoleText
.asm_3f8f8
.gotText
ret
MadeWhirlwindText:
@ -8328,7 +8334,7 @@ RecoilEffect:
ConfusionSideEffect:
call BattleRandom
cp $19
cp $19 ; ~10% chance
ret nc
jr ConfusionSideEffectSuccess
@ -8398,9 +8404,9 @@ ClearHyperBeam:
ld hl, wEnemyBattleStatus2
ld a, [H_WHOSETURN]
and a
jr z, .asm_3f9db
jr z, .playerTurn
ld hl, wPlayerBattleStatus2
.asm_3f9db
.playerTurn
res NeedsToRecharge, [hl] ; mon no longer needs to recharge
pop hl
ret
@ -8421,21 +8427,21 @@ MimicEffect:
call MoveHitTest
ld a, [wMoveMissed]
and a
jr nz, .asm_3fa74
jr nz, .mimicMissed
ld a, [H_WHOSETURN]
and a
ld hl, wBattleMonMoves
ld a, [wPlayerBattleStatus1]
jr nz, .asm_3fa13
jr nz, .enemyTurn
ld a, [wLinkState]
cp LINK_STATE_BATTLING
jr nz, .asm_3fa3a
jr nz, .letPlayerChooseMove
ld hl, wEnemyMonMoves
ld a, [wEnemyBattleStatus1]
.asm_3fa13
.enemyTurn
bit Invulnerable, a
jr nz, .asm_3fa74
.asm_3fa17
jr nz, .mimicMissed
.getRandomMove
push hl
call BattleRandom
and $3
@ -8445,20 +8451,20 @@ MimicEffect:
ld a, [hl]
pop hl
and a
jr z, .asm_3fa17
jr z, .getRandomMove
ld d, a
ld a, [H_WHOSETURN]
and a
ld hl, wBattleMonMoves
ld a, [wPlayerMoveListIndex]
jr z, .asm_3fa5f
jr z, .playerTurn
ld hl, wEnemyMonMoves
ld a, [wEnemyMoveListIndex]
jr .asm_3fa5f
.asm_3fa3a
jr .playerTurn
.letPlayerChooseMove
ld a, [wEnemyBattleStatus1]
bit Invulnerable, a
jr nz, .asm_3fa74
jr nz, .mimicMissed
ld a, [wCurrentMenuItem]
push af
ld a, $1
@ -8473,7 +8479,7 @@ MimicEffect:
ld d, [hl]
pop af
ld hl, wBattleMonMoves
.asm_3fa5f
.playerTurn
ld c, a
ld b, $0
add hl, bc
@ -8484,7 +8490,7 @@ MimicEffect:
call PlayCurrentMoveAnimation
ld hl, MimicLearnedMoveText
jp PrintText
.asm_3fa74
.mimicMissed
jp PrintButItFailedText_
MimicLearnedMoveText:

View File

@ -33,7 +33,7 @@ DecrementPP:
ld a, [wPlayerMonNumber] ; which mon in party is active
ld bc, wPartyMon2 - wPartyMon1
call AddNTimes ; calculate address of the mon to modify
.DecrementPP
.DecrementPP:
ld a, [wPlayerMoveListIndex] ; which move (0, 1, 2, 3) did we use?
ld c, a
ld b, 0

View File

@ -49,11 +49,11 @@ GainExperience:
ld [de], a
.nextBaseStat
dec c
jr z, .asm_552a1
jr z, .statExpDone
inc de
inc de
jr .gainStatExpLoop
.asm_552a1
.statExpDone
xor a
ld [H_MULTIPLICAND], a
ld [H_MULTIPLICAND + 1], a

View File

@ -2,15 +2,15 @@ GetTrainerName_:
ld hl, wGrassRate
ld a, [wLinkState]
and a
jr nz, .rival
jr nz, .foundName
ld hl, wRivalName
ld a, [wTrainerClass]
cp SONY1
jr z, .rival
jr z, .foundName
cp SONY2
jr z, .rival
jr z, .foundName
cp SONY3
jr z, .rival
jr z, .foundName
ld [wd0b5], a
ld a, TRAINER_NAME
ld [wNameListType], a
@ -18,7 +18,7 @@ GetTrainerName_:
ld [wPredefBank], a
call GetName
ld hl, wcd6d
.rival
.foundName
ld de, wTrainerName
ld bc, $d
jp CopyData

View File

@ -2,8 +2,8 @@
DisplayLinkBattleVersusTextBox:
call LoadTextBoxTilePatterns
coord hl, 3, 4
ld b, $7
ld c, $c
ld b, 7
ld c, 12
call TextBoxBorder
coord hl, 4, 5
ld de, wPlayerName

View File

@ -182,7 +182,7 @@ AIMoveChoiceModification2:
jr c, .preferMove
jr .nextMove
.preferMove
dec [hl] ; sligthly encourage this move
dec [hl] ; slightly encourage this move
jr .nextMove
; encourages moves that are effective against the player's mon (even if non-damaging).

View File

@ -27,10 +27,10 @@ CableClub_DoBattleOrTradeAgain:
ld hl, wSerialPlayerDataBlock
ld a, SERIAL_PREAMBLE_BYTE
ld b, 6
.writePlayeDataBlockPreambleLoop
.writePlayerDataBlockPreambleLoop
ld [hli], a
dec b
jr nz, .writePlayeDataBlockPreambleLoop
jr nz, .writePlayerDataBlockPreambleLoop
ld hl, wSerialRandomNumberListBlock
ld a, SERIAL_PREAMBLE_BYTE
ld b, 7
@ -271,7 +271,7 @@ CableClub_DoBattleOrTradeAgain:
cp LINK_STATE_START_BATTLE
ld a, LINK_STATE_TRADING
ld [wLinkState], a
jr nz, .asm_5506
jr nz, .trading
ld a, LINK_STATE_BATTLING
ld [wLinkState], a
ld a, OPP_SONY1
@ -283,7 +283,7 @@ CableClub_DoBattleOrTradeAgain:
predef InitOpponent
predef HealParty
jp ReturnToCableClubRoom
.asm_5506
.trading
ld c, BANK(Music_GameCorner)
ld a, MUSIC_GAME_CORNER
call PlayMusic
@ -900,16 +900,16 @@ CableClub_Run:
call CableClub_DoBattleOrTrade
ld hl, Club_GFX
ld a, h
ld [wTileSetGFXPtr + 1], a
ld [wTilesetGfxPtr + 1], a
ld a, l
ld [wTileSetGFXPtr], a
ld [wTilesetGfxPtr], a
ld a, Bank(Club_GFX)
ld [wTileSetBank], a
ld [wTilesetBank], a
ld hl, Club_Coll
ld a, h
ld [wTileSetCollisionPtr + 1], a
ld [wTilesetCollisionPtr + 1], a
ld a, l
ld [wTileSetCollisionPtr], a
ld [wTilesetCollisionPtr], a
xor a
ld [wGrassRate], a
inc a ; LINK_STATE_IN_CABLE_CLUB
@ -964,8 +964,8 @@ CableClub_TextBoxBorder:
; c = width
CableClub_DrawHorizontalLine:
ld d, c
.asm_5ae1
.loop
ld [hli], a
dec d
jr nz, .asm_5ae1
jr nz, .loop
ret

View File

@ -199,7 +199,6 @@ MoveDownSmallStars:
add hl, de
dec c
jr nz, .innerLoop
; Toggle the palette so that the lower star in the small stars tile blinks in
; and out.
ld a, [rOBP1]

View File

@ -58,8 +58,8 @@ AnimateHallOfFame:
ld c, 80
call DelayFrames
coord hl, 2, 13
ld b, $3
ld c, $e
ld b, 3
ld c, 14
call TextBoxBorder
coord hl, 4, 15
ld de, HallOfFameText
@ -210,12 +210,12 @@ HoFDisplayPlayerStats:
SetEvent EVENT_HALL_OF_FAME_DEX_RATING
predef DisplayDexRating
coord hl, 0, 4
ld b, $6
ld c, $a
ld b, 6
ld c, 10
call TextBoxBorder
coord hl, 5, 0
ld b, $2
ld c, $9
ld b, 2
ld c, 9
call TextBoxBorder
coord hl, 7, 2
ld de, wPlayerName

View File

@ -66,18 +66,18 @@ ViridianSchoolNotebookText4:
PrintFightingDojoText2:
call EnableAutoTextBoxDrawing
tx_pre_jump FightingDojoText_52a10
tx_pre_jump EnemiesOnEverySideText
FightingDojoText_52a10:
TX_FAR _FightingDojoText_52a10
EnemiesOnEverySideText:
TX_FAR _EnemiesOnEverySideText
db "@"
PrintFightingDojoText3:
call EnableAutoTextBoxDrawing
tx_pre_jump FightingDojoText_52a1d
tx_pre_jump WhatGoesAroundComesAroundText
FightingDojoText_52a1d:
TX_FAR _FightingDojoText_52a1d
WhatGoesAroundComesAroundText:
TX_FAR _WhatGoesAroundComesAroundText
db "@"
PrintFightingDojoText:

View File

@ -73,29 +73,29 @@ PrintBenchGuyText:
; format: db map id, player sprite facing direction, text id of PredefTextIDPointerTable
BenchGuyTextPointers:
db VIRIDIAN_POKECENTER, SPRITE_FACING_LEFT
db (ViridianCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre ViridianCityPokecenterBenchGuyText
db PEWTER_POKECENTER, SPRITE_FACING_LEFT
db (PewterCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre PewterCityPokecenterBenchGuyText
db CERULEAN_POKECENTER, SPRITE_FACING_LEFT
db (CeruleanCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre CeruleanCityPokecenterBenchGuyText
db LAVENDER_POKECENTER, SPRITE_FACING_LEFT
db (LavenderCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre LavenderCityPokecenterBenchGuyText
db VERMILION_POKECENTER, SPRITE_FACING_LEFT
db (VermilionCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre VermilionCityPokecenterBenchGuyText
db CELADON_POKECENTER, SPRITE_FACING_LEFT
db (CeladonCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre CeladonCityPokecenterBenchGuyText
db CELADON_HOTEL, SPRITE_FACING_LEFT
db (CeladonCityHotelText_id - TextPredefs) / 2 + 1
db_tx_pre CeladonCityHotelText
db FUCHSIA_POKECENTER, SPRITE_FACING_LEFT
db (FuchsiaCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre FuchsiaCityPokecenterBenchGuyText
db CINNABAR_POKECENTER, SPRITE_FACING_LEFT
db (CinnabarIslandPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre CinnabarIslandPokecenterBenchGuyText
db SAFFRON_POKECENTER, SPRITE_FACING_LEFT
db (SaffronCityPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre SaffronCityPokecenterBenchGuyText
db MT_MOON_POKECENTER, SPRITE_FACING_LEFT
db (MtMoonPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre MtMoonPokecenterBenchGuyText
db ROCK_TUNNEL_POKECENTER,SPRITE_FACING_LEFT
db (RockTunnelPokecenterBenchGuyText_id - TextPredefs) / 2 + 1
db_tx_pre RockTunnelPokecenterBenchGuyText
db $FF
ViridianCityPokecenterBenchGuyText:

View File

@ -39,39 +39,39 @@ PrintBookshelfText:
; format: db tileset id, bookshelf tile id, text id
BookshelfTileIDs:
db PLATEAU, $30
db (IndigoPlateauStatues_id - TextPredefs) / 2 + 1
db_tx_pre IndigoPlateauStatues
db HOUSE, $3D
db (TownMapText_id - TextPredefs) / 2 + 1
db_tx_pre TownMapText
db HOUSE, $1E
db (BookOrSculptureText_id - TextPredefs) / 2 + 1
db_tx_pre BookOrSculptureText
db MANSION, $32
db (BookOrSculptureText_id - TextPredefs) / 2 + 1
db_tx_pre BookOrSculptureText
db REDS_HOUSE_1, $32
db (BookOrSculptureText_id - TextPredefs) / 2 + 1
db_tx_pre BookOrSculptureText
db LAB, $28
db (BookOrSculptureText_id - TextPredefs) / 2 + 1
db_tx_pre BookOrSculptureText
db LOBBY, $16
db (ElevatorText_id - TextPredefs) / 2 + 1
db_tx_pre ElevatorText
db GYM, $1D
db (BookOrSculptureText_id - TextPredefs) / 2 + 1
db_tx_pre BookOrSculptureText
db DOJO, $1D
db (BookOrSculptureText_id - TextPredefs) / 2 + 1
db_tx_pre BookOrSculptureText
db GATE, $22
db (BookOrSculptureText_id - TextPredefs) / 2 + 1
db_tx_pre BookOrSculptureText
db MART, $54
db (PokemonStuffText_id - TextPredefs) / 2 + 1
db_tx_pre PokemonStuffText
db MART, $55
db (PokemonStuffText_id - TextPredefs) / 2 + 1
db_tx_pre PokemonStuffText
db POKECENTER, $54
db (PokemonStuffText_id - TextPredefs) / 2 + 1
db_tx_pre PokemonStuffText
db POKECENTER, $55
db (PokemonStuffText_id - TextPredefs) / 2 + 1
db_tx_pre PokemonStuffText
db LOBBY, $50
db (PokemonStuffText_id - TextPredefs) / 2 + 1
db_tx_pre PokemonStuffText
db LOBBY, $52
db (PokemonStuffText_id - TextPredefs) / 2 + 1
db_tx_pre PokemonStuffText
db SHIP, $36
db (BookOrSculptureText_id - TextPredefs) / 2 + 1
db_tx_pre BookOrSculptureText
db $FF
IndigoPlateauStatues:
@ -81,9 +81,9 @@ IndigoPlateauStatues:
ld a, [wXCoord]
bit 0, a
ld hl, IndigoPlateauStatuesText2
jr nz, .asm_fbd3
jr nz, .ok
ld hl, IndigoPlateauStatuesText3
.asm_fbd3
.ok
call PrintText
jp TextScriptEnd
@ -104,12 +104,12 @@ BookOrSculptureText:
ld hl, PokemonBooksText
ld a, [wCurMapTileset]
cp MANSION ; Celadon Mansion tileset
jr nz, .asm_fbfd
jr nz, .ok
aCoord 8, 6
cp $38
jr nz, .asm_fbfd
jr nz, .ok
ld hl, DiglettSculptureText
.asm_fbfd
.ok
call PrintText
jp TextScriptEnd

View File

@ -70,10 +70,10 @@ SafariZoneGameOver:
ld c, BANK(SFX_Safari_Zone_PA)
ld a, SFX_SAFARI_ZONE_PA
call PlayMusic
.asm_1e9c2
.waitForMusicToPlay
ld a, [wChannelSoundIDs + CH4]
cp $b9
jr nz, .asm_1e9c2
cp SFX_SAFARI_ZONE_PA
jr nz, .waitForMusicToPlay
ld a, TEXT_SAFARI_GAME_OVER
ld [hSpriteIndexOrTextID], a
call DisplayTextID
@ -100,10 +100,10 @@ SafariGameOverText:
TX_ASM
ld a, [wNumSafariBalls]
and a
jr z, .asm_1ea04
jr z, .noMoreSafariBalls
ld hl, TimesUpText
call PrintText
.asm_1ea04
.noMoreSafariBalls
ld hl, GameOverText
call PrintText
jp TextScriptEnd
@ -326,14 +326,14 @@ BillsHousePC:
cp SPRITE_FACING_UP
ret nz
CheckEvent EVENT_LEFT_BILLS_HOUSE_AFTER_HELPING
jr nz, .asm_1ebd2
jr nz, .displayBillsHousePokemonList
CheckEventReuseA EVENT_USED_CELL_SEPARATOR_ON_BILL
jr nz, .asm_1eb86
jr nz, .displayBillsHouseMonitorText
CheckEventReuseA EVENT_BILL_SAID_USE_CELL_SEPARATOR
jr nz, .asm_1eb8b
.asm_1eb86
jr nz, .doCellSeparator
.displayBillsHouseMonitorText
tx_pre_jump BillsHouseMonitorText
.asm_1eb8b
.doCellSeparator
ld a, $1
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
tx_pre BillsHouseInitiatedText
@ -360,7 +360,7 @@ BillsHousePC:
call PlayDefaultMusic
SetEvent EVENT_USED_CELL_SEPARATOR_ON_BILL
ret
.asm_1ebd2
.displayBillsHousePokemonList
ld a, $1
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
tx_pre BillsHousePokemonList

View File

@ -87,6 +87,7 @@ UpdateHPBar2:
call UpdateHPBar_CompareNewHPToOldHP
jr z, .animateHPBarDone
jr nc, .HPIncrease
; HP decrease
dec bc ; subtract 1 HP
ld a, c
ld [wHPBarNewHP], a
@ -95,7 +96,7 @@ UpdateHPBar2:
call UpdateHPBar_CalcOldNewHPBarPixels
ld a, e
sub d ; calc pixel difference
jr .asm_fa7e
jr .ok
.HPIncrease
inc bc ; add 1 HP
ld a, c
@ -105,7 +106,7 @@ UpdateHPBar2:
call UpdateHPBar_CalcOldNewHPBarPixels
ld a, d
sub e ; calc pixel difference
.asm_fa7e
.ok
call UpdateHPBar_PrintHPNumber
and a
jr z, .noPixelDifference

View File

@ -21,7 +21,7 @@ DoInGameTradeDialogue:
call CopyData
pop af
ld l,a
ld h,$0
ld h,0
ld de,InGameTradeTextPointers
add hl,hl
add hl,de

View File

@ -305,7 +305,7 @@ PlayShootingStar:
ld b, SET_PAL_GAME_FREAK_INTRO
call RunPaletteCommand
callba LoadCopyrightAndTextBoxTiles
ld a, $e4
ld a, %11100100
ld [rBGP], a
ld c, 180
call DelayFrames

View File

@ -697,7 +697,7 @@ ItemUseSurfboard:
ld hl,TilePairCollisionsWater
call CheckForTilePairCollisions
jr c,.cannotStopSurfing
ld hl,wTileSetCollisionPtr ; pointer to list of passable tiles
ld hl,wTilesetCollisionPtr ; pointer to list of passable tiles
ld a,[hli]
ld h,[hl]
ld l,a ; hl now points to passable tiles

View File

@ -248,7 +248,7 @@ BillsPCDeposit:
add "1"
.next
ld [hli], a
ld [hl], $50
ld [hl], "@"
ld hl, MonWasStoredText
call PrintText
jp BillsPCMenu

View File

@ -7,7 +7,7 @@ AskName:
coord hl, 0, 0
ld b, 4
ld c, 11
call z, ClearScreenArea ; only if in wild batle
call z, ClearScreenArea ; only if in wild battle
ld a, [wcf91]
ld [wd11e], a
call GetMonName
@ -40,7 +40,7 @@ AskName:
pop af
ld [wUpdateSpritesEnabled], a
ld a, [wcf4b]
cp $50
cp "@"
ret nz
.declinedNickname
ld d, h
@ -108,7 +108,7 @@ DisplayNamingScreen:
ld [wMenuWatchedKeys], a
ld a, 7
ld [wMaxMenuItem], a
ld a, $50
ld a, "@"
ld [wcf4b], a
xor a
ld hl, wNamingScreenSubmitName
@ -153,7 +153,7 @@ DisplayNamingScreen:
ld h, [hl]
ld l, a
push de
jp [hl]
jp hl
.submitNickname
pop de
@ -259,7 +259,7 @@ DisplayNamingScreen:
.addLetter
ld a, [wNamingScreenLetter]
ld [hli], a
ld [hl], $50
ld [hl], "@"
ld a, SFX_PRESS_AB
call PlaySound
ret

View File

@ -7,9 +7,9 @@ OpenOaksPC:
call YesNoChoice
ld a, [wCurrentMenuItem]
and a
jr nz, .asm_1e932
jr nz, .closePC
predef DisplayDexRating
.asm_1e932
.closePC
ld hl, ClosedOaksPCText
call PrintText
jp LoadScreenTilesFromBuffer2

View File

@ -121,18 +121,18 @@ RemoveItemByID:
ld b, a
xor a
ld [hItemToRemoveIndex], a
.asm_17f40
.loop
ld a, [hli]
cp $ff
cp -1 ; reached terminator?
ret z
cp b
jr z, .asm_17f4f
jr z, .foundItem
inc hl
ld a, [hItemToRemoveIndex]
inc a
ld [hItemToRemoveIndex], a
jr .asm_17f40
.asm_17f4f
jr .loop
.foundItem
ld a, $1
ld [wItemQuantity], a
ld a, [hItemToRemoveIndex]

View File

@ -125,6 +125,7 @@ HandlePokedexSideMenu:
call DrawTileLine ; cover up the menu cursor in the pokemon list
pop bc
ret
.buttonBPressed
push bc
coord hl, 15, 10
@ -133,16 +134,19 @@ HandlePokedexSideMenu:
call DrawTileLine ; cover up the menu cursor in the side menu
pop bc
jr .exitSideMenu
.choseData
call ShowPokedexDataInternal
ld b,0
jr .exitSideMenu
; play pokemon cry
.choseCry
ld a,[wd11e]
call GetCryData
call PlaySound
jr .handleMenuInput
.choseArea
predef LoadTownMap_Nest ; display pokemon areas
ld b,0
@ -206,6 +210,7 @@ HandlePokedexListMenu:
dec c
jr nz,.maxSeenPokemonInnerLoop
jr .maxSeenPokemonLoop
.storeMaxSeenPokemon
ld a,b
ld [wDexMaxSeenMon],a
@ -409,20 +414,25 @@ ShowPokedexDataInternal:
push af
xor a
ld [hTilesetType],a
coord hl, 0, 0
ld de,1
lb bc, $64, SCREEN_WIDTH
call DrawTileLine ; draw top border
coord hl, 0, 17
ld b, $6f
call DrawTileLine ; draw bottom border
coord hl, 0, 1
ld de,20
lb bc, $66, $10
call DrawTileLine ; draw left border
coord hl, 19, 1
ld b,$67
call DrawTileLine ; draw right border
ld a,$63 ; upper left corner tile
Coorda 0, 0
ld a,$65 ; upper right corner tile
@ -431,15 +441,19 @@ ShowPokedexDataInternal:
Coorda 0, 17
ld a,$6e ; lower right corner tile
Coorda 19, 17
coord hl, 0, 9
ld de,PokedexDataDividerLine
call PlaceString ; draw horizontal divider line
coord hl, 9, 6
ld de,HeightWeightText
call PlaceString
call GetMonName
coord hl, 9, 2
call PlaceString
ld hl,PokedexEntryPointers
ld a,[wd11e]
dec a
@ -450,14 +464,17 @@ ShowPokedexDataInternal:
ld a,[hli]
ld e,a
ld d,[hl] ; de = address of pokedex entry
coord hl, 9, 4
call PlaceString ; print species name
ld h,b
ld l,c
push de
ld a,[wd11e]
push af
call IndexToPokedex
coord hl, 2, 8
ld a, "№"
ld [hli],a
@ -466,6 +483,7 @@ ShowPokedexDataInternal:
ld de,wd11e
lb bc, LEADING_ZEROES | 1, 3
call PrintNumber ; print pokedex number
ld hl,wPokedexOwned
call IsPokemonBitSet
pop af
@ -473,10 +491,12 @@ ShowPokedexDataInternal:
ld a,[wcf91]
ld [wd0b5],a
pop de
push af
push bc
push de
push hl
call Delay3
call GBPalNormal
call GetMonHeader ; load pokemon picture location
@ -484,10 +504,12 @@ ShowPokedexDataInternal:
call LoadFlippedFrontSpriteByMonIndex ; draw pokemon picture
ld a,[wcf91]
call PlayCry ; play pokemon cry
pop hl
pop de
pop bc
pop af
ld a,c
and a
jp z,.waitForButtonPress ; if the pokemon has not been owned, don't print the height, weight, or description

View File

@ -23,8 +23,8 @@ CeladonPrizeMenu:
ld [wTopMenuItemX],a
call PrintPrizePrice
coord hl, 0, 2
ld b,$08
ld c,$10
ld b, 8
ld c, 16
call TextBoxBorder
call GetPrizeMenuId
call UpdateSprites
@ -32,12 +32,12 @@ CeladonPrizeMenu:
call PrintText
call HandleMenuInput ; menu choice handler
bit 1,a ; keypress = B (Cancel)
jr nz,.NoChoice
jr nz, .noChoice
ld a,[wCurrentMenuItem]
cp a,$03 ; "NO,THANKS" choice
jr z,.NoChoice
cp 3 ; "NO,THANKS" choice
jr z, .noChoice
call HandlePrizeChoice
.NoChoice
.noChoice
ld hl,wd730
res 6,[hl]
ret
@ -65,7 +65,7 @@ GetPrizeMenuId:
; (distinguishing between Pokemon names
; and Items (specifically TMs) names)
ld a,[hSpriteIndexOrTextID]
sub a,3 ; prize-texts' id are 3, 4 and 5
sub 3 ; prize-texts' id are 3, 4 and 5
ld [wWhichPrizeWindow],a ; prize-texts' id (relative, i.e. 0, 1 or 2)
add a
add a
@ -88,7 +88,7 @@ GetPrizeMenuId:
ld bc,6
call CopyData
ld a,[wWhichPrizeWindow]
cp a,$02 ;is TM_menu?
cp 2 ;is TM_menu?
jr nz,.putMonName
ld a,[wPrize1]
ld [wd11e],a
@ -138,7 +138,7 @@ GetPrizeMenuId:
call PrintBCDNumber
ld de,wPrize2Price
coord hl, 13, 7
ld c,(%1 << 7 | 2)
ld c,(1 << 7 | 2)
call PrintBCDNumber
ld de,wPrize3Price
coord hl, 13, 9
@ -149,15 +149,15 @@ INCLUDE "data/prizes.asm"
PrintPrizePrice:
coord hl, 11, 0
ld b,$01
ld c,$07
ld b, 1
ld c, 7
call TextBoxBorder
call UpdateSprites
coord hl, 12, 0
ld de,.CoinText
ld de, .CoinString
call PlaceString
coord hl, 13, 1
ld de,.SixSpacesText
ld de, .SixSpacesString
call PlaceString
coord hl, 13, 1
ld de,wPlayerCoins
@ -165,10 +165,10 @@ PrintPrizePrice:
call PrintBCDNumber
ret
.CoinText
.CoinString:
db "COIN@"
.SixSpacesText
.SixSpacesString:
db " @"
LoadCoinsToSubtract:
@ -196,33 +196,33 @@ HandlePrizeChoice:
ld a,[hl]
ld [wd11e],a
ld a,[wWhichPrizeWindow]
cp a,$02 ; is prize a TM?
jr nz,.GetMonName
cp 2 ; is prize a TM?
jr nz, .getMonName
call GetItemName
jr .GivePrize
.GetMonName
jr .givePrize
.getMonName
call GetMonName
.GivePrize
.givePrize
ld hl,SoYouWantPrizeTextPtr
call PrintText
call YesNoChoice
ld a,[wCurrentMenuItem] ; yes/no answer (Y=0, N=1)
and a
jr nz,.PrintOhFineThen
jr nz, .printOhFineThen
call LoadCoinsToSubtract
call HasEnoughCoins
jr c,.NotEnoughCoins
jr c, .notEnoughCoins
ld a,[wWhichPrizeWindow]
cp a,$02
jr nz,.GiveMon
cp $02
jr nz, .giveMon
ld a,[wd11e]
ld b,a
ld a,1
ld c,a
call GiveItem
jr nc,.BagFull
jr .SubtractCoins
.GiveMon
jr nc, .bagFull
jr .subtractCoins
.giveMon
ld a,[wd11e]
ld [wcf91],a
push af
@ -243,24 +243,24 @@ HandlePrizeChoice:
; were full), return without subtracting coins.
ret nc
.SubtractCoins
.subtractCoins
call LoadCoinsToSubtract
ld hl,hCoins + 1
ld de,wPlayerCoins + 1
ld c,$02 ; how many bytes
predef SubBCDPredef
jp PrintPrizePrice
.BagFull
.bagFull
ld hl,PrizeRoomBagIsFullTextPtr
jp PrintText
.NotEnoughCoins
.notEnoughCoins
ld hl,SorryNeedMoreCoinsText
jp PrintText
.PrintOhFineThen
.printOhFineThen
ld hl,OhFineThenTextPtr
jp PrintText
UnknownData52951:
UnknownPrizeData:
; XXX what's this?
db $00,$01,$00,$01,$00,$01,$00,$00,$01

View File

@ -34,7 +34,7 @@ StartMenu_Pokemon:
ld [wTextBoxID],a
call DisplayTextBoxID ; display pokemon menu options
ld hl,wFieldMoves
lb bc, $02, $0c ; max menu item ID, top menu item Y
lb bc, 2, 12 ; max menu item ID, top menu item Y
ld e,5
.adjustMenuVariablesLoop
dec e
@ -222,7 +222,7 @@ StartMenu_Pokemon:
res 4,[hl]
ld c,60
call DelayFrames
call GBPalWhiteOutWithDelay3 ; zero all three palettes and wait 3 V-blanks
call GBPalWhiteOutWithDelay3
jp .goBackToMap
.warpToLastPokemonCenterText
TX_FAR _WarpToLastPokemonCenterText

View File

@ -250,16 +250,16 @@ PrintStatsBox:
and a ; a is 0 from the status screen
jr nz, .DifferentBox
coord hl, 0, 8
ld b, $8
ld c, $8
ld b, 8
ld c, 8
call TextBoxBorder ; Draws the box
coord hl, 1, 9 ; Start printing stats from here
ld bc, $0019 ; Number offset
jr .PrintStats
.DifferentBox
coord hl, 9, 2
ld b, $8
ld c, $9
ld b, 8
ld c, 9
call TextBoxBorder
coord hl, 11, 3
ld bc, $0018
@ -280,7 +280,7 @@ PrintStatsBox:
call PrintStat
ld de, wLoadedMonSpecial
jp PrintNumber
PrintStat
PrintStat:
push hl
call PrintNumber
pop hl

View File

@ -131,6 +131,9 @@ LoadVendingMachineItem:
ret
VendingPrices:
db FRESH_WATER,$00,$02,$00
db SODA_POP, $00,$03,$00
db LEMONADE, $00,$03,$50
db FRESH_WATER
money 200
db SODA_POP
money 300
db LEMONADE
money 350

View File

@ -132,7 +132,7 @@ LoadMonPartySpriteGfxWithLCDDisabled:
ld hl, MonPartySpritePointers
ld a, $1c
ld bc, $0
.asm_7179c
.loop
push af
push bc
push hl
@ -159,7 +159,7 @@ LoadMonPartySpriteGfxWithLCDDisabled:
ld c, a
pop af
dec a
jr nz, .asm_7179c
jr nz, .loop
jp EnableLCD
MonPartySpritePointers:

View File

@ -6,7 +6,7 @@ SetDefaultNames:
ld a, [wd732]
push af
ld hl, wPlayerName
ld bc, $d8a
ld bc, wBoxDataEnd - wPlayerName
xor a
call FillMemory
ld hl, wSpriteStateData1
@ -195,7 +195,7 @@ MovePicLeft:
ld [rWX],a
call DelayFrame
ld a,$E4
ld a,%11100100
ld [rBGP],a
.next
call DelayFrame

View File

@ -74,7 +74,7 @@ UsedCutText:
InitCutAnimOAM:
xor a
ld [wWhichAnimationOffsets], a
ld a, $e4
ld a, %11100100
ld [rOBP1], a
ld a, [wCutTile]
cp $52

View File

@ -34,7 +34,7 @@ ShakeElevator:
call PlayMusic
.musicLoop
ld a, [wChannelSoundIDs + CH4]
cp $b9
cp SFX_SAFARI_ZONE_PA
jr z, .musicLoop
call UpdateSprites
jp PlayDefaultMusic
@ -56,7 +56,7 @@ ShakeElevatorRedrawRow:
add hl, de
ld a, h
and $3
or $98
or vBGMap0 / $100
ld d, a
ld a, l
pop hl

View File

@ -17,11 +17,11 @@ EmotionBubble:
ld [wUpdateSpritesEnabled], a
ld a, [wd736]
bit 6, a ; are the last 4 OAM entries reserved for a shadow or fishing rod?
ld hl, wOAMBuffer + $8f
ld de, wOAMBuffer + $9f
ld hl, wOAMBuffer + 4 * 35 + $3 ; $8f
ld de, wOAMBuffer + 4 * 39 + $3 ; $9f
jr z, .next
ld hl, wOAMBuffer + $7f
ld de, wOAMBuffer + $8f
ld hl, wOAMBuffer + 4 * 31 + $3 ; $7f
ld de, wOAMBuffer + 4 * 35 + $3 ; $8f
; Copy OAM data 16 bytes forward to make room for emotion bubble OAM data at the
; start of the OAM buffer.

View File

@ -27,7 +27,7 @@ FoundHiddenItemText:
ld b, a
ld c, 1
call GiveItem
jr nc, .BagFull
jr nc, .bagFull
ld hl, wObtainedHiddenItemsFlags
ld a, [wHiddenItemOrCoinsIndex]
ld c, a
@ -37,7 +37,7 @@ FoundHiddenItemText:
call PlaySoundWaitForCurrent
call WaitForSoundToFinish
jp TextScriptEnd
.BagFull
.bagFull
call WaitForTextScrollButtonPress ; wait for button press
xor a
ld [wDoNotWaitForButtonPressAfterDisplayingText], a
@ -77,24 +77,24 @@ HiddenCoins:
cp 20
jr z, .bcd20
cp 40
jr z, .bcd20
jr z, .bcd20 ; should be bcd40
jr .bcd100
.bcd10
ld a, $10
ld [hCoins + 1], a
jr .bcddone
jr .bcdDone
.bcd20
ld a, $20
ld [hCoins + 1], a
jr .bcddone
jr .bcdDone
.bcd40 ; due to a typo, this is never used
ld a, $40
ld [hCoins + 1], a
jr .bcddone
jr .bcdDone
.bcd100
ld a, $1
ld [hCoins], a
.bcddone
.bcdDone
ld de, wPlayerCoins + 1
ld hl, hCoins + 1
ld c, $2
@ -107,13 +107,13 @@ HiddenCoins:
call EnableAutoTextBoxDrawing
ld a, [wPlayerCoins]
cp $99
jr nz, .RoomInCoinCase
jr nz, .roomInCoinCase
ld a, [wPlayerCoins + 1]
cp $99
jr nz, .RoomInCoinCase
jr nz, .roomInCoinCase
tx_pre_id DroppedHiddenCoinsText
jr .done
.RoomInCoinCase
.roomInCoinCase
tx_pre_id FoundHiddenCoinsText
.done
jp PrintPredefTextID

View File

@ -393,7 +393,7 @@ UpdateSpriteMovementDelay:
ld l, a
ld [hl], $1 ; c1x1 = 1 (mark as ready to move)
notYetMoving:
ld h, $c1
ld h, wSpriteStateData1 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add $8
ld l, a
@ -408,7 +408,6 @@ MakeNPCFacePlayer:
ld a, [wd72d]
bit 5, a
jr nz, notYetMoving
res 7, [hl]
ld a, [wPlayerDirection]
bit PLAYER_DIR_BIT_UP, a
@ -449,7 +448,7 @@ InitializeSpriteStatus:
; calculates the spprite's scrren position form its map position and the player position
InitializeSpriteScreenPosition:
ld h, $c2
ld h, wSpriteStateData2 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add $4
ld l, a
@ -477,7 +476,7 @@ CheckSpriteAvailability:
ld a, [$ffe5]
and a
jp nz, .spriteInvisible
ld h, $c2
ld h, wSpriteStateData2 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add $6
ld l, a
@ -525,7 +524,7 @@ CheckSpriteAvailability:
cp d
jr c, .spriteVisible ; standing on tile with ID >=$60 (top right tile)
.spriteInvisible
ld h, $c1
ld h, wSpriteStateData1 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add $2
ld l, a
@ -579,7 +578,7 @@ UpdateSpriteImage:
; e: X movement delta (-1, 0 or 1)
; set carry on failure, clears carry on success
CanWalkOntoTile:
ld h, $c2
ld h, wSpriteStateData2 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add $6
ld l, a
@ -590,9 +589,9 @@ CanWalkOntoTile:
and a
ret
.notScripted
ld a, [wTileSetCollisionPtr]
ld a, [wTilesetCollisionPtr]
ld l, a
ld a, [wTileSetCollisionPtr+1]
ld a, [wTilesetCollisionPtr+1]
ld h, a
.tilePassableLoop
ld a, [hli]
@ -607,7 +606,7 @@ CanWalkOntoTile:
ld a, [hl] ; $c2x6 (movement byte 1)
inc a
jr z, .impassable ; if $ff, no movement allowed (however, changing direction is)
ld h, $c1
ld h, wSpriteStateData1 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add $4
ld l, a
@ -626,14 +625,14 @@ CanWalkOntoTile:
call DetectCollisionBetweenSprites
pop bc
pop de
ld h, $c1
ld h, wSpriteStateData1 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add $c
ld l, a
ld a, [hl] ; c1xc (directions in which sprite collision would occur)
and b ; check against chosen direction (1,2,4 or 8)
jr nz, .impassable ; collision between sprites, don't go there
ld h, $c2
ld h, wSpriteStateData2 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add $2
ld l, a
@ -690,7 +689,7 @@ CanWalkOntoTile:
; this is always the lower left tile of the 2x2 tile blocks all sprites are snapped to
; hl: output pointer
GetTileSpriteStandsOn:
ld h, $c1
ld h, wSpriteStateData1 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add $4
ld l, a

View File

@ -6,7 +6,7 @@ PrepareOAMData:
dec a
jr z, .updateEnabled
cp 0 - 1
cp -1
ret nz
ld [wUpdateSpritesEnabled], a
jp HideSprites

View File

@ -388,7 +388,7 @@ FishingAnim:
set 6, [hl] ; reserve the last 4 OAM entries
ld de, RedSprite
ld hl, vNPCSprites
lb bc, BANK(RedSprite), $0c
lb bc, BANK(RedSprite), $c
call CopyVideoData
ld a, $4
ld hl, RedFishingTiles

View File

@ -85,7 +85,7 @@ DisplayPokemartDialogue_:
lb bc, 14, 1 ; location that PrintText always prints to, this is useless
call PrintText
coord hl, 14, 7
lb bc, 08, 15
lb bc, 8, 15
ld a,TWO_OPTION_MENU
ld [wTextBoxID],a
call DisplayTextBoxID ; yes/no menu

View File

@ -4,16 +4,16 @@ _GetSpritePosition1:
ld a, [wSpriteIndex]
ld [H_SPRITEINDEX], a
call GetSpriteDataPointer
ld a, [hli]
ld a, [hli] ; c1x4 (screen Y pos)
ld [$ffeb], a
inc hl
ld a, [hl]
ld a, [hl] ; c1x6 (screen X pos)
ld [$ffec], a
ld de, $fe
ld de, (wSpriteStateData2 + $4) - (wSpriteStateData1 + $6)
add hl, de
ld a, [hli]
ld a, [hli] ; c2x4 (map Y pos)
ld [$ffed], a
ld a, [hl]
ld a, [hl] ; c2x5 (map X pos)
ld [$ffee], a
ret
@ -28,7 +28,7 @@ _GetSpritePosition2:
inc hl
ld a, [hl] ; c1x6 (screen X pos)
ld [wSavedSpriteScreenX], a
ld de, $104 - $6
ld de, (wSpriteStateData2 + $4) - (wSpriteStateData1 + $6)
add hl, de
ld a, [hli] ; c2x4 (map Y pos)
ld [wSavedSpriteMapY], a
@ -47,7 +47,7 @@ _SetSpritePosition1:
inc hl
ld a, [$ffec] ; c1x6 (screen X pos)
ld [hl], a
ld de, $104 - $6
ld de, (wSpriteStateData2 + $4) - (wSpriteStateData1 + $6)
add hl, de
ld a, [$ffed] ; c2x4 (map Y pos)
ld [hli], a
@ -57,21 +57,21 @@ _SetSpritePosition1:
_SetSpritePosition2:
ld hl, wSpriteStateData1
ld de, $0004
ld de, 4
ld a, [wSpriteIndex]
ld [H_SPRITEINDEX], a
call GetSpriteDataPointer
ld a, [wSavedSpriteScreenY]
ld [hli], a
ld [hli], a ; c1x4 (screen Y pos)
inc hl
ld a, [wSavedSpriteScreenX]
ld [hl], a
ld de, $00fe
ld [hl], a ; c1x6 (screen X pos)
ld de, (wSpriteStateData2 + $4) - (wSpriteStateData1 + $6)
add hl, de
ld a, [wSavedSpriteMapY]
ld [hli], a
ld [hli], a ; c2x4 (map Y pos)
ld a, [wSavedSpriteMapX]
ld [hl], a
ld [hl], a ; c2x5 (map X pos)
ret
TrainerWalkUpToPlayer:
@ -80,11 +80,11 @@ TrainerWalkUpToPlayer:
ld [wTrainerSpriteOffset], a
call ReadTrainerScreenPosition
ld a, [wTrainerFacingDirection]
and a
and a ; SPRITE_FACING_DOWN
jr z, .facingDown
cp $4
cp SPRITE_FACING_UP
jr z, .facingUp
cp $8
cp SPRITE_FACING_LEFT
jr z, .facingLeft
jr .facingRight
.facingDown
@ -148,7 +148,7 @@ TrainerWalkUpToPlayer:
jp MoveSprite_
; input: de = offset within sprite entry
; output: de = pointer to sprite data
; output: hl = pointer to sprite data
GetSpriteDataPointer:
push de
add hl, de
@ -225,7 +225,7 @@ TrainerEngage:
set 0, [hl]
call EngageMapTrainer
ld a, $ff
.noEngage:
.noEngage
ld [wTrainerSpriteOffset], a
pop de
pop hl
@ -239,7 +239,7 @@ ReadTrainerScreenPosition:
ld e, a
ld hl, wSpriteStateData1
add hl, de
ld a, [hl]
ld a, [hl] ; c1x4 (sprite Y pos)
ld [wTrainerScreenY], a
ld a, [wTrainerSpriteOffset]
add $6
@ -247,7 +247,7 @@ ReadTrainerScreenPosition:
ld e, a
ld hl, wSpriteStateData1
add hl, de
ld a, [hl]
ld a, [hl] ; c1x6 (sprite X pos)
ld [wTrainerScreenX], a
ret
@ -262,13 +262,13 @@ CheckSpriteCanSeePlayer:
jr .notInLine ; player too far away
.checkIfLinedUp
ld a, [wTrainerFacingDirection] ; sprite facing direction
cp $0 ; down
cp SPRITE_FACING_DOWN
jr z, .checkXCoord
cp $4 ; up
cp SPRITE_FACING_UP
jr z, .checkXCoord
cp $8 ; left
cp SPRITE_FACING_LEFT
jr z, .checkYCoord
cp $c ; right
cp SPRITE_FACING_RIGHT
jr z, .checkYCoord
jr .notInLine
.checkXCoord
@ -315,21 +315,21 @@ CheckPlayerIsInFrontOfSprite:
ld a, [hl] ; c1x6 (sprite screen X pos)
ld [wTrainerScreenX], a
ld a, [wTrainerFacingDirection] ; facing direction
cp $0
cp SPRITE_FACING_DOWN
jr nz, .notFacingDown
ld a, [wTrainerScreenY] ; sprite screen Y pos
cp $3c
jr c, .engage ; sprite above player
jr .noEngage ; sprite below player
.notFacingDown
cp $4
cp SPRITE_FACING_UP
jr nz, .notFacingUp
ld a, [wTrainerScreenY] ; sprite screen Y pos
cp $3c
jr nc, .engage ; sprite below player
jr .noEngage ; sprite above player
.notFacingUp
cp $8
cp SPRITE_FACING_LEFT
jr nz, .notFacingLeft
ld a, [wTrainerScreenX] ; sprite screen X pos
cp $40

View File

@ -27,10 +27,10 @@ GetPredefPointer:
add a
add e
ld e,a
jr nc,.next
jr nc, .nocarry
inc d
.next
.nocarry
add hl,de
ld d,h
ld e,l
@ -60,7 +60,7 @@ PredefPointers::
add_predef CopyDownscaledMonTiles
add_predef LoadMissableObjects
add_predef HealParty
add_predef MoveAnimation; 08 play move animation
add_predef MoveAnimation
add_predef DivideBCDPredef
add_predef DivideBCDPredef2
add_predef AddBCDPredef
@ -81,8 +81,8 @@ PredefPointers::
add_predef LearnMoveFromLevelUp
add_predef LearnMove
add_predef GetQuantityOfItemInBag
dbw $03,CheckForHiddenObjectOrBookshelfOrCardKeyDoor ; for these two, the bank number is actually 0
dbw $03,GiveItem
dbw $03,CheckForHiddenObjectOrBookshelfOrCardKeyDoor ; home bank
dbw $03,GiveItem ; home bank
add_predef ChangeBGPalColor0_4Frames
add_predef FindPathToPlayer
add_predef PredefShakeScreenVertically
@ -122,7 +122,7 @@ PredefPointers::
add_predef CanLearnTM
add_predef TMToMove
add_predef _RunPaletteCommand
add_predef StarterDex ; 46
add_predef StarterDex
add_predef _AddPartyMon
add_predef UpdateHPBar2
add_predef DrawEnemyHUDAndHPBar
@ -147,7 +147,7 @@ PredefPointers::
add_predef PickUpItem
add_predef PrintMoveType
add_predef LoadMovePPs
add_predef DrawHP ; 5F
add_predef DrawHP
add_predef DrawHP2
add_predef DisplayElevatorFloorMenu
add_predef OaksAideScript

View File

@ -638,7 +638,7 @@ SaveHallOfFameTeams:
ld a, [wNumHoFTeams]
dec a
cp HOF_TEAM_CAPACITY
jr nc, .asm_73b28
jr nc, .shiftHOFTeams
ld hl, sHallOfFame
ld bc, HOF_TEAM
call AddNTimes
@ -648,7 +648,9 @@ SaveHallOfFameTeams:
ld bc, HOF_TEAM
jr HallOfFame_Copy
.asm_73b28
.shiftHOFTeams
; if the space designated for HOF teams is full, then shift all HOF teams to the next slot, making space for the new HOF team
; this deletes the last HOF team though
ld hl, sHallOfFame + HOF_TEAM
ld de, sHallOfFame
ld bc, HOF_TEAM * (HOF_TEAM_CAPACITY - 1)

View File

@ -865,7 +865,7 @@ LoadSlotMachineTiles:
call FarCopyData2
ld hl, SlotMachineMap
coord de, 0, 0
ld bc, $00f0
ld bc, SlotMachineMapEnd - SlotMachineMap
call CopyData
call EnableLCD
ld hl, wSlotMachineWheel1Offset
@ -879,6 +879,7 @@ LoadSlotMachineTiles:
SlotMachineMap:
INCBIN "gfx/tilemaps/slotmachine.map"
SlotMachineMapEnd:
INCLUDE "data/slot_machine_wheels.asm"

View File

@ -169,7 +169,7 @@ ENDC
db -1,2
db 0 ; terminate list with 0
.ScrollTitleScreenPokemonLogo
.ScrollTitleScreenPokemonLogo:
; Scrolls the Pokemon logo on the title screen to create the bouncing effect
; Scrolls d pixels e times
call DelayFrame

View File

@ -67,7 +67,7 @@ _TitleScroll:
pop bc
jr _TitleScroll
.ScrollBetween
.ScrollBetween:
.wait
ld a, [rLY] ; rLY
cp l

View File

@ -141,7 +141,7 @@ LoadTownMap_Fly:
call LoadFontTilePatterns
ld de, BirdSprite
ld hl, vSprites + $40
lb bc, BANK(BirdSprite), $0c
lb bc, BANK(BirdSprite), $c
call CopyVideoData
ld de, TownMapUpArrow
ld hl, vChars1 + $6d0
@ -355,12 +355,12 @@ DrawPlayerOrBirdSprite:
call WritePlayerOrBirdSpriteOAM
pop hl
ld de, wcd6d
.asm_711dc
.loop
ld a, [hli]
ld [de], a
inc de
cp $50
jr nz, .asm_711dc
cp "@"
jr nz, .loop
ld hl, wOAMBuffer
ld de, wTileMapBackup
ld bc, $a0
@ -397,8 +397,8 @@ DisplayWildLocations:
jr nz, .drawPlayerSprite
; if no OAM entries were written, print area unknown text
coord hl, 1, 7
ld b, $2
ld c, $f
ld b, 2
ld c, 15
call TextBoxBorder
coord hl, 2, 9
ld de, AreaUnknownText

View File

@ -305,7 +305,7 @@ Trade_AnimateBallEnteringLinkCable:
ld [rOBP0], a
xor a
ld [wLinkCableAnimBulgeToggle], a
ld bc, $2060
lb bc, $20, $60
.moveBallInsideLinkCableLoop
push bc
xor a
@ -380,7 +380,7 @@ Trade_AnimLeftToRight:
call Trade_InitGameboyTransferGfx
ld a, $1
ld [wTradedMonMovingRight], a
ld a, $e4
ld a, %11100100
ld [rOBP0], a
ld a, $54
ld [wBaseCoordX], a
@ -466,7 +466,7 @@ Trade_DrawLeftGameboy:
ld a, $5d
ld [hli], a
ld a, $5e
ld c, $8
ld c, 8
.loop
ld [hli], a
dec c
@ -526,8 +526,8 @@ Trade_DrawRightGameboy:
; draw text box with enemy name above link cable
coord hl, 6, 0
ld b, $2
ld c, $7
ld b, 2
ld c, 7
call TextBoxBorder
coord hl, 7, 2
ld de, wLinkEnemyTrainerName

129
home.asm
View File

@ -117,7 +117,6 @@ INCLUDE "home/joypad.asm"
INCLUDE "data/map_header_pointers.asm"
INCLUDE "home/overworld.asm"
CheckForUserInterruption::
; Return carry if Up+Select+B, Start or A are pressed in c frames.
; Used only in the intro and title screen.
@ -255,7 +254,6 @@ DrawHPBar::
LoadMonData::
jpab LoadMonData_
OverwritewMoves::
; Write c to [wMoves + b]. Unused.
ld hl, wMoves
@ -327,7 +325,7 @@ GetCryData::
add hl, bc
add hl, bc
ld a, Bank(CryData)
ld a, BANK(CryData)
call BankswitchHome
ld a, [hli]
ld b, a ; cry id
@ -347,7 +345,6 @@ GetCryData::
add c
ret
DisplayPartyMenu::
ld a,[hTilesetType]
push af
@ -497,6 +494,7 @@ PrintStatusCondition::
ld [hl],"T"
and a
ret
PrintStatusConditionNotFainted:
ld a,[H_LOADEDROMBANK]
push af
@ -519,7 +517,7 @@ PrintLevel::
ld [hli],a
ld c,2 ; number of digits
ld a,[wLoadedMonLevel] ; level
cp a,100
cp 100
jr c,PrintLevelCommon
; if level at least 100, write over the ":L" tile
dec hl
@ -569,25 +567,25 @@ GetMonHeader::
ld [wd11e],a
ld de,FossilKabutopsPic
ld b,$66 ; size of Kabutops fossil and Ghost sprites
cp a,FOSSIL_KABUTOPS ; Kabutops fossil
cp FOSSIL_KABUTOPS ; Kabutops fossil
jr z,.specialID
ld de,GhostPic
cp a,MON_GHOST ; Ghost
cp MON_GHOST ; Ghost
jr z,.specialID
ld de,FossilAerodactylPic
ld b,$77 ; size of Aerodactyl fossil sprite
cp a,FOSSIL_AERODACTYL ; Aerodactyl fossil
cp FOSSIL_AERODACTYL ; Aerodactyl fossil
jr z,.specialID
cp a,MEW
jr z,.mew
predef IndexToPokedex ; convert pokemon ID in [wd11e] to pokedex number
ld a,[wd11e]
dec a
ld bc,MonBaseStatsEnd - MonBaseStats
ld bc, MonBaseStatsEnd - MonBaseStats
ld hl,BaseStats
call AddNTimes
ld de,wMonHeader
ld bc,MonBaseStatsEnd - MonBaseStats
ld bc, MonBaseStatsEnd - MonBaseStats
call CopyData
jr .done
.specialID
@ -703,7 +701,7 @@ PrintBCDDigit::
.skipCurrencySymbol
res 7,b ; unset 7 to indicate that a nonzero digit has been reached
.outputDigit
add a,"0"
add "0"
ld [hli],a
jp PrintLetterDelay
.zeroDigit
@ -999,15 +997,15 @@ ResetPlayerSpriteData_ClearSpriteData::
FadeOutAudio::
ld a, [wAudioFadeOutControl]
and a
jr nz, .asm_28dc
and a ; currently fading out audio?
jr nz, .fadingOut
ld a, [wd72c]
bit 1, a
ret nz
ld a, $77
ld [rNR50], a
ret
.asm_28dc
.fadingOut
ld a, [wAudioFadeOutCounter]
and a
jr z, .counterReachedZero
@ -1018,8 +1016,8 @@ FadeOutAudio::
ld a, [wAudioFadeOutCounterReloadValue]
ld [wAudioFadeOutCounter], a
ld a, [rNR50]
and a
jr z, .asm_2903
and a ; has the volume reached 0?
jr z, .fadeOutComplete
ld b, a
and $f
dec a
@ -1032,7 +1030,7 @@ FadeOutAudio::
or c
ld [rNR50], a
ret
.asm_2903
.fadeOutComplete
ld a, [wAudioFadeOutControl]
ld b, a
xor a
@ -1070,13 +1068,13 @@ DisplayTextID::
ld [wSpriteIndex],a
and a
jp z,DisplayStartMenu
cp a,TEXT_SAFARI_GAME_OVER
cp TEXT_SAFARI_GAME_OVER
jp z,DisplaySafariGameOverText
cp a,TEXT_MON_FAINTED
cp TEXT_MON_FAINTED
jp z,DisplayPokemonFaintedText
cp a,TEXT_BLACKED_OUT
cp TEXT_BLACKED_OUT
jp z,DisplayPlayerBlackedOutText
cp a,TEXT_REPEL_WORE_OFF
cp TEXT_REPEL_WORE_OFF
jp z,DisplayRepelWoreOffText
ld a,[wNumSprites]
ld e,a
@ -1115,24 +1113,24 @@ DisplayTextID::
ld l,a ; hl = address of the text
ld a,[hl] ; a = first byte of text
; check first byte of text for special cases
cp a,$fe ; Pokemart NPC
cp $fe ; Pokemart NPC
jp z,DisplayPokemartDialogue
cp a,$ff ; Pokemon Center NPC
cp $ff ; Pokemon Center NPC
jp z,DisplayPokemonCenterDialogue
cp a,$fc ; Item Storage PC
cp $fc ; Item Storage PC
jp z,FuncTX_ItemStoragePC
cp a,$fd ; Bill's PC
cp $fd ; Bill's PC
jp z,FuncTX_BillsPC
cp a,$f9 ; Pokemon Center PC
cp $f9 ; Pokemon Center PC
jp z,FuncTX_PokemonCenterPC
cp a,$f5 ; Vending Machine
cp $f5 ; Vending Machine
jr nz,.notVendingMachine
callba VendingMachineMenu ; jump banks to vending machine routine
jr AfterDisplayingTextID
.notVendingMachine
cp a,$f7 ; slot machine
jp z,FuncTX_SlotMachine
cp a,$f6 ; cable connection NPC in Pokemon Center
cp $f7 ; prize menu
jp z, FuncTX_GameCornerPrizeMenu
cp $f6 ; cable connection NPC in Pokemon Center
jr nz,.notSpecialCase
callab CableClubNPC
jr AfterDisplayingTextID
@ -1227,7 +1225,7 @@ LoadItemList::
ld a,[hli]
ld [de],a
inc de
cp a,$ff
cp $ff
jr nz,.loop
ret
@ -1381,7 +1379,7 @@ DisplayListMenuID::
ld a,$01 ; hardcoded bank
jr .bankswitch
.specialBattleType ; Old Man battle
ld a, Bank(DisplayBattleMenu)
ld a, BANK(DisplayBattleMenu)
.bankswitch
call BankswitchHome
ld hl,wd730
@ -1410,7 +1408,7 @@ DisplayListMenuID::
ld a,1 ; max menu item ID is 1 if the list has less than 2 entries
ld [wMenuWatchMovingOutOfBounds],a
ld a,[wListCount]
cp a,2 ; does the list have less than 2 entries?
cp 2 ; does the list have less than 2 entries?
jr c,.setMenuVariables
ld a,2 ; max menu item ID is 2 if the list has at least 2 entries
.setMenuVariables
@ -1480,7 +1478,7 @@ DisplayListMenuIDLoop::
ld a,c
ld [wWhichPokemon],a
ld a,[wListMenuID]
cp a,ITEMLISTMENU
cp ITEMLISTMENU
jr nz,.skipMultiplying
; if it's an item menu
sla c ; item entries are 2 bytes long, so multiply by 2
@ -1501,7 +1499,7 @@ DisplayListMenuIDLoop::
call GetItemPrice
pop hl
ld a,[wListMenuID]
cp a,ITEMLISTMENU
cp ITEMLISTMENU
jr nz,.skipGettingQuantity
; if it's an item menu
inc hl
@ -1547,7 +1545,7 @@ DisplayListMenuIDLoop::
jr z,.upPressed
.downPressed
ld a,[hl]
add a,3
add 3
ld b,a
ld a,[wListCount]
cp b ; will going down scroll past the Cancel button?
@ -1567,7 +1565,7 @@ DisplayChooseQuantityMenu::
ld b,1 ; height
ld c,3 ; width
ld a,[wListMenuID]
cp a,PRICEDITEMLISTMENU
cp PRICEDITEMLISTMENU
jr nz,.drawTextBox
; text box dimensions/coordinates for quantity and price
coord hl, 7, 9
@ -1577,7 +1575,7 @@ DisplayChooseQuantityMenu::
call TextBoxBorder
coord hl, 16, 10
ld a,[wListMenuID]
cp a,PRICEDITEMLISTMENU
cp PRICEDITEMLISTMENU
jr nz,.printInitialQuantity
coord hl, 8, 10
.printInitialQuantity
@ -1621,7 +1619,7 @@ DisplayChooseQuantityMenu::
.handleNewQuantity
coord hl, 17, 10
ld a,[wListMenuID]
cp a,PRICEDITEMLISTMENU
cp PRICEDITEMLISTMENU
jr nz,.printQuantity
.printPrice
ld c,$03
@ -1715,7 +1713,7 @@ PrintListMenuEntries::
ld a,[wListScrollOffset]
ld c,a
ld a,[wListMenuID]
cp a,ITEMLISTMENU
cp ITEMLISTMENU
ld a,c
jr nz,.skipMultiplying
; if it's an item menu
@ -1735,7 +1733,7 @@ PrintListMenuEntries::
ld [wWhichPokemon],a
ld a,[de]
ld [wd11e],a
cp a,$ff
cp $ff
jp z,.printCancelMenuItem
push bc
push de
@ -1745,7 +1743,7 @@ PrintListMenuEntries::
ld a,[wListMenuID]
and a
jr z,.pokemonPCMenu
cp a,$01
cp MOVESLISTMENU
jr z,.movesMenu
.itemMenu
call GetItemName
@ -1833,7 +1831,7 @@ PrintListMenuEntries::
pop de
inc de
ld a,[wListMenuID]
cp a,ITEMLISTMENU
cp ITEMLISTMENU
jr nz,.nextListEntry
.printItemQuantity
ld a,[wd11e]
@ -1990,7 +1988,6 @@ GetMachineName::
inc de
ld a,"@"
ld [de],a
pop af
ld [wd11e],a
pop bc
@ -2006,9 +2003,9 @@ HiddenPrefix::
; sets carry if item is HM, clears carry if item is not HM
; Input: a = item ID
IsItemHM::
cp a,HM_01
cp HM_01
jr c,.notHM
cp a,TM_01
cp TM_01
ret
.notHM
and a
@ -2188,6 +2185,7 @@ RunNPCMovementScript::
ld [H_LOADEDROMBANK], a
ld [MBC1RomBank], a
ret
.NPCMovementScriptPointerTables
dw PalletMovementScriptPointerTable
dw PewterMuseumGuyMovementScriptPointerTable
@ -2678,7 +2676,7 @@ FuncTX_BillsPC::
ld hl, BillsPC_
jr bankswitchAndContinue
FuncTX_SlotMachine::
FuncTX_GameCornerPrizeMenu::
; XXX find a better name for this function
; special_F7
ld b,BANK(CeladonPrizeMenu)
@ -2751,7 +2749,7 @@ CheckCoords::
ld [wCoordIndex],a
.loop
ld a,[hli]
cp a,$ff ; reached terminator?
cp $ff ; reached terminator?
jr z,.notInArray
push hl
ld hl,wCoordIndex
@ -2870,7 +2868,7 @@ GetSpriteMovementByte1Pointer::
ld h,$C2
ld a,[H_SPRITEINDEX]
swap a
add a,6
add 6
ld l,a
ret
@ -2923,7 +2921,6 @@ GetTrainerInformation::
GetTrainerName::
jpba GetTrainerName_
HasEnoughMoney::
; Check if the player has at least as much
; money as the 3-byte BCD value at hMoney.
@ -3005,12 +3002,13 @@ YesNoChoicePokeCenter::
lb bc, 8, 12
jr DisplayYesNoChoice
Func_361a::
WideYesNoChoice:: ; unused
call SaveScreenTilesToBuffer1
ld a, WIDE_YES_NO_MENU
ld [wTwoOptionMenuID], a
coord hl, 12, 7
lb bc, 8, 13
DisplayYesNoChoice::
ld a, TWO_OPTION_MENU
ld [wTextBoxID], a
@ -3044,7 +3042,7 @@ MoveSprite_::
ld [hli],a
inc de
inc c
cp a,$FF ; have we reached the end of the movement data?
cp $FF ; have we reached the end of the movement data?
jr nz,.loop
ld a,c
@ -3065,7 +3063,7 @@ MoveSprite_::
; divides [hDividend2] by [hDivisor2] and stores the quotient in [hQuotient2]
DivideBytes::
push hl
ld hl, $ffe7
ld hl, hQuotient2
xor a
ld [hld], a
ld a, [hld]
@ -3156,7 +3154,6 @@ UncompressSpriteFromDE::
ld [hl], d
jp UncompressSpriteData
SaveScreenTilesToBuffer2::
coord hl, 0, 0
ld de, wTileMapBackup2
@ -3198,7 +3195,7 @@ LoadScreenTilesFromBuffer1::
ret
DelayFrames::
; wait n frames, where n is the value in c
; wait c frames
call DelayFrame
dec c
jr nz,DelayFrames
@ -3299,7 +3296,7 @@ GetName::
ld e,l
.nextChar
ld a,[hli]
cp a, "@"
cp "@"
jr nz,.nextChar
inc c ;entry counter
ld a,b ;wanted entry
@ -3331,9 +3328,9 @@ GetItemPrice::
ld a, [wListMenuID]
cp MOVESLISTMENU
ld a, BANK(ItemPrices)
jr nz, .asm_37ed
jr nz, .ok
ld a, $f ; hardcoded Bank
.asm_37ed
.ok
ld [H_LOADEDROMBANK], a
ld [MBC1RomBank], a
ld hl, wItemPrices
@ -3344,10 +3341,10 @@ GetItemPrice::
cp HM_01
jr nc, .getTMPrice
ld bc, $3
.asm_3802
.loop
add hl, bc
dec a
jr nz, .asm_3802
jr nz, .loop
dec hl
ld a, [hld]
ld [hItemPrice + 2], a
@ -3355,13 +3352,13 @@ GetItemPrice::
ld [hItemPrice + 1], a
ld a, [hl]
ld [hItemPrice], a
jr .asm_381c
jr .done
.getTMPrice
ld a, Bank(GetMachinePrice)
ld [H_LOADEDROMBANK], a
ld [MBC1RomBank], a
call GetMachinePrice
.asm_381c
.done
ld de, hItemPrice
pop af
ld [H_LOADEDROMBANK], a
@ -4074,7 +4071,7 @@ PlaceMenuCursor::
jr nz,.currentMenuItemLoop
.checkForArrow2
ld a,[hl]
cp a,"▶" ; has the right arrow already been placed?
cp "▶" ; has the right arrow already been placed?
jr z,.skipSavingTile ; if so, don't lose the saved tile
ld [wTileBehindCursor],a ; save tile before overwriting with right arrow
.skipSavingTile
@ -4655,6 +4652,8 @@ SetMapTextPointer::
ret
TextPredefs::
const_value = 1
add_tx_pre CardKeySuccessText ; 01
add_tx_pre CardKeyFailText ; 02
add_tx_pre RedBedroomPCText ; 03
@ -4709,8 +4708,8 @@ TextPredefs::
add_tx_pre LinkCableHelp ; 34
add_tx_pre TMNotebook ; 35
add_tx_pre FightingDojoText ; 36
add_tx_pre FightingDojoText_52a10 ; 37
add_tx_pre FightingDojoText_52a1d ; 38
add_tx_pre EnemiesOnEverySideText ; 37
add_tx_pre WhatGoesAroundComesAroundText ; 38
add_tx_pre NewBicycleText ; 39
add_tx_pre IndigoPlateauStatues ; 3A
add_tx_pre VermilionGymTrashSuccessText1 ; 3B

View File

@ -1,7 +1,7 @@
; These routines manage gradual fading
; (e.g., entering a doorway)
LoadGBPal::
ld a, [wMapPalOffset] ;tells if cur.map is dark (requires HM5_FLASH?)
ld a, [wMapPalOffset] ;tells if wCurMap is dark (requires HM5_FLASH?)
ld b, a
ld hl, FadePal4
ld a, l

View File

@ -59,7 +59,7 @@ OverworldLoopLessDelay::
res 3,[hl]
jp nz,WarpFound2
ld a,[wd732]
and a,1 << 4 | 1 << 3 ; fly warp or dungeon warp
and 1 << 4 | 1 << 3 ; fly warp or dungeon warp
jp nz,HandleFlyWarpOrDungeonWarp
ld a,[wCurOpponent]
and a
@ -133,7 +133,7 @@ OverworldLoopLessDelay::
ld hl,wFlags_0xcd60
res 2,[hl]
call UpdateSprites
ld a,1
ld a, 1
ld [wCheckFor180DegreeTurn],a
ld a,[wPlayerMovingDirection] ; the direction that was pressed last time
and a
@ -143,6 +143,7 @@ OverworldLoopLessDelay::
xor a
ld [wPlayerMovingDirection],a ; zero the direction
jp OverworldLoop
.checkIfDownButtonIsPressed
ld a,[hJoyHeld] ; current joypad state
bit 7,a ; down button
@ -151,6 +152,7 @@ OverworldLoopLessDelay::
ld [wSpriteStateData1 + 3],a ; delta Y
ld a,PLAYER_DIR_DOWN
jr .handleDirectionButtonPress
.checkIfUpButtonIsPressed
bit 6,a ; up button
jr z,.checkIfLeftButtonIsPressed
@ -158,6 +160,7 @@ OverworldLoopLessDelay::
ld [wSpriteStateData1 + 3],a ; delta Y
ld a,PLAYER_DIR_UP
jr .handleDirectionButtonPress
.checkIfLeftButtonIsPressed
bit 5,a ; left button
jr z,.checkIfRightButtonIsPressed
@ -165,11 +168,14 @@ OverworldLoopLessDelay::
ld [wSpriteStateData1 + 5],a ; delta X
ld a,PLAYER_DIR_LEFT
jr .handleDirectionButtonPress
.checkIfRightButtonIsPressed
bit 4,a ; right button
jr z,.noDirectionButtonsPressed
ld a,1 ; PLAYER_DIR_RIGHT
ld a, 1
ld [wSpriteStateData1 + 5],a ; delta X
.handleDirectionButtonPress
ld [wPlayerDirection],a ; new direction
ld a,[wd730]
@ -226,12 +232,13 @@ OverworldLoopLessDelay::
call NewBattle
jp c,.battleOccurred
jp OverworldLoop
.noDirectionChange
ld a,[wPlayerDirection] ; current direction
ld [wPlayerMovingDirection],a ; save direction
call UpdateSprites
ld a,[wWalkBikeSurfState]
cp a,$02 ; surfing
cp $02 ; surfing
jr z,.surfing
; not surfing
call CollisionCheckOnLand
@ -248,20 +255,24 @@ OverworldLoopLessDelay::
pop hl
jp c,CheckWarpsCollision
jp OverworldLoop
.surfing
call CollisionCheckOnWater
jp c,OverworldLoop
.noCollision
ld a,$08
ld [wWalkCounter],a
jr .moveAhead2
.moveAhead
ld a,[wd736]
bit 7,a
jr z,.noSpinning
callba LoadSpinnerArrowTiles ; spin while moving
callba LoadSpinnerArrowTiles
.noSpinning
call UpdateSprites
.moveAhead2
ld hl,wFlags_0xcd60
res 2,[hl]
@ -271,7 +282,7 @@ OverworldLoopLessDelay::
ld a,[wd736]
bit 6,a ; jumping a ledge?
jr nz,.normalPlayerSpriteAdvancement
call BikeSpeedup ; if riding a bike and not jumping a ledge
call DoBikeSpeedup
.normalPlayerSpriteAdvancement
call AdvancePlayerSprite
ld a,[wWalkCounter]
@ -323,14 +334,14 @@ OverworldLoopLessDelay::
xor a
ld [hJoyHeld],a
ld a,[wCurMap]
cp a,CINNABAR_GYM
cp CINNABAR_GYM
jr nz,.notCinnabarGym
SetEvent EVENT_2A7
.notCinnabarGym
ld hl,wd72e
set 5,[hl]
ld a,[wCurMap]
cp a,OAKS_LAB
cp OAKS_LAB
jp z,.noFaintCheck ; no blacking out if the player lost to the rival in Oak's lab
callab AnyPartyAlive
ld a,d
@ -363,15 +374,15 @@ NewBattle::
ret
; function to make bikes twice as fast as walking
BikeSpeedup::
DoBikeSpeedup::
ld a,[wNPCMovementScriptPointerTableNum]
and a
ret nz
ld a,[wCurMap]
cp a,ROUTE_17 ; Cycling Road
cp ROUTE_17 ; Cycling Road
jr nz,.goFaster
ld a,[hJoyHeld]
and a,D_UP | D_LEFT | D_RIGHT
and D_UP | D_LEFT | D_RIGHT
ret nz
.goFaster
jp AdvancePlayerSprite
@ -421,7 +432,7 @@ CheckWarpsNoCollisionLoop::
pop bc
pop de
ld a,[hJoyHeld]
and a,D_DOWN | D_UP | D_LEFT | D_RIGHT
and D_DOWN | D_UP | D_LEFT | D_RIGHT
jr z,CheckWarpsNoCollisionRetry2 ; if directional buttons aren't being pressed, do not pass through the warp
jr WarpFound1
@ -483,7 +494,7 @@ WarpFound2::
ld [wUnusedD366],a ; not read
ld a,[hWarpDestinationMap]
ld [wCurMap],a
cp a,ROCK_TUNNEL_1
cp ROCK_TUNNEL_1
jr nz,.notRockTunnel
ld a,$06
ld [wMapPalOffset],a
@ -491,10 +502,12 @@ WarpFound2::
.notRockTunnel
call PlayMapChangeSound
jr .done
; for maps that can have the 0xFF destination map, which means to return to the outside map; not all these maps are necessarily indoors, though
; for maps that can have the 0xFF destination map, which means to return to the outside map
; not all these maps are necessarily indoors, though
.indoorMaps
ld a,[hWarpDestinationMap] ; destination map
cp a,$ff
cp $ff
jr z,.goBackOutside
; if not going back to the previous map
ld [wCurMap],a
@ -535,7 +548,7 @@ ContinueCheckWarpsNoCollisionLoop::
CheckMapConnections::
.checkWestMap
ld a,[wXCoord]
cp a,$ff
cp $ff
jr nz,.checkEastMap
ld a,[wMapConn3Ptr]
ld [wCurMap],a
@ -555,7 +568,7 @@ CheckMapConnections::
jr z,.savePointer1
.pointerAdjustmentLoop1
ld a,[wWestConnectedMapWidth] ; width of connected map
add a,MAP_BORDER * 2
add MAP_BORDER * 2
ld e,a
ld d,0
ld b,0
@ -568,6 +581,7 @@ CheckMapConnections::
ld a,h
ld [wCurrentTileBlockMapViewPointer + 1],a
jp .loadNewMap
.checkEastMap
ld b,a
ld a,[wCurrentMapWidth2] ; map width
@ -591,7 +605,7 @@ CheckMapConnections::
jr z,.savePointer2
.pointerAdjustmentLoop2
ld a,[wEastConnectedMapWidth]
add a,MAP_BORDER * 2
add MAP_BORDER * 2
ld e,a
ld d,0
ld b,0
@ -604,9 +618,10 @@ CheckMapConnections::
ld a,h
ld [wCurrentTileBlockMapViewPointer + 1],a
jp .loadNewMap
.checkNorthMap
ld a,[wYCoord]
cp a,$ff
cp $ff
jr nz,.checkSouthMap
ld a,[wMapConn1Ptr]
ld [wCurMap],a
@ -630,6 +645,7 @@ CheckMapConnections::
ld a,h
ld [wCurrentTileBlockMapViewPointer + 1],a
jp .loadNewMap
.checkSouthMap
ld b,a
ld a,[wCurrentMapHeight2]
@ -666,13 +682,14 @@ CheckMapConnections::
callba InitMapSprites
call LoadTileBlockMap
jp OverworldLoopLessDelay
.didNotEnterConnectedMap
jp OverworldLoop
; function to play a sound when changing maps
PlayMapChangeSound::
aCoord 8, 8 ; upper left tile of the 4x4 square the player's sprite is standing on
cp a,$0b ; door tile in tileset 0
cp $0b ; door tile in tileset 0
jr nz,.didNotGoThroughDoor
ld a,SFX_GO_INSIDE
jr .playSound
@ -854,13 +871,13 @@ INCLUDE "data/bike_riding_tilesets.asm"
; load the tile pattern data of the current tileset into VRAM
LoadTilesetTilePatternData::
ld a,[wTileSetGFXPtr]
ld a,[wTilesetGfxPtr]
ld l,a
ld a,[wTileSetGFXPtr + 1]
ld a,[wTilesetGfxPtr + 1]
ld h,a
ld de,vTileset
ld bc,$600
ld a,[wTileSetBank]
ld a,[wTilesetBank]
jp FarCopyData2
; this loads the current maps complete tile map (which references blocks, not individual tiles) to C6E8
@ -883,7 +900,7 @@ LoadTileBlockMap::
ld hl,wOverworldMap
ld a,[wCurMapWidth]
ld [hMapWidth],a
add a,MAP_BORDER * 2 ; east and west
add MAP_BORDER * 2 ; east and west
ld [hMapStride],a ; map width + border
ld b,0
ld c,a
@ -921,7 +938,7 @@ LoadTileBlockMap::
jr nz,.rowLoop
.northConnection
ld a,[wMapConn1Ptr]
cp a,$ff
cp $ff
jr z,.southConnection
call SwitchToMapRomBank
ld a,[wNorthConnectionStripSrc]
@ -939,7 +956,7 @@ LoadTileBlockMap::
call LoadNorthSouthConnectionsTileMap
.southConnection
ld a,[wMapConn2Ptr]
cp a,$ff
cp $ff
jr z,.westConnection
call SwitchToMapRomBank
ld a,[wSouthConnectionStripSrc]
@ -957,7 +974,7 @@ LoadTileBlockMap::
call LoadNorthSouthConnectionsTileMap
.westConnection
ld a,[wMapConn3Ptr]
cp a,$ff
cp $ff
jr z,.eastConnection
call SwitchToMapRomBank
ld a,[wWestConnectionStripSrc]
@ -975,7 +992,7 @@ LoadTileBlockMap::
call LoadEastWestConnectionsTileMap
.eastConnection
ld a,[wMapConn4Ptr]
cp a,$ff
cp $ff
jr z,.done
call SwitchToMapRomBank
ld a,[wEastConnectionStripSrc]
@ -1016,7 +1033,7 @@ LoadNorthSouthConnectionsTileMap::
inc h
.noCarry1
ld a,[wCurMapWidth]
add a,MAP_BORDER * 2
add MAP_BORDER * 2
add e
ld e,a
jr nc,.noCarry2
@ -1045,7 +1062,7 @@ LoadEastWestConnectionsTileMap::
inc h
.noCarry1
ld a,[wCurMapWidth]
add a,MAP_BORDER * 2
add MAP_BORDER * 2
add e
ld e,a
jr nc,.noCarry2
@ -1100,7 +1117,7 @@ IsSpriteOrSignInFrontOfPlayer::
; check if the player is front of a counter in a pokemon center, pokemart, etc. and if so, extend the range at which he can talk to the NPC
.extendRangeOverCounter
predef GetTileAndCoordsInFrontOfPlayer ; get the tile in front of the player in c
ld hl,wTileSetTalkingOverTiles ; list of tiles that extend talking range (counter tiles)
ld hl,wTilesetTalkingOverTiles ; list of tiles that extend talking range (counter tiles)
ld b,3
ld d,$20 ; talking range in pixels (long range)
.counterTilesLoop
@ -1126,6 +1143,7 @@ IsSpriteInFrontOfPlayer2::
ld b,a
ld a,PLAYER_DIR_UP
jr .doneCheckingDirection
.checkIfPlayerFacingDown
cp SPRITE_FACING_DOWN
jr nz,.checkIfPlayerFacingRight
@ -1135,6 +1153,7 @@ IsSpriteInFrontOfPlayer2::
ld b,a
ld a,PLAYER_DIR_DOWN
jr .doneCheckingDirection
.checkIfPlayerFacingRight
cp SPRITE_FACING_RIGHT
jr nz,.playerFacingLeft
@ -1144,6 +1163,7 @@ IsSpriteInFrontOfPlayer2::
ld c,a
ld a,PLAYER_DIR_RIGHT
jr .doneCheckingDirection
.playerFacingLeft
; facing left
ld a,c
@ -1225,7 +1245,7 @@ CollisionCheckOnLand::
jr nc,.noCollision
.collision
ld a,[wChannelSoundIDs + CH4]
cp a,SFX_COLLISION ; check if collision sound is already playing
cp SFX_COLLISION ; check if collision sound is already playing
jr z,.setCarry
ld a,SFX_COLLISION
call PlaySound ; play collision sound (if it's not already playing)
@ -1242,7 +1262,7 @@ CheckTilePassable::
predef GetTileAndCoordsInFrontOfPlayer ; get tile in front of player
ld a,[wTileInFrontOfPlayer] ; tile in front of player
ld c,a
ld hl,wTileSetCollisionPtr ; pointer to list of passable tiles
ld hl,wTilesetCollisionPtr ; pointer to list of passable tiles
ld a,[hli]
ld h,[hl]
ld l,a ; hl now points to passable tiles
@ -1287,7 +1307,7 @@ CheckForTilePairCollisions::
ld a,[wCurMapTileset] ; tileset number
ld b,a
ld a,[hli]
cp a,$ff
cp $ff
jr z,.noMatch
cp b
jr z,.tilesetMatches
@ -1354,7 +1374,7 @@ TilePairCollisionsWater::
LoadCurrentMapView::
ld a,[H_LOADEDROMBANK]
push af
ld a,[wTileSetBank] ; tile data ROM bank
ld a,[wTilesetBank] ; tile data ROM bank
ld [H_LOADEDROMBANK],a
ld [MBC1RomBank],a ; switch to ROM bank that contains tile data
ld a,[wCurrentTileBlockMapViewPointer] ; address of upper left corner of current map view
@ -1387,7 +1407,7 @@ LoadCurrentMapView::
; update tile block map pointer to next row's address
pop de
ld a,[wCurMapWidth]
add a,MAP_BORDER * 2
add MAP_BORDER * 2
add e
ld e,a
jr nc,.noCarry
@ -1722,8 +1742,8 @@ ScheduleSouthRowRedraw::
ld bc,$0200
add hl,bc
ld a,h
and a,$03
or a,$98
and $03
or $98
ld [hRedrawRowOrColumnDest + 1],a
ld a,l
ld [hRedrawRowOrColumnDest],a
@ -1736,11 +1756,11 @@ ScheduleEastColumnRedraw::
call ScheduleColumnRedrawHelper
ld a,[wMapViewVRAMPointer]
ld c,a
and a,$e0
and $e0
ld b,a
ld a,c
add a,18
and a,$1f
add 18
and $1f
or b
ld [hRedrawRowOrColumnDest],a
ld a,[wMapViewVRAMPointer + 1]
@ -1784,17 +1804,17 @@ ScheduleWestColumnRedraw::
; Input: c = tile block ID, hl = destination address
DrawTileBlock::
push hl
ld a,[wTileSetBlocksPtr] ; pointer to tiles
ld a,[wTilesetBlocksPtr] ; pointer to tiles
ld l,a
ld a,[wTileSetBlocksPtr + 1]
ld a,[wTilesetBlocksPtr + 1]
ld h,a
ld a,c
swap a
ld b,a
and a,$f0
and $f0
ld c,a
ld a,b
and a,$0f
and $0f
ld b,a ; bc = tile block ID * 0x10
add hl,bc
ld d,h
@ -1833,10 +1853,10 @@ JoypadOverworld::
bit 3,a ; check if a trainer wants a challenge
jr nz,.notForcedDownwards
ld a,[wCurMap]
cp a,ROUTE_17 ; Cycling Road
cp ROUTE_17 ; Cycling Road
jr nz,.notForcedDownwards
ld a,[hJoyHeld]
and a,D_DOWN | D_UP | D_LEFT | D_RIGHT | B_BUTTON | A_BUTTON
and D_DOWN | D_UP | D_LEFT | D_RIGHT | B_BUTTON | A_BUTTON
jr nz,.notForcedDownwards
ld a,D_DOWN
ld [hJoyHeld],a ; on the cycling road, if there isn't a trainer and the player isn't pressing buttons, simulate a down press
@ -1868,6 +1888,7 @@ JoypadOverworld::
ld [hJoyPressed],a
ld [hJoyReleased],a
ret
; if done simulating button presses
.doneSimulating
xor a
@ -1878,7 +1899,7 @@ JoypadOverworld::
ld [hJoyHeld],a
ld hl,wd736
ld a,[hl]
and a,$f8
and $f8
ld [hl],a
ld hl,wd730
res 7,[hl]
@ -1915,7 +1936,7 @@ CollisionCheckOnWater::
jr z,.noCollision ; keep surfing
; check if the [land] tile in front of the player is passable
.checkIfNextTileIsPassable
ld hl,wTileSetCollisionPtr ; pointer to list of passable tiles
ld hl,wTilesetCollisionPtr ; pointer to list of passable tiles
ld a,[hli]
ld h,[hl]
ld l,a
@ -1928,7 +1949,7 @@ CollisionCheckOnWater::
jr .loop
.collision
ld a,[wChannelSoundIDs + CH4]
cp a,SFX_COLLISION ; check if collision sound is already playing
cp SFX_COLLISION ; check if collision sound is already playing
jr z,.setCarry
ld a,SFX_COLLISION
call PlaySound ; play collision sound (if it's not already playing)
@ -2386,7 +2407,7 @@ IgnoreInputForHalfSecond:
ld [wIgnoreInputCounter], a
ld hl, wd730
ld a, [hl]
or $26
or %00100110
ld [hl], a ; set ignore input bit
ret

View File

@ -531,9 +531,9 @@ ReverseNybble::
ld de, NybbleReverseTable
add e
ld e, a
jr nc, .asm_283f
jr nc, .noCarry
inc d
.asm_283f
.noCarry
ld a, [de]
ret

View File

@ -91,79 +91,79 @@ Serial_ExchangeByte::
ld [hSerialReceivedNewData], a
ld a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK
jr nz, .asm_21a7
jr nz, .loop
ld a, START_TRANSFER_INTERNAL_CLOCK
ld [rSC], a
.asm_21a7
.loop
ld a, [hSerialReceivedNewData]
and a
jr nz, .asm_21f1
jr nz, .ok
ld a, [hSerialConnectionStatus]
cp USING_EXTERNAL_CLOCK
jr nz, .asm_21cc
jr nz, .doNotIncrementUnknownCounter
call IsUnknownCounterZero
jr z, .asm_21cc
jr z, .doNotIncrementUnknownCounter
call WaitLoop_15Iterations
push hl
ld hl, wUnknownSerialCounter + 1
inc [hl]
jr nz, .asm_21c3
jr nz, .noCarry
dec hl
inc [hl]
.asm_21c3
.noCarry
pop hl
call IsUnknownCounterZero
jr nz, .asm_21a7
jr nz, .loop
jp SetUnknownCounterToFFFF
.asm_21cc
.doNotIncrementUnknownCounter
ld a, [rIE]
and (1 << SERIAL) | (1 << TIMER) | (1 << LCD_STAT) | (1 << VBLANK)
cp (1 << SERIAL)
jr nz, .asm_21a7
jr nz, .loop
ld a, [wUnknownSerialCounter2]
dec a
ld [wUnknownSerialCounter2], a
jr nz, .asm_21a7
jr nz, .loop
ld a, [wUnknownSerialCounter2 + 1]
dec a
ld [wUnknownSerialCounter2 + 1], a
jr nz, .asm_21a7
jr nz, .loop
ld a, [hSerialConnectionStatus]
cp USING_EXTERNAL_CLOCK
jr z, .asm_21f1
jr z, .ok
ld a, 255
.waitLoop
dec a
jr nz, .waitLoop
.asm_21f1
.ok
xor a
ld [hSerialReceivedNewData], a
ld a, [rIE]
and (1 << SERIAL) | (1 << TIMER) | (1 << LCD_STAT) | (1 << VBLANK)
sub (1 << SERIAL)
jr nz, .asm_2204
jr nz, .skipReloadingUnknownCounter2
ld [wUnknownSerialCounter2], a
ld a, $50
ld [wUnknownSerialCounter2 + 1], a
.asm_2204
.skipReloadingUnknownCounter2
ld a, [hSerialReceiveData]
cp SERIAL_NO_DATA_BYTE
ret nz
call IsUnknownCounterZero
jr z, .asm_221f
jr z, .done
push hl
ld hl, wUnknownSerialCounter + 1
ld a, [hl]
dec a
ld [hld], a
inc a
jr nz, .asm_2219
jr nz, .noBorrow
dec [hl]
.asm_2219
.noBorrow
pop hl
call IsUnknownCounterZero
jr z, SetUnknownCounterToFFFF
.asm_221f
.done
ld a, [rIE]
and (1 << SERIAL) | (1 << TIMER) | (1 << LCD_STAT) | (1 << VBLANK)
cp (1 << SERIAL)

View File

@ -52,28 +52,28 @@ PlaceNextChar::
ld a,[de]
cp "@"
jr nz,.PlaceText
jr nz, Char4ETest
ld b,h
ld c,l
pop hl
ret
.PlaceText
cp $4E
jr nz,.next
ld bc,SCREEN_WIDTH * 2
Char4ETest::
cp $4E ; next
jr nz, .char4FTest
ld bc, 2 * SCREEN_WIDTH
ld a,[hFlags_0xFFF6]
bit 2,a
jr z,.next2
jr z,.ok
ld bc,SCREEN_WIDTH
.next2
.ok
pop hl
add hl,bc
push hl
jp PlaceNextChar_inc
.next
cp $4F
.char4FTest
cp $4F ; line
jr nz,.next3
pop hl
coord hl, 1, 16
@ -81,46 +81,36 @@ PlaceNextChar::
jp PlaceNextChar_inc
.next3 ; Check against a dictionary
dict: macro
if \1 == 0
and a
jp z,Char00
cp $4C
jp z,Char4C
cp $4B
jp z,Char4B
cp $51
jp z,Char51
cp $49
jp z,Char49
cp $52
jp z,Char52
cp $53
jp z,Char53
cp $54
jp z,Char54
cp $5B
jp z,Char5B
cp $5E
jp z,Char5E
cp $5C
jp z,Char5C
cp $5D
jp z,Char5D
cp $55
jp z,Char55
cp $56
jp z,Char56
cp $57
jp z,Char57
cp $58
jp z,Char58
cp $4A
jp z,Char4A
cp $5F
jp z,Char5F
cp $59
jp z,Char59
cp $5A
jp z,Char5A
else
cp \1
endc
jp z, \2
endm
dict $00, Char00 ; error
dict $4C, Char4C ; autocont
dict $4B, Char4B ; cont_
dict $51, Char51 ; para
dict $49, Char49 ; page
dict $52, Char52 ; player
dict $53, Char53 ; rival
dict $54, Char54 ; POKé
dict $5B, Char5B ; PC
dict $5E, Char5E ; ROCKET
dict $5C, Char5C ; TM
dict $5D, Char5D ; TRAINER
dict $55, Char55 ; cont
dict $56, Char56 ; 6 dots
dict $57, Char57 ; done
dict $58, Char58 ; prompt
dict $4A, Char4A ; PKMN
dict $5F, Char5F ; dex
dict $59, Char59 ; TARGET
dict $5A, Char5A ; USER
ld [hli],a
call PrintLetterDelay
PlaceNextChar_inc::
@ -211,7 +201,6 @@ MonsterNameCharsCommon::
; print “Enemy ”
ld de,Char5AText
call PlaceString
ld h,b
ld l,c
ld de,wEnemyMonNick ; enemy active monster name
@ -264,36 +253,36 @@ Char5F::
pop hl
ret
Char58::
Char58:: ; prompt
ld a,[wLinkState]
cp LINK_STATE_BATTLING
jp z,Next1AA2
ld a,"▼"
jp z, .ok
ld a, "▼"
Coorda 18, 16
Next1AA2::
.ok
call ProtectedDelay3
call ManualTextScroll
ld a, " "
Coorda 18, 16
Char57::
Char57:: ; done
pop hl
ld de,Char58Text
ld de, Char58Text
dec de
ret
Char58Text::
db "@"
Char51::
Char51:: ; para
push de
ld a,"▼"
ld a, "▼"
Coorda 18, 16
call ProtectedDelay3
call ManualTextScroll
coord hl, 1, 13
lb bc, 4, 18
call ClearScreenArea
ld c,20
ld c, 20
call DelayFrames
pop de
coord hl, 1, 14
@ -328,8 +317,8 @@ Char4B::
;fall through
Char4C::
push de
call ScrollTextUp
call ScrollTextUp
call ScrollTextUpOneLine
call ScrollTextUpOneLine
coord hl, 1, 16
pop de
jp PlaceNextChar_inc
@ -338,7 +327,7 @@ Char4C::
; always called twice in a row
; first time, copy the two rows of text to the "in between" rows that are usually emtpy
; second time, copy the bottom row of text into the top row of text
ScrollTextUp::
ScrollTextUpOneLine::
coord hl, 0, 14 ; top row of text
coord de, 0, 13 ; empty line above text
ld b, SCREEN_WIDTH * 3
@ -376,7 +365,7 @@ TextCommandProcessor::
push af
set 1,a
ld e,a
ld a,[$fff4]
ld a, [$fff4]
xor e
ld [wLetterPrintingDelayFlags],a
ld a,c
@ -393,22 +382,22 @@ NextTextCommand::
ret
.doTextCommand
push hl
cp a,$17
jp z,TextCommand17
cp a,$0e
cp a, $17
jp z, TextCommand17
cp a, $0e
jp nc,TextCommand0B ; if a != 0x17 and a >= 0xE, go to command 0xB
; if a < 0xE, use a jump table
ld hl,TextCommandJumpTable
push bc
add a
ld b,$00
ld c,a
add hl,bc
ld b, 0
ld c, a
add hl, bc
pop bc
ld a,[hli]
ld h,[hl]
ld l,a
jp [hl]
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
; draw box
; 04AAAABBCC
@ -527,10 +516,10 @@ TextCommand06::
; 07
; (no arguments)
TextCommand07::
ld a," "
ld a, " "
Coorda 18, 16 ; place blank space in lower right corner of dialogue text box
call ScrollTextUp
call ScrollTextUp
call ScrollTextUpOneLine
call ScrollTextUpOneLine
pop hl
coord bc, 1, 16 ; address of second line of dialogue text box
jp NextTextCommand
@ -541,7 +530,7 @@ TextCommand08::
pop hl
ld de,NextTextCommand
push de ; return address
jp [hl]
jp hl
; print decimal number (converted from binary number)
; 09AAAABB
@ -630,16 +619,16 @@ TextCommand0B::
; format: text command ID, sound ID or cry ID
TextCommandSounds::
db $0B,SFX_GET_ITEM_1 ; actually plays SFX_LEVEL_UP when the battle music engine is loaded
db $12,SFX_CAUGHT_MON
db $0E,SFX_POKEDEX_RATING ; unused?
db $0F,SFX_GET_ITEM_1 ; unused?
db $10,SFX_GET_ITEM_2
db $11,SFX_GET_KEY_ITEM
db $13,SFX_DEX_PAGE_ADDED
db $14,NIDORINA ; used in OakSpeech
db $15,PIDGEOT ; used in SaffronCityText12
db $16,DEWGONG ; unused?
db $0B, SFX_GET_ITEM_1 ; actually plays SFX_LEVEL_UP when the battle music engine is loaded
db $12, SFX_CAUGHT_MON
db $0E, SFX_POKEDEX_RATING ; unused?
db $0F, SFX_GET_ITEM_1 ; unused?
db $10, SFX_GET_ITEM_2
db $11, SFX_GET_KEY_ITEM
db $13, SFX_DEX_PAGE_ADDED
db $14, NIDORINA ; used in OakSpeech
db $15, PIDGEOT ; used in SaffronCityText12
db $16, DEWGONG ; unused?
; draw ellipses
; 0CAA

View File

@ -27,7 +27,7 @@ VBlank::
call VBlankCopyDouble
call UpdateMovingBgTiles
call $ff80 ; hOAMDMA
ld a, Bank(PrepareOAMData)
ld a, BANK(PrepareOAMData)
ld [H_LOADEDROMBANK], a
ld [MBC1RomBank], a
call PrepareOAMData

View File

@ -33,13 +33,13 @@ ClearBgMap::
jr nz,.loop
ret
RedrawRowOrColumn::
; This function redraws a BG row of height 2 or a BG column of width 2.
; One of its main uses is redrawing the row or column that will be exposed upon
; scrolling the BG when the player takes a step. Redrawing only the exposed
; row or column is more efficient than redrawing the entire screen.
; However, this function is also called repeatedly to redraw the whole screen
; when necessary. It is also used in trade animation and elevator code.
RedrawRowOrColumn::
ld a,[hRedrawRowOrColumnMode]
and a
ret z

View File

@ -69,29 +69,62 @@ bcd3: MACRO
coins equs "bcd2"
money equs "bcd3"
validateCoords: MACRO
if \1 >= SCREEN_WIDTH
fail "x coord out of range"
endc
if \2 >= SCREEN_HEIGHT
fail "y coord out of range"
endc
endm
;\1 = r
;\2 = X
;\3 = Y
;\4 = which tilemap (optional)
coord: MACRO
ld \1, wTileMap + 20 * \3 + \2
validateCoords \2, \3
if _NARG >= 4
ld \1, \4 + SCREEN_WIDTH * \3 + \2
else
ld \1, wTileMap + SCREEN_WIDTH * \3 + \2
endc
ENDM
;\1 = X
;\2 = Y
;\3 = which tilemap (optional)
aCoord: MACRO
ld a, [wTileMap + 20 * \2 + \1]
validateCoords \1, \2
if _NARG >= 3
ld a, [\3 + SCREEN_WIDTH * \2 + \1]
else
ld a, [wTileMap + SCREEN_WIDTH * \2 + \1]
endc
ENDM
;\1 = X
;\2 = Y
;\3 = which tilemap (optional)
Coorda: MACRO
ld [wTileMap + 20 * \2 + \1], a
validateCoords \1, \2
if _NARG >= 3
ld [\3 + SCREEN_WIDTH * \2 + \1], a
else
ld [wTileMap + SCREEN_WIDTH * \2 + \1], a
endc
ENDM
;\1 = X
;\2 = Y
;\3 = which tilemap (optional)
dwCoord: MACRO
dw wTileMap + 20 * \2 + \1
validateCoords \1, \2
if _NARG >= 3
dw \3 + SCREEN_WIDTH * \2 + \1
else
dw wTileMap + SCREEN_WIDTH * \2 + \1
endc
ENDM
;\1 = r
@ -122,7 +155,7 @@ EMAP: MACRO ; emap x-coordinate,y-coordinate,textpointer
; nybble: y-coordinate
; nybble: x-coordinate
; word : pointer to map name
db (\1 + (\2 << 4))
dn \2, \1
dw \3
ENDM
@ -134,7 +167,7 @@ IMAP: MACRO ; imap mapid_less_than,x-coordinate,y-coordinate,textpointer
; nybble: x-coordinate
; word : pointer to map name
db \1 + 1
db \2 + \3 << 4
dn \3, \2
dw \4
ENDM
@ -162,6 +195,24 @@ dbw: MACRO
dw \2
ENDM
dba: MACRO
dbw BANK(\1), \1
ENDM
dwb: MACRO
dw \1
db \2
ENDM
dab: MACRO
dwb \1, BANK(\1)
ENDM
dbbw: MACRO
db \1, \2
dw \3
ENDM
; data format macros
RGB: MACRO
dw (\3 << 10 | \2 << 5 | \1)
@ -248,6 +299,10 @@ TX_MART: MACRO
TX_POKECENTER_NURSE EQUS "db $ff"
; Predef macro.
predef_const: MACRO
const \1PredefID
ENDM
add_predef: MACRO
\1Predef::
db BANK(\1)
@ -268,11 +323,18 @@ predef_jump: MACRO
jp Predef
ENDM
tx_pre_const: MACRO
const \1_id
ENDM
add_tx_pre: MACRO
\1_id:: dw \1
ENDM
db_tx_pre: MACRO
db (\1_id - TextPredefs) / 2 + 1
ENDM
tx_pre_id: MACRO
ld a, (\1_id - TextPredefs) / 2 + 1
ENDM
@ -684,9 +746,9 @@ ENDM
tmlearn: MACRO
x = 0
rept _NARG
if \1 != 0
IF \1 != 0
x = x | (1 << ((\1 - 1) % 8))
endc
ENDC
shift
endr
db x

View File

@ -2442,7 +2442,7 @@ GetTileTwoStepsInFrontOfPlayer:
CheckForCollisionWhenPushingBoulder:
call GetTileTwoStepsInFrontOfPlayer
ld hl, wTileSetCollisionPtr
ld hl, wTilesetCollisionPtr
ld a, [hli]
ld h, [hl]
ld l, a
@ -2672,7 +2672,7 @@ LoadTilesetHeader:
ld e, a
ld hl, Tilesets
add hl, de
ld de, wTileSetBank
ld de, wTilesetBank
ld c, $b
.copyTilesetHeaderLoop
ld a, [hli]

309
text.asm

File diff suppressed because it is too large Load Diff

View File

@ -25,7 +25,7 @@ _BikeShopText_1d81f::
prompt
_BikeShopText_1d824::
text $52, " exchanged"
text "<PLAYER> exchanged"
line "the BIKE VOUCHER"
cont "for a BICYCLE.@@"

View File

@ -8,7 +8,7 @@ _TM18PreReceiveText::
prompt
_ReceivedTM18Text::
text $52, " received"
text "<PLAYER> received"
line "@"
TX_RAM wcf4b
text "!@@"

View File

@ -83,13 +83,13 @@ FanClubChairStoryText::
prompt
ReceivedBikeVoucherText::
text $52, " received"
text "<PLAYER> received"
line "a @"
TX_RAM wcf4b
text "!@@"
ExplainBikeVoucherText::
db $0
text ""
para "Exchange that for"
line "a BICYCLE!"
@ -111,7 +111,7 @@ FanClubNoStoryText::
done
FanClubChairFinalText::
text "Hello, ", $52, "!"
text "Hello, <PLAYER>!"
para "Did you come see"
line "me about my"

View File

@ -1,7 +1,7 @@
_HallofFameRoomText1::
text "OAK: Er-hem!"
line "Congratulations"
cont $52, "!"
cont "<PLAYER>!"
para "This floor is the"
line "#MON HALL OF"
@ -16,13 +16,13 @@ _HallofFameRoomText1::
line "also recorded in"
cont "the HALL OF FAME!"
para $52, "! You have"
para "<PLAYER>! You have"
line "endeavored hard"
cont "to become the new"
cont "LEAGUE champion!"
para "Congratulations,"
line $52, ", you and"
line "<PLAYER>, you and"
cont "your #MON are"
cont "HALL OF FAMERs!"
done

View File

@ -1,6 +1,6 @@
_LanceBeforeBattleText::
text "Ah! I heard about"
line "you ", $52, "!"
line "you <PLAYER>!"
para "I lead the ELITE"
line "FOUR! You can"

View File

@ -81,7 +81,7 @@ _Museum1FText_5c28e::
prompt
_ReceivedOldAmberText::
text $52, " received"
text "<PLAYER> received"
line "OLD AMBER!@@"
_Museum1FText_5c299::

View File

@ -1,11 +1,11 @@
_OaksLabGaryText1::
text $53,": Yo"
line $52,"! Gramps"
text "<RIVAL>: Yo"
line "<PLAYER>! Gramps"
cont "isn't around!"
done
_OaksLabText40::
text $53,": Heh, I"
text "<RIVAL>: Heh, I"
line "don't need to be"
cont "greedy like you!"
@ -14,7 +14,7 @@ _OaksLabText40::
done
_OaksLabText41::
text $53,": My"
text "<RIVAL>: My"
line "#MON looks a"
cont "lot stronger."
done
@ -60,7 +60,7 @@ _OaksLabLastMonText::
done
_OaksLabText_1d2f0::
text "OAK: Now, ", $52, ","
text "OAK: Now, <PLAYER>,"
line "which #MON do"
cont "you want?"
done
@ -73,14 +73,14 @@ _OaksLabText_1d2f5::
done
_OaksLabText_1d2fa::
text "OAK: ", $52, ","
text "OAK: <PLAYER>,"
line "raise your young"
cont "#MON by making"
cont "it fight!"
done
_OaksLabDeliverParcelText1::
text "OAK: Oh, ", $52, "!"
text "OAK: Oh, <PLAYER>!"
para "How is my old"
line "#MON?"
@ -95,11 +95,11 @@ _OaksLabDeliverParcelText1::
para "What? You have"
line "something for me?"
para $52, " delivered"
para "<PLAYER> delivered"
line "OAK's PARCEL.@@"
_OaksLabDeliverParcelText2::
db $0
text ""
para "Ah! This is the"
line "custom # BALL"
cont "I ordered!"
@ -109,7 +109,7 @@ _OaksLabDeliverParcelText2::
_OaksLabAroundWorldText::
text "#MON around the"
line "world wait for"
cont "you, ", $52, "!"
cont "you, <PLAYER>!"
done
_OaksLabGivePokeballsText1::
@ -123,11 +123,11 @@ _OaksLabGivePokeballsText1::
cont "to capture wild"
cont "#MON."
para $52, " got 5"
para "<PLAYER> got 5"
line "# BALLs!@@"
_OaksLabGivePokeballsText2::
db $0
text ""
para "When a wild"
line "#MON appears,"
cont "it's fair game."
@ -182,20 +182,20 @@ _OaksLabText_1d340::
done
_OaksLabRivalWaitingText::
text $53, ": Gramps!"
text "<RIVAL>: Gramps!"
line "I'm fed up with"
cont "waiting!"
done
_OaksLabChooseMonText::
text "OAK: ", $53, "?"
text "OAK: <RIVAL>?"
line "Let me think..."
para "Oh, that's right,"
line "I told you to"
cont "come! Just wait!"
para "Here, ", $52, "!"
para "Here, <PLAYER>!"
para "There are 3"
line "#MON here!"
@ -216,14 +216,14 @@ _OaksLabChooseMonText::
done
_OaksLabRivalInterjectionText::
text $53, ": Hey!"
text "<RIVAL>: Hey!"
line "Gramps! What"
cont "about me?"
done
_OaksLabBePatientText::
text "OAK: Be patient!"
line $53, ", you can"
line "<RIVAL>, you can"
cont "have one too!"
done
@ -233,19 +233,19 @@ _OaksLabLeavingText::
done
_OaksLabRivalPickingMonText::
text $53, ": I'll take"
text "<RIVAL>: I'll take"
line "this one, then!"
done
_OaksLabRivalReceivedMonText::
text $53, " received"
text "<RIVAL> received"
line "a @"
TX_RAM wcd6d
text "!@@"
_OaksLabRivalChallengeText::
text $53, ": Wait"
line $52, "!"
text "<RIVAL>: Wait"
line "<PLAYER>!"
cont "Let's check out"
cont "our #MON!"
@ -261,26 +261,26 @@ _OaksLabText_1d3be::
prompt
_OaksLabText_1d3c3::
text $53, ": Yeah! Am"
text "<RIVAL>: Yeah! Am"
line "I great or what?"
prompt
_OaksLabRivalToughenUpText::
text $53, ": Okay!"
text "<RIVAL>: Okay!"
line "I'll make my"
cont "#MON fight to"
cont "toughen it up!"
para $52, "! Gramps!"
para "<PLAYER>! Gramps!"
line "Smell you later!"
done
_OaksLabText21::
text $53, ": Gramps!"
text "<RIVAL>: Gramps!"
done
_OaksLabText22::
text $53, ": What did"
text "<RIVAL>: What did"
line "you call me for?"
done
@ -305,11 +305,11 @@ _OaksLabText24::
done
_OaksLabText25::
text "OAK: ", $52, " and"
line $53, "! Take"
text "OAK: <PLAYER> and"
line "<RIVAL>! Take"
cont "these with you!"
para $52, " got"
para "<PLAYER> got"
line "#DEX from OAK!@@"
_OaksLabText26::
@ -336,11 +336,11 @@ _OaksLabText26::
done
_OaksLabText27::
text $53, ": Alright"
text "<RIVAL>: Alright"
line "Gramps! Leave it"
cont "all to me!"
para $52, ", I hate to"
para "<PLAYER>, I hate to"
line "say it, but I"
cont "don't need you!"
@ -350,7 +350,7 @@ _OaksLabText27::
para "I'll tell her not"
line "to lend you one,"
cont $52, "! Hahaha!"
cont "<PLAYER>! Hahaha!"
done
_OaksLabText_1d405::

View File

@ -10,7 +10,7 @@ _MomWakeUpText::
done
_MomHealText1::
text "MOM: ",$52,"!"
text "MOM: <PLAYER>!"
line "You should take a"
cont "quick rest."
prompt

View File

@ -60,7 +60,7 @@ _Route22RivalBeforeBattleText2::
cont "That's cool!"
para "Then I'll whip you"
line $52, " as a"
line "<PLAYER> as a"
cont "warm up for"
cont "#MON LEAGUE!"
@ -88,8 +88,8 @@ _Route22RivalDefeatedText2::
prompt
_Route22Text_511d0::
text $53, ": Hahaha!"
line $52, "! That's"
text "<RIVAL>: Hahaha!"
line "<PLAYER>! That's"
cont "your best? You're"
cont "nowhere near as"
cont "good as me, pal!"

View File

@ -58,7 +58,7 @@ _SilphCo11Text2::
done
_SilphCo11Text3::
text "Ah ", $52, "!"
text "Ah <PLAYER>!"
line "So we meet again!"
para "The PRESIDENT and"

View File

@ -35,7 +35,7 @@ _SSAnneWelcomeText9::
prompt
_SSAnneFlashedTicketText::
text $52, " flashed"
text "<PLAYER> flashed"
line "the S.S.TICKET!"
para "Great! Welcome to"
@ -43,7 +43,7 @@ _SSAnneFlashedTicketText::
done
_SSAnneNoTicketText::
text $52, " doesn't"
text "<PLAYER> doesn't"
line "have the needed"
cont "S.S.TICKET."
@ -71,7 +71,7 @@ _VermilionCityText5::
line "Gogogoh!@@"
_VermilionCityText14::
db $0
text ""
para "A MACHOP is"
line "stomping the land"
cont "flat."

View File

@ -53,4 +53,3 @@ _OakSpeechText3::
cont "with #MON"
cont "awaits! Let's go!"
done

View File

@ -1778,7 +1778,7 @@ wEnemyNumAttacksLeft:: ; d06f
wEnemyConfusedCounter:: ; d070
ds 1
wEnemyToxcCounter:: ; d071
wEnemyToxicCounter:: ; d071
ds 1
wEnemyDisabledMove:: ; d072
@ -2637,21 +2637,21 @@ wPlayerDirection:: ; d52a
; if the player is not moving, the last the direction in which the player moved
ds 1
wTileSetBank:: ; d52b
wTilesetBank:: ; d52b
ds 1
wTileSetBlocksPtr:: ; d52c
wTilesetBlocksPtr:: ; d52c
; maps blocks (4x4 tiles) to tiles
ds 2
wTileSetGFXPtr:: ; d52e
wTilesetGfxPtr:: ; d52e
ds 2
wTileSetCollisionPtr:: ; d530
wTilesetCollisionPtr:: ; d530
; list of all walkable tiles
ds 2
wTileSetTalkingOverTiles:: ; d532
wTilesetTalkingOverTiles:: ; d532
ds 3
wGrassTile:: ; d535