More movement stuff

This commit is contained in:
PikalaxALT 2015-12-29 13:15:58 -05:00
parent a2a2668233
commit 9bbb65166e
19 changed files with 1510 additions and 1742 deletions

View File

@ -5508,7 +5508,7 @@ EnemyMonEntrance: ; 3e3ff
; 3e40b ; 3e40b
BattleMonEntrance: ; 3e40b BattleMonEntrance: ; 3e40b
call BattleMonNickComma_TextBox call WithdrawPkmnText
ld c, 50 ld c, 50
call DelayFrames call DelayFrames
@ -8103,8 +8103,6 @@ JumpText_GoForItPkmn: ; 3f2df
JumpText_YourFoesWeakGetmPkmn: ; 3f2e6 JumpText_YourFoesWeakGetmPkmn: ; 3f2e6
text_jump Text_YourFoesWeakGetmPkmn text_jump Text_YourFoesWeakGetmPkmn
start_asm start_asm
; 3f2eb
Function_TextJump_BattleMonNick01: ; 3f2eb Function_TextJump_BattleMonNick01: ; 3f2eb
ld hl, TextJump_BattleMonNick01 ld hl, TextJump_BattleMonNick01
ret ret
@ -8115,18 +8113,13 @@ TextJump_BattleMonNick01: ; 3f2ef
db "@" db "@"
; 3f2f4 ; 3f2f4
WithdrawPkmnText: ; 3f2f4
BattleMonNickComma_TextBox: ; 3f2f4 ld hl, .WithdrawPkmnText
ld hl, TextJump_BattleMonNickComma
jp BattleTextBox jp BattleTextBox
; 3f2fa
TextJump_BattleMonNickComma: ; 3f2fa .WithdrawPkmnText
text_jump Text_BattleMonNickComma text_jump Text_BattleMonNickComma
start_asm start_asm
; 3f2ff
WithdrawPkmnText: ; 3f2ff
; Print text to withdraw Pkmn ; Print text to withdraw Pkmn
; depending on HP the message is different ; depending on HP the message is different
push de push de

View File

@ -5949,7 +5949,6 @@ BattleCommand_StatUpMessage: ; 363b8
.stat .stat
text_jump UnknownText_0x1c0cc6 text_jump UnknownText_0x1c0cc6
start_asm start_asm
ld hl, .up ld hl, .up
ld a, [LoweredStat] ld a, [LoweredStat]
and $f0 and $f0
@ -5983,7 +5982,6 @@ BattleCommand_StatDownMessage: ; 363e9
.stat .stat
text_jump UnknownText_0x1c0ceb text_jump UnknownText_0x1c0ceb
start_asm start_asm
ld hl, .fell ld hl, .fell
ld a, [LoweredStat] ld a, [LoweredStat]
and $f0 and $f0
@ -7345,7 +7343,6 @@ BattleCommand_Charge: ; 36b4d
.UsedText .UsedText
text_jump UnknownText_0x1c0d0e ; "[USER]" text_jump UnknownText_0x1c0d0e ; "[USER]"
start_asm start_asm
ld a, BATTLE_VARS_MOVE_ANIM ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar call GetBattleVar
cp RAZOR_WIND cp RAZOR_WIND

View File

@ -11,7 +11,6 @@ UsedMoveText: ; 105db9
text_jump _ActorNameText text_jump _ActorNameText
start_asm start_asm
ld a, [hBattleTurn] ld a, [hBattleTurn]
and a and a
jr nz, .start jr nz, .start
@ -67,30 +66,26 @@ UsedMoveText: ; 105db9
UsedMove1Text: ; 105e04 UsedMove1Text: ; 105e04
text_jump _UsedMove1Text text_jump _UsedMove1Text
start_asm start_asm
jr Function105e10 jr UsedMoveText_CheckObedience
; 105e0b ; 105e0b
UsedMove2Text: ; 105e0b UsedMove2Text: ; 105e0b
text_jump _UsedMove2Text text_jump _UsedMove2Text
start_asm start_asm
; 105e10 UsedMoveText_CheckObedience: ; 105e10
Function105e10: ; 105e10
; check obedience ; check obedience
ld a, [AlreadyDisobeyed] ld a, [AlreadyDisobeyed]
and a and a
jr z, GetMoveNameText jr z, .GetMoveNameText
; print "instead," ; print "instead,"
ld hl, UsedInsteadText ld hl, .UsedInsteadText
ret ret
; 105e1a ; 105e1a
UsedInsteadText: ; 105e1a .UsedInsteadText
text_jump _UsedInsteadText text_jump _UsedInsteadText
start_asm start_asm
; 105e1f .GetMoveNameText
GetMoveNameText: ; 105e1f
ld hl, MoveNameText ld hl, MoveNameText
ret ret
; 105e23 ; 105e23
@ -98,9 +93,6 @@ GetMoveNameText: ; 105e1f
MoveNameText: ; 105e23 MoveNameText: ; 105e23
text_jump _MoveNameText text_jump _MoveNameText
start_asm start_asm
; 105e28
GetUsedMoveTextEnder: ; 105e28
; get start address ; get start address
ld hl, .endusedmovetexts ld hl, .endusedmovetexts

44
data/map_objects.asm Executable file
View File

@ -0,0 +1,44 @@
sprite_movement_data: macro
db \1, \2, \3, \4, \5
dn \6, 0
endm
; function, facing, action, flags1, flags2, palette flags
sprite_movement_data SPRITEMOVEFN_00, DOWN, PERSON_ACTION_STAND, $02, $00, %0000 ; 00
sprite_movement_data SPRITEMOVEFN_STANDING, DOWN, PERSON_ACTION_STAND, $0c, $00, %0000 ; 01
sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_XY, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 02
sprite_movement_data SPRITEMOVEFN_SLOW_RANDOM_SPIN, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 03
sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_Y, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 04
sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_X, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 05
sprite_movement_data SPRITEMOVEFN_STANDING, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 06
sprite_movement_data SPRITEMOVEFN_STANDING, UP, PERSON_ACTION_STAND, $00, $00, %0000 ; 07
sprite_movement_data SPRITEMOVEFN_STANDING, LEFT, PERSON_ACTION_STAND, $00, $00, %0000 ; 08
sprite_movement_data SPRITEMOVEFN_STANDING, RIGHT, PERSON_ACTION_STAND, $00, $00, %0000 ; 09
sprite_movement_data SPRITEMOVEFN_FAST_RANDOM_SPIN, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 0a
sprite_movement_data SPRITEMOVEFN_OBEY_DPAD, DOWN, PERSON_ACTION_STAND, $02, $00, %0000 ; 0b
sprite_movement_data SPRITEMOVEFN_08, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 0c
sprite_movement_data SPRITEMOVEFN_09, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 0d
sprite_movement_data SPRITEMOVEFN_0A, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 0e
sprite_movement_data SPRITEMOVEFN_0B, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 0f
sprite_movement_data SPRITEMOVEFN_0C, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 10
sprite_movement_data SPRITEMOVEFN_0D, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 11
sprite_movement_data SPRITEMOVEFN_0E, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 12
sprite_movement_data SPRITEMOVEFN_FOLLOW, DOWN, PERSON_ACTION_STAND, $02, $00, %0000 ; 13
sprite_movement_data SPRITEMOVEFN_SCRIPTED, DOWN, PERSON_ACTION_STAND, $02, $00, %0000 ; 14
sprite_movement_data SPRITEMOVEFN_BIG_SNORLAX, DOWN, PERSON_ACTION_09, $2e, $01, %1100 ; 15
sprite_movement_data SPRITEMOVEFN_BOUNCE, DOWN, PERSON_ACTION_0A, $2e, $00, %0000 ; 16
sprite_movement_data SPRITEMOVEFN_STANDING, DOWN, PERSON_ACTION_STAND, $0c, $00, %0000 ; 17
sprite_movement_data SPRITEMOVEFN_STANDING, DOWN, PERSON_ACTION_STAND, $2e, $10, %0000 ; 18
sprite_movement_data SPRITEMOVEFN_STRENGTH, DOWN, PERSON_ACTION_STAND, $2e, $00, %0100 ; 19
sprite_movement_data SPRITEMOVEFN_FOLLOWNOTEXACT, DOWN, PERSON_ACTION_STAND, $02, $00, %0000 ; 1a
sprite_movement_data SPRITEMOVEFN_SHADOW, DOWN, PERSON_ACTION_00, $8e, $01, %0000 ; 1b
sprite_movement_data SPRITEMOVEFN_EMOTE, DOWN, PERSON_ACTION_EMOTE, $8e, $02, %0000 ; 1c
sprite_movement_data SPRITEMOVEFN_SCREENSHAKE, DOWN, PERSON_ACTION_00, $82, $00, %0000 ; 1d
sprite_movement_data SPRITEMOVEFN_SPIN_COUNTERCLOCKWISE, LEFT, PERSON_ACTION_STAND, $00, $00, %0000 ; 1e
sprite_movement_data SPRITEMOVEFN_SPIN_CLOCKWISE, RIGHT, PERSON_ACTION_STAND, $00, $00, %0000 ; 1f
sprite_movement_data SPRITEMOVEFN_STRENGTH, DOWN, PERSON_ACTION_0C, $2e, $01, %1100 ; 20
sprite_movement_data SPRITEMOVEFN_STRENGTH, DOWN, PERSON_ACTION_0D, $2e, $01, %1100 ; 21
sprite_movement_data SPRITEMOVEFN_BOULDERDUST, DOWN, PERSON_ACTION_0E, $8e, $01, %0000 ; 22
sprite_movement_data SPRITEMOVEFN_GRASS, DOWN, PERSON_ACTION_0F, $8e, $02, %0000 ; 23
sprite_movement_data SPRITEMOVEFN_RANDOM_WALK_XY, DOWN, PERSON_ACTION_STAND, $00, $00, %0010 ; 24
sprite_movement_data SPRITEMOVEFN_00, DOWN, PERSON_ACTION_STAND, $00, $00, %0000 ; 25

