mirror of
https://github.com/pret/pokered.git
synced 2024-10-22 22:55:31 +00:00
split code out of main.asm
This commit is contained in:
parent
10289bf7dd
commit
bf67f7174d
22 changed files with 2671 additions and 2675 deletions
512
engine/add_mon.asm
Normal file
512
engine/add_mon.asm
Normal file
|
@ -0,0 +1,512 @@
|
||||||
|
_AddPartyMon:
|
||||||
|
; Adds a new mon to the player's or enemy's party.
|
||||||
|
; [wMonDataLocation] is used in an unusual way in this function.
|
||||||
|
; If the lower nybble is 0, the mon is added to the player's party, else the enemy's.
|
||||||
|
; If the entire value is 0, then the player is allowed to name the mon.
|
||||||
|
ld de, wPartyCount
|
||||||
|
ld a, [wMonDataLocation]
|
||||||
|
and $f
|
||||||
|
jr z, .next
|
||||||
|
ld de, wEnemyPartyCount
|
||||||
|
.next
|
||||||
|
ld a, [de]
|
||||||
|
inc a
|
||||||
|
cp PARTY_LENGTH + 1
|
||||||
|
ret nc ; return if the party is already full
|
||||||
|
ld [de], a
|
||||||
|
ld a, [de]
|
||||||
|
ld [hNewPartyLength], a
|
||||||
|
add e
|
||||||
|
ld e, a
|
||||||
|
jr nc, .noCarry
|
||||||
|
inc d
|
||||||
|
.noCarry
|
||||||
|
ld a, [wcf91]
|
||||||
|
ld [de], a ; write species of new mon in party list
|
||||||
|
inc de
|
||||||
|
ld a, $ff ; terminator
|
||||||
|
ld [de], a
|
||||||
|
ld hl, wPartyMonOT
|
||||||
|
ld a, [wMonDataLocation]
|
||||||
|
and $f
|
||||||
|
jr z, .next2
|
||||||
|
ld hl, wEnemyMonOT
|
||||||
|
.next2
|
||||||
|
ld a, [hNewPartyLength]
|
||||||
|
dec a
|
||||||
|
call SkipFixedLengthTextEntries
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
ld hl, wPlayerName
|
||||||
|
ld bc, NAME_LENGTH
|
||||||
|
call CopyData
|
||||||
|
ld a, [wMonDataLocation]
|
||||||
|
and a
|
||||||
|
jr nz, .skipNaming
|
||||||
|
ld hl, wPartyMonNicks
|
||||||
|
ld a, [hNewPartyLength]
|
||||||
|
dec a
|
||||||
|
call SkipFixedLengthTextEntries
|
||||||
|
ld a, NAME_MON_SCREEN
|
||||||
|
ld [wNamingScreenType], a
|
||||||
|
predef AskName
|
||||||
|
.skipNaming
|
||||||
|
ld hl, wPartyMons
|
||||||
|
ld a, [wMonDataLocation]
|
||||||
|
and $f
|
||||||
|
jr z, .next3
|
||||||
|
ld hl, wEnemyMons
|
||||||
|
.next3
|
||||||
|
ld a, [hNewPartyLength]
|
||||||
|
dec a
|
||||||
|
ld bc, wPartyMon2 - wPartyMon1
|
||||||
|
call AddNTimes
|
||||||
|
ld e, l
|
||||||
|
ld d, h
|
||||||
|
push hl
|
||||||
|
ld a, [wcf91]
|
||||||
|
ld [wd0b5], a
|
||||||
|
call GetMonHeader
|
||||||
|
ld hl, wMonHeader
|
||||||
|
ld a, [hli]
|
||||||
|
ld [de], a ; species
|
||||||
|
inc de
|
||||||
|
pop hl
|
||||||
|
push hl
|
||||||
|
ld a, [wMonDataLocation]
|
||||||
|
and $f
|
||||||
|
ld a, $98 ; set enemy trainer mon IVs to fixed average values
|
||||||
|
ld b, $88
|
||||||
|
jr nz, .next4
|
||||||
|
|
||||||
|
; If the mon is being added to the player's party, update the pokedex.
|
||||||
|
ld a, [wcf91]
|
||||||
|
ld [wd11e], a
|
||||||
|
push de
|
||||||
|
predef IndexToPokedex
|
||||||
|
pop de
|
||||||
|
ld a, [wd11e]
|
||||||
|
dec a
|
||||||
|
ld c, a
|
||||||
|
ld b, FLAG_TEST
|
||||||
|
ld hl, wPokedexOwned
|
||||||
|
call FlagAction
|
||||||
|
ld a, c ; whether the mon was already flagged as owned
|
||||||
|
ld [wUnusedD153], a ; not read
|
||||||
|
ld a, [wd11e]
|
||||||
|
dec a
|
||||||
|
ld c, a
|
||||||
|
ld b, FLAG_SET
|
||||||
|
push bc
|
||||||
|
call FlagAction
|
||||||
|
pop bc
|
||||||
|
ld hl, wPokedexSeen
|
||||||
|
call FlagAction
|
||||||
|
|
||||||
|
pop hl
|
||||||
|
push hl
|
||||||
|
|
||||||
|
ld a, [wIsInBattle]
|
||||||
|
and a ; is this a wild mon caught in battle?
|
||||||
|
jr nz, .copyEnemyMonData
|
||||||
|
|
||||||
|
; Not wild.
|
||||||
|
call Random ; generate random IVs
|
||||||
|
ld b, a
|
||||||
|
call Random
|
||||||
|
|
||||||
|
.next4
|
||||||
|
push bc
|
||||||
|
ld bc, wPartyMon1DVs - wPartyMon1
|
||||||
|
add hl, bc
|
||||||
|
pop bc
|
||||||
|
ld [hli], a
|
||||||
|
ld [hl], b ; write IVs
|
||||||
|
ld bc, (wPartyMon1HPExp - 1) - (wPartyMon1DVs + 1)
|
||||||
|
add hl, bc
|
||||||
|
ld a, 1
|
||||||
|
ld c, a
|
||||||
|
xor a
|
||||||
|
ld b, a
|
||||||
|
call CalcStat ; calc HP stat (set cur Hp to max HP)
|
||||||
|
ld a, [H_MULTIPLICAND+1]
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
ld a, [H_MULTIPLICAND+2]
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
xor a
|
||||||
|
ld [de], a ; box level
|
||||||
|
inc de
|
||||||
|
ld [de], a ; status ailments
|
||||||
|
inc de
|
||||||
|
jr .copyMonTypesAndMoves
|
||||||
|
.copyEnemyMonData
|
||||||
|
ld bc, wEnemyMon1DVs - wEnemyMon1
|
||||||
|
add hl, bc
|
||||||
|
ld a, [wEnemyMonDVs] ; copy IVs from cur enemy mon
|
||||||
|
ld [hli], a
|
||||||
|
ld a, [wEnemyMonDVs + 1]
|
||||||
|
ld [hl], a
|
||||||
|
ld a, [wEnemyMonHP] ; copy HP from cur enemy mon
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
ld a, [wEnemyMonHP+1]
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
xor a
|
||||||
|
ld [de], a ; box level
|
||||||
|
inc de
|
||||||
|
ld a, [wEnemyMonStatus] ; copy status ailments from cur enemy mon
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
.copyMonTypesAndMoves
|
||||||
|
ld hl, wMonHTypes
|
||||||
|
ld a, [hli] ; type 1
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
ld a, [hli] ; type 2
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
ld a, [hli] ; catch rate (held item in gen 2)
|
||||||
|
ld [de], a
|
||||||
|
ld hl, wMonHMoves
|
||||||
|
ld a, [hli]
|
||||||
|
inc de
|
||||||
|
push de
|
||||||
|
ld [de], a
|
||||||
|
ld a, [hli]
|
||||||
|
inc de
|
||||||
|
ld [de], a
|
||||||
|
ld a, [hli]
|
||||||
|
inc de
|
||||||
|
ld [de], a
|
||||||
|
ld a, [hli]
|
||||||
|
inc de
|
||||||
|
ld [de], a
|
||||||
|
push de
|
||||||
|
dec de
|
||||||
|
dec de
|
||||||
|
dec de
|
||||||
|
xor a
|
||||||
|
ld [wLearningMovesFromDayCare], a
|
||||||
|
predef WriteMonMoves
|
||||||
|
pop de
|
||||||
|
ld a, [wPlayerID] ; set trainer ID to player ID
|
||||||
|
inc de
|
||||||
|
ld [de], a
|
||||||
|
ld a, [wPlayerID + 1]
|
||||||
|
inc de
|
||||||
|
ld [de], a
|
||||||
|
push de
|
||||||
|
ld a, [wCurEnemyLVL]
|
||||||
|
ld d, a
|
||||||
|
callab CalcExperience
|
||||||
|
pop de
|
||||||
|
inc de
|
||||||
|
ld a, [hExperience] ; write experience
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
ld a, [hExperience + 1]
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
ld a, [hExperience + 2]
|
||||||
|
ld [de], a
|
||||||
|
xor a
|
||||||
|
ld b, NUM_STATS * 2
|
||||||
|
.writeEVsLoop ; set all EVs to 0
|
||||||
|
inc de
|
||||||
|
ld [de], a
|
||||||
|
dec b
|
||||||
|
jr nz, .writeEVsLoop
|
||||||
|
inc de
|
||||||
|
inc de
|
||||||
|
pop hl
|
||||||
|
call AddPartyMon_WriteMovePP
|
||||||
|
inc de
|
||||||
|
ld a, [wCurEnemyLVL]
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
ld a, [wIsInBattle]
|
||||||
|
dec a
|
||||||
|
jr nz, .calcFreshStats
|
||||||
|
ld hl, wEnemyMonMaxHP
|
||||||
|
ld bc, $a
|
||||||
|
call CopyData ; copy stats of cur enemy mon
|
||||||
|
pop hl
|
||||||
|
jr .done
|
||||||
|
.calcFreshStats
|
||||||
|
pop hl
|
||||||
|
ld bc, wPartyMon1HPExp - 1 - wPartyMon1
|
||||||
|
add hl, bc
|
||||||
|
ld b, $0
|
||||||
|
call CalcStats ; calculate fresh set of stats
|
||||||
|
.done
|
||||||
|
scf
|
||||||
|
ret
|
||||||
|
|
||||||
|
LoadMovePPs:
|
||||||
|
call GetPredefRegisters
|
||||||
|
; fallthrough
|
||||||
|
AddPartyMon_WriteMovePP:
|
||||||
|
ld b, NUM_MOVES
|
||||||
|
.pploop
|
||||||
|
ld a, [hli] ; read move ID
|
||||||
|
and a
|
||||||
|
jr z, .empty
|
||||||
|
dec a
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
push bc
|
||||||
|
ld hl, Moves
|
||||||
|
ld bc, MoveEnd - Moves
|
||||||
|
call AddNTimes
|
||||||
|
ld de, wcd6d
|
||||||
|
ld a, BANK(Moves)
|
||||||
|
call FarCopyData
|
||||||
|
pop bc
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
ld a, [wcd6d + 5] ; PP is byte 5 of move data
|
||||||
|
.empty
|
||||||
|
inc de
|
||||||
|
ld [de], a
|
||||||
|
dec b
|
||||||
|
jr nz, .pploop ; there are still moves to read
|
||||||
|
ret
|
||||||
|
|
||||||
|
; adds enemy mon [wcf91] (at position [wWhichPokemon] in enemy list) to own party
|
||||||
|
; used in the cable club trade center
|
||||||
|
_AddEnemyMonToPlayerParty:
|
||||||
|
ld hl, wPartyCount
|
||||||
|
ld a, [hl]
|
||||||
|
cp PARTY_LENGTH
|
||||||
|
scf
|
||||||
|
ret z ; party full, return failure
|
||||||
|
inc a
|
||||||
|
ld [hl], a ; add 1 to party members
|
||||||
|
ld c, a
|
||||||
|
ld b, $0
|
||||||
|
add hl, bc
|
||||||
|
ld a, [wcf91]
|
||||||
|
ld [hli], a ; add mon as last list entry
|
||||||
|
ld [hl], $ff ; write new sentinel
|
||||||
|
ld hl, wPartyMons
|
||||||
|
ld a, [wPartyCount]
|
||||||
|
dec a
|
||||||
|
ld bc, wPartyMon2 - wPartyMon1
|
||||||
|
call AddNTimes
|
||||||
|
ld e, l
|
||||||
|
ld d, h
|
||||||
|
ld hl, wLoadedMon
|
||||||
|
call CopyData ; write new mon's data (from wLoadedMon)
|
||||||
|
ld hl, wPartyMonOT
|
||||||
|
ld a, [wPartyCount]
|
||||||
|
dec a
|
||||||
|
call SkipFixedLengthTextEntries
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
ld hl, wEnemyMonOT
|
||||||
|
ld a, [wWhichPokemon]
|
||||||
|
call SkipFixedLengthTextEntries
|
||||||
|
ld bc, NAME_LENGTH
|
||||||
|
call CopyData ; write new mon's OT name (from an enemy mon)
|
||||||
|
ld hl, wPartyMonNicks
|
||||||
|
ld a, [wPartyCount]
|
||||||
|
dec a
|
||||||
|
call SkipFixedLengthTextEntries
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
ld hl, wEnemyMonNicks
|
||||||
|
ld a, [wWhichPokemon]
|
||||||
|
call SkipFixedLengthTextEntries
|
||||||
|
ld bc, NAME_LENGTH
|
||||||
|
call CopyData ; write new mon's nickname (from an enemy mon)
|
||||||
|
ld a, [wcf91]
|
||||||
|
ld [wd11e], a
|
||||||
|
predef IndexToPokedex
|
||||||
|
ld a, [wd11e]
|
||||||
|
dec a
|
||||||
|
ld c, a
|
||||||
|
ld b, FLAG_SET
|
||||||
|
ld hl, wPokedexOwned
|
||||||
|
push bc
|
||||||
|
call FlagAction ; add to owned pokemon
|
||||||
|
pop bc
|
||||||
|
ld hl, wPokedexSeen
|
||||||
|
call FlagAction ; add to seen pokemon
|
||||||
|
and a
|
||||||
|
ret ; return success
|
||||||
|
|
||||||
|
_MoveMon:
|
||||||
|
ld a, [wMoveMonType]
|
||||||
|
and a
|
||||||
|
jr z, .checkPartyMonSlots
|
||||||
|
cp DAYCARE_TO_PARTY
|
||||||
|
jr z, .checkPartyMonSlots
|
||||||
|
cp PARTY_TO_DAYCARE
|
||||||
|
ld hl, wDayCareMon
|
||||||
|
jr z, .asm_f575
|
||||||
|
ld hl, wNumInBox
|
||||||
|
ld a, [hl]
|
||||||
|
cp MONS_PER_BOX
|
||||||
|
jr nz, .partyOrBoxNotFull
|
||||||
|
jr .boxFull
|
||||||
|
.checkPartyMonSlots
|
||||||
|
ld hl, wPartyCount
|
||||||
|
ld a, [hl]
|
||||||
|
cp PARTY_LENGTH
|
||||||
|
jr nz, .partyOrBoxNotFull
|
||||||
|
.boxFull
|
||||||
|
scf
|
||||||
|
ret
|
||||||
|
.partyOrBoxNotFull
|
||||||
|
inc a
|
||||||
|
ld [hl], a ; increment number of mons in party/box
|
||||||
|
ld c, a
|
||||||
|
ld b, 0
|
||||||
|
add hl, bc
|
||||||
|
ld a, [wMoveMonType]
|
||||||
|
cp DAYCARE_TO_PARTY
|
||||||
|
ld a, [wDayCareMon]
|
||||||
|
jr z, .asm_f556
|
||||||
|
ld a, [wcf91]
|
||||||
|
.asm_f556
|
||||||
|
ld [hli], a ; write new mon ID
|
||||||
|
ld [hl], $ff ; write new sentinel
|
||||||
|
ld a, [wMoveMonType]
|
||||||
|
dec a
|
||||||
|
ld hl, wPartyMons
|
||||||
|
ld bc, wPartyMon2 - wPartyMon1 ; $2c
|
||||||
|
ld a, [wPartyCount]
|
||||||
|
jr nz, .skipToNewMonEntry
|
||||||
|
ld hl, wBoxMons
|
||||||
|
ld bc, wBoxMon2 - wBoxMon1 ; $21
|
||||||
|
ld a, [wNumInBox]
|
||||||
|
.skipToNewMonEntry
|
||||||
|
dec a
|
||||||
|
call AddNTimes
|
||||||
|
.asm_f575
|
||||||
|
push hl
|
||||||
|
ld e, l
|
||||||
|
ld d, h
|
||||||
|
ld a, [wMoveMonType]
|
||||||
|
and a
|
||||||
|
ld hl, wBoxMons
|
||||||
|
ld bc, wBoxMon2 - wBoxMon1 ; $21
|
||||||
|
jr z, .asm_f591
|
||||||
|
cp DAYCARE_TO_PARTY
|
||||||
|
ld hl, wDayCareMon
|
||||||
|
jr z, .asm_f597
|
||||||
|
ld hl, wPartyMons
|
||||||
|
ld bc, wPartyMon2 - wPartyMon1 ; $2c
|
||||||
|
.asm_f591
|
||||||
|
ld a, [wWhichPokemon]
|
||||||
|
call AddNTimes
|
||||||
|
.asm_f597
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
ld bc, wBoxMon2 - wBoxMon1
|
||||||
|
call CopyData
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
ld a, [wMoveMonType]
|
||||||
|
and a
|
||||||
|
jr z, .asm_f5b4
|
||||||
|
cp DAYCARE_TO_PARTY
|
||||||
|
jr z, .asm_f5b4
|
||||||
|
ld bc, wBoxMon2 - wBoxMon1
|
||||||
|
add hl, bc
|
||||||
|
ld a, [hl]
|
||||||
|
inc de
|
||||||
|
inc de
|
||||||
|
inc de
|
||||||
|
ld [de], a
|
||||||
|
.asm_f5b4
|
||||||
|
ld a, [wMoveMonType]
|
||||||
|
cp PARTY_TO_DAYCARE
|
||||||
|
ld de, wDayCareMonOT
|
||||||
|
jr z, .asm_f5d3
|
||||||
|
dec a
|
||||||
|
ld hl, wPartyMonOT
|
||||||
|
ld a, [wPartyCount]
|
||||||
|
jr nz, .asm_f5cd
|
||||||
|
ld hl, wBoxMonOT
|
||||||
|
ld a, [wNumInBox]
|
||||||
|
.asm_f5cd
|
||||||
|
dec a
|
||||||
|
call SkipFixedLengthTextEntries
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
.asm_f5d3
|
||||||
|
ld hl, wBoxMonOT
|
||||||
|
ld a, [wMoveMonType]
|
||||||
|
and a
|
||||||
|
jr z, .asm_f5e6
|
||||||
|
ld hl, wDayCareMonOT
|
||||||
|
cp DAYCARE_TO_PARTY
|
||||||
|
jr z, .asm_f5ec
|
||||||
|
ld hl, wPartyMonOT
|
||||||
|
.asm_f5e6
|
||||||
|
ld a, [wWhichPokemon]
|
||||||
|
call SkipFixedLengthTextEntries
|
||||||
|
.asm_f5ec
|
||||||
|
ld bc, NAME_LENGTH
|
||||||
|
call CopyData
|
||||||
|
ld a, [wMoveMonType]
|
||||||
|
cp PARTY_TO_DAYCARE
|
||||||
|
ld de, wDayCareMonName
|
||||||
|
jr z, .asm_f611
|
||||||
|
dec a
|
||||||
|
ld hl, wPartyMonNicks
|
||||||
|
ld a, [wPartyCount]
|
||||||
|
jr nz, .asm_f60b
|
||||||
|
ld hl, wBoxMonNicks
|
||||||
|
ld a, [wNumInBox]
|
||||||
|
.asm_f60b
|
||||||
|
dec a
|
||||||
|
call SkipFixedLengthTextEntries
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
.asm_f611
|
||||||
|
ld hl, wBoxMonNicks
|
||||||
|
ld a, [wMoveMonType]
|
||||||
|
and a
|
||||||
|
jr z, .asm_f624
|
||||||
|
ld hl, wDayCareMonName
|
||||||
|
cp DAYCARE_TO_PARTY
|
||||||
|
jr z, .asm_f62a
|
||||||
|
ld hl, wPartyMonNicks
|
||||||
|
.asm_f624
|
||||||
|
ld a, [wWhichPokemon]
|
||||||
|
call SkipFixedLengthTextEntries
|
||||||
|
.asm_f62a
|
||||||
|
ld bc, NAME_LENGTH
|
||||||
|
call CopyData
|
||||||
|
pop hl
|
||||||
|
ld a, [wMoveMonType]
|
||||||
|
cp PARTY_TO_BOX
|
||||||
|
jr z, .asm_f664
|
||||||
|
cp PARTY_TO_DAYCARE
|
||||||
|
jr z, .asm_f664
|
||||||
|
push hl
|
||||||
|
srl a
|
||||||
|
add $2
|
||||||
|
ld [wMonDataLocation], a
|
||||||
|
call LoadMonData
|
||||||
|
callba CalcLevelFromExperience
|
||||||
|
ld a, d
|
||||||
|
ld [wCurEnemyLVL], a
|
||||||
|
pop hl
|
||||||
|
ld bc, wBoxMon2 - wBoxMon1
|
||||||
|
add hl, bc
|
||||||
|
ld [hli], a
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
ld bc, -18
|
||||||
|
add hl, bc
|
||||||
|
ld b, $1
|
||||||
|
call CalcStats
|
||||||
|
.asm_f664
|
||||||
|
and a
|
||||||
|
ret
|
212
engine/bcd.asm
Normal file
212
engine/bcd.asm
Normal file
|
@ -0,0 +1,212 @@
|
||||||
|
DivideBCDPredef::
|
||||||
|
DivideBCDPredef2::
|
||||||
|
DivideBCDPredef3::
|
||||||
|
DivideBCDPredef4::
|
||||||
|
call GetPredefRegisters
|
||||||
|
|
||||||
|
DivideBCD::
|
||||||
|
xor a
|
||||||
|
ld [$ffa5], a
|
||||||
|
ld [$ffa6], a
|
||||||
|
ld [$ffa7], a
|
||||||
|
ld d, $1
|
||||||
|
.asm_f72a
|
||||||
|
ld a, [$ffa2]
|
||||||
|
and $f0
|
||||||
|
jr nz, .asm_f75b
|
||||||
|
inc d
|
||||||
|
ld a, [$ffa2]
|
||||||
|
swap a
|
||||||
|
and $f0
|
||||||
|
ld b, a
|
||||||
|
ld a, [$ffa3]
|
||||||
|
swap a
|
||||||
|
ld [$ffa3], a
|
||||||
|
and $f
|
||||||
|
or b
|
||||||
|
ld [$ffa2], a
|
||||||
|
ld a, [$ffa3]
|
||||||
|
and $f0
|
||||||
|
ld b, a
|
||||||
|
ld a, [$ffa4]
|
||||||
|
swap a
|
||||||
|
ld [$ffa4], a
|
||||||
|
and $f
|
||||||
|
or b
|
||||||
|
ld [$ffa3], a
|
||||||
|
ld a, [$ffa4]
|
||||||
|
and $f0
|
||||||
|
ld [$ffa4], a
|
||||||
|
jr .asm_f72a
|
||||||
|
.asm_f75b
|
||||||
|
push de
|
||||||
|
push de
|
||||||
|
call DivideBCD_f800
|
||||||
|
pop de
|
||||||
|
ld a, b
|
||||||
|
swap a
|
||||||
|
and $f0
|
||||||
|
ld [$ffa5], a
|
||||||
|
dec d
|
||||||
|
jr z, .asm_f7bc
|
||||||
|
push de
|
||||||
|
call DivideBCD_f7d7
|
||||||
|
call DivideBCD_f800
|
||||||
|
pop de
|
||||||
|
ld a, [$ffa5]
|
||||||
|
or b
|
||||||
|
ld [$ffa5], a
|
||||||
|
dec d
|
||||||
|
jr z, .asm_f7bc
|
||||||
|
push de
|
||||||
|
call DivideBCD_f7d7
|
||||||
|
call DivideBCD_f800
|
||||||
|
pop de
|
||||||
|
ld a, b
|
||||||
|
swap a
|
||||||
|
and $f0
|
||||||
|
ld [$ffa6], a
|
||||||
|
dec d
|
||||||
|
jr z, .asm_f7bc
|
||||||
|
push de
|
||||||
|
call DivideBCD_f7d7
|
||||||
|
call DivideBCD_f800
|
||||||
|
pop de
|
||||||
|
ld a, [$ffa6]
|
||||||
|
or b
|
||||||
|
ld [$ffa6], a
|
||||||
|
dec d
|
||||||
|
jr z, .asm_f7bc
|
||||||
|
push de
|
||||||
|
call DivideBCD_f7d7
|
||||||
|
call DivideBCD_f800
|
||||||
|
pop de
|
||||||
|
ld a, b
|
||||||
|
swap a
|
||||||
|
and $f0
|
||||||
|
ld [$ffa7], a
|
||||||
|
dec d
|
||||||
|
jr z, .asm_f7bc
|
||||||
|
push de
|
||||||
|
call DivideBCD_f7d7
|
||||||
|
call DivideBCD_f800
|
||||||
|
pop de
|
||||||
|
ld a, [$ffa7]
|
||||||
|
or b
|
||||||
|
ld [$ffa7], a
|
||||||
|
.asm_f7bc
|
||||||
|
ld a, [$ffa5]
|
||||||
|
ld [$ffa2], a
|
||||||
|
ld a, [$ffa6]
|
||||||
|
ld [$ffa3], a
|
||||||
|
ld a, [$ffa7]
|
||||||
|
ld [$ffa4], a
|
||||||
|
pop de
|
||||||
|
ld a, $6
|
||||||
|
sub d
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
.asm_f7ce
|
||||||
|
push af
|
||||||
|
call DivideBCD_f7d7
|
||||||
|
pop af
|
||||||
|
dec a
|
||||||
|
jr nz, .asm_f7ce
|
||||||
|
ret
|
||||||
|
|
||||||
|
DivideBCD_f7d7:
|
||||||
|
ld a, [$ffa4]
|
||||||
|
swap a
|
||||||
|
and $f
|
||||||
|
ld b, a
|
||||||
|
ld a, [$ffa3]
|
||||||
|
swap a
|
||||||
|
ld [$ffa3], a
|
||||||
|
and $f0
|
||||||
|
or b
|
||||||
|
ld [$ffa4], a
|
||||||
|
ld a, [$ffa3]
|
||||||
|
and $f
|
||||||
|
ld b, a
|
||||||
|
ld a, [$ffa2]
|
||||||
|
swap a
|
||||||
|
ld [$ffa2], a
|
||||||
|
and $f0
|
||||||
|
or b
|
||||||
|
ld [$ffa3], a
|
||||||
|
ld a, [$ffa2]
|
||||||
|
and $f
|
||||||
|
ld [$ffa2], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
DivideBCD_f800:
|
||||||
|
ld bc, $3
|
||||||
|
.asm_f803
|
||||||
|
ld de, $ff9f
|
||||||
|
ld hl, $ffa2
|
||||||
|
push bc
|
||||||
|
call StringCmp
|
||||||
|
pop bc
|
||||||
|
ret c
|
||||||
|
inc b
|
||||||
|
ld de, $ffa1
|
||||||
|
ld hl, $ffa4
|
||||||
|
push bc
|
||||||
|
call SubBCD
|
||||||
|
pop bc
|
||||||
|
jr .asm_f803
|
||||||
|
|
||||||
|
|
||||||
|
AddBCDPredef::
|
||||||
|
call GetPredefRegisters
|
||||||
|
|
||||||
|
AddBCD::
|
||||||
|
and a
|
||||||
|
ld b, c
|
||||||
|
.add
|
||||||
|
ld a, [de]
|
||||||
|
adc [hl]
|
||||||
|
daa
|
||||||
|
ld [de], a
|
||||||
|
dec de
|
||||||
|
dec hl
|
||||||
|
dec c
|
||||||
|
jr nz, .add
|
||||||
|
jr nc, .done
|
||||||
|
ld a, $99
|
||||||
|
inc de
|
||||||
|
.fill
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
dec b
|
||||||
|
jr nz, .fill
|
||||||
|
.done
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
SubBCDPredef::
|
||||||
|
call GetPredefRegisters
|
||||||
|
|
||||||
|
SubBCD::
|
||||||
|
and a
|
||||||
|
ld b, c
|
||||||
|
.sub
|
||||||
|
ld a, [de]
|
||||||
|
sbc [hl]
|
||||||
|
daa
|
||||||
|
ld [de], a
|
||||||
|
dec de
|
||||||
|
dec hl
|
||||||
|
dec c
|
||||||
|
jr nz, .sub
|
||||||
|
jr nc, .done
|
||||||
|
ld a, $00
|
||||||
|
inc de
|
||||||
|
.fill
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
dec b
|
||||||
|
jr nz, .fill
|
||||||
|
scf
|
||||||
|
.done
|
||||||
|
ret
|
|
@ -588,7 +588,7 @@ ReturnToCableClubRoom:
|
||||||
dec a
|
dec a
|
||||||
ld [wDestinationWarpID], a
|
ld [wDestinationWarpID], a
|
||||||
call LoadMapData
|
call LoadMapData
|
||||||
callba ClearVariablesAfterLoadingMapData
|
callba ClearVariablesOnEnterMap
|
||||||
pop hl
|
pop hl
|
||||||
pop af
|
pop af
|
||||||
ld [hl], a
|
ld [hl], a
|
||||||
|
|
73
engine/flag_action.asm
Normal file
73
engine/flag_action.asm
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
FlagActionPredef:
|
||||||
|
call GetPredefRegisters
|
||||||
|
|
||||||
|
FlagAction:
|
||||||
|
; Perform action b on bit c
|
||||||
|
; in the bitfield at hl.
|
||||||
|
; 0: reset
|
||||||
|
; 1: set
|
||||||
|
; 2: read
|
||||||
|
; Return the result in c.
|
||||||
|
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
push bc
|
||||||
|
|
||||||
|
; bit
|
||||||
|
ld a, c
|
||||||
|
ld d, a
|
||||||
|
and 7
|
||||||
|
ld e, a
|
||||||
|
|
||||||
|
; byte
|
||||||
|
ld a, d
|
||||||
|
srl a
|
||||||
|
srl a
|
||||||
|
srl a
|
||||||
|
add l
|
||||||
|
ld l, a
|
||||||
|
jr nc, .ok
|
||||||
|
inc h
|
||||||
|
.ok
|
||||||
|
|
||||||
|
; d = 1 << e (bitmask)
|
||||||
|
inc e
|
||||||
|
ld d, 1
|
||||||
|
.shift
|
||||||
|
dec e
|
||||||
|
jr z, .shifted
|
||||||
|
sla d
|
||||||
|
jr .shift
|
||||||
|
.shifted
|
||||||
|
|
||||||
|
ld a, b
|
||||||
|
and a
|
||||||
|
jr z, .reset
|
||||||
|
cp 2
|
||||||
|
jr z, .read
|
||||||
|
|
||||||
|
.set
|
||||||
|
ld b, [hl]
|
||||||
|
ld a, d
|
||||||
|
or b
|
||||||
|
ld [hl], a
|
||||||
|
jr .done
|
||||||
|
|
||||||
|
.reset
|
||||||
|
ld b, [hl]
|
||||||
|
ld a, d
|
||||||
|
xor $ff
|
||||||
|
and b
|
||||||
|
ld [hl], a
|
||||||
|
jr .done
|
||||||
|
|
||||||
|
.read
|
||||||
|
ld b, [hl]
|
||||||
|
ld a, d
|
||||||
|
and b
|
||||||
|
.done
|
||||||
|
pop bc
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
ld c, a
|
||||||
|
ret
|
18
engine/get_bag_item_quantity.asm
Normal file
18
engine/get_bag_item_quantity.asm
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
GetQuantityOfItemInBag:
|
||||||
|
; In: b = item ID
|
||||||
|
; Out: b = how many of that item are in the bag
|
||||||
|
call GetPredefRegisters
|
||||||
|
ld hl, wNumBagItems
|
||||||
|
.loop
|
||||||
|
inc hl
|
||||||
|
ld a, [hli]
|
||||||
|
cp $ff
|
||||||
|
jr z, .notInBag
|
||||||
|
cp b
|
||||||
|
jr nz, .loop
|
||||||
|
ld a, [hl]
|
||||||
|
ld b, a
|
||||||
|
ret
|
||||||
|
.notInBag
|
||||||
|
ld b, 0
|
||||||
|
ret
|
99
engine/heal_party.asm
Normal file
99
engine/heal_party.asm
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
HealParty:
|
||||||
|
; Restore HP and PP.
|
||||||
|
|
||||||
|
ld hl, wPartySpecies
|
||||||
|
ld de, wPartyMon1HP
|
||||||
|
.healmon
|
||||||
|
ld a, [hli]
|
||||||
|
cp $ff
|
||||||
|
jr z, .done
|
||||||
|
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
|
||||||
|
ld hl, wPartyMon1Status - wPartyMon1HP
|
||||||
|
add hl, de
|
||||||
|
xor a
|
||||||
|
ld [hl], a
|
||||||
|
|
||||||
|
push de
|
||||||
|
ld b, NUM_MOVES ; A Pokémon has 4 moves
|
||||||
|
.pp
|
||||||
|
ld hl, wPartyMon1Moves - wPartyMon1HP
|
||||||
|
add hl, de
|
||||||
|
|
||||||
|
ld a, [hl]
|
||||||
|
and a
|
||||||
|
jr z, .nextmove
|
||||||
|
|
||||||
|
dec a
|
||||||
|
ld hl, wPartyMon1PP - wPartyMon1HP
|
||||||
|
add hl, de
|
||||||
|
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
push bc
|
||||||
|
|
||||||
|
ld hl, Moves
|
||||||
|
ld bc, MoveEnd - Moves
|
||||||
|
call AddNTimes
|
||||||
|
ld de, wcd6d
|
||||||
|
ld a, BANK(Moves)
|
||||||
|
call FarCopyData
|
||||||
|
ld a, [wcd6d + 5] ; PP is byte 5 of move data
|
||||||
|
|
||||||
|
pop bc
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
|
||||||
|
inc de
|
||||||
|
push bc
|
||||||
|
ld b, a
|
||||||
|
ld a, [hl]
|
||||||
|
and $c0
|
||||||
|
add b
|
||||||
|
ld [hl], a
|
||||||
|
pop bc
|
||||||
|
|
||||||
|
.nextmove
|
||||||
|
dec b
|
||||||
|
jr nz, .pp
|
||||||
|
pop de
|
||||||
|
|
||||||
|
ld hl, wPartyMon1MaxHP - wPartyMon1HP
|
||||||
|
add hl, de
|
||||||
|
ld a, [hli]
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
ld a, [hl]
|
||||||
|
ld [de], a
|
||||||
|
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
|
||||||
|
push hl
|
||||||
|
ld bc, wPartyMon2 - wPartyMon1
|
||||||
|
ld h, d
|
||||||
|
ld l, e
|
||||||
|
add hl, bc
|
||||||
|
ld d, h
|
||||||
|
ld e, l
|
||||||
|
pop hl
|
||||||
|
jr .healmon
|
||||||
|
|
||||||
|
.done
|
||||||
|
xor a
|
||||||
|
ld [wWhichPokemon], a
|
||||||
|
ld [wd11e], a
|
||||||
|
|
||||||
|
ld a, [wPartyCount]
|
||||||
|
ld b, a
|
||||||
|
.ppup
|
||||||
|
push bc
|
||||||
|
call RestoreBonusPP
|
||||||
|
pop bc
|
||||||
|
ld hl, wWhichPokemon
|
||||||
|
inc [hl]
|
||||||
|
dec b
|
||||||
|
jr nz, .ppup
|
||||||
|
ret
|
55
engine/init_player_data.asm
Normal file
55
engine/init_player_data.asm
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
InitPlayerData:
|
||||||
|
InitPlayerData2:
|
||||||
|
|
||||||
|
call Random
|
||||||
|
ld a, [hRandomSub]
|
||||||
|
ld [wPlayerID], a
|
||||||
|
|
||||||
|
call Random
|
||||||
|
ld a, [hRandomAdd]
|
||||||
|
ld [wPlayerID + 1], a
|
||||||
|
|
||||||
|
ld a, $ff
|
||||||
|
ld [wUnusedD71B], a
|
||||||
|
|
||||||
|
ld hl, wPartyCount
|
||||||
|
call InitializeEmptyList
|
||||||
|
ld hl, wNumInBox
|
||||||
|
call InitializeEmptyList
|
||||||
|
ld hl, wNumBagItems
|
||||||
|
call InitializeEmptyList
|
||||||
|
ld hl, wNumBoxItems
|
||||||
|
call InitializeEmptyList
|
||||||
|
|
||||||
|
START_MONEY EQU $3000
|
||||||
|
ld hl, wPlayerMoney + 1
|
||||||
|
ld a, START_MONEY / $100
|
||||||
|
ld [hld], a
|
||||||
|
xor a
|
||||||
|
ld [hli], a
|
||||||
|
inc hl
|
||||||
|
ld [hl], a
|
||||||
|
|
||||||
|
ld [wMonDataLocation], a
|
||||||
|
|
||||||
|
ld hl, wObtainedBadges
|
||||||
|
ld [hli], a
|
||||||
|
|
||||||
|
ld [hl], a
|
||||||
|
|
||||||
|
ld hl, wPlayerCoins
|
||||||
|
ld [hli], a
|
||||||
|
ld [hl], a
|
||||||
|
|
||||||
|
ld hl, wGameProgressFlags
|
||||||
|
ld bc, wGameProgressFlagsEnd - wGameProgressFlags
|
||||||
|
call FillMemory ; clear all game progress flags
|
||||||
|
|
||||||
|
jp InitializeMissableObjectsFlags
|
||||||
|
|
||||||
|
InitializeEmptyList:
|
||||||
|
xor a ; count
|
||||||
|
ld [hli], a
|
||||||
|
dec a ; terminator
|
||||||
|
ld [hl], a
|
||||||
|
ret
|
150
engine/items/inventory.asm
Normal file
150
engine/items/inventory.asm
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
; function to add an item (in varying quantities) to the player's bag or PC box
|
||||||
|
; INPUT:
|
||||||
|
; hl = address of inventory (either wNumBagItems or wNumBoxItems)
|
||||||
|
; [wcf91] = item ID
|
||||||
|
; [wItemQuantity] = item quantity
|
||||||
|
; sets carry flag if successful, unsets carry flag if unsuccessful
|
||||||
|
AddItemToInventory_:
|
||||||
|
ld a,[wItemQuantity] ; a = item quantity
|
||||||
|
push af
|
||||||
|
push bc
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
push hl
|
||||||
|
ld d,PC_ITEM_CAPACITY ; how many items the PC can hold
|
||||||
|
ld a,wNumBagItems & $FF
|
||||||
|
cp l
|
||||||
|
jr nz,.checkIfInventoryFull
|
||||||
|
ld a,wNumBagItems >> 8
|
||||||
|
cp h
|
||||||
|
jr nz,.checkIfInventoryFull
|
||||||
|
; if the destination is the bag
|
||||||
|
ld d,BAG_ITEM_CAPACITY ; how many items the bag can hold
|
||||||
|
.checkIfInventoryFull
|
||||||
|
ld a,[hl]
|
||||||
|
sub d
|
||||||
|
ld d,a
|
||||||
|
ld a,[hli]
|
||||||
|
and a
|
||||||
|
jr z,.addNewItem
|
||||||
|
.loop
|
||||||
|
ld a,[hli]
|
||||||
|
ld b,a ; b = ID of current item in table
|
||||||
|
ld a,[wcf91] ; a = ID of item being added
|
||||||
|
cp b ; does the current item in the table match the item being added?
|
||||||
|
jp z,.increaseItemQuantity ; if so, increase the item's quantity
|
||||||
|
inc hl
|
||||||
|
ld a,[hl]
|
||||||
|
cp a,$ff ; is it the end of the table?
|
||||||
|
jr nz,.loop
|
||||||
|
.addNewItem ; add an item not yet in the inventory
|
||||||
|
pop hl
|
||||||
|
ld a,d
|
||||||
|
and a ; is there room for a new item slot?
|
||||||
|
jr z,.done
|
||||||
|
; if there is room
|
||||||
|
inc [hl] ; increment the number of items in the inventory
|
||||||
|
ld a,[hl] ; the number of items will be the index of the new item
|
||||||
|
add a
|
||||||
|
dec a
|
||||||
|
ld c,a
|
||||||
|
ld b,0
|
||||||
|
add hl,bc ; hl = address to store the item
|
||||||
|
ld a,[wcf91]
|
||||||
|
ld [hli],a ; store item ID
|
||||||
|
ld a,[wItemQuantity]
|
||||||
|
ld [hli],a ; store item quantity
|
||||||
|
ld [hl],$ff ; store terminator
|
||||||
|
jp .success
|
||||||
|
.increaseItemQuantity ; increase the quantity of an item already in the inventory
|
||||||
|
ld a,[wItemQuantity]
|
||||||
|
ld b,a ; b = quantity to add
|
||||||
|
ld a,[hl] ; a = existing item quantity
|
||||||
|
add b ; a = new item quantity
|
||||||
|
cp a,100
|
||||||
|
jp c,.storeNewQuantity ; if the new quantity is less than 100, store it
|
||||||
|
; if the new quantity is greater than or equal to 100,
|
||||||
|
; try to max out the current slot and add the rest in a new slot
|
||||||
|
sub a,99
|
||||||
|
ld [wItemQuantity],a ; a = amount left over (to put in the new slot)
|
||||||
|
ld a,d
|
||||||
|
and a ; is there room for a new item slot?
|
||||||
|
jr z,.increaseItemQuantityFailed
|
||||||
|
; if so, store 99 in the current slot and store the rest in a new slot
|
||||||
|
ld a,99
|
||||||
|
ld [hli],a
|
||||||
|
jp .loop
|
||||||
|
.increaseItemQuantityFailed
|
||||||
|
pop hl
|
||||||
|
and a
|
||||||
|
jr .done
|
||||||
|
.storeNewQuantity
|
||||||
|
ld [hl],a
|
||||||
|
pop hl
|
||||||
|
.success
|
||||||
|
scf
|
||||||
|
.done
|
||||||
|
pop hl
|
||||||
|
pop de
|
||||||
|
pop bc
|
||||||
|
pop bc
|
||||||
|
ld a,b
|
||||||
|
ld [wItemQuantity],a ; restore the initial value from when the function was called
|
||||||
|
ret
|
||||||
|
|
||||||
|
; function to remove an item (in varying quantities) from the player's bag or PC box
|
||||||
|
; INPUT:
|
||||||
|
; hl = address of inventory (either wNumBagItems or wNumBoxItems)
|
||||||
|
; [wWhichPokemon] = index (within the inventory) of the item to remove
|
||||||
|
; [wItemQuantity] = quantity to remove
|
||||||
|
RemoveItemFromInventory_:
|
||||||
|
push hl
|
||||||
|
inc hl
|
||||||
|
ld a,[wWhichPokemon] ; index (within the inventory) of the item being removed
|
||||||
|
sla a
|
||||||
|
add l
|
||||||
|
ld l,a
|
||||||
|
jr nc,.noCarry
|
||||||
|
inc h
|
||||||
|
.noCarry
|
||||||
|
inc hl
|
||||||
|
ld a,[wItemQuantity] ; quantity being removed
|
||||||
|
ld e,a
|
||||||
|
ld a,[hl] ; a = current quantity
|
||||||
|
sub e
|
||||||
|
ld [hld],a ; store new quantity
|
||||||
|
ld [wMaxItemQuantity],a
|
||||||
|
and a
|
||||||
|
jr nz,.skipMovingUpSlots
|
||||||
|
; if the remaining quantity is 0,
|
||||||
|
; remove the emptied item slot and move up all the following item slots
|
||||||
|
.moveSlotsUp
|
||||||
|
ld e,l
|
||||||
|
ld d,h
|
||||||
|
inc de
|
||||||
|
inc de ; de = address of the slot following the emptied one
|
||||||
|
.loop ; loop to move up the following slots
|
||||||
|
ld a,[de]
|
||||||
|
inc de
|
||||||
|
ld [hli],a
|
||||||
|
cp a,$ff
|
||||||
|
jr nz,.loop
|
||||||
|
; update menu info
|
||||||
|
xor a
|
||||||
|
ld [wListScrollOffset],a
|
||||||
|
ld [wCurrentMenuItem],a
|
||||||
|
ld [wBagSavedMenuItem],a
|
||||||
|
ld [wSavedListScrollOffset],a
|
||||||
|
pop hl
|
||||||
|
ld a,[hl] ; a = number of items in inventory
|
||||||
|
dec a ; decrement the number of items
|
||||||
|
ld [hl],a ; store new number of items
|
||||||
|
ld [wListCount],a
|
||||||
|
cp a,2
|
||||||
|
jr c,.done
|
||||||
|
ld [wMaxMenuItem],a
|
||||||
|
jr .done
|
||||||
|
.skipMovingUpSlots
|
||||||
|
pop hl
|
||||||
|
.done
|
||||||
|
ret
|
120
engine/menu/draw_badges.asm
Normal file
120
engine/menu/draw_badges.asm
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
DrawBadges:
|
||||||
|
; Draw 4x2 gym leader faces, with the faces replaced by
|
||||||
|
; badges if they are owned. Used in the player status screen.
|
||||||
|
|
||||||
|
; In Japanese versions, names are displayed above faces.
|
||||||
|
; Instead of removing relevant code, the name graphics were erased.
|
||||||
|
|
||||||
|
; Tile ids for face/badge graphics.
|
||||||
|
ld de, wBadgeOrFaceTiles
|
||||||
|
ld hl, .FaceBadgeTiles
|
||||||
|
ld bc, 8
|
||||||
|
call CopyData
|
||||||
|
|
||||||
|
; Booleans for each badge.
|
||||||
|
ld hl, wTempObtainedBadgesBooleans
|
||||||
|
ld bc, 8
|
||||||
|
xor a
|
||||||
|
call FillMemory
|
||||||
|
|
||||||
|
; Alter these based on owned badges.
|
||||||
|
ld de, wTempObtainedBadgesBooleans
|
||||||
|
ld hl, wBadgeOrFaceTiles
|
||||||
|
ld a, [wObtainedBadges]
|
||||||
|
ld b, a
|
||||||
|
ld c, 8
|
||||||
|
.CheckBadge
|
||||||
|
srl b
|
||||||
|
jr nc, .NextBadge
|
||||||
|
ld a, [hl]
|
||||||
|
add 4 ; Badge graphics are after each face
|
||||||
|
ld [hl], a
|
||||||
|
ld a, 1
|
||||||
|
ld [de], a
|
||||||
|
.NextBadge
|
||||||
|
inc hl
|
||||||
|
inc de
|
||||||
|
dec c
|
||||||
|
jr nz, .CheckBadge
|
||||||
|
|
||||||
|
; Draw two rows of badges.
|
||||||
|
ld hl, wBadgeNumberTile
|
||||||
|
ld a, $d8 ; [1]
|
||||||
|
ld [hli], a
|
||||||
|
ld [hl], $60 ; First name
|
||||||
|
|
||||||
|
coord hl, 2, 11
|
||||||
|
ld de, wTempObtainedBadgesBooleans
|
||||||
|
call .DrawBadgeRow
|
||||||
|
|
||||||
|
coord hl, 2, 14
|
||||||
|
ld de, wTempObtainedBadgesBooleans + 4
|
||||||
|
; call .DrawBadgeRow
|
||||||
|
; ret
|
||||||
|
|
||||||
|
.DrawBadgeRow
|
||||||
|
; Draw 4 badges.
|
||||||
|
|
||||||
|
ld c, 4
|
||||||
|
.DrawBadge
|
||||||
|
push de
|
||||||
|
push hl
|
||||||
|
|
||||||
|
; Badge no.
|
||||||
|
ld a, [wBadgeNumberTile]
|
||||||
|
ld [hli], a
|
||||||
|
inc a
|
||||||
|
ld [wBadgeNumberTile], a
|
||||||
|
|
||||||
|
; Names aren't printed if the badge is owned.
|
||||||
|
ld a, [de]
|
||||||
|
and a
|
||||||
|
ld a, [wBadgeNameTile]
|
||||||
|
jr nz, .SkipName
|
||||||
|
call .PlaceTiles
|
||||||
|
jr .PlaceBadge
|
||||||
|
|
||||||
|
.SkipName
|
||||||
|
inc a
|
||||||
|
inc a
|
||||||
|
inc hl
|
||||||
|
|
||||||
|
.PlaceBadge
|
||||||
|
ld [wBadgeNameTile], a
|
||||||
|
ld de, SCREEN_WIDTH - 1
|
||||||
|
add hl, de
|
||||||
|
ld a, [wBadgeOrFaceTiles]
|
||||||
|
call .PlaceTiles
|
||||||
|
add hl, de
|
||||||
|
call .PlaceTiles
|
||||||
|
|
||||||
|
; Shift badge array back one byte.
|
||||||
|
push bc
|
||||||
|
ld hl, wBadgeOrFaceTiles + 1
|
||||||
|
ld de, wBadgeOrFaceTiles
|
||||||
|
ld bc, 8
|
||||||
|
call CopyData
|
||||||
|
pop bc
|
||||||
|
|
||||||
|
pop hl
|
||||||
|
ld de, 4
|
||||||
|
add hl, de
|
||||||
|
|
||||||
|
pop de
|
||||||
|
inc de
|
||||||
|
dec c
|
||||||
|
jr nz, .DrawBadge
|
||||||
|
ret
|
||||||
|
|
||||||
|
.PlaceTiles
|
||||||
|
ld [hli], a
|
||||||
|
inc a
|
||||||
|
ld [hl], a
|
||||||
|
inc a
|
||||||
|
ret
|
||||||
|
|
||||||
|
.FaceBadgeTiles
|
||||||
|
db $20, $28, $30, $38, $40, $48, $50, $58
|
||||||
|
|
||||||
|
GymLeaderFaceAndBadgeTileGraphics:
|
||||||
|
INCBIN "gfx/badges.2bpp"
|
20
engine/overworld/clear_variables.asm
Normal file
20
engine/overworld/clear_variables.asm
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
ClearVariablesOnEnterMap:
|
||||||
|
ld a, SCREEN_HEIGHT_PIXELS
|
||||||
|
ld [hWY], a
|
||||||
|
ld [rWY], a
|
||||||
|
xor a
|
||||||
|
ld [H_AUTOBGTRANSFERENABLED], a
|
||||||
|
ld [wStepCounter], a
|
||||||
|
ld [wLoneAttackNo], a
|
||||||
|
ld [hJoyPressed], a
|
||||||
|
ld [hJoyReleased], a
|
||||||
|
ld [hJoyHeld], a
|
||||||
|
ld [wActionResultOrTookBattleTurn], a
|
||||||
|
ld [wUnusedD5A3], a
|
||||||
|
ld hl, wCardKeyDoorY
|
||||||
|
ld [hli], a
|
||||||
|
ld [hl], a
|
||||||
|
ld hl, wWhichTrade
|
||||||
|
ld bc, wStandingOnWarpPadOrHole - wWhichTrade
|
||||||
|
call FillMemory
|
||||||
|
ret
|
18
engine/overworld/daycare_exp.asm
Normal file
18
engine/overworld/daycare_exp.asm
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
IncrementDayCareMonExp:
|
||||||
|
ld a, [wDayCareInUse]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
ld hl, wDayCareMonExp + 2
|
||||||
|
inc [hl]
|
||||||
|
ret nz
|
||||||
|
dec hl
|
||||||
|
inc [hl]
|
||||||
|
ret nz
|
||||||
|
dec hl
|
||||||
|
inc [hl]
|
||||||
|
ld a, [hl]
|
||||||
|
cp $50
|
||||||
|
ret c
|
||||||
|
ld a, $50
|
||||||
|
ld [hl], a
|
||||||
|
ret
|
57
engine/overworld/field_move_messages.asm
Normal file
57
engine/overworld/field_move_messages.asm
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
PrintStrengthTxt:
|
||||||
|
ld hl, wd728
|
||||||
|
set 0, [hl]
|
||||||
|
ld hl, UsedStrengthText
|
||||||
|
call PrintText
|
||||||
|
ld hl, CanMoveBouldersText
|
||||||
|
jp PrintText
|
||||||
|
|
||||||
|
UsedStrengthText:
|
||||||
|
TX_FAR _UsedStrengthText
|
||||||
|
TX_ASM
|
||||||
|
ld a, [wcf91]
|
||||||
|
call PlayCry
|
||||||
|
call Delay3
|
||||||
|
jp TextScriptEnd
|
||||||
|
|
||||||
|
CanMoveBouldersText:
|
||||||
|
TX_FAR _CanMoveBouldersText
|
||||||
|
db "@"
|
||||||
|
|
||||||
|
IsSurfingAllowed:
|
||||||
|
; Returns whether surfing is allowed in bit 1 of wd728.
|
||||||
|
; Surfing isn't allowed on the Cycling Road or in the lowest level of the
|
||||||
|
; Seafoam Islands before the current has been slowed with boulders.
|
||||||
|
ld hl, wd728
|
||||||
|
set 1, [hl]
|
||||||
|
ld a, [wd732]
|
||||||
|
bit 5, a
|
||||||
|
jr nz, .forcedToRideBike
|
||||||
|
ld a, [wCurMap]
|
||||||
|
cp SEAFOAM_ISLANDS_5
|
||||||
|
ret nz
|
||||||
|
CheckBothEventsSet EVENT_SEAFOAM4_BOULDER1_DOWN_HOLE, EVENT_SEAFOAM4_BOULDER2_DOWN_HOLE
|
||||||
|
ret z
|
||||||
|
ld hl, CoordsData_cdf7
|
||||||
|
call ArePlayerCoordsInArray
|
||||||
|
ret nc
|
||||||
|
ld hl, wd728
|
||||||
|
res 1, [hl]
|
||||||
|
ld hl, CurrentTooFastText
|
||||||
|
jp PrintText
|
||||||
|
.forcedToRideBike
|
||||||
|
ld hl, wd728
|
||||||
|
res 1, [hl]
|
||||||
|
ld hl, CyclingIsFunText
|
||||||
|
jp PrintText
|
||||||
|
|
||||||
|
CoordsData_cdf7:
|
||||||
|
db $0B,$07,$FF
|
||||||
|
|
||||||
|
CurrentTooFastText:
|
||||||
|
TX_FAR _CurrentTooFastText
|
||||||
|
db "@"
|
||||||
|
|
||||||
|
CyclingIsFunText:
|
||||||
|
TX_FAR _CyclingIsFunText
|
||||||
|
db "@"
|
215
engine/overworld/missable_objects.asm
Normal file
215
engine/overworld/missable_objects.asm
Normal file
|
@ -0,0 +1,215 @@
|
||||||
|
MarkTownVisitedAndLoadMissableObjects:
|
||||||
|
ld a, [wCurMap]
|
||||||
|
cp ROUTE_1
|
||||||
|
jr nc, .notInTown
|
||||||
|
ld c, a
|
||||||
|
ld b, FLAG_SET
|
||||||
|
ld hl, wTownVisitedFlag ; mark town as visited (for flying)
|
||||||
|
predef FlagActionPredef
|
||||||
|
.notInTown
|
||||||
|
ld hl, MapHSPointers
|
||||||
|
ld a, [wCurMap]
|
||||||
|
ld b, $0
|
||||||
|
ld c, a
|
||||||
|
add hl, bc
|
||||||
|
add hl, bc
|
||||||
|
ld a, [hli] ; load missable objects pointer in hl
|
||||||
|
ld h, [hl]
|
||||||
|
; fall through
|
||||||
|
|
||||||
|
LoadMissableObjects:
|
||||||
|
ld l, a
|
||||||
|
push hl
|
||||||
|
ld de, MapHS00 ; calculate difference between out pointer and the base pointer
|
||||||
|
ld a, l
|
||||||
|
sub e
|
||||||
|
jr nc, .asm_f13c
|
||||||
|
dec h
|
||||||
|
.asm_f13c
|
||||||
|
ld l, a
|
||||||
|
ld a, h
|
||||||
|
sub d
|
||||||
|
ld h, a
|
||||||
|
ld a, h
|
||||||
|
ld [H_DIVIDEND], a
|
||||||
|
ld a, l
|
||||||
|
ld [H_DIVIDEND+1], a
|
||||||
|
xor a
|
||||||
|
ld [H_DIVIDEND+2], a
|
||||||
|
ld [H_DIVIDEND+3], a
|
||||||
|
ld a, $3
|
||||||
|
ld [H_DIVISOR], a
|
||||||
|
ld b, $2
|
||||||
|
call Divide ; divide difference by 3, resulting in the global offset (number of missable items before ours)
|
||||||
|
ld a, [wCurMap]
|
||||||
|
ld b, a
|
||||||
|
ld a, [H_DIVIDEND+3]
|
||||||
|
ld c, a ; store global offset in c
|
||||||
|
ld de, wMissableObjectList
|
||||||
|
pop hl
|
||||||
|
.writeMissableObjectsListLoop
|
||||||
|
ld a, [hli]
|
||||||
|
cp $ff
|
||||||
|
jr z, .done ; end of list
|
||||||
|
cp b
|
||||||
|
jr nz, .done ; not for current map anymore
|
||||||
|
ld a, [hli]
|
||||||
|
inc hl
|
||||||
|
ld [de], a ; write (map-local) sprite ID
|
||||||
|
inc de
|
||||||
|
ld a, c
|
||||||
|
inc c
|
||||||
|
ld [de], a ; write (global) missable object index
|
||||||
|
inc de
|
||||||
|
jr .writeMissableObjectsListLoop
|
||||||
|
.done
|
||||||
|
ld a, $ff
|
||||||
|
ld [de], a ; write sentinel
|
||||||
|
ret
|
||||||
|
|
||||||
|
InitializeMissableObjectsFlags:
|
||||||
|
ld hl, wMissableObjectFlags
|
||||||
|
ld bc, wMissableObjectFlagsEnd - wMissableObjectFlags
|
||||||
|
xor a
|
||||||
|
call FillMemory ; clear missable objects flags
|
||||||
|
ld hl, MapHS00
|
||||||
|
xor a
|
||||||
|
ld [wMissableObjectCounter], a
|
||||||
|
.missableObjectsLoop
|
||||||
|
ld a, [hli]
|
||||||
|
cp $ff ; end of list
|
||||||
|
ret z
|
||||||
|
push hl
|
||||||
|
inc hl
|
||||||
|
ld a, [hl]
|
||||||
|
cp Hide
|
||||||
|
jr nz, .skip
|
||||||
|
ld hl, wMissableObjectFlags
|
||||||
|
ld a, [wMissableObjectCounter]
|
||||||
|
ld c, a
|
||||||
|
ld b, FLAG_SET
|
||||||
|
call MissableObjectFlagAction ; set flag if Item is hidden
|
||||||
|
.skip
|
||||||
|
ld hl, wMissableObjectCounter
|
||||||
|
inc [hl]
|
||||||
|
pop hl
|
||||||
|
inc hl
|
||||||
|
inc hl
|
||||||
|
jr .missableObjectsLoop
|
||||||
|
|
||||||
|
; tests if current sprite is a missable object that is hidden/has been removed
|
||||||
|
IsObjectHidden:
|
||||||
|
ld a, [H_CURRENTSPRITEOFFSET]
|
||||||
|
swap a
|
||||||
|
ld b, a
|
||||||
|
ld hl, wMissableObjectList
|
||||||
|
.loop
|
||||||
|
ld a, [hli]
|
||||||
|
cp $ff
|
||||||
|
jr z, .notHidden ; not missable -> not hidden
|
||||||
|
cp b
|
||||||
|
ld a, [hli]
|
||||||
|
jr nz, .loop
|
||||||
|
ld c, a
|
||||||
|
ld b, FLAG_TEST
|
||||||
|
ld hl, wMissableObjectFlags
|
||||||
|
call MissableObjectFlagAction
|
||||||
|
ld a, c
|
||||||
|
and a
|
||||||
|
jr nz, .hidden
|
||||||
|
.notHidden
|
||||||
|
xor a
|
||||||
|
.hidden
|
||||||
|
ld [$ffe5], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; adds missable object (items, leg. pokemon, etc.) to the map
|
||||||
|
; [wMissableObjectIndex]: index of the missable object to be added (global index)
|
||||||
|
ShowObject:
|
||||||
|
ShowObject2:
|
||||||
|
ld hl, wMissableObjectFlags
|
||||||
|
ld a, [wMissableObjectIndex]
|
||||||
|
ld c, a
|
||||||
|
ld b, FLAG_RESET
|
||||||
|
call MissableObjectFlagAction ; reset "removed" flag
|
||||||
|
jp UpdateSprites
|
||||||
|
|
||||||
|
; removes missable object (items, leg. pokemon, etc.) from the map
|
||||||
|
; [wMissableObjectIndex]: index of the missable object to be removed (global index)
|
||||||
|
HideObject:
|
||||||
|
ld hl, wMissableObjectFlags
|
||||||
|
ld a, [wMissableObjectIndex]
|
||||||
|
ld c, a
|
||||||
|
ld b, FLAG_SET
|
||||||
|
call MissableObjectFlagAction ; set "removed" flag
|
||||||
|
jp UpdateSprites
|
||||||
|
|
||||||
|
MissableObjectFlagAction:
|
||||||
|
; identical to FlagAction
|
||||||
|
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
push bc
|
||||||
|
|
||||||
|
; bit
|
||||||
|
ld a, c
|
||||||
|
ld d, a
|
||||||
|
and 7
|
||||||
|
ld e, a
|
||||||
|
|
||||||
|
; byte
|
||||||
|
ld a, d
|
||||||
|
srl a
|
||||||
|
srl a
|
||||||
|
srl a
|
||||||
|
add l
|
||||||
|
ld l, a
|
||||||
|
jr nc, .ok
|
||||||
|
inc h
|
||||||
|
.ok
|
||||||
|
|
||||||
|
; d = 1 << e (bitmask)
|
||||||
|
inc e
|
||||||
|
ld d, 1
|
||||||
|
.shift
|
||||||
|
dec e
|
||||||
|
jr z, .shifted
|
||||||
|
sla d
|
||||||
|
jr .shift
|
||||||
|
.shifted
|
||||||
|
|
||||||
|
ld a, b
|
||||||
|
and a
|
||||||
|
jr z, .reset
|
||||||
|
cp 2
|
||||||
|
jr z, .read
|
||||||
|
|
||||||
|
.set
|
||||||
|
ld a, [hl]
|
||||||
|
ld b, a
|
||||||
|
ld a, d
|
||||||
|
or b
|
||||||
|
ld [hl], a
|
||||||
|
jr .done
|
||||||
|
|
||||||
|
.reset
|
||||||
|
ld a, [hl]
|
||||||
|
ld b, a
|
||||||
|
ld a, d
|
||||||
|
xor $ff
|
||||||
|
and b
|
||||||
|
ld [hl], a
|
||||||
|
jr .done
|
||||||
|
|
||||||
|
.read
|
||||||
|
ld a, [hl]
|
||||||
|
ld b, a
|
||||||
|
ld a, d
|
||||||
|
and b
|
||||||
|
|
||||||
|
.done
|
||||||
|
pop bc
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
ld c, a
|
||||||
|
ret
|
463
engine/overworld/player_state.asm
Normal file
463
engine/overworld/player_state.asm
Normal file
|
@ -0,0 +1,463 @@
|
||||||
|
; only used for setting bit 2 of wd736 upon entering a new map
|
||||||
|
IsPlayerStandingOnWarp:
|
||||||
|
ld a, [wNumberOfWarps]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
ld c, a
|
||||||
|
ld hl, wWarpEntries
|
||||||
|
.loop
|
||||||
|
ld a, [wYCoord]
|
||||||
|
cp [hl]
|
||||||
|
jr nz, .nextWarp1
|
||||||
|
inc hl
|
||||||
|
ld a, [wXCoord]
|
||||||
|
cp [hl]
|
||||||
|
jr nz, .nextWarp2
|
||||||
|
inc hl
|
||||||
|
ld a, [hli] ; target warp
|
||||||
|
ld [wDestinationWarpID], a
|
||||||
|
ld a, [hl] ; target map
|
||||||
|
ld [hWarpDestinationMap], a
|
||||||
|
ld hl, wd736
|
||||||
|
set 2, [hl] ; standing on warp flag
|
||||||
|
ret
|
||||||
|
.nextWarp1
|
||||||
|
inc hl
|
||||||
|
.nextWarp2
|
||||||
|
inc hl
|
||||||
|
inc hl
|
||||||
|
inc hl
|
||||||
|
dec c
|
||||||
|
jr nz, .loop
|
||||||
|
ret
|
||||||
|
|
||||||
|
CheckForceBikeOrSurf:
|
||||||
|
ld hl, wd732
|
||||||
|
bit 5, [hl]
|
||||||
|
ret nz
|
||||||
|
ld hl, ForcedBikeOrSurfMaps
|
||||||
|
ld a, [wYCoord]
|
||||||
|
ld b, a
|
||||||
|
ld a, [wXCoord]
|
||||||
|
ld c, a
|
||||||
|
ld a, [wCurMap]
|
||||||
|
ld d, a
|
||||||
|
.loop
|
||||||
|
ld a, [hli]
|
||||||
|
cp $ff
|
||||||
|
ret z ;if we reach FF then it's not part of the list
|
||||||
|
cp d ;compare to current map
|
||||||
|
jr nz, .incorrectMap
|
||||||
|
ld a, [hli]
|
||||||
|
cp b ;compare y-coord
|
||||||
|
jr nz, .incorrectY
|
||||||
|
ld a, [hli]
|
||||||
|
cp c ;compare x-coord
|
||||||
|
jr nz, .loop ; incorrect x-coord, check next item
|
||||||
|
ld a, [wCurMap]
|
||||||
|
cp SEAFOAM_ISLANDS_4
|
||||||
|
ld a, $2
|
||||||
|
ld [wSeafoamIslands4CurScript], a
|
||||||
|
jr z, .forceSurfing
|
||||||
|
ld a, [wCurMap]
|
||||||
|
cp SEAFOAM_ISLANDS_5
|
||||||
|
ld a, $2
|
||||||
|
ld [wSeafoamIslands5CurScript], a
|
||||||
|
jr z, .forceSurfing
|
||||||
|
;force bike riding
|
||||||
|
ld hl, wd732
|
||||||
|
set 5, [hl]
|
||||||
|
ld a, $1
|
||||||
|
ld [wWalkBikeSurfState], a
|
||||||
|
ld [wWalkBikeSurfStateCopy], a
|
||||||
|
jp ForceBikeOrSurf
|
||||||
|
.incorrectMap
|
||||||
|
inc hl
|
||||||
|
.incorrectY
|
||||||
|
inc hl
|
||||||
|
jr .loop
|
||||||
|
.forceSurfing
|
||||||
|
ld a, $2
|
||||||
|
ld [wWalkBikeSurfState], a
|
||||||
|
ld [wWalkBikeSurfStateCopy], a
|
||||||
|
jp ForceBikeOrSurf
|
||||||
|
|
||||||
|
INCLUDE "data/force_bike_surf.asm"
|
||||||
|
|
||||||
|
IsPlayerFacingEdgeOfMap:
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
push bc
|
||||||
|
ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction
|
||||||
|
srl a
|
||||||
|
ld c, a
|
||||||
|
ld b, $0
|
||||||
|
ld hl, .functionPointerTable
|
||||||
|
add hl, bc
|
||||||
|
ld a, [hli]
|
||||||
|
ld h, [hl]
|
||||||
|
ld l, a
|
||||||
|
ld a, [wYCoord]
|
||||||
|
ld b, a
|
||||||
|
ld a, [wXCoord]
|
||||||
|
ld c, a
|
||||||
|
ld de, .asm_c41e
|
||||||
|
push de
|
||||||
|
jp [hl]
|
||||||
|
.asm_c41e
|
||||||
|
pop bc
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
ret
|
||||||
|
|
||||||
|
.functionPointerTable
|
||||||
|
dw .facingDown
|
||||||
|
dw .facingUp
|
||||||
|
dw .facingLeft
|
||||||
|
dw .facingRight
|
||||||
|
|
||||||
|
.facingDown
|
||||||
|
ld a, [wCurMapHeight]
|
||||||
|
add a
|
||||||
|
dec a
|
||||||
|
cp b
|
||||||
|
jr z, .setCarry
|
||||||
|
jr .resetCarry
|
||||||
|
|
||||||
|
.facingUp
|
||||||
|
ld a, b
|
||||||
|
and a
|
||||||
|
jr z, .setCarry
|
||||||
|
jr .resetCarry
|
||||||
|
|
||||||
|
.facingLeft
|
||||||
|
ld a, c
|
||||||
|
and a
|
||||||
|
jr z, .setCarry
|
||||||
|
jr .resetCarry
|
||||||
|
|
||||||
|
.facingRight
|
||||||
|
ld a, [wCurMapWidth]
|
||||||
|
add a
|
||||||
|
dec a
|
||||||
|
cp c
|
||||||
|
jr z, .setCarry
|
||||||
|
jr .resetCarry
|
||||||
|
.resetCarry
|
||||||
|
and a
|
||||||
|
ret
|
||||||
|
.setCarry
|
||||||
|
scf
|
||||||
|
ret
|
||||||
|
|
||||||
|
IsWarpTileInFrontOfPlayer:
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
push bc
|
||||||
|
call _GetTileAndCoordsInFrontOfPlayer
|
||||||
|
ld a, [wCurMap]
|
||||||
|
cp SS_ANNE_5
|
||||||
|
jr z, .ssAnne5
|
||||||
|
ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction
|
||||||
|
srl a
|
||||||
|
ld c, a
|
||||||
|
ld b, 0
|
||||||
|
ld hl, .warpTileListPointers
|
||||||
|
add hl, bc
|
||||||
|
ld a, [hli]
|
||||||
|
ld h, [hl]
|
||||||
|
ld l, a
|
||||||
|
ld a, [wTileInFrontOfPlayer]
|
||||||
|
ld de, $1
|
||||||
|
call IsInArray
|
||||||
|
.done
|
||||||
|
pop bc
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
ret
|
||||||
|
|
||||||
|
.warpTileListPointers:
|
||||||
|
dw .facingDownWarpTiles
|
||||||
|
dw .facingUpWarpTiles
|
||||||
|
dw .facingLeftWarpTiles
|
||||||
|
dw .facingRightWarpTiles
|
||||||
|
|
||||||
|
.facingDownWarpTiles
|
||||||
|
db $01,$12,$17,$3D,$04,$18,$33,$FF
|
||||||
|
|
||||||
|
.facingUpWarpTiles
|
||||||
|
db $01,$5C,$FF
|
||||||
|
|
||||||
|
.facingLeftWarpTiles
|
||||||
|
db $1A,$4B,$FF
|
||||||
|
|
||||||
|
.facingRightWarpTiles
|
||||||
|
db $0F,$4E,$FF
|
||||||
|
|
||||||
|
.ssAnne5
|
||||||
|
ld a, [wTileInFrontOfPlayer]
|
||||||
|
cp $15
|
||||||
|
jr nz, .notSSAnne5Warp
|
||||||
|
scf
|
||||||
|
jr .done
|
||||||
|
.notSSAnne5Warp
|
||||||
|
and a
|
||||||
|
jr .done
|
||||||
|
|
||||||
|
IsPlayerStandingOnDoorTileOrWarpTile:
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
push bc
|
||||||
|
callba IsPlayerStandingOnDoorTile
|
||||||
|
jr c, .done
|
||||||
|
ld a, [wCurMapTileset]
|
||||||
|
add a
|
||||||
|
ld c, a
|
||||||
|
ld b, $0
|
||||||
|
ld hl, WarpTileIDPointers
|
||||||
|
add hl, bc
|
||||||
|
ld a, [hli]
|
||||||
|
ld h, [hl]
|
||||||
|
ld l, a
|
||||||
|
ld de, $1
|
||||||
|
aCoord 8, 9
|
||||||
|
call IsInArray
|
||||||
|
jr nc, .done
|
||||||
|
ld hl, wd736
|
||||||
|
res 2, [hl]
|
||||||
|
.done
|
||||||
|
pop bc
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
ret
|
||||||
|
|
||||||
|
INCLUDE "data/warp_tile_ids.asm"
|
||||||
|
|
||||||
|
PrintSafariZoneSteps:
|
||||||
|
ld a, [wCurMap]
|
||||||
|
cp SAFARI_ZONE_EAST
|
||||||
|
ret c
|
||||||
|
cp UNKNOWN_DUNGEON_2
|
||||||
|
ret nc
|
||||||
|
coord hl, 0, 0
|
||||||
|
ld b, 3
|
||||||
|
ld c, 7
|
||||||
|
call TextBoxBorder
|
||||||
|
coord hl, 1, 1
|
||||||
|
ld de, wSafariSteps
|
||||||
|
lb bc, 2, 3
|
||||||
|
call PrintNumber
|
||||||
|
coord hl, 4, 1
|
||||||
|
ld de, SafariSteps
|
||||||
|
call PlaceString
|
||||||
|
coord hl, 1, 3
|
||||||
|
ld de, SafariBallText
|
||||||
|
call PlaceString
|
||||||
|
ld a, [wNumSafariBalls]
|
||||||
|
cp 10
|
||||||
|
jr nc, .asm_c56d
|
||||||
|
coord hl, 5, 3
|
||||||
|
ld a, " "
|
||||||
|
ld [hl], a
|
||||||
|
.asm_c56d
|
||||||
|
coord hl, 6, 3
|
||||||
|
ld de, wNumSafariBalls
|
||||||
|
lb bc, 1, 2
|
||||||
|
jp PrintNumber
|
||||||
|
|
||||||
|
SafariSteps:
|
||||||
|
db "/500@"
|
||||||
|
|
||||||
|
SafariBallText:
|
||||||
|
db "BALL×× @"
|
||||||
|
|
||||||
|
GetTileAndCoordsInFrontOfPlayer:
|
||||||
|
call GetPredefRegisters
|
||||||
|
|
||||||
|
_GetTileAndCoordsInFrontOfPlayer:
|
||||||
|
ld a, [wYCoord]
|
||||||
|
ld d, a
|
||||||
|
ld a, [wXCoord]
|
||||||
|
ld e, a
|
||||||
|
ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
|
||||||
|
and a ; cp SPRITE_FACING_DOWN
|
||||||
|
jr nz, .notFacingDown
|
||||||
|
; facing down
|
||||||
|
aCoord 8, 11
|
||||||
|
inc d
|
||||||
|
jr .storeTile
|
||||||
|
.notFacingDown
|
||||||
|
cp SPRITE_FACING_UP
|
||||||
|
jr nz, .notFacingUp
|
||||||
|
; facing up
|
||||||
|
aCoord 8, 7
|
||||||
|
dec d
|
||||||
|
jr .storeTile
|
||||||
|
.notFacingUp
|
||||||
|
cp SPRITE_FACING_LEFT
|
||||||
|
jr nz, .notFacingLeft
|
||||||
|
; facing left
|
||||||
|
aCoord 6, 9
|
||||||
|
dec e
|
||||||
|
jr .storeTile
|
||||||
|
.notFacingLeft
|
||||||
|
cp SPRITE_FACING_RIGHT
|
||||||
|
jr nz, .storeTile
|
||||||
|
; facing right
|
||||||
|
aCoord 10, 9
|
||||||
|
inc e
|
||||||
|
.storeTile
|
||||||
|
ld c, a
|
||||||
|
ld [wTileInFrontOfPlayer], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
GetTileTwoStepsInFrontOfPlayer:
|
||||||
|
xor a
|
||||||
|
ld [$ffdb], a
|
||||||
|
ld hl, wYCoord
|
||||||
|
ld a, [hli]
|
||||||
|
ld d, a
|
||||||
|
ld e, [hl]
|
||||||
|
ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
|
||||||
|
and a ; cp SPRITE_FACING_DOWN
|
||||||
|
jr nz, .notFacingDown
|
||||||
|
; facing down
|
||||||
|
ld hl, $ffdb
|
||||||
|
set 0, [hl]
|
||||||
|
aCoord 8, 13
|
||||||
|
inc d
|
||||||
|
jr .storeTile
|
||||||
|
.notFacingDown
|
||||||
|
cp SPRITE_FACING_UP
|
||||||
|
jr nz, .notFacingUp
|
||||||
|
; facing up
|
||||||
|
ld hl, $ffdb
|
||||||
|
set 1, [hl]
|
||||||
|
aCoord 8, 5
|
||||||
|
dec d
|
||||||
|
jr .storeTile
|
||||||
|
.notFacingUp
|
||||||
|
cp SPRITE_FACING_LEFT
|
||||||
|
jr nz, .notFacingLeft
|
||||||
|
; facing left
|
||||||
|
ld hl, $ffdb
|
||||||
|
set 2, [hl]
|
||||||
|
aCoord 4, 9
|
||||||
|
dec e
|
||||||
|
jr .storeTile
|
||||||
|
.notFacingLeft
|
||||||
|
cp SPRITE_FACING_RIGHT
|
||||||
|
jr nz, .storeTile
|
||||||
|
; facing right
|
||||||
|
ld hl, $ffdb
|
||||||
|
set 3, [hl]
|
||||||
|
aCoord 12, 9
|
||||||
|
inc e
|
||||||
|
.storeTile
|
||||||
|
ld c, a
|
||||||
|
ld [wTileInFrontOfBoulderAndBoulderCollisionResult], a
|
||||||
|
ld [wTileInFrontOfPlayer], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
CheckForCollisionWhenPushingBoulder:
|
||||||
|
call GetTileTwoStepsInFrontOfPlayer
|
||||||
|
ld hl, wTilesetCollisionPtr
|
||||||
|
ld a, [hli]
|
||||||
|
ld h, [hl]
|
||||||
|
ld l, a
|
||||||
|
.loop
|
||||||
|
ld a, [hli]
|
||||||
|
cp $ff
|
||||||
|
jr z, .done ; if the tile two steps ahead is not passable
|
||||||
|
cp c
|
||||||
|
jr nz, .loop
|
||||||
|
ld hl, TilePairCollisionsLand
|
||||||
|
call CheckForTilePairCollisions2
|
||||||
|
ld a, $ff
|
||||||
|
jr c, .done ; if there is an elevation difference between the current tile and the one two steps ahead
|
||||||
|
ld a, [wTileInFrontOfBoulderAndBoulderCollisionResult]
|
||||||
|
cp $15 ; stairs tile
|
||||||
|
ld a, $ff
|
||||||
|
jr z, .done ; if the tile two steps ahead is stairs
|
||||||
|
call CheckForBoulderCollisionWithSprites
|
||||||
|
.done
|
||||||
|
ld [wTileInFrontOfBoulderAndBoulderCollisionResult], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; sets a to $ff if there is a collision and $00 if there is no collision
|
||||||
|
CheckForBoulderCollisionWithSprites:
|
||||||
|
ld a, [wBoulderSpriteIndex]
|
||||||
|
dec a
|
||||||
|
swap a
|
||||||
|
ld d, 0
|
||||||
|
ld e, a
|
||||||
|
ld hl, wSpriteStateData2 + $14
|
||||||
|
add hl, de
|
||||||
|
ld a, [hli] ; map Y position
|
||||||
|
ld [$ffdc], a
|
||||||
|
ld a, [hl] ; map X position
|
||||||
|
ld [$ffdd], a
|
||||||
|
ld a, [wNumSprites]
|
||||||
|
ld c, a
|
||||||
|
ld de, $f
|
||||||
|
ld hl, wSpriteStateData2 + $14
|
||||||
|
ld a, [$ffdb]
|
||||||
|
and $3 ; facing up or down?
|
||||||
|
jr z, .pushingHorizontallyLoop
|
||||||
|
.pushingVerticallyLoop
|
||||||
|
inc hl
|
||||||
|
ld a, [$ffdd]
|
||||||
|
cp [hl]
|
||||||
|
jr nz, .nextSprite1 ; if X coordinates don't match
|
||||||
|
dec hl
|
||||||
|
ld a, [hli]
|
||||||
|
ld b, a
|
||||||
|
ld a, [$ffdb]
|
||||||
|
rrca
|
||||||
|
jr c, .pushingDown
|
||||||
|
; pushing up
|
||||||
|
ld a, [$ffdc]
|
||||||
|
dec a
|
||||||
|
jr .compareYCoords
|
||||||
|
.pushingDown
|
||||||
|
ld a, [$ffdc]
|
||||||
|
inc a
|
||||||
|
.compareYCoords
|
||||||
|
cp b
|
||||||
|
jr z, .failure
|
||||||
|
.nextSprite1
|
||||||
|
dec c
|
||||||
|
jr z, .success
|
||||||
|
add hl, de
|
||||||
|
jr .pushingVerticallyLoop
|
||||||
|
.pushingHorizontallyLoop
|
||||||
|
ld a, [hli]
|
||||||
|
ld b, a
|
||||||
|
ld a, [$ffdc]
|
||||||
|
cp b
|
||||||
|
jr nz, .nextSprite2
|
||||||
|
ld b, [hl]
|
||||||
|
ld a, [$ffdb]
|
||||||
|
bit 2, a
|
||||||
|
jr nz, .pushingLeft
|
||||||
|
; pushing right
|
||||||
|
ld a, [$ffdd]
|
||||||
|
inc a
|
||||||
|
jr .compareXCoords
|
||||||
|
.pushingLeft
|
||||||
|
ld a, [$ffdd]
|
||||||
|
dec a
|
||||||
|
.compareXCoords
|
||||||
|
cp b
|
||||||
|
jr z, .failure
|
||||||
|
.nextSprite2
|
||||||
|
dec c
|
||||||
|
jr z, .success
|
||||||
|
add hl, de
|
||||||
|
jr .pushingHorizontallyLoop
|
||||||
|
.failure
|
||||||
|
ld a, $ff
|
||||||
|
ret
|
||||||
|
.success
|
||||||
|
xor a
|
||||||
|
ret
|
112
engine/overworld/poison.asm
Normal file
112
engine/overworld/poison.asm
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
ApplyOutOfBattlePoisonDamage:
|
||||||
|
ld a, [wd730]
|
||||||
|
add a
|
||||||
|
jp c, .noBlackOut ; no black out if joypad states are being simulated
|
||||||
|
ld a, [wPartyCount]
|
||||||
|
and a
|
||||||
|
jp z, .noBlackOut
|
||||||
|
call IncrementDayCareMonExp
|
||||||
|
ld a, [wStepCounter]
|
||||||
|
and $3 ; is the counter a multiple of 4?
|
||||||
|
jp nz, .noBlackOut ; only apply poison damage every fourth step
|
||||||
|
ld [wWhichPokemon], a
|
||||||
|
ld hl, wPartyMon1Status
|
||||||
|
ld de, wPartySpecies
|
||||||
|
.applyDamageLoop
|
||||||
|
ld a, [hl]
|
||||||
|
and (1 << PSN)
|
||||||
|
jr z, .nextMon2 ; not poisoned
|
||||||
|
dec hl
|
||||||
|
dec hl
|
||||||
|
ld a, [hld]
|
||||||
|
ld b, a
|
||||||
|
ld a, [hli]
|
||||||
|
or b
|
||||||
|
jr z, .nextMon ; already fainted
|
||||||
|
; subtract 1 from HP
|
||||||
|
ld a, [hl]
|
||||||
|
dec a
|
||||||
|
ld [hld], a
|
||||||
|
inc a
|
||||||
|
jr nz, .noBorrow
|
||||||
|
; borrow 1 from upper byte of HP
|
||||||
|
dec [hl]
|
||||||
|
inc hl
|
||||||
|
jr .nextMon
|
||||||
|
.noBorrow
|
||||||
|
ld a, [hli]
|
||||||
|
or [hl]
|
||||||
|
jr nz, .nextMon ; didn't faint from damage
|
||||||
|
; the mon fainted from the damage
|
||||||
|
push hl
|
||||||
|
inc hl
|
||||||
|
inc hl
|
||||||
|
ld [hl], a
|
||||||
|
ld a, [de]
|
||||||
|
ld [wd11e], a
|
||||||
|
push de
|
||||||
|
ld a, [wWhichPokemon]
|
||||||
|
ld hl, wPartyMonNicks
|
||||||
|
call GetPartyMonName
|
||||||
|
xor a
|
||||||
|
ld [wJoyIgnore], a
|
||||||
|
call EnableAutoTextBoxDrawing
|
||||||
|
ld a, $d0
|
||||||
|
ld [hSpriteIndexOrTextID], a
|
||||||
|
call DisplayTextID
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
.nextMon
|
||||||
|
inc hl
|
||||||
|
inc hl
|
||||||
|
.nextMon2
|
||||||
|
inc de
|
||||||
|
ld a, [de]
|
||||||
|
inc a
|
||||||
|
jr z, .applyDamageLoopDone
|
||||||
|
ld bc, wPartyMon2 - wPartyMon1
|
||||||
|
add hl, bc
|
||||||
|
push hl
|
||||||
|
ld hl, wWhichPokemon
|
||||||
|
inc [hl]
|
||||||
|
pop hl
|
||||||
|
jr .applyDamageLoop
|
||||||
|
.applyDamageLoopDone
|
||||||
|
ld hl, wPartyMon1Status
|
||||||
|
ld a, [wPartyCount]
|
||||||
|
ld d, a
|
||||||
|
ld e, 0
|
||||||
|
.countPoisonedLoop
|
||||||
|
ld a, [hl]
|
||||||
|
and (1 << PSN)
|
||||||
|
or e
|
||||||
|
ld e, a
|
||||||
|
ld bc, wPartyMon2 - wPartyMon1
|
||||||
|
add hl, bc
|
||||||
|
dec d
|
||||||
|
jr nz, .countPoisonedLoop
|
||||||
|
ld a, e
|
||||||
|
and a ; are any party members poisoned?
|
||||||
|
jr z, .skipPoisonEffectAndSound
|
||||||
|
ld b, $2
|
||||||
|
predef ChangeBGPalColor0_4Frames ; change BG white to dark grey for 4 frames
|
||||||
|
ld a, SFX_POISONED
|
||||||
|
call PlaySound
|
||||||
|
.skipPoisonEffectAndSound
|
||||||
|
predef AnyPartyAlive
|
||||||
|
ld a, d
|
||||||
|
and a
|
||||||
|
jr nz, .noBlackOut
|
||||||
|
call EnableAutoTextBoxDrawing
|
||||||
|
ld a, $d1
|
||||||
|
ld [hSpriteIndexOrTextID], a
|
||||||
|
call DisplayTextID
|
||||||
|
ld hl, wd72e
|
||||||
|
set 5, [hl]
|
||||||
|
ld a, $ff
|
||||||
|
jr .done
|
||||||
|
.noBlackOut
|
||||||
|
xor a
|
||||||
|
.done
|
||||||
|
ld [wOutOfBattleBlackout], a
|
||||||
|
ret
|
105
engine/overworld/push_boulder.asm
Normal file
105
engine/overworld/push_boulder.asm
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
TryPushingBoulder:
|
||||||
|
ld a, [wd728]
|
||||||
|
bit 0, a ; using Strength?
|
||||||
|
ret z
|
||||||
|
ld a, [wFlags_0xcd60]
|
||||||
|
bit 1, a ; has boulder dust animation from previous push played yet?
|
||||||
|
ret nz
|
||||||
|
xor a
|
||||||
|
ld [hSpriteIndexOrTextID], a
|
||||||
|
call IsSpriteInFrontOfPlayer
|
||||||
|
ld a, [hSpriteIndexOrTextID]
|
||||||
|
ld [wBoulderSpriteIndex], a
|
||||||
|
and a
|
||||||
|
jp z, ResetBoulderPushFlags
|
||||||
|
ld hl, wSpriteStateData1 + 1
|
||||||
|
ld d, $0
|
||||||
|
ld a, [hSpriteIndexOrTextID]
|
||||||
|
swap a
|
||||||
|
ld e, a
|
||||||
|
add hl, de
|
||||||
|
res 7, [hl]
|
||||||
|
call GetSpriteMovementByte2Pointer
|
||||||
|
ld a, [hl]
|
||||||
|
cp BOULDER_MOVEMENT_BYTE_2
|
||||||
|
jp nz, ResetBoulderPushFlags
|
||||||
|
ld hl, wFlags_0xcd60
|
||||||
|
bit 6, [hl]
|
||||||
|
set 6, [hl] ; indicate that the player has tried pushing
|
||||||
|
ret z ; the player must try pushing twice before the boulder will move
|
||||||
|
ld a, [hJoyHeld]
|
||||||
|
and D_RIGHT | D_LEFT | D_UP | D_DOWN
|
||||||
|
ret z
|
||||||
|
predef CheckForCollisionWhenPushingBoulder
|
||||||
|
ld a, [wTileInFrontOfBoulderAndBoulderCollisionResult]
|
||||||
|
and a ; was there a collision?
|
||||||
|
jp nz, ResetBoulderPushFlags
|
||||||
|
ld a, [hJoyHeld]
|
||||||
|
ld b, a
|
||||||
|
ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
|
||||||
|
cp SPRITE_FACING_UP
|
||||||
|
jr z, .pushBoulderUp
|
||||||
|
cp SPRITE_FACING_LEFT
|
||||||
|
jr z, .pushBoulderLeft
|
||||||
|
cp SPRITE_FACING_RIGHT
|
||||||
|
jr z, .pushBoulderRight
|
||||||
|
.pushBoulderDown
|
||||||
|
bit 7, b
|
||||||
|
ret z
|
||||||
|
ld de, PushBoulderDownMovementData
|
||||||
|
jr .done
|
||||||
|
.pushBoulderUp
|
||||||
|
bit 6, b
|
||||||
|
ret z
|
||||||
|
ld de, PushBoulderUpMovementData
|
||||||
|
jr .done
|
||||||
|
.pushBoulderLeft
|
||||||
|
bit 5, b
|
||||||
|
ret z
|
||||||
|
ld de, PushBoulderLeftMovementData
|
||||||
|
jr .done
|
||||||
|
.pushBoulderRight
|
||||||
|
bit 4, b
|
||||||
|
ret z
|
||||||
|
ld de, PushBoulderRightMovementData
|
||||||
|
.done
|
||||||
|
call MoveSprite
|
||||||
|
ld a, SFX_PUSH_BOULDER
|
||||||
|
call PlaySound
|
||||||
|
ld hl, wFlags_0xcd60
|
||||||
|
set 1, [hl]
|
||||||
|
ret
|
||||||
|
|
||||||
|
PushBoulderUpMovementData:
|
||||||
|
db NPC_MOVEMENT_UP,$FF
|
||||||
|
|
||||||
|
PushBoulderDownMovementData:
|
||||||
|
db NPC_MOVEMENT_DOWN,$FF
|
||||||
|
|
||||||
|
PushBoulderLeftMovementData:
|
||||||
|
db NPC_MOVEMENT_LEFT,$FF
|
||||||
|
|
||||||
|
PushBoulderRightMovementData:
|
||||||
|
db NPC_MOVEMENT_RIGHT,$FF
|
||||||
|
|
||||||
|
DoBoulderDustAnimation:
|
||||||
|
ld a, [wd730]
|
||||||
|
bit 0, a
|
||||||
|
ret nz
|
||||||
|
callab AnimateBoulderDust
|
||||||
|
call DiscardButtonPresses
|
||||||
|
ld [wJoyIgnore], a
|
||||||
|
call ResetBoulderPushFlags
|
||||||
|
set 7, [hl]
|
||||||
|
ld a, [wBoulderSpriteIndex]
|
||||||
|
ld [H_SPRITEINDEX], a
|
||||||
|
call GetSpriteMovementByte2Pointer
|
||||||
|
ld [hl], $10
|
||||||
|
ld a, SFX_CUT
|
||||||
|
jp PlaySound
|
||||||
|
|
||||||
|
ResetBoulderPushFlags:
|
||||||
|
ld hl, wFlags_0xcd60
|
||||||
|
res 1, [hl]
|
||||||
|
res 6, [hl]
|
||||||
|
ret
|
60
engine/overworld/tileset_header.asm
Normal file
60
engine/overworld/tileset_header.asm
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
LoadTilesetHeader:
|
||||||
|
call GetPredefRegisters
|
||||||
|
push hl
|
||||||
|
ld d, 0
|
||||||
|
ld a, [wCurMapTileset]
|
||||||
|
add a
|
||||||
|
add a
|
||||||
|
ld b, a
|
||||||
|
add a
|
||||||
|
add b ; a = tileset * 12
|
||||||
|
jr nc, .noCarry
|
||||||
|
inc d
|
||||||
|
.noCarry
|
||||||
|
ld e, a
|
||||||
|
ld hl, Tilesets
|
||||||
|
add hl, de
|
||||||
|
ld de, wTilesetBank
|
||||||
|
ld c, $b
|
||||||
|
.copyTilesetHeaderLoop
|
||||||
|
ld a, [hli]
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
dec c
|
||||||
|
jr nz, .copyTilesetHeaderLoop
|
||||||
|
ld a, [hl]
|
||||||
|
ld [hTilesetType], a
|
||||||
|
xor a
|
||||||
|
ld [$ffd8], a
|
||||||
|
pop hl
|
||||||
|
ld a, [wCurMapTileset]
|
||||||
|
push hl
|
||||||
|
push de
|
||||||
|
ld hl, DungeonTilesets
|
||||||
|
ld de, $1
|
||||||
|
call IsInArray
|
||||||
|
pop de
|
||||||
|
pop hl
|
||||||
|
jr c, .asm_c797
|
||||||
|
ld a, [wCurMapTileset]
|
||||||
|
ld b, a
|
||||||
|
ld a, [hPreviousTileset]
|
||||||
|
cp b
|
||||||
|
jr z, .done
|
||||||
|
.asm_c797
|
||||||
|
ld a, [wDestinationWarpID]
|
||||||
|
cp $ff
|
||||||
|
jr z, .done
|
||||||
|
call LoadDestinationWarpPosition
|
||||||
|
ld a, [wYCoord]
|
||||||
|
and $1
|
||||||
|
ld [wYBlockCoord], a
|
||||||
|
ld a, [wXCoord]
|
||||||
|
and $1
|
||||||
|
ld [wXBlockCoord], a
|
||||||
|
.done
|
||||||
|
ret
|
||||||
|
|
||||||
|
INCLUDE "data/dungeon_tilesets.asm"
|
||||||
|
|
||||||
|
INCLUDE "data/tileset_headers.asm"
|
126
engine/overworld/update_map.asm
Normal file
126
engine/overworld/update_map.asm
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
; replaces a tile block with the one specified in [wNewTileBlockID]
|
||||||
|
; and redraws the map view if necessary
|
||||||
|
; b = Y
|
||||||
|
; c = X
|
||||||
|
ReplaceTileBlock:
|
||||||
|
call GetPredefRegisters
|
||||||
|
ld hl, wOverworldMap
|
||||||
|
ld a, [wCurMapWidth]
|
||||||
|
add $6
|
||||||
|
ld e, a
|
||||||
|
ld d, $0
|
||||||
|
add hl, de
|
||||||
|
add hl, de
|
||||||
|
add hl, de
|
||||||
|
ld e, $3
|
||||||
|
add hl, de
|
||||||
|
ld e, a
|
||||||
|
ld a, b
|
||||||
|
and a
|
||||||
|
jr z, .addX
|
||||||
|
; add width * Y
|
||||||
|
.addWidthYTimesLoop
|
||||||
|
add hl, de
|
||||||
|
dec b
|
||||||
|
jr nz, .addWidthYTimesLoop
|
||||||
|
.addX
|
||||||
|
add hl, bc ; add X
|
||||||
|
ld a, [wNewTileBlockID]
|
||||||
|
ld [hl], a
|
||||||
|
ld a, [wCurrentTileBlockMapViewPointer]
|
||||||
|
ld c, a
|
||||||
|
ld a, [wCurrentTileBlockMapViewPointer + 1]
|
||||||
|
ld b, a
|
||||||
|
call CompareHLWithBC
|
||||||
|
ret c ; return if the replaced tile block is below the map view in memory
|
||||||
|
push hl
|
||||||
|
ld l, e
|
||||||
|
ld h, $0
|
||||||
|
ld e, $6
|
||||||
|
ld d, h
|
||||||
|
add hl, hl
|
||||||
|
add hl, hl
|
||||||
|
add hl, de
|
||||||
|
add hl, bc
|
||||||
|
pop bc
|
||||||
|
call CompareHLWithBC
|
||||||
|
ret c ; return if the replaced tile block is above the map view in memory
|
||||||
|
|
||||||
|
RedrawMapView:
|
||||||
|
ld a, [wIsInBattle]
|
||||||
|
inc a
|
||||||
|
ret z
|
||||||
|
ld a, [H_AUTOBGTRANSFERENABLED]
|
||||||
|
push af
|
||||||
|
ld a, [hTilesetType]
|
||||||
|
push af
|
||||||
|
xor a
|
||||||
|
ld [H_AUTOBGTRANSFERENABLED], a
|
||||||
|
ld [hTilesetType], a ; no flower/water BG tile animations
|
||||||
|
call LoadCurrentMapView
|
||||||
|
call RunDefaultPaletteCommand
|
||||||
|
ld hl, wMapViewVRAMPointer
|
||||||
|
ld a, [hli]
|
||||||
|
ld h, [hl]
|
||||||
|
ld l, a
|
||||||
|
ld de, -2 * 32
|
||||||
|
add hl, de
|
||||||
|
ld a, h
|
||||||
|
and $3
|
||||||
|
or $98
|
||||||
|
ld a, l
|
||||||
|
ld [wBuffer], a
|
||||||
|
ld a, h
|
||||||
|
ld [wBuffer + 1], a ; this copy of the address is not used
|
||||||
|
ld a, 2
|
||||||
|
ld [$ffbe], a
|
||||||
|
ld c, 9 ; number of rows of 2x2 tiles (this covers the whole screen)
|
||||||
|
.redrawRowLoop
|
||||||
|
push bc
|
||||||
|
push hl
|
||||||
|
push hl
|
||||||
|
ld hl, wTileMap - 2 * SCREEN_WIDTH
|
||||||
|
ld de, SCREEN_WIDTH
|
||||||
|
ld a, [$ffbe]
|
||||||
|
.calcWRAMAddrLoop
|
||||||
|
add hl, de
|
||||||
|
dec a
|
||||||
|
jr nz, .calcWRAMAddrLoop
|
||||||
|
call CopyToRedrawRowOrColumnSrcTiles
|
||||||
|
pop hl
|
||||||
|
ld de, $20
|
||||||
|
ld a, [$ffbe]
|
||||||
|
ld c, a
|
||||||
|
.calcVRAMAddrLoop
|
||||||
|
add hl, de
|
||||||
|
ld a, h
|
||||||
|
and $3
|
||||||
|
or $98
|
||||||
|
dec c
|
||||||
|
jr nz, .calcVRAMAddrLoop
|
||||||
|
ld [hRedrawRowOrColumnDest + 1], a
|
||||||
|
ld a, l
|
||||||
|
ld [hRedrawRowOrColumnDest], a
|
||||||
|
ld a, REDRAW_ROW
|
||||||
|
ld [hRedrawRowOrColumnMode], a
|
||||||
|
call DelayFrame
|
||||||
|
ld hl, $ffbe
|
||||||
|
inc [hl]
|
||||||
|
inc [hl]
|
||||||
|
pop hl
|
||||||
|
pop bc
|
||||||
|
dec c
|
||||||
|
jr nz, .redrawRowLoop
|
||||||
|
pop af
|
||||||
|
ld [hTilesetType], a
|
||||||
|
pop af
|
||||||
|
ld [H_AUTOBGTRANSFERENABLED], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
CompareHLWithBC:
|
||||||
|
ld a, h
|
||||||
|
sub b
|
||||||
|
ret nz
|
||||||
|
ld a, l
|
||||||
|
sub c
|
||||||
|
ret
|
33
engine/overworld/wild_mons.asm
Normal file
33
engine/overworld/wild_mons.asm
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
LoadWildData:
|
||||||
|
ld hl,WildDataPointers
|
||||||
|
ld a,[wCurMap]
|
||||||
|
|
||||||
|
; get wild data for current map
|
||||||
|
ld c,a
|
||||||
|
ld b,0
|
||||||
|
add hl,bc
|
||||||
|
add hl,bc
|
||||||
|
ld a,[hli]
|
||||||
|
ld h,[hl]
|
||||||
|
ld l,a ; hl now points to wild data for current map
|
||||||
|
ld a,[hli]
|
||||||
|
ld [wGrassRate],a
|
||||||
|
and a
|
||||||
|
jr z,.NoGrassData ; if no grass data, skip to surfing data
|
||||||
|
push hl
|
||||||
|
ld de,wGrassMons ; otherwise, load grass data
|
||||||
|
ld bc,$0014
|
||||||
|
call CopyData
|
||||||
|
pop hl
|
||||||
|
ld bc,$0014
|
||||||
|
add hl,bc
|
||||||
|
.NoGrassData
|
||||||
|
ld a,[hli]
|
||||||
|
ld [wWaterRate],a
|
||||||
|
and a
|
||||||
|
ret z ; if no water data, we're done
|
||||||
|
ld de,wWaterMons ; otherwise, load surfing data
|
||||||
|
ld bc,$0014
|
||||||
|
jp CopyData
|
||||||
|
|
||||||
|
INCLUDE "data/wild_mons.asm"
|
201
engine/pathfinding.asm
Normal file
201
engine/pathfinding.asm
Normal file
|
@ -0,0 +1,201 @@
|
||||||
|
FindPathToPlayer:
|
||||||
|
xor a
|
||||||
|
ld hl, hFindPathNumSteps
|
||||||
|
ld [hli], a ; hFindPathNumSteps
|
||||||
|
ld [hli], a ; hFindPathFlags
|
||||||
|
ld [hli], a ; hFindPathYProgress
|
||||||
|
ld [hl], a ; hFindPathXProgress
|
||||||
|
ld hl, wNPCMovementDirections2
|
||||||
|
ld de, $0
|
||||||
|
.loop
|
||||||
|
ld a, [hFindPathYProgress]
|
||||||
|
ld b, a
|
||||||
|
ld a, [hNPCPlayerYDistance] ; Y distance in steps
|
||||||
|
call CalcDifference
|
||||||
|
ld d, a
|
||||||
|
and a
|
||||||
|
jr nz, .asm_f8da
|
||||||
|
ld a, [hFindPathFlags]
|
||||||
|
set 0, a ; current end of path matches the player's Y coordinate
|
||||||
|
ld [hFindPathFlags], a
|
||||||
|
.asm_f8da
|
||||||
|
ld a, [hFindPathXProgress]
|
||||||
|
ld b, a
|
||||||
|
ld a, [hNPCPlayerXDistance] ; X distance in steps
|
||||||
|
call CalcDifference
|
||||||
|
ld e, a
|
||||||
|
and a
|
||||||
|
jr nz, .asm_f8ec
|
||||||
|
ld a, [hFindPathFlags]
|
||||||
|
set 1, a ; current end of path matches the player's X coordinate
|
||||||
|
ld [hFindPathFlags], a
|
||||||
|
.asm_f8ec
|
||||||
|
ld a, [hFindPathFlags]
|
||||||
|
cp $3 ; has the end of the path reached the player's position?
|
||||||
|
jr z, .done
|
||||||
|
; Compare whether the X distance between the player and the current of the path
|
||||||
|
; is greater or if the Y distance is. Then, try to reduce whichever is greater.
|
||||||
|
ld a, e
|
||||||
|
cp d
|
||||||
|
jr c, .yDistanceGreater
|
||||||
|
; x distance is greater
|
||||||
|
ld a, [hNPCPlayerRelativePosFlags]
|
||||||
|
bit 1, a
|
||||||
|
jr nz, .playerIsLeftOfNPC
|
||||||
|
ld d, NPC_MOVEMENT_RIGHT
|
||||||
|
jr .next1
|
||||||
|
.playerIsLeftOfNPC
|
||||||
|
ld d, NPC_MOVEMENT_LEFT
|
||||||
|
.next1
|
||||||
|
ld a, [hFindPathXProgress]
|
||||||
|
add 1
|
||||||
|
ld [hFindPathXProgress], a
|
||||||
|
jr .storeDirection
|
||||||
|
.yDistanceGreater
|
||||||
|
ld a, [hNPCPlayerRelativePosFlags]
|
||||||
|
bit 0, a
|
||||||
|
jr nz, .playerIsAboveNPC
|
||||||
|
ld d, NPC_MOVEMENT_DOWN
|
||||||
|
jr .next2
|
||||||
|
.playerIsAboveNPC
|
||||||
|
ld d, NPC_MOVEMENT_UP
|
||||||
|
.next2
|
||||||
|
ld a, [hFindPathYProgress]
|
||||||
|
add 1
|
||||||
|
ld [hFindPathYProgress], a
|
||||||
|
.storeDirection
|
||||||
|
ld a, d
|
||||||
|
ld [hli], a
|
||||||
|
ld a, [hFindPathNumSteps]
|
||||||
|
inc a
|
||||||
|
ld [hFindPathNumSteps], a
|
||||||
|
jp .loop
|
||||||
|
.done
|
||||||
|
ld [hl], $ff
|
||||||
|
ret
|
||||||
|
|
||||||
|
CalcPositionOfPlayerRelativeToNPC:
|
||||||
|
xor a
|
||||||
|
ld [hNPCPlayerRelativePosFlags], a
|
||||||
|
ld a, [wSpriteStateData1 + 4] ; player's sprite screen Y position in pixels
|
||||||
|
ld d, a
|
||||||
|
ld a, [wSpriteStateData1 + 6] ; player's sprite screen X position in pixels
|
||||||
|
ld e, a
|
||||||
|
ld hl, wSpriteStateData1
|
||||||
|
ld a, [hNPCSpriteOffset]
|
||||||
|
add l
|
||||||
|
add $4
|
||||||
|
ld l, a
|
||||||
|
jr nc, .noCarry
|
||||||
|
inc h
|
||||||
|
.noCarry
|
||||||
|
ld a, d
|
||||||
|
ld b, a
|
||||||
|
ld a, [hli] ; NPC sprite screen Y position in pixels
|
||||||
|
call CalcDifference
|
||||||
|
jr nc, .NPCSouthOfOrAlignedWithPlayer
|
||||||
|
.NPCNorthOfPlayer
|
||||||
|
push hl
|
||||||
|
ld hl, hNPCPlayerRelativePosFlags
|
||||||
|
bit 0, [hl]
|
||||||
|
set 0, [hl]
|
||||||
|
pop hl
|
||||||
|
jr .divideYDistance
|
||||||
|
.NPCSouthOfOrAlignedWithPlayer
|
||||||
|
push hl
|
||||||
|
ld hl, hNPCPlayerRelativePosFlags
|
||||||
|
bit 0, [hl]
|
||||||
|
res 0, [hl]
|
||||||
|
pop hl
|
||||||
|
.divideYDistance
|
||||||
|
push hl
|
||||||
|
ld hl, hDividend2
|
||||||
|
ld [hli], a
|
||||||
|
ld a, 16
|
||||||
|
ld [hli], a
|
||||||
|
call DivideBytes ; divide Y absolute distance by 16
|
||||||
|
ld a, [hl] ; quotient
|
||||||
|
ld [hNPCPlayerYDistance], a
|
||||||
|
pop hl
|
||||||
|
inc hl
|
||||||
|
ld b, e
|
||||||
|
ld a, [hl] ; NPC sprite screen X position in pixels
|
||||||
|
call CalcDifference
|
||||||
|
jr nc, .NPCEastOfOrAlignedWithPlayer
|
||||||
|
.NPCWestOfPlayer
|
||||||
|
push hl
|
||||||
|
ld hl, hNPCPlayerRelativePosFlags
|
||||||
|
bit 1, [hl]
|
||||||
|
set 1, [hl]
|
||||||
|
pop hl
|
||||||
|
jr .divideXDistance
|
||||||
|
.NPCEastOfOrAlignedWithPlayer
|
||||||
|
push hl
|
||||||
|
ld hl, hNPCPlayerRelativePosFlags
|
||||||
|
bit 1, [hl]
|
||||||
|
res 1, [hl]
|
||||||
|
pop hl
|
||||||
|
.divideXDistance
|
||||||
|
ld [hDividend2], a
|
||||||
|
ld a, 16
|
||||||
|
ld [hDivisor2], a
|
||||||
|
call DivideBytes ; divide X absolute distance by 16
|
||||||
|
ld a, [hQuotient2]
|
||||||
|
ld [hNPCPlayerXDistance], a
|
||||||
|
ld a, [hNPCPlayerRelativePosPerspective]
|
||||||
|
and a
|
||||||
|
ret z
|
||||||
|
ld a, [hNPCPlayerRelativePosFlags]
|
||||||
|
cpl
|
||||||
|
and $3
|
||||||
|
ld [hNPCPlayerRelativePosFlags], a
|
||||||
|
ret
|
||||||
|
|
||||||
|
ConvertNPCMovementDirectionsToJoypadMasks:
|
||||||
|
ld a, [hNPCMovementDirections2Index]
|
||||||
|
ld [wNPCMovementDirections2Index], a
|
||||||
|
dec a
|
||||||
|
ld de, wSimulatedJoypadStatesEnd
|
||||||
|
ld hl, wNPCMovementDirections2
|
||||||
|
add l
|
||||||
|
ld l, a
|
||||||
|
jr nc, .loop
|
||||||
|
inc h
|
||||||
|
.loop
|
||||||
|
ld a, [hld]
|
||||||
|
call ConvertNPCMovementDirectionToJoypadMask
|
||||||
|
ld [de], a
|
||||||
|
inc de
|
||||||
|
ld a, [hNPCMovementDirections2Index]
|
||||||
|
dec a
|
||||||
|
ld [hNPCMovementDirections2Index], a
|
||||||
|
jr nz, .loop
|
||||||
|
ret
|
||||||
|
|
||||||
|
ConvertNPCMovementDirectionToJoypadMask:
|
||||||
|
push hl
|
||||||
|
ld b, a
|
||||||
|
ld hl, NPCMovementDirectionsToJoypadMasksTable
|
||||||
|
.loop
|
||||||
|
ld a, [hli]
|
||||||
|
cp $ff
|
||||||
|
jr z, .done
|
||||||
|
cp b
|
||||||
|
jr z, .loadJoypadMask
|
||||||
|
inc hl
|
||||||
|
jr .loop
|
||||||
|
.loadJoypadMask
|
||||||
|
ld a, [hl]
|
||||||
|
.done
|
||||||
|
pop hl
|
||||||
|
ret
|
||||||
|
|
||||||
|
NPCMovementDirectionsToJoypadMasksTable:
|
||||||
|
db NPC_MOVEMENT_UP, D_UP
|
||||||
|
db NPC_MOVEMENT_DOWN, D_DOWN
|
||||||
|
db NPC_MOVEMENT_LEFT, D_LEFT
|
||||||
|
db NPC_MOVEMENT_RIGHT, D_RIGHT
|
||||||
|
db $ff
|
||||||
|
|
||||||
|
; unreferenced
|
||||||
|
ret
|
|
@ -8,7 +8,7 @@ EnterMap::
|
||||||
ld a, $ff
|
ld a, $ff
|
||||||
ld [wJoyIgnore], a
|
ld [wJoyIgnore], a
|
||||||
call LoadMapData
|
call LoadMapData
|
||||||
callba ClearVariablesAfterLoadingMapData
|
callba ClearVariablesOnEnterMap
|
||||||
ld hl, wd72c
|
ld hl, wd72c
|
||||||
bit 0, [hl] ; has the player already made 3 steps since the last battle?
|
bit 0, [hl] ; has the player already made 3 steps since the last battle?
|
||||||
jr z, .skipGivingThreeStepsOfNoRandomBattles
|
jr z, .skipGivingThreeStepsOfNoRandomBattles
|
||||||
|
|
Loading…
Reference in a new issue