pull some bank 1 code out of main.asm

This commit is contained in:
YamaArashi 2016-09-17 17:37:32 -07:00
parent 46a94c63fc
commit 6f1ac06e03
8 changed files with 504 additions and 505 deletions

View file

@ -969,3 +969,9 @@ CableClub_DrawHorizontalLine:
dec d
jr nz, .loop
ret
LoadTrainerInfoTextBoxTiles:
ld de, TrainerInfoTextBoxTileGraphics
ld hl, vChars2 + $760
lb bc, BANK(TrainerInfoTextBoxTileGraphics), (TrainerInfoTextBoxTileGraphicsEnd - TrainerInfoTextBoxTileGraphics) / $10
jp CopyVideoData

49
engine/load_mon_data.asm Normal file
View file

@ -0,0 +1,49 @@
LoadMonData_:
; Load monster [wWhichPokemon] from list [wMonDataLocation]:
; 0: partymon
; 1: enemymon
; 2: boxmon
; 3: daycaremon
; Return monster id at wcf91 and its data at wLoadedMon.
; Also load base stats at wMonHeader for convenience.
ld a, [wDayCareMonSpecies]
ld [wcf91], a
ld a, [wMonDataLocation]
cp DAYCARE_DATA
jr z, .GetMonHeader
ld a, [wWhichPokemon]
ld e, a
callab GetMonSpecies
.GetMonHeader
ld a, [wcf91]
ld [wd0b5], a ; input for GetMonHeader
call GetMonHeader
ld hl, wPartyMons
ld bc, wPartyMon2 - wPartyMon1
ld a, [wMonDataLocation]
cp ENEMY_PARTY_DATA
jr c, .getMonEntry
ld hl, wEnemyMons
jr z, .getMonEntry
cp 2
ld hl, wBoxMons
ld bc, wBoxMon2 - wBoxMon1
jr z, .getMonEntry
ld hl, wDayCareMon
jr .copyMonData
.getMonEntry
ld a, [wWhichPokemon]
call AddNTimes
.copyMonData
ld de, wLoadedMon
ld bc, wPartyMon2 - wPartyMon1
jp CopyData

View file