View File

@ -8,7 +8,7 @@ CheckBreedmonCompatibility: ; 16e1d
ld [TempMonDVs], a ld [TempMonDVs], a
ld a, [wBreedMon1DVs + 1] ld a, [wBreedMon1DVs + 1]
ld [TempMonDVs + 1], a ld [TempMonDVs + 1], a
ld a, $3 ld a, BREEDMON
ld [MonType], a ld [MonType], a
predef GetGender predef GetGender
jr c, .genderless jr c, .genderless

View File

@ -51,7 +51,7 @@ LearnMove: ; 6508
.not_disabled .not_disabled
call GetMoveName call GetMoveName
ld hl, UnknownText_0x6684 ; 1, 2 and… ld hl, Text_1_2_and_Poof ; 1, 2 and…
call PrintText call PrintText
pop de pop de
pop hl pop hl
@ -102,18 +102,18 @@ LearnMove: ; 6508
jp .learned jp .learned
.cancel .cancel
ld hl, UnknownText_0x6675 ; Stop learning <MOVE>? ld hl, Text_StopLearning ; Stop learning <MOVE>?
call PrintText call PrintText
call YesNoBox call YesNoBox
jp c, .loop jp c, .loop
ld hl, UnknownText_0x667a ; <MON> did not learn <MOVE>. ld hl, Text_DidNotLearn ; <MON> did not learn <MOVE>.
call PrintText call PrintText
ld b, 0 ld b, 0
ret ret
.learned .learned
ld hl, UnknownText_0x666b ; <MON> learned <MOVE>! ld hl, Text_LearnedMove ; <MON> learned <MOVE>!
call PrintText call PrintText
ld b, 1 ld b, 1
ret ret
@ -121,7 +121,7 @@ LearnMove: ; 6508
ForgetMove: ; 65d3 ForgetMove: ; 65d3
push hl push hl
ld hl, UnknownText_0x667f ld hl, Text_TryingToLearn
call PrintText call PrintText
call YesNoBox call YesNoBox
pop hl pop hl
@ -135,7 +135,7 @@ ForgetMove: ; 65d3
pop hl pop hl
.loop .loop
push hl push hl
ld hl, UnknownText_0x6670 ld hl, Text_ForgetWhich
call PrintText call PrintText
hlcoord 5, 2 hlcoord 5, 2
ld b, NUM_MOVES * 2 ld b, NUM_MOVES * 2
@ -192,7 +192,7 @@ ForgetMove: ; 65d3
ret ret
.hmmove .hmmove
ld hl, UnknownText_0x669a ld hl, Text_CantForgetHM
call PrintText call PrintText
pop hl pop hl
jr .loop jr .loop
@ -202,55 +202,54 @@ ForgetMove: ; 65d3
ret ret
; 666b ; 666b
UnknownText_0x666b: ; 666b Text_LearnedMove: ; 666b
; <MON> learned <MOVE>! ; <MON> learned <MOVE>!
text_jump UnknownText_0x1c5660 text_jump UnknownText_0x1c5660
db "@" db "@"
; 6670 ; 6670
UnknownText_0x6670: ; 6670 Text_ForgetWhich: ; 6670
; Which move should be forgotten? ; Which move should be forgotten?
text_jump UnknownText_0x1c5678 text_jump UnknownText_0x1c5678
db "@" db "@"
; 6675 ; 6675
UnknownText_0x6675: ; 6675 Text_StopLearning: ; 6675
; Stop learning <MOVE>? ; Stop learning <MOVE>?
text_jump UnknownText_0x1c5699 text_jump UnknownText_0x1c5699
db "@" db "@"
; 667a ; 667a
UnknownText_0x667a: ; 667a Text_DidNotLearn: ; 667a
; <MON> did not learn <MOVE>. ; <MON> did not learn <MOVE>.
text_jump UnknownText_0x1c56af text_jump UnknownText_0x1c56af
db "@" db "@"
; 667f ; 667f
UnknownText_0x667f: ; 667f Text_TryingToLearn: ; 667f
; <MON> is trying to learn <MOVE>. But <MON> can't learn more than ; <MON> is trying to learn <MOVE>. But <MON> can't learn more than
; four moves. Delete an older move to make room for <MOVE>? ; four moves. Delete an older move to make room for <MOVE>?
text_jump UnknownText_0x1c56c9 text_jump UnknownText_0x1c56c9
db "@" db "@"
; 6684 ; 6684
UnknownText_0x6684: ; 6684 Text_1_2_and_Poof: ; 6684
text_jump UnknownText_0x1c5740 ; 1, 2 and… text_jump UnknownText_0x1c5740 ; 1, 2 and…
start_asm start_asm
push de push de
ld de, SFX_SWITCH_POKEMON ld de, SFX_SWITCH_POKEMON
call PlaySFX call PlaySFX
pop de pop de
ld hl, UnknownText_0x6695 ld hl, .PoofForgot
ret ret
; 6695
UnknownText_0x6695: ; 6695 .PoofForgot
; Poof! <MON> forgot <MOVE>. And… ; Poof! <MON> forgot <MOVE>. And…
text_jump UnknownText_0x1c574e text_jump UnknownText_0x1c574e
db "@" db "@"
; 669a ; 669a
UnknownText_0x669a: ; 669a Text_CantForgetHM: ; 669a
; HM moves can't be forgotten now. ; HM moves can't be forgotten now.
text_jump UnknownText_0x1c5772 text_jump UnknownText_0x1c5772
db "@" db "@"

View File

@ -208,12 +208,12 @@ GivePokeItem:: ; 446cc
push bc push bc
push af push af
ld hl, sPartyMail ld hl, sPartyMail
ld bc, $2f ld bc, MAIL_STRUCT_LENGTH
call AddNTimes call AddNTimes
ld d, h ld d, h
ld e, l ld e, l
ld hl, wd002 ld hl, wd002
ld bc, $21 ld bc, MAIL_MSG_LENGTH + 1
ld a, BANK(sPartyMail) ld a, BANK(sPartyMail)
call GetSRAMBank call GetSRAMBank
call CopyBytes call CopyBytes
@ -222,7 +222,7 @@ GivePokeItem:: ; 446cc
ld hl, PartyMonOT ld hl, PartyMonOT
ld bc, NAME_LENGTH ld bc, NAME_LENGTH
call AddNTimes call AddNTimes
ld bc, $a ld bc, NAME_LENGTH - 1
call CopyBytes call CopyBytes
pop af pop af
ld hl, PartyMon1ID ld hl, PartyMon1ID