@ -0,0 +1,356 @@
_UpdateSprites:
ld h, $c1
inc h
ld a, $e ; wSpriteStateData2 + $0e
.spriteLoop
ld l, a
sub $e
ld c, a
ld [H_CURRENTSPRITEOFFSET], a
ld a, [hl]
and a
jr z, .skipSprite ; tests $c2Xe
push hl
push de
push bc
call .updateCurrentSprite
pop bc
pop de
pop hl
.skipSprite
ld a, l
add $10 ; move to next sprite
cp $e ; test for overflow (back at $0e)
jr nz, .spriteLoop
ret
.updateCurrentSprite
cp $1
jp nz, UpdateNonPlayerSprite
jp UpdatePlayerSprite
UpdateNonPlayerSprite:
dec a
swap a
ld [$ff93], a ; $10 * sprite#
ld a, [wNPCMovementScriptSpriteOffset] ; some sprite offset?
ld b, a
ld a, [H_CURRENTSPRITEOFFSET]
cp b
jr nz, .unequal
jp DoScriptedNPCMovement
.unequal
jp UpdateNPCSprite
; This detects if the current sprite (whose offset is at H_CURRENTSPRITEOFFSET)
; is going to collide with another sprite by looping over the other sprites.
; The current sprite's offset will be labelled with i (e.g. $c1i0).
; The loop sprite's offset will labelled with j (e.g. $c1j0).
;
; Note that the Y coordinate of the sprite (in [$c1k4]) is one of the following
; 9 values when the sprite is aligned with the grid: $fc, $0c, $1c, $2c, ..., $7c.
; The reason that 4 is added below to the coordinate is to make it align with a
; multiple of $10 to make comparisons easier.
DetectCollisionBetweenSprites:
nop
ld h, wSpriteStateData1 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add wSpriteStateData1 % $100
ld l, a
ld a, [hl] ; a = [$c1i0] (picture) (0 if slot is unused)
and a ; is this sprite slot slot used?
ret z ; return if not used
ld a, l
add 3
ld l, a
ld a, [hli] ; a = [$c1i3] (delta Y) (-1, 0, or 1)
call SetSpriteCollisionValues
ld a, [hli] ; a = [$C1i4] (Y screen coordinate)
add 4 ; align with multiple of $10
; The effect of the following 3 lines is to
; add 7 to a if moving south or
; subtract 7 from a if moving north.
add b
and $f0
or c
ld [$ff90], a ; store Y coordinate adjusted for direction of movement
ld a, [hli] ; a = [$c1i5] (delta X) (-1, 0, or 1)
call SetSpriteCollisionValues
ld a, [hl] ; a = [$C1i6] (X screen coordinate)
; The effect of the following 3 lines is to
; add 7 to a if moving east or
; subtract 7 from a if moving west.
add b
and $f0
or c
ld [$ff91], a ; store X coordinate adjusted for direction of movement
ld a, l
add 7
ld l, a
xor a
ld [hld], a ; zero [$c1id] XXX what's [$c1id] for?
ld [hld], a ; zero [$c1ic] (directions in which collisions occurred)
ld a, [$ff91]
ld [hld], a ; [$c1ib] = adjusted X coordinate
ld a, [$ff90]
ld [hl], a ; [$c1ia] = adjusted Y coordinate
xor a ; zero the loop counter
.loop
ld [$ff8f], a ; store loop counter
swap a
ld e, a
ld a, [H_CURRENTSPRITEOFFSET]
cp e ; does the loop sprite match the current sprite?
jp z, .next ; go to the next sprite if they match
ld d, h
ld a, [de] ; a = [$c1j0] (picture) (0 if slot is unused)
and a ; is this sprite slot slot used?
jp z, .next ; go the next sprite if not used
inc e
inc e
ld a, [de] ; a = [$c1j2] ($ff means the sprite is offscreen)
inc a
jp z, .next ; go the next sprite if offscreen
ld a, [H_CURRENTSPRITEOFFSET]
add 10
ld l, a
inc e
ld a, [de] ; a = [$c1j3] (delta Y)
call SetSpriteCollisionValues
inc e
ld a, [de] ; a = [$C1j4] (Y screen coordinate)
add 4 ; align with multiple of $10
; The effect of the following 3 lines is to
; add 7 to a if moving south or
; subtract 7 from a if moving north.
add b
and $f0
or c
sub [hl] ; subtract the adjusted Y coordinate of sprite i ([$c1ia]) from that of sprite j
; calculate the absolute value of the difference to get the distance
jr nc, .noCarry1
cpl
inc a
.noCarry1
ld [$ff90], a ; store the distance between the two sprites' adjusted Y values
; Use the carry flag set by the above subtraction to determine which sprite's
; Y coordinate is larger. This information is used later to set [$c1ic],
; which stores which direction the collision occurred in.
; The following 5 lines set the lowest 2 bits of c, which are later shifted left by 2.
; If sprite i's Y is larger, set lowest 2 bits of c to 10.
; If sprite j's Y is larger or both are equal, set lowest 2 bits of c to 01.
push af
rl c
pop af
ccf
rl c
; If sprite i's delta Y is 0, then b = 7, else b = 9.
ld b, 7
ld a, [hl] ; a = [$c1ia] (adjusted Y coordinate)
and $f
jr z, .next1
ld b, 9
.next1
ld a, [$ff90] ; a = distance between adjusted Y coordinates
sub b
ld [$ff92], a ; store distance adjusted using sprite i's direction
ld a, b
ld [$ff90], a ; store 7 or 9 depending on sprite i's delta Y
jr c, .checkXDistance
; If sprite j's delta Y is 0, then b = 7, else b = 9.
ld b, 7
dec e
ld a, [de] ; a = [$c1j3] (delta Y)
inc e
and a
jr z, .next2
ld b, 9
.next2
ld a, [$ff92] ; a = distance adjusted using sprite i's direction
sub b ; adjust distance using sprite j's direction
jr z, .checkXDistance
jr nc, .next ; go to next sprite if distance is still positive after both adjustments
.checkXDistance
inc e
inc l
ld a, [de] ; a = [$c1j5] (delta X)
push bc
call SetSpriteCollisionValues
inc e
ld a, [de] ; a = [$c1j6] (X screen coordinate)
; The effect of the following 3 lines is to
; add 7 to a if moving east or
; subtract 7 from a if moving west.
add b
and $f0
or c
pop bc
sub [hl] ; subtract the adjusted X coordinate of sprite i ([$c1ib]) from that of sprite j
; calculate the absolute value of the difference to get the distance
jr nc, .noCarry2
cpl
inc a
.noCarry2
ld [$ff91], a ; store the distance between the two sprites' adjusted X values
; Use the carry flag set by the above subtraction to determine which sprite's
; X coordinate is larger. This information is used later to set [$c1ic],
; which stores which direction the collision occurred in.
; The following 5 lines set the lowest 2 bits of c.
; If sprite i's X is larger, set lowest 2 bits of c to 10.
; If sprite j's X is larger or both are equal, set lowest 2 bits of c to 01.
push af
rl c
pop af
ccf
rl c
; If sprite i's delta X is 0, then b = 7, else b = 9.
ld b, 7
ld a, [hl] ; a = [$c1ib] (adjusted X coordinate)
and $f
jr z, .next3
ld b, 9
.next3
ld a, [$ff91] ; a = distance between adjusted X coordinates
sub b
ld [$ff92], a ; store distance adjusted using sprite i's direction
ld a, b
ld [$ff91], a ; store 7 or 9 depending on sprite i's delta X
jr c, .collision
; If sprite j's delta X is 0, then b = 7, else b = 9.
ld b, 7
dec e
ld a, [de] ; a = [$c1j5] (delta X)
inc e
and a
jr z, .next4
ld b, 9
.next4
ld a, [$ff92] ; a = distance adjusted using sprite i's direction
sub b ; adjust distance using sprite j's direction
jr z, .collision
jr nc, .next ; go to next sprite if distance is still positive after both adjustments
.collision
ld a, [$ff91] ; a = 7 or 9 depending on sprite i's delta X
ld b, a
ld a, [$ff90] ; a = 7 or 9 depending on sprite i's delta Y
inc l
; If delta X isn't 0 and delta Y is 0, then b = %0011, else b = %1100.
; (note that normally if delta X isn't 0, then delta Y must be 0 and vice versa)
cp b
jr c, .next5
ld b, %1100
jr .next6
.next5
ld b, %0011
.next6
ld a, c ; c has 2 bits set (one of bits 0-1 is set for the X axis and one of bits 2-3 for the Y axis)
and b ; we select either the bit in bits 0-1 or bits 2-3 based on the calculation immediately above
or [hl] ; or with existing collision direction bits in [$c1ic]
ld [hl], a ; store new value
ld a, c ; useless code because a is overwritten before being used again
; set bit in [$c1ie] or [$c1if] to indicate which sprite the collision occurred with
inc l
inc l
ld a, [$ff8f] ; a = loop counter
ld de, SpriteCollisionBitTable
add a
add e
ld e, a
jr nc, .noCarry3
inc d
.noCarry3
ld a, [de]
or [hl]
ld [hli], a
inc de
ld a, [de]
or [hl]
ld [hl], a
.next
ld a, [$ff8f] ; a = loop counter
inc a
cp $10
jp nz, .loop
ret
; takes delta X or delta Y in a
; b = delta X/Y
; c = 0 if delta X/Y is 0
; c = 7 if delta X/Y is 1
; c = 9 if delta X/Y is -1
SetSpriteCollisionValues:
and a
ld b, 0
ld c, 0
jr z, .done
ld c, 9
cp -1
jr z, .ok
ld c, 7
ld a, 0
.ok
ld b, a
.done
ret
SpriteCollisionBitTable:
db %00000000,%00000001
db %00000000,%00000010
db %00000000,%00000100
db %00000000,%00001000
db %00000000,%00010000
db %00000000,%00100000
db %00000000,%01000000
db %00000000,%10000000
db %00000001,%00000000
db %00000010,%00000000
db %00000100,%00000000
db %00001000,%00000000
db %00010000,%00000000
db %00100000,%00000000
db %01000000,%00000000
db %10000000,%00000000

View file

@ -0,0 +1,20 @@
PrintWaitingText:
coord hl, 3, 10
ld b, $1
ld c, $b
ld a, [wIsInBattle]
and a
jr z, .asm_4c17
call TextBoxBorder
jr .asm_4c1a
.asm_4c17
call CableClub_TextBoxBorder
.asm_4c1a
coord hl, 4, 11
ld de, WaitingText
call PlaceString
ld c, 50
jp DelayFrames
WaitingText:
db "Waiting...!@"

45
engine/test_battle.asm Normal file
View file

@ -0,0 +1,45 @@
TestBattle:
ret
.loop
call GBPalNormal
; Don't mess around
; with obedience.
ld a, %10000000 ; EARTHBADGE
ld [wObtainedBadges], a
ld hl, wFlags_D733
set BIT_TEST_BATTLE, [hl]
; Reset the party.
ld hl, wPartyCount
xor a
ld [hli], a
dec a
ld [hl], a
; Give the player a
; level 20 Rhydon.
ld a, RHYDON
ld [wcf91], a
ld a, 20
ld [wCurEnemyLVL], a
xor a
ld [wMonDataLocation], a
ld [wCurMap], a
call AddPartyMon
; Fight against a
; level 20 Rhydon.
ld a, RHYDON
ld [wCurOpponent], a
predef InitOpponent
; When the battle ends,
; do it all again.
ld a, 1
ld [wUpdateSpritesEnabled], a
ld [H_AUTOBGTRANSFERENABLED], a
jr .loop

View file

@ -398,3 +398,6 @@ ENDC
IF DEF(_BLUE)
db $61,$62,$63,$64,$65,$66,$67,$68,"@" ; "Blue Version"
ENDC
NintenText: db "NINTEN@"
SonyText: db "SONY@"

510
main.asm
View file

@ -11,7 +11,6 @@ PICS_3 EQU $B
PICS_4 EQU $C
PICS_5 EQU $D
INCLUDE "home.asm"
@ -74,525 +73,26 @@ INCLUDE "data/baseStats/mew.asm"
INCLUDE "engine/battle/safari_zone.asm"
INCLUDE "engine/titlescreen.asm"
NintenText: db "NINTEN@"
SonyText: db "SONY@"
LoadMonData_:
; Load monster [wWhichPokemon] from list [wMonDataLocation]:
; 0: partymon
; 1: enemymon
; 2: boxmon
; 3: daycaremon
; Return monster id at wcf91 and its data at wLoadedMon.
; Also load base stats at wMonHeader for convenience.
ld a, [wDayCareMonSpecies]
ld [wcf91], a
ld a, [wMonDataLocation]
cp DAYCARE_DATA
jr z, .GetMonHeader
ld a, [wWhichPokemon]
ld e, a
callab GetMonSpecies
.GetMonHeader
ld a, [wcf91]
ld [wd0b5], a ; input for GetMonHeader
call GetMonHeader
ld hl, wPartyMons
ld bc, wPartyMon2 - wPartyMon1
ld a, [wMonDataLocation]
cp ENEMY_PARTY_DATA
jr c, .getMonEntry
ld hl, wEnemyMons
jr z, .getMonEntry
cp 2
ld hl, wBoxMons
ld bc, wBoxMon2 - wBoxMon1
jr z, .getMonEntry
ld hl, wDayCareMon
jr .copyMonData
.getMonEntry
ld a, [wWhichPokemon]
call AddNTimes
.copyMonData
ld de, wLoadedMon
ld bc, wPartyMon2 - wPartyMon1
jp CopyData
INCLUDE "engine/load_mon_data.asm"
INCLUDE "data/item_prices.asm"
INCLUDE "text/item_names.asm"
UnusedNames:
db "かみなりバッヂ@"
db "かいがらバッヂ@"
db "おじぞうバッヂ@"
db "はやぶさバッヂ@"
db "ひんやりバッヂ@"
db "なかよしバッヂ@"
db "バラバッヂ@"
db "ひのたまバッヂ@"
db "ゴールドバッヂ@"
db "たまご@"
db "ひよこ@"
db "ブロンズ@"
db "シルバー@"
db "ゴールド@"
db "プチキャプテン@"
db "キャプテン@"
db "プチマスター@"
db "マスター@"
db "エクセレント"
INCLUDE "text/unused_names.asm"
INCLUDE "engine/overworld/oam.asm"
INCLUDE "engine/oam_dma.asm"
PrintWaitingText:
coord hl, 3, 10
ld b, $1
ld c, $b
ld a, [wIsInBattle]
and a
jr z, .asm_4c17
call TextBoxBorder
jr .asm_4c1a
.asm_4c17
call CableClub_TextBoxBorder
.asm_4c1a
coord hl, 4, 11
ld de, WaitingText
call PlaceString
ld c, 50
jp DelayFrames
INCLUDE "engine/print_waiting_text.asm"
WaitingText:
db "Waiting...!@"
INCLUDE "engine/overworld/map_sprite_functions1.asm"
_UpdateSprites:
ld h, $c1
inc h
ld a, $e ; wSpriteStateData2 + $0e
.spriteLoop
ld l, a
sub $e
ld c, a
ld [H_CURRENTSPRITEOFFSET], a
ld a, [hl]
and a
jr z, .skipSprite ; tests $c2Xe
push hl
push de
push bc
call .updateCurrentSprite
pop bc
pop de
pop hl
.skipSprite
ld a, l
add $10 ; move to next sprite
cp $e ; test for overflow (back at $0e)
jr nz, .spriteLoop
ret
.updateCurrentSprite
cp $1
jp nz, UpdateNonPlayerSprite
jp UpdatePlayerSprite
UpdateNonPlayerSprite:
dec a
swap a
ld [$ff93], a ; $10 * sprite#
ld a, [wNPCMovementScriptSpriteOffset] ; some sprite offset?
ld b, a
ld a, [H_CURRENTSPRITEOFFSET]
cp b
jr nz, .unequal
jp DoScriptedNPCMovement
.unequal
jp UpdateNPCSprite
; This detects if the current sprite (whose offset is at H_CURRENTSPRITEOFFSET)
; is going to collide with another sprite by looping over the other sprites.
; The current sprite's offset will be labelled with i (e.g. $c1i0).
; The loop sprite's offset will labelled with j (e.g. $c1j0).
;
; Note that the Y coordinate of the sprite (in [$c1k4]) is one of the following
; 9 values when the sprite is aligned with the grid: $fc, $0c, $1c, $2c, ..., $7c.
; The reason that 4 is added below to the coordinate is to make it align with a
; multiple of $10 to make comparisons easier.
DetectCollisionBetweenSprites:
nop
ld h, wSpriteStateData1 / $100
ld a, [H_CURRENTSPRITEOFFSET]
add wSpriteStateData1 % $100
ld l, a
ld a, [hl] ; a = [$c1i0] (picture) (0 if slot is unused)
and a ; is this sprite slot slot used?
ret z ; return if not used
ld a, l
add 3
ld l, a
ld a, [hli] ; a = [$c1i3] (delta Y) (-1, 0, or 1)
call SetSpriteCollisionValues
ld a, [hli] ; a = [$C1i4] (Y screen coordinate)
add 4 ; align with multiple of $10
; The effect of the following 3 lines is to
; add 7 to a if moving south or
; subtract 7 from a if moving north.
add b
and $f0
or c
ld [$ff90], a ; store Y coordinate adjusted for direction of movement
ld a, [hli] ; a = [$c1i5] (delta X) (-1, 0, or 1)
call SetSpriteCollisionValues
ld a, [hl] ; a = [$C1i6] (X screen coordinate)
; The effect of the following 3 lines is to
; add 7 to a if moving east or
; subtract 7 from a if moving west.
add b
and $f0
or c
ld [$ff91], a ; store X coordinate adjusted for direction of movement
ld a, l
add 7
ld l, a
xor a
ld [hld], a ; zero [$c1id] XXX what's [$c1id] for?
ld [hld], a ; zero [$c1ic] (directions in which collisions occurred)
ld a, [$ff91]
ld [hld], a ; [$c1ib] = adjusted X coordinate
ld a, [$ff90]
ld [hl], a ; [$c1ia] = adjusted Y coordinate
xor a ; zero the loop counter
.loop
ld [$ff8f], a ; store loop counter
swap a
ld e, a
ld a, [H_CURRENTSPRITEOFFSET]
cp e ; does the loop sprite match the current sprite?
jp z, .next ; go to the next sprite if they match
ld d, h
ld a, [de] ; a = [$c1j0] (picture) (0 if slot is unused)
and a ; is this sprite slot slot used?
jp z, .next ; go the next sprite if not used
inc e
inc e
ld a, [de] ; a = [$c1j2] ($ff means the sprite is offscreen)
inc a
jp z, .next ; go the next sprite if offscreen
ld a, [H_CURRENTSPRITEOFFSET]
add 10
ld l, a
inc e
ld a, [de] ; a = [$c1j3] (delta Y)
call SetSpriteCollisionValues
inc e
ld a, [de] ; a = [$C1j4] (Y screen coordinate)
add 4 ; align with multiple of $10
; The effect of the following 3 lines is to
; add 7 to a if moving south or
; subtract 7 from a if moving north.
add b
and $f0
or c
sub [hl] ; subtract the adjusted Y coordinate of sprite i ([$c1ia]) from that of sprite j
; calculate the absolute value of the difference to get the distance
jr nc, .noCarry1
cpl
inc a
.noCarry1
ld [$ff90], a ; store the distance between the two sprites' adjusted Y values
; Use the carry flag set by the above subtraction to determine which sprite's
; Y coordinate is larger. This information is used later to set [$c1ic],
; which stores which direction the collision occurred in.
; The following 5 lines set the lowest 2 bits of c, which are later shifted left by 2.
; If sprite i's Y is larger, set lowest 2 bits of c to 10.
; If sprite j's Y is larger or both are equal, set lowest 2 bits of c to 01.
push af
rl c
pop af
ccf
rl c
; If sprite i's delta Y is 0, then b = 7, else b = 9.
ld b, 7
ld a, [hl] ; a = [$c1ia] (adjusted Y coordinate)
and $f
jr z, .next1
ld b, 9
.next1
ld a, [$ff90] ; a = distance between adjusted Y coordinates
sub b
ld [$ff92], a ; store distance adjusted using sprite i's direction
ld a, b
ld [$ff90], a ; store 7 or 9 depending on sprite i's delta Y
jr c, .checkXDistance
; If sprite j's delta Y is 0, then b = 7, else b = 9.
ld b, 7
dec e
ld a, [de] ; a = [$c1j3] (delta Y)
inc e
and a
jr z, .next2
ld b, 9
.next2
ld a, [$ff92] ; a = distance adjusted using sprite i's direction
sub b ; adjust distance using sprite j's direction
jr z, .checkXDistance
jr nc, .next ; go to next sprite if distance is still positive after both adjustments
.checkXDistance
inc e
inc l
ld a, [de] ; a = [$c1j5] (delta X)
push bc
call SetSpriteCollisionValues
inc e
ld a, [de] ; a = [$c1j6] (X screen coordinate)
; The effect of the following 3 lines is to
; add 7 to a if moving east or
; subtract 7 from a if moving west.
add b
and $f0
or c
pop bc
sub [hl] ; subtract the adjusted X coordinate of sprite i ([$c1ib]) from that of sprite j
; calculate the absolute value of the difference to get the distance
jr nc, .noCarry2
cpl
inc a
.noCarry2
ld [$ff91], a ; store the distance between the two sprites' adjusted X values
; Use the carry flag set by the above subtraction to determine which sprite's
; X coordinate is larger. This information is used later to set [$c1ic],
; which stores which direction the collision occurred in.
; The following 5 lines set the lowest 2 bits of c.
; If sprite i's X is larger, set lowest 2 bits of c to 10.
; If sprite j's X is larger or both are equal, set lowest 2 bits of c to 01.
push af
rl c
pop af
ccf
rl c
; If sprite i's delta X is 0, then b = 7, else b = 9.
ld b, 7
ld a, [hl] ; a = [$c1ib] (adjusted X coordinate)
and $f
jr z, .next3
ld b, 9
.next3
ld a, [$ff91] ; a = distance between adjusted X coordinates
sub b
ld [$ff92], a ; store distance adjusted using sprite i's direction
ld a, b
ld [$ff91], a ; store 7 or 9 depending on sprite i's delta X
jr c, .collision
; If sprite j's delta X is 0, then b = 7, else b = 9.
ld b, 7
dec e
ld a, [de] ; a = [$c1j5] (delta X)
inc e
and a
jr z, .next4
ld b, 9
.next4
ld a, [$ff92] ; a = distance adjusted using sprite i's direction
sub b ; adjust distance using sprite j's direction
jr z, .collision
jr nc, .next ; go to next sprite if distance is still positive after both adjustments
.collision
ld a, [$ff91] ; a = 7 or 9 depending on sprite i's delta X
ld b, a
ld a, [$ff90] ; a = 7 or 9 depending on sprite i's delta Y
inc l
; If delta X isn't 0 and delta Y is 0, then b = %0011, else b = %1100.
; (note that normally if delta X isn't 0, then delta Y must be 0 and vice versa)
cp b
jr c, .next5
ld b, %1100
jr .next6
.next5
ld b, %0011
.next6
ld a, c ; c has 2 bits set (one of bits 0-1 is set for the X axis and one of bits 2-3 for the Y axis)
and b ; we select either the bit in bits 0-1 or bits 2-3 based on the calculation immediately above
or [hl] ; or with existing collision direction bits in [$c1ic]
ld [hl], a ; store new value
ld a, c ; useless code because a is overwritten before being used again
; set bit in [$c1ie] or [$c1if] to indicate which sprite the collision occurred with
inc l
inc l
ld a, [$ff8f] ; a = loop counter
ld de, SpriteCollisionBitTable
add a
add e
ld e, a
jr nc, .noCarry3
inc d
.noCarry3
ld a, [de]
or [hl]
ld [hli], a
inc de
ld a, [de]
or [hl]
ld [hl], a
.next
ld a, [$ff8f] ; a = loop counter
inc a
cp $10
jp nz, .loop
ret
; takes delta X or delta Y in a
; b = delta X/Y
; c = 0 if delta X/Y is 0
; c = 7 if delta X/Y is 1
; c = 9 if delta X/Y is -1
SetSpriteCollisionValues:
and a
ld b, 0
ld c, 0
jr z, .done
ld c, 9
cp -1
jr z, .ok
ld c, 7
ld a, 0
.ok
ld b, a
.done
ret
SpriteCollisionBitTable:
db %00000000,%00000001
db %00000000,%00000010
db %00000000,%00000100
db %00000000,%00001000
db %00000000,%00010000
db %00000000,%00100000
db %00000000,%01000000
db %00000000,%10000000
db %00000001,%00000000
db %00000010,%00000000
db %00000100,%00000000
db %00001000,%00000000
db %00010000,%00000000
db %00100000,%00000000
db %01000000,%00000000
db %10000000,%00000000
TestBattle:
ret
.loop
call GBPalNormal
; Don't mess around
; with obedience.
ld a, %10000000 ; EARTHBADGE
ld [wObtainedBadges], a
ld hl, wFlags_D733
set BIT_TEST_BATTLE, [hl]
; Reset the party.
ld hl, wPartyCount
xor a
ld [hli], a
dec a
ld [hl], a
; Give the player a
; level 20 Rhydon.
ld a, RHYDON
ld [wcf91], a
ld a, 20
ld [wCurEnemyLVL], a
xor a
ld [wMonDataLocation], a
ld [wCurMap], a
call AddPartyMon
; Fight against a
; level 20 Rhydon.
ld a, RHYDON
ld [wCurOpponent], a
predef InitOpponent
; When the battle ends,
; do it all again.
ld a, 1
ld [wUpdateSpritesEnabled], a
ld [H_AUTOBGTRANSFERENABLED], a
jr .loop
INCLUDE "engine/test_battle.asm"
INCLUDE "engine/overworld/item.asm"
INCLUDE "engine/overworld/movement.asm"
INCLUDE "engine/cable_club.asm"
LoadTrainerInfoTextBoxTiles:
ld de, TrainerInfoTextBoxTileGraphics
ld hl, vChars2 + $760
lb bc, BANK(TrainerInfoTextBoxTileGraphics), (TrainerInfoTextBoxTileGraphicsEnd - TrainerInfoTextBoxTileGraphics) / $10
jp CopyVideoData
INCLUDE "engine/menu/main_menu.asm"
INCLUDE "engine/oak_speech.asm"

20
text/unused_names.asm Normal file
View file

@ -0,0 +1,20 @@
UnusedNames::
db "かみなりバッヂ@"
db "かいがらバッヂ@"
db "おじぞうバッヂ@"
db "はやぶさバッヂ@"
db "ひんやりバッヂ@"
db "なかよしバッヂ@"
db "バラバッヂ@"
db "ひのたまバッヂ@"
db "ゴールドバッヂ@"
db "たまご@"
db "ひよこ@"
db "ブロンズ@"
db "シルバー@"
db "ゴールド@"
db "プチキャプテン@"
db "キャプテン@"
db "プチマスター@"
db "マスター@"
db "エクセレント"