323
engine/map_object_action.asm Executable file
View File

@ -0,0 +1,323 @@
ld hl, OBJECT_ACTION
add hl, bc
ld a, [hl]
ld l, a
ld h, 0
add hl, hl
add hl, hl
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
call _hl_
ret
; 445f
Pointers445f: ; 445f
dw SetFacingStanding, SetFacingStanding ; 00
dw Function44b5, SetFacingCurrent ; 01 standing?
dw Function44c1, SetFacingCurrent ; 02 walking?
dw Function4508, SetFacingCurrent ; 03 bumping?
dw Function4529, SetFacingCurrent ; 04
dw Function4539, SetFacingStanding ; 05
dw Function456e, Function456e ; 06
dw Function457b, SetFacingStanding ; 07
dw Function4582, Function4582 ; 08
dw Function4589, Function4589 ; 09
dw Function4590, Function45a4 ; 0a
dw Function45ab, SetFacingCurrent ; 0c
dw Function45be, Function45be ; 0b
dw Function45c5, Function45c5 ; 0d
dw Function45da, SetFacingStanding ; 0e
dw Function45ed, SetFacingStanding ; 0f
dw Function44e4, SetFacingCurrent ; 10
; 44a3
SetFacingStanding: ; 44a3
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], STANDING
ret
; 44aa
SetFacingCurrent: ; 44aa
call GetSpriteDirection
or 0 ; useless
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], a
ret
; 44b5
Function44b5: ; 44b5
ld hl, OBJECT_FACING_STEP
add hl, bc
ld a, [hl]
and 1
jr nz, Function44c1
jp SetFacingCurrent
; 44c1
Function44c1: ; 44c1
ld hl, OBJECT_FLAGS1
add hl, bc
bit SLIDING, [hl]
jp nz, SetFacingCurrent
ld hl, OBJECT_STEP_FRAME
add hl, bc
ld a, [hl]
inc a
and %00001111
ld [hl], a
rrca
rrca
and %00000011
ld d, a
call GetSpriteDirection
or 0 ; useless
or d
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], a
ret
; 44e4
Function44e4: ; 44e4
ld hl, OBJECT_FLAGS1
add hl, bc
bit SLIDING, [hl]
jp nz, SetFacingCurrent
ld hl, OBJECT_STEP_FRAME
add hl, bc
ld a, [hl]
add 2
and %00001111
ld [hl], a
rrca
rrca
and %00000011
ld d, a
call GetSpriteDirection
or 0 ; useless
or d
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], a
ret
; 4508
Function4508: ; 4508
ld hl, OBJECT_FLAGS1
add hl, bc
bit SLIDING, [hl]
jp nz, SetFacingCurrent
ld hl, OBJECT_STEP_FRAME
add hl, bc
inc [hl]
ld a, [hl]
rrca
rrca
rrca
and %00000011
ld d, a
call GetSpriteDirection
or 0 ; useless
or d
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], a
ret
; 4529
Function4529: ; 4529
call Function453f
ld hl, OBJECT_FACING
add hl, bc
ld a, [hl]
or 0 ; useless
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], a
ret
; 4539
Function4539: ; 4539
call Function453f
jp SetFacingStanding
; 453f
Function453f: ; 453f
ld hl, OBJECT_STEP_FRAME
add hl, bc
ld a, [hl]
and %11110000
ld e, a
ld a, [hl]
inc a
and %00001111
ld d, a
cp 4
jr c, .ok
ld d, 0
ld a, e
add $10
and %00110000
ld e, a
.ok
ld a, d
or e
ld [hl], a
swap e
ld d, 0
ld hl, .Directions
add hl, de
ld a, [hl]
ld hl, OBJECT_FACING
add hl, bc
ld [hl], a
ret
; 456a
.Directions ; 456a
db OW_DOWN, OW_RIGHT, OW_UP, OW_LEFT
; 456e
Function456e: ; 456e
call GetSpriteDirection
rrca
rrca
add $10
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], a
ret
; 457b
Function457b: ; 457b
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], FACING_15
ret
; 4582
Function4582: ; 4582 emote
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], FACING_EMOTE
ret
; 4589
Function4589: ; 4589
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], FACING_17
ret
; 4590
Function4590: ; 4590
ld hl, OBJECT_STEP_FRAME
add hl, bc
ld a, [hl]
inc a
and %00001111
ld [hl], a
and %00001000
jr z, Function45a4
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], FACING_04
ret
; 45a4
Function45a4: ; 45a4
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], 0
ret
; 45ab
Function45ab: ; 45ab
ld hl, OBJECT_STEP_FRAME
add hl, bc
ld a, [hl]
inc a
ld [hl], a
and %00001100
rrca
rrca
add $18
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], a
ret
; 45be
Function45be: ; 45be
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], FACING_16
ret
; 45c5
Function45c5: ; 45c5
ld a, [VariableSprites + SPRITE_BIG_DOLL - SPRITE_VARS]
ld d, FACING_17
cp SPRITE_BIG_SNORLAX
jr z, .ok
cp SPRITE_BIG_LAPRAS
jr z, .ok
ld d, FACING_16
.ok
ld hl, OBJECT_FACING_STEP
add hl, bc
ld [hl], d
ret
; 45da
Function45da: ; 45da
ld hl, OBJECT_STEP_FRAME
add hl, bc
inc [hl]
ld a, [hl]
ld hl, OBJECT_FACING_STEP
add hl, bc
and 2
ld a, FACING_1C
jr z, .ok
inc a ; FACING_1D
.ok
ld [hl], a
ret
; 45ed
Function45ed: ; 45ed
ld hl, OBJECT_STEP_FRAME
add hl, bc
inc [hl]
ld a, [hl]
ld hl, OBJECT_FACING_STEP
add hl, bc
and 4
ld a, FACING_1E
jr z, .ok
inc a ; FACING_1F
.ok
ld [hl], a
ret
; 4600

File diff suppressed because it is too large Load Diff

View File

@ -3,10 +3,10 @@ MovementPointers: ; 5075
dw Movement_turn_head_up ; 01 dw Movement_turn_head_up ; 01
dw Movement_turn_head_left ; 02 dw Movement_turn_head_left ; 02
dw Movement_turn_head_right ; 03 dw Movement_turn_head_right ; 03
dw Movement_half_step_down ; 04 dw Movement_turn_step_down ; 04
dw Movement_half_step_up ; 05 dw Movement_turn_step_up ; 05
dw Movement_half_step_left ; 06 dw Movement_turn_step_left ; 06
dw Movement_half_step_right ; 07 dw Movement_turn_step_right ; 07
dw Movement_slow_step_down ; 08 dw Movement_slow_step_down ; 08
dw Movement_slow_step_up ; 09 dw Movement_slow_step_up ; 09
dw Movement_slow_step_left ; 0a dw Movement_slow_step_left ; 0a
@ -130,7 +130,7 @@ Movement_step_dig: ; 5145
ld hl, OBJECT_ACTION ld hl, OBJECT_ACTION
add hl, bc add hl, bc
ld [hl], PERSON_ACTION_SPIN ld [hl], PERSON_ACTION_SPIN
call GetMovementByte call JumpMovementPointer
ld hl, OBJECT_STEP_DURATION ld hl, OBJECT_STEP_DURATION
add hl, bc add hl, bc
ld [hl], a ld [hl], a
@ -150,7 +150,7 @@ Movement_return_dig: ; 516a
ld hl, OBJECT_STEP_FRAME ld hl, OBJECT_STEP_FRAME
add hl, bc add hl, bc
ld [hl], a ld [hl], a
call GetMovementByte call JumpMovementPointer
ld hl, OBJECT_STEP_DURATION ld hl, OBJECT_STEP_DURATION
add hl, bc add hl, bc
ld [hl], a ld [hl], a
@ -174,7 +174,7 @@ Movement_fish_got_bite: ; 5189
; 5196 ; 5196
Movement_rock_smash: ; 5196 Movement_rock_smash: ; 5196
call GetMovementByte call JumpMovementPointer
ld hl, OBJECT_STEP_DURATION ld hl, OBJECT_STEP_DURATION
add hl, bc add hl, bc
ld [hl], a ld [hl], a
@ -233,7 +233,7 @@ Movement_48: ; 51db
add hl, bc add hl, bc
ld [hl], $0 ld [hl], $0
call GetMovementByte call JumpMovementPointer
ld hl, OBJECT_STEP_DURATION ld hl, OBJECT_STEP_DURATION
add hl, bc add hl, bc
ld [hl], a ld [hl], a
@ -311,7 +311,7 @@ Movement_step_sleep: ; 5242
; parameters: ; parameters:
; duration (DecimalParam) ; duration (DecimalParam)
call GetMovementByte call JumpMovementPointer
jr Movement_step_sleep_common jr Movement_step_sleep_common
Movement_step_sleep_common: ; 5247 Movement_step_sleep_common: ; 5247
@ -429,7 +429,7 @@ Movement_step_shake: ; 52d5
; parameters: ; parameters:
; displacement (DecimalParam) ; displacement (DecimalParam)
call GetMovementByte call JumpMovementPointer
call ShakeScreen call ShakeScreen
jp ContinueReadingMovement jp ContinueReadingMovement
; 52de ; 52de
@ -709,23 +709,23 @@ Movement_fast_jump_step_right: ; 53eb
; 53f0 ; 53f0
Movement_half_step_down: ; 53f0 Movement_turn_step_down: ; 53f0
ld a, OW_DOWN ld a, OW_DOWN
jr HalfStep jr TurnStep
Movement_half_step_up: ; 53f4 Movement_turn_step_up: ; 53f4
ld a, OW_UP ld a, OW_UP
jr HalfStep jr TurnStep
Movement_half_step_left: ; 53f8 Movement_turn_step_left: ; 53f8
ld a, OW_LEFT ld a, OW_LEFT
jr HalfStep jr TurnStep
Movement_half_step_right: ; 53fc Movement_turn_step_right: ; 53fc
ld a, OW_RIGHT ld a, OW_RIGHT
jr HalfStep jr TurnStep
HalfStep: ; 5400 TurnStep: ; 5400
ld hl, OBJECT_29 ; new facing ld hl, OBJECT_29 ; new facing
add hl, bc add hl, bc
ld [hl], a ld [hl], a

View File

@ -511,7 +511,6 @@ TradedForText: ; 0xfcf80
; traded givemon for getmon ; traded givemon for getmon
text_jump UnknownText_0x1bd429 text_jump UnknownText_0x1bd429
start_asm start_asm
ld de, MUSIC_NONE ld de, MUSIC_NONE
call PlayMusic call PlayMusic
call DelayFrame call DelayFrame

846
engine/player_movement.asm Executable file
View File

@ -0,0 +1,846 @@
DoPlayerMovement:: ; 80000
call .GetDPad
ld a, movement_step_sleep_1
ld [MovementAnimation], a
xor a
ld [wd041], a
call .TranslateIntoMovement
ld c, a
ld a, [MovementAnimation]
ld [wPlayerNextMovement], a
ret
.GetDPad
ld a, [hJoyDown]
ld [CurInput], a
; Standing downhill instead moves down.
ld hl, BikeFlags
bit 2, [hl] ; downhill
ret z
ld c, a
and D_PAD
ret nz
ld a, c
or D_DOWN
ld [CurInput], a
ret
; 8002d
.TranslateIntoMovement
ld a, [PlayerState]
cp PLAYER_NORMAL
jr z, .Normal
cp PLAYER_SURF
jr z, .Surf
cp PLAYER_SURF_PIKA
jr z, .Surf
cp PLAYER_BIKE
jr z, .Normal
cp PLAYER_SLIP
jr z, .Ice
.Normal
call .CheckForced
call .GetAction
call .CheckTile
ret c
call .CheckTurning
ret c
call .TryStep
ret c
call .TryJump
ret c
call .CheckWarp
ret c
jr .NotMoving
.Surf
call .CheckForced
call .GetAction
call .CheckTile
ret c
call .CheckTurning
ret c
call .TrySurf
ret c
jr .NotMoving
.Ice
call .CheckForced
call .GetAction
call .CheckTile
ret c
call .CheckTurning
ret c
call .TryStep
ret c
call .TryJump
ret c
call .CheckWarp
ret c
ld a, [WalkingDirection]
cp STANDING
jr z, .HitWall
call .BumpSound
.HitWall
call .StandInPlace
xor a
ret
.NotMoving
ld a, [WalkingDirection]
cp STANDING
jr z, .Standing
; Walking into an edge warp won't bump.
ld a, [EngineBuffer4]
and a
jr nz, .CantMove
call .BumpSound
.CantMove
call ._WalkInPlace
xor a
ret
.Standing
call .StandInPlace
xor a
ret
; 800b7
.CheckTile: ; 800b7
; Tiles such as waterfalls and warps move the player
; in a given direction, overriding input.
ld a, [PlayerNextTile]
ld c, a
call CheckWhirlpoolTile
jr c, .asm_800c4
ld a, 3
scf
ret
.asm_800c4
and $f0
cp $30 ; moving water
jr z, .water
cp $40 ; moving land 1
jr z, .land1
cp $50 ; moving land 2
jr z, .land2
cp $70 ; warps
jr z, .warps
jr .asm_8013c
.water
ld a, c
and 3
ld c, a
ld b, 0
ld hl, .water_table
add hl, bc
ld a, [hl]
ld [WalkingDirection], a
jr .asm_8013e
.water_table
db RIGHT
db LEFT
db UP
db DOWN
.land1
ld a, c
and 7
ld c, a
ld b, 0
ld hl, .land1_table
add hl, bc
ld a, [hl]
cp STANDING
jr z, .asm_8013c
ld [WalkingDirection], a
jr .asm_8013e
.land1_table
db STANDING
db RIGHT
db LEFT
db UP
db DOWN
db STANDING
db STANDING
db STANDING
.land2
ld a, c
and 7
ld c, a
ld b, 0
ld hl, .land2_table
add hl, bc
ld a, [hl]
cp STANDING
jr z, .asm_8013c
ld [WalkingDirection], a
jr .asm_8013e
.land2_table
db RIGHT
db LEFT
db UP
db DOWN
db STANDING
db STANDING
db STANDING
db STANDING
.warps
ld a, c
cp $71 ; door
jr z, .down
cp $79
jr z, .down
cp $7a ; stairs
jr z, .down
cp $7b ; cave
jr nz, .asm_8013c
.down
ld a, DOWN
ld [WalkingDirection], a
jr .asm_8013e
.asm_8013c
xor a
ret
.asm_8013e
ld a, STEP_WALK
call .DoStep
ld a, 5
scf
ret
; 80147
.CheckTurning: ; 80147
; If the player is turning, change direction first. This also lets
; the player change facing without moving by tapping a direction.
ld a, [wd04e]
cp 0
jr nz, .asm_80169
ld a, [WalkingDirection]
cp STANDING
jr z, .asm_80169
ld e, a
ld a, [PlayerDirection]
rrca
rrca
and 3
cp e
jr z, .asm_80169
ld a, STEP_TURN
call .DoStep
ld a, 2
scf
ret
.asm_80169
xor a
ret
; 8016b
.TryStep: ; 8016b
; Surfing actually calls .TrySurf directly instead of passing through here.
ld a, [PlayerState]
cp PLAYER_SURF
jr z, .TrySurf
cp PLAYER_SURF_PIKA
jr z, .TrySurf
call .CheckLandPerms
jr c, .bump
call .CheckNPC
and a
jr z, .bump
cp 2
jr z, .bump
ld a, [PlayerNextTile]
call CheckIceTile
jr nc, .ice
; Downhill riding is slower when not moving down.
call .BikeCheck
jr nz, .walk
ld hl, BikeFlags
bit 2, [hl] ; downhill
jr z, .fast
ld a, [WalkingDirection]
cp DOWN
jr z, .fast
ld a, STEP_WALK
call .DoStep
scf
ret
.fast
ld a, STEP_BIKE
call .DoStep
scf
ret
.walk
ld a, STEP_WALK
call .DoStep
scf
ret
.ice
ld a, STEP_ICE
call .DoStep
scf
ret
; unused?
xor a
ret
.bump
xor a
ret
; 801c0
.TrySurf: ; 801c0
call .CheckSurfPerms
ld [wd040], a
jr c, .surf_bump
call .CheckNPC
ld [wd03f], a
and a
jr z, .surf_bump
cp 2
jr z, .surf_bump
ld a, [wd040]
and a
jr nz, .ExitWater
ld a, STEP_WALK
call .DoStep
scf
ret
.ExitWater
call .GetOutOfWater
call PlayMapMusic
ld a, STEP_WALK
call .DoStep
ld a, 6
scf
ret
.surf_bump
xor a
ret
; 801f3
.TryJump: ; 801f3
ld a, [PlayerNextTile]
ld e, a
and $f0
cp $a0 ; ledge
jr nz, .DontJump
ld a, e
and 7
ld e, a
ld d, 0
ld hl, .data_8021e
add hl, de
ld a, [FacingDirection]
and [hl]
jr z, .DontJump
ld de, SFX_JUMP_OVER_LEDGE
call PlaySFX
ld a, STEP_LEDGE
call .DoStep
ld a, 7
scf
ret
.DontJump
xor a
ret
.data_8021e
db FACE_RIGHT
db FACE_LEFT
db FACE_UP
db FACE_DOWN
db FACE_RIGHT | FACE_DOWN
db FACE_DOWN | FACE_LEFT
db FACE_UP | FACE_RIGHT
db FACE_UP | FACE_LEFT
; 80226
.CheckWarp: ; 80226
; Bug: Since no case is made for STANDING here, it will check
; [.edgewarps + $ff]. This resolves to $3e at $8035a.
; This causes wd041 to be nonzero when standing on tile $3e,
; making bumps silent.
ld a, [WalkingDirection]
ld e, a
ld d, 0
ld hl, .EdgeWarps
add hl, de
ld a, [PlayerNextTile]
cp [hl]
jr nz, .not_warp
ld a, 1
ld [wd041], a
ld a, [WalkingDirection]
cp STANDING
jr z, .not_warp
ld e, a
ld a, [PlayerDirection]
rrca
rrca
and 3
cp e
jr nz, .not_warp
call WarpCheck
jr nc, .not_warp
call .StandInPlace
scf
ld a, 1
ret
.not_warp
xor a
ret
.EdgeWarps
db $70, $78, $76, $7e
; 8025f
.DoStep: ; 8025f
ld e, a
ld d, 0
ld hl, .Steps
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [WalkingDirection]
ld e, a
cp STANDING
jp z, .StandInPlace
add hl, de
ld a, [hl]
ld [MovementAnimation], a
ld hl, .InPlace
add hl, de
ld a, [hl]
ld [wd04e], a
ld a, 4
ret
.Steps
dw .SlowStep
dw .NormalStep
dw .FastStep
dw .JumpStep
dw .SlideStep
dw .TurningStep
dw .BackJumpStep
dw .InPlace
.SlowStep
slow_step_down
slow_step_up
slow_step_left
slow_step_right
.NormalStep
step_down
step_up
step_left
step_right
.FastStep
big_step_down
big_step_up
big_step_left
big_step_right
.JumpStep
jump_step_down
jump_step_up
jump_step_left
jump_step_right
.SlideStep
fast_slide_step_down
fast_slide_step_up
fast_slide_step_left
fast_slide_step_right
.BackJumpStep
jump_step_up
jump_step_down
jump_step_right
jump_step_left
.TurningStep
turn_step_down
turn_step_up
turn_step_left
turn_step_right
.InPlace
db $80 + movement_turn_head_down
db $80 + movement_turn_head_up
db $80 + movement_turn_head_left
db $80 + movement_turn_head_right
; 802b3
.StandInPlace: ; 802b3
ld a, 0
ld [wd04e], a
ld a, movement_step_sleep_1
ld [MovementAnimation], a
xor a
ret
; 802bf
._WalkInPlace: ; 802bf
ld a, 0
ld [wd04e], a
ld a, movement_step_bump
ld [MovementAnimation], a
xor a
ret
; 802cb
.CheckForced: ; 802cb
; When sliding on ice, input is forced to remain in the same direction.
call CheckStandingOnIce
ret nc
ld a, [wd04e]
cp 0
ret z
and 3
ld e, a
ld d, 0
ld hl, .forced_dpad
add hl, de
ld a, [CurInput]
and BUTTONS
or [hl]
ld [CurInput], a
ret
.forced_dpad
db D_DOWN, D_UP, D_LEFT, D_RIGHT
; 802ec
.GetAction: ; 802ec
; Poll player input and update movement info.
ld hl, .table
ld de, .table2 - .table1
ld a, [CurInput]
bit D_DOWN_F, a
jr nz, .d_down
bit D_UP_F, a
jr nz, .d_up
bit D_LEFT_F, a
jr nz, .d_left
bit D_RIGHT_F, a
jr nz, .d_right
; Standing
jr .update
.d_down add hl, de
.d_up add hl, de
.d_left add hl, de
.d_right add hl, de
.update
ld a, [hli]
ld [WalkingDirection], a
ld a, [hli]
ld [FacingDirection], a
ld a, [hli]
ld [WalkingX], a
ld a, [hli]
ld [WalkingY], a
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [hl]
ld [WalkingTile], a
ret
.table
; struct:
; walk direction
; facing
; x movement
; y movement
; tile collision pointer
.table1
db STANDING, FACE_CURRENT, 0, 0
dw PlayerNextTile
.table2
db RIGHT, FACE_RIGHT, 1, 0
dw TileRight
db LEFT, FACE_LEFT, -1, 0
dw TileLeft
db UP, FACE_UP, 0, -1
dw TileUp
db DOWN, FACE_DOWN, 0, 1
dw TileDown
; 80341
.CheckNPC: ; 80341
; Returns 0 if there is an NPC in front that you can't move
; Returns 1 if there is no NPC in front
; Returns 2 if there is a movable NPC in front
ld a, 0
ld [hMapObjectIndexBuffer], a
; Load the next X coordinate into d
ld a, [PlayerNextMapX]
ld d, a
ld a, [WalkingX]
add d
ld d, a
; Load the next Y coordinate into e
ld a, [PlayerNextMapY]
ld e, a
ld a, [WalkingY]
add e
ld e, a
; Find an object struct with coordinates equal to d,e
ld bc, ObjectStructs ; redundant
callba IsNPCAtCoord
jr nc, .is_npc
call .CheckStrengthBoulder
jr c, .no_bump
xor a
ret
.is_npc
ld a, 1
ret
.no_bump
ld a, 2
ret
; 8036f
.CheckStrengthBoulder: ; 8036f
ld hl, BikeFlags
bit 0, [hl] ; using strength
jr z, .not_boulder
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
ld a, [hl]
cp STANDING
jr nz, .not_boulder
ld hl, OBJECT_PALETTE
add hl, bc
bit 6, [hl]
jr z, .not_boulder
ld hl, OBJECT_FLAGS2
add hl, bc
set 2, [hl]
ld a, [WalkingDirection]
ld d, a
ld hl, OBJECT_RANGE
add hl, bc
ld a, [hl]
and $fc
or d
ld [hl], a
scf
ret
.not_boulder
xor a
ret
; 8039e
.CheckLandPerms: ; 8039e
; Return 0 if walking onto land and tile permissions allow it.
; Otherwise, return carry.
ld a, [TilePermissions]
ld d, a
ld a, [FacingDirection]
and d
jr nz, .NotWalkable
ld a, [WalkingTile]
call .CheckWalkable
jr c, .NotWalkable
xor a
ret
.NotWalkable
scf
ret
; 803b4
.CheckSurfPerms: ; 803b4
; Return 0 if moving in water, or 1 if moving onto land.
; Otherwise, return carry.
ld a, [TilePermissions]
ld d, a
ld a, [FacingDirection]
and d
jr nz, .NotSurfable
ld a, [WalkingTile]
call .CheckSurfable
jr c, .NotSurfable
and a
ret
.NotSurfable
scf
ret
; 803ca
.BikeCheck: ; 803ca
ld a, [PlayerState]
cp PLAYER_BIKE
ret z
cp PLAYER_SLIP
ret
; 803d3
.CheckWalkable: ; 803d3
; Return 0 if tile a is land. Otherwise, return carry.
call GetTileCollision
and a ; land
ret z
scf
ret
; 803da
.CheckSurfable: ; 803da
; Return 0 if tile a is water, or 1 if land.
; Otherwise, return carry.
call GetTileCollision
cp 1
jr z, .Water
; Can walk back onto land from water.
and a
jr z, .Land
jr .Neither
.Water
xor a
ret
.Land
ld a, 1
and a
ret
.Neither
scf
ret
; 803ee
.BumpSound: ; 803ee
call CheckSFX
ret c
ld de, SFX_BUMP
call PlaySFX
ret
; 803f9
.GetOutOfWater: ; 803f9
push bc
ld a, PLAYER_NORMAL
ld [PlayerState], a
call ReplaceKrisSprite ; UpdateSprites
pop bc
ret
; 80404
CheckStandingOnIce:: ; 80404
ld a, [wd04e]
cp 0
jr z, .not_ice
cp $f0
jr z, .not_ice
ld a, [PlayerNextTile]
call CheckIceTile
jr nc, .yep
ld a, [PlayerState]
cp PLAYER_SLIP
jr nz, .not_ice
.yep
scf
ret
.not_ice
and a
ret
; 80422
Function80422:: ; 80422
ld hl, wPlayerNextMovement
ld a, movement_step_sleep_1
cp [hl]
ret z
ld [hl], a
ld a, 0
ld [wd04e], a
ret
; 80430

View File

@ -336,7 +336,6 @@ Text_WhoaMins: ; 0x908a4
; Whoa!@ @ ; Whoa!@ @
text_jump UnknownText_0x1bc31b text_jump UnknownText_0x1bc31b
start_asm start_asm
; 0x908a9
hlcoord 7, 14 hlcoord 7, 14
call DisplayMinutesWithMinString call DisplayMinutesWithMinString
ld hl, .QuestionMark ld hl, .QuestionMark
@ -645,7 +644,6 @@ DebugDisplayTime: ; 90abc
.Text: ; 0x90acc .Text: ; 0x90acc
start_asm start_asm
call UpdateTime call UpdateTime
hlcoord 1, 14 hlcoord 1, 14

View File

@ -63,9 +63,6 @@ BugContest_ThirdPlaceText: ; 0x13719
; Placing third was @ , who caught a @ !@ @ ; Placing third was @ , who caught a @ !@ @
text_jump ContestJudging_ThirdPlaceText text_jump ContestJudging_ThirdPlaceText
start_asm start_asm
; 0x1371e
BugContest_ThirdPlace: ; 1371e
ld de, SFX_3RD_PLACE ld de, SFX_3RD_PLACE
call PlaySFX call PlaySFX
call WaitSFX call WaitSFX

View File

@ -460,7 +460,7 @@ LoadMovementDataPointer:: ; 19e9
ld hl, OBJECT_STEP_TYPE ld hl, OBJECT_STEP_TYPE
add hl, bc add hl, bc
ld [hl], 0 ld [hl], STEP_TYPE_00
ld hl, VramState ld hl, VramState
set 7, [hl] set 7, [hl]
@ -611,7 +611,7 @@ endr
ret ret
; 1aae ; 1aae
Function1aae:: ; 1aae _GetMovementByte:: ; 1aae
; Switch to the movement data bank ; Switch to the movement data bank
ld a, [hROMBank] ld a, [hROMBank]
push af push af

View File

@ -1,3 +1,4 @@
enum_start enum_start
enum movement_turn_head_down enum movement_turn_head_down
@ -20,24 +21,24 @@ turn_head_right: macro
db movement_turn_head_right ; $03 db movement_turn_head_right ; $03
endm endm
enum movement_half_step_down enum movement_turn_step_down
half_step_down: macro turn_step_down: macro
db movement_half_step_down ; $04 db movement_turn_step_down ; $04
endm endm
enum movement_half_step_up enum movement_turn_step_up
half_step_up: macro turn_step_up: macro
db movement_half_step_up ; $05 db movement_turn_step_up ; $05
endm endm
enum movement_half_step_left enum movement_turn_step_left
half_step_left: macro turn_step_left: macro
db movement_half_step_left ; $06 db movement_turn_step_left ; $06
endm endm
enum movement_half_step_right enum movement_turn_step_right
half_step_right: macro turn_step_right: macro
db movement_half_step_right ; $07 db movement_turn_step_right ; $07
endm endm
enum movement_slow_step_down enum movement_slow_step_down
@ -367,7 +368,10 @@ step_loop: macro
db movement_step_loop ; $4a db movement_step_loop ; $4a
endm endm
__enum__ = $4c enum movement_step_4b
step_4b: macro
db movement_step_4b ; $4b
endm
enum movement_teleport_from enum movement_teleport_from
teleport_from: macro teleport_from: macro

870
main.asm
View File

@ -1568,21 +1568,21 @@ GetRelativeFacing:: ; 8417
ret ret
; 848a ; 848a
Function848a: ; 848a QueueFollowerFirstStep: ; 848a
call Function849d call .QueueFirstStep
jr c, .same jr c, .same
ld [wd4d1], a ld [wFollowMovementQueue], a
xor a xor a
ld [wd4d0], a ld [wFollowerMovementQueueLength], a
ret ret
.same .same
ld a, -1 ld a, -1
ld [wd4d0], a ld [wFollowerMovementQueueLength], a
ret ret
; 849d ; 849d
Function849d: ; 849d .QueueFirstStep
ld a, [wObjectFollow_Leader] ld a, [wObjectFollow_Leader]
call GetObjectStruct call GetObjectStruct
ld hl, OBJECT_NEXT_MAP_X ld hl, OBJECT_NEXT_MAP_X
@ -1600,12 +1600,12 @@ Function849d: ; 849d
jr z, .check_y jr z, .check_y
jr c, .left jr c, .left
and a and a
ld a, $c + RIGHT ld a, movement_step_right
ret ret
.left .left
and a and a
ld a, $c + LEFT ld a, movement_step_left
ret ret
.check_y .check_y
@ -1616,12 +1616,12 @@ Function849d: ; 849d
jr z, .same_xy jr z, .same_xy
jr c, .up jr c, .up
and a and a
ld a, $c + DOWN ld a, movement_step_down
ret ret
.up .up
and a and a
ld a, $c + UP ld a, movement_step_up
ret ret
.same_xy .same_xy
@ -11520,855 +11520,7 @@ INCLUDE "text/phone/extra.asm"
SECTION "bank20", ROMX, BANK[$20] SECTION "bank20", ROMX, BANK[$20]
DoPlayerMovement:: ; 80000 INCLUDE "engine/player_movement.asm"
call GetMovementInput
ld a, movement_step_sleep_1
ld [MovementAnimation], a
xor a
ld [wd041], a
call GetPlayerMovement
ld c, a
ld a, [MovementAnimation]
ld [wc2de], a
ret
; 80017
GetMovementInput: ; 80017
ld a, [hJoyDown]
ld [CurInput], a
; Standing downhill instead moves down.
ld hl, BikeFlags
bit 2, [hl] ; downhill
ret z
ld c, a
and D_PAD
ret nz
ld a, c
or D_DOWN
ld [CurInput], a
ret
; 8002d
GetPlayerMovement: ; 8002d
ld a, [PlayerState]
cp PLAYER_NORMAL
jr z, .Normal
cp PLAYER_SURF
jr z, .Surf
cp PLAYER_SURF_PIKA
jr z, .Surf
cp PLAYER_BIKE
jr z, .Normal
cp PLAYER_SLIP
jr z, .Ice
.Normal
call CheckForcedMovementInput
call GetMovementAction
call CheckTileMovement
ret c
call CheckTurning
ret c
call TryStep
ret c
call TryJumpLedge
ret c
call CheckEdgeWarp
ret c
jr .NotMoving
.Surf
call CheckForcedMovementInput
call GetMovementAction
call CheckTileMovement
ret c
call CheckTurning
ret c
call TrySurfStep
ret c
jr .NotMoving
.Ice
call CheckForcedMovementInput
call GetMovementAction
call CheckTileMovement
ret c
call CheckTurning
ret c
call TryStep
ret c
call TryJumpLedge
ret c
call CheckEdgeWarp
ret c
ld a, [WalkingDirection]
cp STANDING
jr z, .HitWall
call PlayBump
.HitWall
call StandInPlace
xor a
ret
.NotMoving
ld a, [WalkingDirection]
cp STANDING
jr z, .Standing
; Walking into an edge warp won't bump.
ld a, [EngineBuffer4]
and a
jr nz, .CantMove
call PlayBump
.CantMove
call WalkInPlace
xor a
ret
.Standing
call StandInPlace
xor a
ret
; 800b7
CheckTileMovement: ; 800b7
; Tiles such as waterfalls and warps move the player
; in a given direction, overriding input.
ld a, [PlayerNextTile]
ld c, a
call CheckWhirlpoolTile
jr c, .asm_800c4
ld a, 3
scf
ret
.asm_800c4
and $f0
cp $30 ; moving water
jr z, .water
cp $40 ; moving land 1
jr z, .land1
cp $50 ; moving land 2
jr z, .land2
cp $70 ; warps
jr z, .warps
jr .asm_8013c
.water
ld a, c
and 3
ld c, a
ld b, 0
ld hl, .water_table
add hl, bc
ld a, [hl]
ld [WalkingDirection], a
jr .asm_8013e
.water_table
db RIGHT
db LEFT
db UP
db DOWN
.land1
ld a, c
and 7
ld c, a
ld b, 0
ld hl, .land1_table
add hl, bc
ld a, [hl]
cp STANDING
jr z, .asm_8013c
ld [WalkingDirection], a
jr .asm_8013e
.land1_table
db STANDING
db RIGHT
db LEFT
db UP
db DOWN
db STANDING
db STANDING
db STANDING
.land2
ld a, c
and 7
ld c, a
ld b, 0
ld hl, .land2_table
add hl, bc
ld a, [hl]
cp STANDING
jr z, .asm_8013c
ld [WalkingDirection], a
jr .asm_8013e
.land2_table
db RIGHT
db LEFT
db UP
db DOWN
db STANDING
db STANDING
db STANDING
db STANDING
.warps
ld a, c
cp $71 ; door
jr z, .down
cp $79
jr z, .down
cp $7a ; stairs
jr z, .down
cp $7b ; cave
jr nz, .asm_8013c
.down
ld a, DOWN
ld [WalkingDirection], a
jr .asm_8013e
.asm_8013c
xor a
ret
.asm_8013e
ld a, STEP_WALK
call DoStep
ld a, 5
scf
ret
; 80147
CheckTurning: ; 80147
; If the player is turning, change direction first. This also lets
; the player change facing without moving by tapping a direction.
ld a, [wd04e]
cp 0
jr nz, .asm_80169
ld a, [WalkingDirection]
cp STANDING
jr z, .asm_80169
ld e, a
ld a, [PlayerDirection]
rrca
rrca
and 3
cp e
jr z, .asm_80169
ld a, STEP_TURN
call DoStep
ld a, 2
scf
ret
.asm_80169
xor a
ret
; 8016b
TryStep: ; 8016b
; Surfing actually calls TrySurfStep directly instead of passing through here.
ld a, [PlayerState]
cp PLAYER_SURF
jr z, TrySurfStep
cp PLAYER_SURF_PIKA
jr z, TrySurfStep
call CheckLandPermissions
jr c, .bump
call IsNPCInFront
and a
jr z, .bump
cp 2
jr z, .bump
ld a, [PlayerNextTile]
call CheckIceTile
jr nc, .ice
; Downhill riding is slower when not moving down.
call CheckRiding
jr nz, .walk
ld hl, BikeFlags
bit 2, [hl] ; downhill
jr z, .fast
ld a, [WalkingDirection]
cp DOWN
jr z, .fast
ld a, STEP_WALK
call DoStep
scf
ret
.fast
ld a, STEP_BIKE
call DoStep
scf
ret
.walk
ld a, STEP_WALK
call DoStep
scf
ret
.ice
ld a, STEP_ICE
call DoStep
scf
ret
; unused?
xor a
ret
.bump
xor a
ret
; 801c0
TrySurfStep: ; 801c0
call CheckWaterPermissions
ld [wd040], a
jr c, .bump
call IsNPCInFront
ld [wd03f], a
and a
jr z, .bump
cp 2
jr z, .bump
ld a, [wd040]
and a
jr nz, .ExitWater
ld a, STEP_WALK
call DoStep
scf
ret
.ExitWater
call WaterToLandSprite
call PlayMapMusic
ld a, STEP_WALK
call DoStep
ld a, 6
scf
ret
.bump
xor a
ret
; 801f3
TryJumpLedge: ; 801f3
ld a, [PlayerNextTile]
ld e, a
and $f0
cp $a0 ; ledge
jr nz, .DontJump
ld a, e
and 7
ld e, a
ld d, 0
ld hl, .data_8021e
add hl, de
ld a, [FacingDirection]
and [hl]
jr z, .DontJump
ld de, SFX_JUMP_OVER_LEDGE
call PlaySFX
ld a, STEP_LEDGE
call DoStep
ld a, 7
scf
ret
.DontJump
xor a
ret
.data_8021e
db FACE_RIGHT
db FACE_LEFT
db FACE_UP
db FACE_DOWN
db FACE_RIGHT | FACE_DOWN
db FACE_DOWN | FACE_LEFT
db FACE_UP | FACE_RIGHT
db FACE_UP | FACE_LEFT
; 80226
CheckEdgeWarp: ; 80226
; Bug: Since no case is made for STANDING here, it will check
; [.edgewarps + $ff]. This resolves to $3e at $8035a.
; This causes wd041 to be nonzero when standing on tile $3e,
; making bumps silent.
ld a, [WalkingDirection]
ld e, a
ld d, 0
ld hl, .EdgeWarps
add hl, de
ld a, [PlayerNextTile]
cp [hl]
jr nz, .nope
ld a, 1
ld [wd041], a
ld a, [WalkingDirection]
cp STANDING
jr z, .nope
ld e, a
ld a, [PlayerDirection]
rrca
rrca
and 3
cp e
jr nz, .nope
call WarpCheck
jr nc, .nope
call StandInPlace
scf
ld a, 1
ret
.nope
xor a
ret
.EdgeWarps
db $70, $78, $76, $7e
; 8025f
DoStep: ; 8025f
ld e, a
ld d, 0
ld hl, .Steps
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [WalkingDirection]
ld e, a
cp STANDING
jp z, StandInPlace
add hl, de
ld a, [hl]
ld [MovementAnimation], a
ld hl, .WalkInPlace
add hl, de
ld a, [hl]
ld [wd04e], a
ld a, 4
ret
.Steps
dw .Slow
dw .Walk
dw .Bike
dw .Ledge
dw .Ice
dw .Turn
dw .BackwardsLedge
dw .WalkInPlace
.Slow
slow_step_down
slow_step_up
slow_step_left
slow_step_right
.Walk
step_down
step_up
step_left
step_right
.Bike
big_step_down
big_step_up
big_step_left
big_step_right
.Ledge
jump_step_down
jump_step_up
jump_step_left
jump_step_right
.Ice
fast_slide_step_down
fast_slide_step_up
fast_slide_step_left
fast_slide_step_right
.BackwardsLedge
jump_step_up
jump_step_down
jump_step_right
jump_step_left
.Turn
half_step_down
half_step_up
half_step_left
half_step_right
.WalkInPlace
db $80 + movement_turn_head_down
db $80 + movement_turn_head_up
db $80 + movement_turn_head_left
db $80 + movement_turn_head_right
; 802b3
StandInPlace: ; 802b3
ld a, 0
ld [wd04e], a
ld a, movement_step_sleep_1
ld [MovementAnimation], a
xor a
ret
; 802bf
WalkInPlace: ; 802bf
ld a, 0
ld [wd04e], a
ld a, movement_step_bump
ld [MovementAnimation], a
xor a
ret
; 802cb
CheckForcedMovementInput: ; 802cb
; When sliding on ice, input is forced to remain in the same direction.
call CheckStandingOnIce
ret nc
ld a, [wd04e]
cp 0
ret z
and 3
ld e, a
ld d, 0
ld hl, .data_802e8
add hl, de
ld a, [CurInput]
and BUTTONS
or [hl]
ld [CurInput], a
ret
.data_802e8
db D_DOWN, D_UP, D_LEFT, D_RIGHT
; 802ec
GetMovementAction: ; 802ec
; Poll player input and update movement info.
ld hl, .table
ld de, .table2 - .table1
ld a, [CurInput]
bit 7, a
jr nz, .down
bit 6, a
jr nz, .up
bit 5, a
jr nz, .left
bit 4, a
jr nz, .right
; Standing
jr .update
.down add hl, de
.up add hl, de
.left add hl, de
.right add hl, de
.update
ld a, [hli]
ld [WalkingDirection], a
ld a, [hli]
ld [FacingDirection], a
ld a, [hli]
ld [WalkingX], a
ld a, [hli]
ld [WalkingY], a
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [hl]
ld [WalkingTile], a
ret
.table
; struct:
; walk direction
; facing
; x movement
; y movement
; tile collision pointer
.table1
db STANDING, FACE_CURRENT, 0, 0
dw PlayerNextTile
.table2
db RIGHT, FACE_RIGHT, 1, 0
dw TileRight
db LEFT, FACE_LEFT, -1, 0
dw TileLeft
db UP, FACE_UP, 0, -1
dw TileUp
db DOWN, FACE_DOWN, 0, 1
dw TileDown
; 80341
IsNPCInFront: ; 80341
; Returns 0 if there is an NPC in front that you can't move
; Returns 1 if there is no NPC in front
; Returns 2 if there is a movable NPC in front
ld a, 0
ld [hMapObjectIndexBuffer], a
; Load the next X coordinate into d
ld a, [PlayerNextMapX]
ld d, a
ld a, [WalkingX]
add d
ld d, a
; Load the next Y coordinate into e
ld a, [PlayerNextMapY]
ld e, a
ld a, [WalkingY]
add e
ld e, a
; Find an object struct with coordinates equal to d,e
ld bc, ObjectStructs ; redundant
callba IsNPCAtCoord
jr nc, .nope
call Function8036f
jr c, .no_bump
; .bump
xor a
ret
.nope
ld a, 1
ret
.no_bump
ld a, 2
ret
; 8036f
Function8036f: ; 8036f
ld hl, BikeFlags
bit 0, [hl] ; using strength
jr z, .nope
ld hl, OBJECT_DIRECTION_WALKING
add hl, bc
ld a, [hl]
cp STANDING
jr nz, .nope
ld hl, OBJECT_PALETTE
add hl, bc
bit 6, [hl]
jr z, .nope
ld hl, OBJECT_FLAGS2
add hl, bc
set 2, [hl]
ld a, [WalkingDirection]
ld d, a
ld hl, OBJECT_RANGE
add hl, bc
ld a, [hl]
and $fc
or d
ld [hl], a
scf
ret
.nope
xor a
ret
; 8039e
CheckLandPermissions: ; 8039e
; Return 0 if walking onto land and tile permissions allow it.
; Otherwise, return carry.
ld a, [TilePermissions]
ld d, a
ld a, [FacingDirection]
and d
jr nz, .NotWalkable
ld a, [WalkingTile]
call CheckWalkable
jr c, .NotWalkable
xor a
ret
.NotWalkable
scf
ret
; 803b4
CheckWaterPermissions: ; 803b4
; Return 0 if moving in water, or 1 if moving onto land.
; Otherwise, return carry.
ld a, [TilePermissions]
ld d, a
ld a, [FacingDirection]
and d
jr nz, .NotSurfable
ld a, [WalkingTile]
call CheckSurfable
jr c, .NotSurfable
and a
ret
.NotSurfable
scf
ret
; 803ca
CheckRiding: ; 803ca
ld a, [PlayerState]
cp PLAYER_BIKE
ret z
cp PLAYER_SLIP
ret
; 803d3
CheckWalkable: ; 803d3
; Return 0 if tile a is land. Otherwise, return carry.
call GetTileCollision
and a ; land
ret z
scf
ret
; 803da
CheckSurfable: ; 803da
; Return 0 if tile a is water, or 1 if land.
; Otherwise, return carry.
call GetTileCollision
cp 1
jr z, .Water
; Can walk back onto land from water.
and a
jr z, .Land
jr .Neither
.Water
xor a
ret
.Land
ld a, 1
and a
ret
.Neither
scf
ret
; 803ee
PlayBump: ; 803ee
call CheckSFX
ret c
ld de, SFX_BUMP
call PlaySFX
ret
; 803f9
WaterToLandSprite: ; 803f9
push bc
ld a, PLAYER_NORMAL
ld [PlayerState], a
call ReplaceKrisSprite ; UpdateSprites
pop bc
ret
; 80404
CheckStandingOnIce:: ; 80404
ld a, [wd04e]
cp 0
jr z, .nope
cp $f0
jr z, .nope
ld a, [PlayerNextTile]
call CheckIceTile
jr nc, .yep
ld a, [PlayerState]
cp PLAYER_SLIP
jr nz, .nope
.yep
scf
ret
.nope
and a
ret
; 80422
Function80422:: ; 80422
ld hl, wc2de
ld a, movement_step_sleep_1
cp [hl]
ret z
ld [hl], a
ld a, 0
ld [wd04e], a
ret
; 80430
INCLUDE "engine/engine_flags.asm" INCLUDE "engine/engine_flags.asm"
; 80648 ; 80648

View File

@ -542,9 +542,6 @@ UnknownText_0x8b64c: ; 0x8b64c
; CARD FOLDER open.@ @ ; CARD FOLDER open.@ @
text_jump UnknownText_0x1bc288 text_jump UnknownText_0x1bc288
start_asm start_asm
; 0x8b651
Function8b651: ; 8b651
ld de, SFX_TWINKLE ld de, SFX_TWINKLE
call PlaySFX call PlaySFX
call WaitSFX call WaitSFX

View File

@ -385,14 +385,14 @@ wLinkMode:: ; c2dc
ScriptVar:: ; c2dd ScriptVar:: ; c2dd
ds 1 ds 1
wc2de:: ds 1 wPlayerNextMovement:: ds 1
wc2df:: ds 1 wPlayerMovement:: ds 1
ds 2 ds 2
wc2e2::
wMovementPerson:: ds 1 wMovementPerson:: ds 1
wMovementDataPointer:: ds 3 ; dba wMovementDataPointer:: ds 3 ; dba
wc2e6:: ds 4 wc2e6:: ds 4
wc2ea:: ds 1 wMovementByteWasControlSwitch:: ds 1
wc2eb::
wMovementPointer:: ds 2 ; c2eb wMovementPointer:: ds 2 ; c2eb
ds 3 ds 3
@ -2601,9 +2601,8 @@ CurDay:: ; d4cb
wObjectFollow_Leader:: ds 1 wObjectFollow_Leader:: ds 1
wObjectFollow_Follower:: ds 1 wObjectFollow_Follower:: ds 1
wCenteredObject:: ds 1 wCenteredObject:: ds 1
wd4d0:: ds 1 wFollowerMovementQueueLength:: ds 1
wd4d1:: ds 1 wFollowMovementQueue:: ds 5
ds 4
ObjectStructs:: ; d4d6 ObjectStructs:: ; d4d6
object_struct: MACRO object_struct: MACRO