diff options
-rw-r--r-- | constants/script_constants.asm | 11 | ||||
-rwxr-xr-x | engine/events/specials.asm | 6 | ||||
-rw-r--r-- | engine/menus/intro_menu.asm | 4 | ||||
-rw-r--r-- | engine/overworld/init_map.asm | 31 | ||||
-rwxr-xr-x | engine/overworld/map_objects.asm | 4 | ||||
-rw-r--r-- | engine/overworld/map_setup.asm | 4 | ||||
-rwxr-xr-x | engine/overworld/npc_movement.asm | 434 | ||||
-rwxr-xr-x | engine/overworld/player_movement.asm | 775 | ||||
-rwxr-xr-x | engine/overworld/player_object.asm | 603 | ||||
-rwxr-xr-x | engine/overworld/player_step.asm | 75 | ||||
-rwxr-xr-x | engine/overworld/time.asm | 253 | ||||
-rwxr-xr-x | engine/overworld/variables.asm | 80 | ||||
-rw-r--r-- | wram.asm | 31 |
13 files changed, 1267 insertions, 1044 deletions
diff --git a/constants/script_constants.asm b/constants/script_constants.asm index f8673936..ec9e5dac 100644 --- a/constants/script_constants.asm +++ b/constants/script_constants.asm @@ -86,6 +86,17 @@ const_value SET -1 const PLAYEREVENT_JOYCHANGEFACING NUM_PLAYER_EVENTS EQU const_value +; PlayerMovement.pointers indexes (see engine/overworld/events.asm) + const_def + const PLAYERMOVEMENT_NORMAL + const PLAYERMOVEMENT_WARP + const PLAYERMOVEMENT_TURN + const PLAYERMOVEMENT_FORCE_TURN + const PLAYERMOVEMENT_FINISH + const PLAYERMOVEMENT_CONTINUE + const PLAYERMOVEMENT_EXIT_WATER + const PLAYERMOVEMENT_JUMP + ; script data sizes (see macros/scripts/maps.asm) SCENE_SCRIPT_SIZE EQU 4 ; scene_script CALLBACK_SIZE EQU 3 ; callback diff --git a/engine/events/specials.asm b/engine/events/specials.asm index 53b8ee5b..c3d2f9ad 100755 --- a/engine/events/specials.asm +++ b/engine/events/specials.asm @@ -404,7 +404,7 @@ Functionc53c: ; c53c (3:453c) ret UnusedCheckUnusedTwoDayTimer: ; c549 (3:4549) - farcall Function118f8 + farcall CheckUnusedTwoDayTimer ld a, [wUnusedTwoDayTimer] ld [wScriptVar], a ret @@ -445,13 +445,13 @@ CheckPokerus: ; c588 (3:4588) jp Functionc53c ResetLuckyNumberShowFlag: ; c591 (3:4591) - farcall Function11917 + farcall RestartLuckyNumberCountdown ClearFlag ENGINE_LUCKY_NUMBER_SHOW farcall LoadOrRegenerateLuckyIDNumber ret CheckLuckyNumberShowFlag: ; c5a3 (3:45a3) - farcall Function1192e + farcall _CheckLuckyNumberShowFlag jp Functionc53c CountUnown: ; c5ac (3:45ac) diff --git a/engine/menus/intro_menu.asm b/engine/menus/intro_menu.asm index e31900d5..1b19d41e 100644 --- a/engine/menus/intro_menu.asm +++ b/engine/menus/intro_menu.asm @@ -238,7 +238,7 @@ Function5bf7: ; 5bf7 (1:5bf7) MainMenu_MysteryGift: call UpdateTime - farcall Function11934 + farcall DoMysteryGiftIfDayHasPassed farcall Function29dff ret @@ -447,7 +447,7 @@ Function5d5d: ; 5d5d (1:5d5d) InitializeWorld: ; 5d97 (1:5d97) call ShrinkPlayer farcall SpawnPlayer - farcall InitializeStartDay_ + farcall _InitializeStartDay ret LoadOrRegenerateLuckyIDNumber: ; 5da7 (1:5da7) diff --git a/engine/overworld/init_map.asm b/engine/overworld/init_map.asm index 5771bd9e..72950ac7 100644 --- a/engine/overworld/init_map.asm +++ b/engine/overworld/init_map.asm @@ -1,21 +1,24 @@ -ReanchorBGMap_NoOAMUpdate:: ; 6551 (1:6551) +ReanchorBGMap_NoOAMUpdate:: call DelayFrame ldh a, [hOAMUpdate] push af + ld a, $1 ldh [hOAMUpdate], a ldh a, [hBGMapMode] push af xor a ldh [hBGMapMode], a - call Function656b + + call .ReanchorBGMap + pop af ldh [hBGMapMode], a pop af ldh [hOAMUpdate], a ret -Function656b: ; 656b (1:656b) +.ReanchorBGMap: xor a ldh [hLCDCPointer], a ldh [hBGMapMode], a @@ -25,18 +28,18 @@ Function656b: ; 656b (1:656b) ld a, $90 ldh [hWY], a call OverworldTextModeSwitch - ld a, $9c + ld a, HIGH(vBGMap1) call .LoadBGMapAddrIntoHRAM call _OpenAndCloseMenu_HDMATransferTilemapAndAttrmap xor a ldh [hBGMapMode], a ldh [hWY], a - ld a, $98 + ld a, HIGH(vBGMap0) call .LoadBGMapAddrIntoHRAM call .WaitTransfer - xor a + xor a ; LOW(vBGMap0) ld [wBGMapAnchor], a - ld a, $98 + ld a, HIGH(vBGMap0) ld [wBGMapAnchor + 1], a xor a ldh [hSCX], a @@ -44,22 +47,22 @@ Function656b: ; 656b (1:656b) call ApplyBGMapAnchorToObjects ret -.LoadBGMapAddrIntoHRAM: ; 65a5 (1:65a5) +.LoadBGMapAddrIntoHRAM: ldh [hBGMapAddress + 1], a xor a ldh [hBGMapAddress], a ret -.WaitTransfer: ; 65ab (1:65ab) +.WaitTransfer: ldh a, [hBGMapMode] push af xor a ldh [hBGMapMode], a ldh a, [hOAMUpdate] push af - ld a, $1 + ld a, 1 ldh [hOAMUpdate], a - ld a, $3 + ld a, 3 ldh [hFF9E], a .asm_65bc call DelayFrame @@ -72,17 +75,19 @@ Function656b: ; 656b (1:656b) ldh [hBGMapMode], a ret -LoadFonts_NoOAMUpdate:: ; 65cb (1:65cb) +LoadFonts_NoOAMUpdate:: ldh a, [hOAMUpdate] push af ld a, $1 ldh [hOAMUpdate], a + call .LoadGFX + pop af ldh [hOAMUpdate], a ret -.LoadGFX: ; 65d9 (1:65d9) +.LoadGFX: call LoadFontsExtra ld a, $90 ldh [hWY], a diff --git a/engine/overworld/map_objects.asm b/engine/overworld/map_objects.asm index 25f3720f..a03a0171 100755 --- a/engine/overworld/map_objects.asm +++ b/engine/overworld/map_objects.asm @@ -2407,9 +2407,9 @@ RefreshPlayerSprite:: .TryResetPlayerAction: ld hl, wPlayerSpriteSetupFlags - bit 7, [hl] + bit PLAYERSPRITESETUP_RESET_ACTION_F, [hl] jr nz, .ok - bit 6, [hl] + bit PLAYERSPRITESETUP_SKIP_RELOAD_GFX_F, [hl] jr nz, .ok ret diff --git a/engine/overworld/map_setup.asm b/engine/overworld/map_setup.asm index cf1c7d03..aec3c949 100644 --- a/engine/overworld/map_setup.asm +++ b/engine/overworld/map_setup.asm @@ -235,9 +235,9 @@ ApplyMapPalettes: ret FadeMapMusicAndPalettes: - ld e, 0 + ld e, LOW(MUSIC_NONE) ld a, [wMusicFadeID] - ld d, 0 + ld d, HIGH(MUSIC_NONE) ld a, [wMusicFadeID + 1] ld a, $4 ld [wMusicFade], a diff --git a/engine/overworld/npc_movement.asm b/engine/overworld/npc_movement.asm index c0b88a8b..3a196508 100755 --- a/engine/overworld/npc_movement.asm +++ b/engine/overworld/npc_movement.asm @@ -1,102 +1,110 @@ -CanObjectMoveInDirection: ; 6fa0 (1:6fa0) - ld hl, $6 +CanObjectMoveInDirection: + ld hl, OBJECT_PALETTE add hl, bc - bit 5, [hl] - jr z, .asm_6fb8 - ld hl, $4 + bit SWIMMING_F, [hl] + jr z, .not_swimming + + ld hl, OBJECT_FLAGS1 add hl, bc - bit 4, [hl] + bit NOCLIP_TILES_F, [hl] ; lost, uncomment next line to fix + ; jr nz, .noclip_tiles push hl push bc - call Function700b + call WillObjectBumpIntoLand pop bc pop hl ret c - jr .asm_6fc8 + jr .continue -.asm_6fb8 - ld hl, $4 +.not_swimming + ld hl, OBJECT_FLAGS1 add hl, bc - bit 4, [hl] - jr nz, .asm_6fc8 + bit NOCLIP_TILES_F, [hl] + jr nz, .noclip_tiles push hl push bc - call Function6fe6 + call WillObjectBumpIntoWater pop bc pop hl ret c -.asm_6fc8 - bit 6, [hl] - jr nz, .asm_6fd4 + +.noclip_tiles +.continue + bit NOCLIP_OBJS_F, [hl] + jr nz, .noclip_objs + push hl push bc - call WillPersonBumpIntoSomeoneElse + call WillObjectBumpIntoSomeoneElse pop bc pop hl ret c -.asm_6fd4 - bit 5, [hl] - jr nz, .asm_6fe4 + +.noclip_objs + bit MOVE_ANYWHERE_F, [hl] + jr nz, .move_anywhere push hl - call HasPersonReachedMovementLimit + call HasObjectReachedMovementLimit pop hl ret c + push hl - call IsPersonMovingOffEdgeOfScreen + call IsObjectMovingOffEdgeOfScreen pop hl ret c -.asm_6fe4 + +.move_anywhere and a ret -Function6fe6: ; 6fe6 (1:6fe6) +WillObjectBumpIntoWater: call Function703e ret c - ld hl, $10 + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld d, [hl] - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld e, [hl] - ld hl, $6 + ld hl, OBJECT_PALETTE add hl, bc - bit 7, [hl] + bit OAM_PRIORITY, [hl] jp nz, Function7080 - ld hl, $e + ld hl, OBJECT_NEXT_TILE add hl, bc ld a, [hl] ld d, a call GetTileCollision - and a - jr z, Function701d + and a ; LAND_TILE + jr z, WillObjectBumpIntoTile scf ret -Function700b: ; 700b (1:700b) +WillObjectBumpIntoLand: call Function703e ret c - ld hl, $e + ld hl, OBJECT_NEXT_TILE add hl, bc ld a, [hl] call GetTileCollision - cp $1 - jr z, Function701d + cp WATER_TILE + jr z, WillObjectBumpIntoTile scf ret -Function701d: - ld hl, $e +WillObjectBumpIntoTile: + ld hl, OBJECT_NEXT_TILE add hl, bc ld a, [hl] call Function705e ret nc push af - ld hl, $7 + ld hl, OBJECT_DIRECTION_WALKING add hl, bc ld a, [hl] - and $3 + maskbits NUM_DIRECTIONS ld e, a - ld d, $0 + ld d, 0 ld hl, .data_703a add hl, de pop af @@ -106,20 +114,23 @@ Function701d: ret .data_703a - db 1 << DOWN, 1 << UP, 1 << RIGHT, 1 << LEFT + db DOWN_MASK ; DOWN + db UP_MASK ; UP + db RIGHT_MASK ; LEFT + db LEFT_MASK ; RIGHT -Function703e: ; 703e (1:703e) - ld hl, $f +Function703e: + ld hl, OBJECT_STANDING_TILE add hl, bc ld a, [hl] call Function705e ret nc push af - ld hl, $7 + ld hl, OBJECT_DIRECTION_WALKING add hl, bc - and $3 + maskbits NUM_DIRECTIONS ld e, a - ld d, $0 + ld d, 0 ld hl, .data_705a add hl, de pop af @@ -129,23 +140,26 @@ Function703e: ; 703e (1:703e) ret .data_705a - db 1 << UP, 1 << DOWN, 1 << LEFT, 1 << RIGHT + db UP_MASK ; DOWN + db DOWN_MASK ; UP + db LEFT_MASK ; LEFT + db RIGHT_MASK ; RIGHT -Function705e: ; 705e (1:705e) +Function705e: ld d, a and $f0 - cp $b0 - jr z, .asm_706b - cp $c0 - jr z, .asm_706b + cp HI_NYBBLE_SIDE_WALLS + jr z, .continue + cp HI_NYBBLE_SIDE_BUOYS + jr z, .continue xor a ret -.asm_706b +.continue ld a, d - and $7 + and 7 ld e, a - ld d, $0 + ld d, 0 ld hl, .data_7078 add hl, de ld a, [hl] @@ -153,216 +167,234 @@ Function705e: ; 705e (1:705e) ret .data_7078 - db 8, 4, 1, 2 - db 10, 6, 9, 5 - -Function7080: ; 7080 (1:7080) - ld hl, $7 + db RIGHT_MASK ; COLL_RIGHT_WALL/BUOY + db LEFT_MASK ; COLL_LEFT_WALL/BUOY + db DOWN_MASK ; COLL_UP_WALL/BUOY + db UP_MASK ; COLL_DOWN_WALL/BUOY + db UP_MASK | RIGHT_MASK ; COLL_DOWN_RIGHT_WALL/BUOY + db UP_MASK | LEFT_MASK ; COLL_DOWN_LEFT_WALL/BUOY + db DOWN_MASK | RIGHT_MASK ; COLL_UP_RIGHT_WALL/BUOY + db DOWN_MASK | LEFT_MASK ; COLL_UP_LEFT_WALL/BUOY + +Function7080: + ld hl, OBJECT_DIRECTION_WALKING add hl, bc ld a, [hl] - and $3 - jr z, .asm_7091 + maskbits NUM_DIRECTIONS + jr z, .down dec a - jr z, .asm_7096 + jr z, .up dec a - jr z, .asm_709a - jr .asm_709e + jr z, .left + jr .right -.asm_7091 +.down inc e push de inc d - jr .asm_70a1 + jr .continue -.asm_7096 +.up push de inc d - jr .asm_70a1 + jr .continue -.asm_709a +.left push de inc e - jr .asm_70a1 + jr .continue -.asm_709e +.right inc d push de inc e -.asm_70a1 + +.continue call GetCoordTile call GetTileCollision pop de - and a - jr nz, .asm_70b6 + and a ; LAND_TILE + jr nz, .not_land call GetCoordTile call GetTileCollision - and a - jr nz, .asm_70b6 + and a ; LAND_TILE + jr nz, .not_land xor a ret -.asm_70b6 +.not_land scf ret CheckFacingObject:: call GetFacingTileCoord + +; Double the distance for counter tiles. call CheckCounterTile jr nz, .asm_70d0 + ld a, [wPlayerStandingMapX] sub d cpl inc a add d ld d, a + ld a, [wPlayerStandingMapY] sub e cpl inc a add e ld e, a + .asm_70d0 - ld bc, wObjectStructs - ld a, $0 + ld bc, wObjectStructs ; redundant + ld a, 0 ldh [hMapObjectIndexBuffer], a - call Function7120 + call IsNPCAtCoord ret nc - ld hl, $7 + ld hl, OBJECT_DIRECTION_WALKING add hl, bc ld a, [hl] - cp $ff - jr z, .asm_70e6 + cp STANDING + jr z, .standing xor a ret -.asm_70e6 +.standing scf ret -WillPersonBumpIntoSomeoneElse: ; 70e8 (1:70e8) - ld hl, $10 +WillObjectBumpIntoSomeoneElse: + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld d, [hl] - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld e, [hl] - jr Function7120 + jr IsNPCAtCoord Function70f4: ldh a, [hMapObjectIndexBuffer] call GetObjectStruct - call Function7100 - call Function7120 + call .CheckWillBeFacingNPC + call IsNPCAtCoord ret -Function7100: ; 7100 (1:7100) - ld hl, $10 +.CheckWillBeFacingNPC: + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld d, [hl] - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld e, [hl] call GetSpriteDirection and a - jr z, .asm_711a - cp $4 - jr z, .asm_711c - cp $8 - jr z, .asm_711e + jr z, .down + cp OW_UP + jr z, .up + cp OW_LEFT + jr z, .left inc d ret -.asm_711a +.down inc e ret -.asm_711c +.up dec e ret -.asm_711e +.left dec d ret -Function7120: ; 7120 (1:7120) - ld bc, wPlayerStruct +IsNPCAtCoord: + ld bc, wObjectStructs xor a -.asm_7124 +.loop ldh [hObjectStructIndexBuffer], a call DoesObjectHaveASprite - jr z, .asm_7172 - ld hl, $4 + jr z, .next + + ld hl, OBJECT_FLAGS1 add hl, bc bit 7, [hl] - jr nz, .asm_7172 - ld hl, $6 + jr nz, .next + + ld hl, OBJECT_PALETTE add hl, bc - bit 7, [hl] - jr z, .asm_7142 + bit BIG_OBJECT_F, [hl] + jr z, .got + call Function7250 - jr nc, .asm_715a - jr .asm_7152 + jr nc, .ok + jr .ok2 -.asm_7142 - ld hl, $10 +.got + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, [hl] cp d - jr nz, .asm_715a - ld hl, $11 + jr nz, .ok + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld a, [hl] cp e - jr nz, .asm_715a -.asm_7152 + jr nz, .ok + +.ok2 ldh a, [hMapObjectIndexBuffer] ld l, a - ldh a, [hConnectedMapWidth] + ldh a, [hObjectStructIndexBuffer] cp l - jr nz, .asm_7181 -.asm_715a - ld hl, $12 + jr nz, .setcarry + +.ok + ld hl, OBJECT_MAP_X add hl, bc ld a, [hl] cp d - jr nz, .asm_7172 - ld hl, $13 + jr nz, .next + ld hl, OBJECT_MAP_Y add hl, bc ld a, [hl] cp e - jr nz, .asm_7172 - ldh a, [hConnectionStripLength] + jr nz, .next + ldh a, [hMapObjectIndexBuffer] ld l, a ldh a, [hObjectStructIndexBuffer] cp l - jr nz, .asm_7181 -.asm_7172 - ld hl, $28 + jr nz, .setcarry + +.next + ld hl, OBJECT_LENGTH add hl, bc ld b, h ld c, l - ldh a, [hConnectedMapWidth] + ldh a, [hObjectStructIndexBuffer] inc a - cp $d - jr nz, .asm_7124 + cp NUM_OBJECT_STRUCTS + jr nz, .loop and a ret -.asm_7181 +.setcarry scf ret -HasPersonReachedMovementLimit: ; 7183 (1:7183) - ld hl, $16 +HasObjectReachedMovementLimit: + ld hl, OBJECT_RADIUS add hl, bc ld a, [hl] and a - jr z, .asm_71c8 + jr z, .nope and $f - jr z, .asm_71a6 + jr z, .check_y ld e, a ld d, a - ld hl, $14 + ld hl, OBJECT_INIT_X add hl, bc ld a, [hl] sub d @@ -370,23 +402,24 @@ HasPersonReachedMovementLimit: ; 7183 (1:7183) ld a, [hl] add e ld e, a - ld hl, $10 + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, [hl] cp d - jr z, .asm_71ca + jr z, .yes cp e - jr z, .asm_71ca -.asm_71a6 - ld hl, $16 + jr z, .yes + +.check_y + ld hl, OBJECT_RADIUS add hl, bc ld a, [hl] swap a and $f - jr z, .asm_71c8 + jr z, .nope ld e, a ld d, a - ld hl, $15 + ld hl, OBJECT_INIT_Y add hl, bc ld a, [hl] sub d @@ -394,46 +427,49 @@ HasPersonReachedMovementLimit: ; 7183 (1:7183) ld a, [hl] add e ld e, a - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld a, [hl] cp d - jr z, .asm_71ca + jr z, .yes cp e - jr z, .asm_71ca -.asm_71c8 + jr z, .yes + +.nope xor a ret -.asm_71ca +.yes scf ret -IsPersonMovingOffEdgeOfScreen: ; 71cc (1:71cc) - ld hl, $10 +IsObjectMovingOffEdgeOfScreen: + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, [wXCoord] cp [hl] - jr z, .asm_71dd - jr nc, .asm_71f0 + jr z, .check_y + jr nc, .yes add $9 cp [hl] - jr c, .asm_71f0 -.asm_71dd - ld hl, $11 + jr c, .yes + +.check_y + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld a, [wYCoord] cp [hl] - jr z, .asm_71ee - jr nc, .asm_71f0 + jr z, .nope + jr nc, .yes add $8 cp [hl] - jr c, .asm_71f0 -.asm_71ee + jr c, .yes + +.nope and a ret -.asm_71f0 +.yes scf ret @@ -444,82 +480,82 @@ Function71f2: ld e, a ld bc, wObjectStructs xor a -.asm_71fe - ldh [hConnectedMapWidth], a +.loop + ldh [hObjectStructIndexBuffer], a call DoesObjectHaveASprite - jr z, .asm_723f - ld hl, $3 + jr z, .next + ld hl, OBJECT_MOVEMENTTYPE add hl, bc ld a, [hl] - cp $15 - jr nz, .asm_7215 + cp SPRITEMOVEDATA_BIGDOLLSYM + jr nz, .not_snorlax call Function7250 - jr c, .asm_724e - jr .asm_723f + jr c, .yes + jr .next -.asm_7215 - ld hl, $11 +.not_snorlax + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld a, [hl] cp e - jr nz, .asm_722d - ld hl, $10 + jr nz, .check_current_coords + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, [hl] cp d - jr nz, .asm_722d + jr nz, .check_current_coords ldh a, [hObjectStructIndexBuffer] - cp $0 - jr z, .asm_723f - jr .asm_724e + cp PLAYER_OBJECT + jr z, .next + jr .yes -.asm_722d - ld hl, $13 +.check_current_coords + ld hl, OBJECT_MAP_Y add hl, bc ld a, [hl] cp e - jr nz, .asm_723f - ld hl, $12 + jr nz, .next + ld hl, OBJECT_MAP_X add hl, bc ld a, [hl] cp d - jr nz, .asm_723f - jr .asm_724e + jr nz, .next + jr .yes -.asm_723f - ld hl, $28 +.next + ld hl, OBJECT_LENGTH add hl, bc ld b, h ld c, l - ldh a, [hConnectedMapWidth] + ldh a, [hObjectStructIndexBuffer] inc a - cp $d - jr nz, .asm_71fe + cp NUM_OBJECT_STRUCTS + jr nz, .loop xor a ret -.asm_724e +.yes scf ret -Function7250: ; 7250 (1:7250) - ld hl, $10 +Function7250: + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, d sub [hl] - jr c, .asm_726a + jr c, .nope cp $2 - jr nc, .asm_726a - ld hl, $11 + jr nc, .nope + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld a, e sub [hl] - jr c, .asm_726a + jr c, .nope cp $2 - jr nc, .asm_726a + jr nc, .nope scf ret -.asm_726a +.nope and a ret diff --git a/engine/overworld/player_movement.asm b/engine/overworld/player_movement.asm index 21dd97ca..165a8479 100755 --- a/engine/overworld/player_movement.asm +++ b/engine/overworld/player_movement.asm @@ -1,421 +1,475 @@ -DoPlayerMovement:: ; 10000 (4:4000) - call Function10017 +DoPlayerMovement:: + + call .GetDPad ld a, movement_step_sleep ld [wMovementAnimation], a xor a ld [wWalkingIntoEdgeWarp], a - call Function1002d + call .TranslateIntoMovement ld c, a ld a, [wMovementAnimation] ld [wPlayerNextMovement], a ret -Function10017: ; 10017 (4:4017) +.GetDPad: + ldh a, [hJoyDown] ld [wCurInput], a - CheckFlagHL ENGINE_DOWNHILL + +; Standing downhill instead moves down. + + ld hl, wBikeFlags + bit BIKEFLAGS_DOWNHILL_F, [hl] ret z + ld c, a - and $f0 + and D_PAD ret nz + ld a, c - or $80 + or D_DOWN ld [wCurInput], a ret -Function1002d: ; 1002d (4:402d) +.TranslateIntoMovement: ld a, [wPlayerState] cp PLAYER_NORMAL - jr z, .asm_10044 + jr z, .Normal cp PLAYER_SURF - jr z, .asm_10060 + jr z, .Surf cp PLAYER_SURF_PIKA - jr z, .asm_10060 + jr z, .Surf cp PLAYER_BIKE - jr z, .asm_10044 + jr z, .Normal cp PLAYER_SKATE - jr z, .asm_10074 -.asm_10044 - call Function102cb - call Function102ec - call Function100b7 + jr z, .Ice + +.Normal: + call .CheckForced + call .GetAction + call .CheckTile ret c - call Function10147 + call .CheckTurning ret c - call Function1016b + call .TryStep ret c - call Function101f3 + call .TryJump ret c - call Function10226 + call .CheckWarp ret c - jr .asm_1009d + jr .NotMoving -.asm_10060 - call Function102cb - call Function102ec - call Function100b7 +.Surf: + call .CheckForced + call .GetAction + call .CheckTile ret c - call Function10147 + call .CheckTurning ret c - call Function101c0 + call .TrySurf ret c - jr .asm_1009d + jr .NotMoving -.asm_10074 - call Function102cb - call Function102ec - call Function100b7 +.Ice: + call .CheckForced + call .GetAction + call .CheckTile ret c - call Function10147 + call .CheckTurning ret c - call Function1016b + call .TryStep ret c - call Function101f3 + call .TryJump ret c - call Function10226 + call .CheckWarp ret c ld a, [wWalkingDirection] - cp $ff - jr z, .asm_10098 - call Function103ee -.asm_10098 - call Function102b3 + cp STANDING + jr z, .HitWall + call .BumpSound +.HitWall: + call .StandInPlace xor a ret -.asm_1009d +.NotMoving: ld a, [wWalkingDirection] - cp $ff - jr z, .asm_100b2 + cp STANDING + jr z, .Standing + +; Walking into an edge warp won't bump. ld a, [wWalkingIntoEdgeWarp] and a - jr nz, .asm_100ad - call Function103ee -.asm_100ad - call Function102bf + jr nz, .CantMove + call .BumpSound +.CantMove: + call ._WalkInPlace xor a ret -.asm_100b2 - call Function102b3 +.Standing: + call .StandInPlace xor a ret -Function100b7: ; 100b7 (4:40b7) +.CheckTile: +; Tiles such as waterfalls and warps move the player +; in a given direction, overriding input. + ld a, [wPlayerStandingTile] ld c, a call CheckWhirlpoolTile - jr c, .asm_100c4 - ld a, $3 + jr c, .not_whirlpool + ld a, PLAYERMOVEMENT_FORCE_TURN scf ret -.asm_100c4 +.not_whirlpool and $f0 - cp $30 - jr z, .asm_100d8 - cp $40 - jr z, .asm_100ec - cp $50 - jr z, .asm_10108 - cp $70 - jr z, .asm_10124 - jr .asm_1013c - -.asm_100d8 + cp HI_NYBBLE_CURRENT + jr z, .water + cp HI_NYBBLE_WALK + jr z, .land1 + cp HI_NYBBLE_WALK_ALT + jr z, .land2 + cp HI_NYBBLE_WARPS + jr z, .warps + jr .no_walk + +.water ld a, c - and $3 + maskbits NUM_DIRECTIONS ld c, a - ld b, $0 + ld b, 0 ld hl, .water_table add hl, bc ld a, [hl] ld [wWalkingDirection], a - jr .asm_1013e + jr .continue_walk .water_table - db RIGHT - db LEFT - db UP - db DOWN + db RIGHT ; COLL_WATERFALL_RIGHT + db LEFT ; COLL_WATERFALL_LEFT + db UP ; COLL_WATERFALL_UP + db DOWN ; COLL_WATERFALL -.asm_100ec +.land1 ld a, c - and $7 + and 7 ld c, a - ld b, $0 + ld b, 0 ld hl, .land1_table add hl, bc ld a, [hl] - cp $ff - jr z, .asm_1013c + cp STANDING + jr z, .no_walk ld [wWalkingDirection], a - jr .asm_1013e + jr .continue_walk .land1_table - db STANDING - db RIGHT - db LEFT - db UP - db DOWN - db STANDING - db STANDING - db STANDING - -.asm_10108 + db STANDING ; COLL_BRAKE + db RIGHT ; COLL_WALK_RIGHT + db LEFT ; COLL_WALK_LEFT + db UP ; COLL_WALK_UP + db DOWN ; COLL_WALK_DOWN + db STANDING ; COLL_BRAKE_45 + db STANDING ; COLL_BRAKE_46 + db STANDING ; COLL_BRAKE_47 + +.land2 ld a, c - and $7 + and 7 ld c, a - ld b, $0 + ld b, 0 ld hl, .land2_table add hl, bc ld a, [hl] - cp $ff - jr z, .asm_1013c + cp STANDING + jr z, .no_walk ld [wWalkingDirection], a - jr .asm_1013e + jr .continue_walk .land2_table - db RIGHT - db LEFT - db UP - db DOWN - db STANDING - db STANDING - db STANDING - db STANDING - -.asm_10124 + db RIGHT ; COLL_WALK_RIGHT_ALT + db LEFT ; COLL_WALK_LEFT_ALT + db UP ; COLL_WALK_UP_ALT + db DOWN ; COLL_WALK_DOWN_ALT + db STANDING ; COLL_BRAKE_ALT + db STANDING ; COLL_BRAKE_55 + db STANDING ; COLL_BRAKE_56 + db STANDING ; COLL_BRAKE_57 + +.warps ld a, c - cp $71 - jr z, .asm_10135 - cp $79 - jr z, .asm_10135 - cp $7a - jr z, .asm_10135 - cp $7b - jr nz, .asm_1013c -.asm_10135 - ld a, $0 + cp COLL_DOOR + jr z, .down + cp COLL_DOOR_79 + jr z, .down + cp COLL_STAIRCASE + jr z, .down + cp COLL_CAVE + jr nz, .no_walk + +.down + ld a, DOWN ld [wWalkingDirection], a - jr .asm_1013e + jr .continue_walk -.asm_1013c +.no_walk xor a ret -.asm_1013e - ld a, $1 - call Function1025f - ld a, $5 +.continue_walk + ld a, STEP_WALK + call .DoStep + ld a, PLAYERMOVEMENT_CONTINUE scf ret -Function10147: ; 10147 (4:4147) +.CheckTurning: +; If the player is turning, change direction first. This also lets +; the player change facing without moving by tapping a direction. + ld a, [wPlayerTurningDirection] - cp $0 - jr nz, .asm_10169 + cp 0 + jr nz, .not_turning ld a, [wWalkingDirection] - cp $ff - jr z, .asm_10169 + cp STANDING + jr z, .not_turning + ld e, a ld a, [wPlayerDirection] rrca rrca - and $3 + maskbits NUM_DIRECTIONS cp e - jr z, .asm_10169 - ld a, $5 - call Function1025f - ld a, $2 + jr z, .not_turning + + ld a, STEP_TURN + call .DoStep + ld a, PLAYERMOVEMENT_TURN scf ret -.asm_10169 +.not_turning xor a ret -Function1016b: ; 1016b (4:416b) +.TryStep: +; Surfing actually calls .TrySurf directly instead of passing through here. ld a, [wPlayerState] - cp $4 - jr z, Function101c0 - cp $8 - jr z, Function101c0 - call Function1039e - jr c, .asm_101be - call Function10341 + cp PLAYER_SURF + jr z, .TrySurf + cp PLAYER_SURF_PIKA + jr z, .TrySurf + + call .CheckLandPerms + jr c, .bump + + call .CheckNPC and a - jr z, .asm_101be - cp $2 - jr z, .asm_101be + jr z, .bump + cp 2 + jr z, .bump + ld a, [wPlayerStandingTile] call CheckIceTile - jr nc, .asm_101b5 - call Function103ca - jr nz, .asm_101ae + jr nc, .ice + +; Downhill riding is slower when not moving down. + call .BikeCheck + jr nz, .walk + ld hl, wBikeFlags - bit 2, [hl] - jr z, .asm_101a7 + bit BIKEFLAGS_DOWNHILL_F, [hl] + jr z, .fast + ld a, [wWalkingDirection] - cp $0 - jr z, .asm_101a7 - ld a, $1 - call Function1025f + cp DOWN + jr z, .fast + + ld a, STEP_WALK + call .DoStep scf ret -.asm_101a7 - ld a, $2 - call Function1025f +.fast + ld a, STEP_BIKE + call .DoStep scf ret -.asm_101ae - ld a, $1 - call Function1025f +.walk + ld a, STEP_WALK + call .DoStep scf ret -.asm_101b5 - ld a, $4 - call Function1025f +.ice + ld a, STEP_ICE + call .DoStep scf ret +; unused xor a ret -.asm_101be +.bump xor a ret -Function101c0: ; 101c0 (4:41c0) - call Function103b4 +.TrySurf: + call .CheckSurfPerms ld [wWalkingIntoLand], a - jr c, .asm_101f1 - call Function10341 + jr c, .surf_bump + + call .CheckNPC ld [wWalkingIntoNPC], a and a - jr z, .asm_101f1 - cp $2 - jr z, .asm_101f1 + jr z, .surf_bump + cp 2 + jr z, .surf_bump + ld a, [wWalkingIntoLand] and a - jr nz, .asm_101e2 - ld a, $1 - call Function1025f + jr nz, .ExitWater + + ld a, STEP_WALK + call .DoStep scf ret -.asm_101e2 - call Function103f9 +.ExitWater: + call .GetOutOfWater call PlayMapMusic - ld a, $1 - call Function1025f - ld a, $6 + ld a, STEP_WALK + call .DoStep + ld a, PLAYERMOVEMENT_EXIT_WATER scf ret -.asm_101f1 +.surf_bump xor a ret -Function101f3: ; 101f3 (4:41f3) +.TryJump: ld a, [wPlayerStandingTile] ld e, a and $f0 - cp $a0 - jr nz, .asm_1021c + cp HI_NYBBLE_LEDGES + jr nz, .DontJump + ld a, e - and $7 + and 7 ld e, a - ld d, $0 + ld d, 0 ld hl, .data_1021e add hl, de ld a, [wFacingDirection] and [hl] - jr z, .asm_1021c - ld de, $16 + jr z, .DontJump + + ld de, SFX_JUMP_OVER_LEDGE call PlaySFX - ld a, $3 - call Function1025f - ld a, $7 + ld a, STEP_LEDGE + call .DoStep + ld a, PLAYERMOVEMENT_JUMP scf ret -.asm_1021c +.DontJump: xor a ret .data_1021e - 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 - -Function10226: ; 10226 (4:4226) + db FACE_RIGHT ; COLL_HOP_RIGHT + db FACE_LEFT ; COLL_HOP_LEFT + db FACE_UP ; COLL_HOP_UP + db FACE_DOWN ; COLL_HOP_DOWN + db FACE_RIGHT | FACE_DOWN ; COLL_HOP_DOWN_RIGHT + db FACE_DOWN | FACE_LEFT ; COLL_HOP_DOWN_LEFT + db FACE_UP | FACE_RIGHT ; COLL_HOP_UP_RIGHT + db FACE_UP | FACE_LEFT ; COLL_HOP_UP_LEFT + +.CheckWarp: +; Bug: Since no case is made for STANDING here, it will check +; [.edgewarps + $ff]. This resolves to $3e at $8035a. +; This causes wWalkingIntoEdgeWarp to be nonzero when standing on tile $3e, +; making bumps silent. + ld a, [wWalkingDirection] + ; cp STANDING + ; jr z, .not_warp ld e, a - ld d, $0 - ld hl, .edge_warps + ld d, 0 + ld hl, .EdgeWarps add hl, de ld a, [wPlayerStandingTile] cp [hl] - jr nz, .asm_10259 - ld a, $1 + jr nz, .not_warp + + ld a, TRUE ld [wWalkingIntoEdgeWarp], a ld a, [wWalkingDirection] - cp $ff - jr z, .asm_10259 + ; This is in the wrong place. + cp STANDING + jr z, .not_warp + ld e, a ld a, [wPlayerDirection] rrca rrca - and $3 + maskbits NUM_DIRECTIONS cp e - jr nz, .asm_10259 + jr nz, .not_warp call WarpCheck - jr nc, .asm_10259 - call Function102b3 + jr nc, .not_warp + + call .StandInPlace scf - ld a, $1 + ld a, PLAYERMOVEMENT_WARP ret -.asm_10259 - xor a +.not_warp + xor a ; PLAYERMOVEMENT_NORMAL ret -.edge_warps - db $70, $78, $76, $7e +.EdgeWarps: + db COLL_WARP_CARPET_DOWN + db COLL_WARP_CARPET_UP + db COLL_WARP_CARPET_LEFT + db COLL_WARP_CARPET_RIGHT -Function1025f: ; 1025f (4:425f) +.DoStep: ld e, a - ld d, $0 + ld d, 0 ld hl, .Steps add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a + ld a, [wWalkingDirection] ld e, a - cp $ff - jp z, Function102b3 + cp STANDING + jp z, .StandInPlace + add hl, de ld a, [hl] ld [wMovementAnimation], a - ld hl, $42af + + ld hl, .FinishFacing add hl, de ld a, [hl] ld [wPlayerTurningDirection], a - ld a, $4 + + ld a, PLAYERMOVEMENT_FINISH ret .Steps: +; entries correspond to STEP_* constants dw .SlowStep dw .NormalStep dw .FastStep @@ -461,41 +515,44 @@ Function1025f: ; 1025f (4:425f) turn_step LEFT turn_step RIGHT .FinishFacing: - db $80 + DOWN - db $80 + UP - db $80 + LEFT - db $80 + RIGHT + db $80 | DOWN + db $80 | UP + db $80 | LEFT + db $80 | RIGHT -Function102b3: ; 102b3 (4:42b3) - ld a, $0 +.StandInPlace: + ld a, 0 ld [wPlayerTurningDirection], a - ld a, $3e + ld a, movement_step_sleep ld [wMovementAnimation], a xor a ret -Function102bf: ; 102bf (4:42bf) - ld a, $0 +._WalkInPlace: + ld a, 0 ld [wPlayerTurningDirection], a - ld a, $50 + ld a, movement_step_bump ld [wMovementAnimation], a xor a ret -Function102cb: ; 102cb (4:42cb) +.CheckForced: +; When sliding on ice, input is forced to remain in the same direction. + call CheckStandingOnIce ret nc + ld a, [wPlayerTurningDirection] -.asm_102d2 - cp $0 + cp 0 ret z - and $3 + + maskbits NUM_DIRECTIONS ld e, a - ld d, $0 + ld d, 0 ld hl, .forced_dpad add hl, de ld a, [wCurInput] - and $f + and BUTTONS or [hl] ld [wCurInput], a ret @@ -503,30 +560,29 @@ Function102cb: ; 102cb (4:42cb) .forced_dpad db D_DOWN, D_UP, D_LEFT, D_RIGHT -Function102ec: ; 102ec (4:42ec) - ld hl, .table - ld de, .table2 - .table1 +.GetAction: +; Poll player input and update movement info. + + ld hl, .action_table + ld de, .action_table_1_end - .action_table_1 ld a, [wCurInput] - bit 7, a - jr nz, .asm_10307 - bit 6, a - jr nz, .asm_10308 -.asm_102fc - bit 5, a - jr nz, .asm_10309 - bit 4, a - jr nz, .asm_1030a - jr .asm_1030b - -.asm_10307 - add hl, de -.asm_10308 - add hl, de -.asm_10309 - add hl, de -.asm_1030a - add hl, de -.asm_1030b + 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 [wWalkingDirection], a ld a, [hli] @@ -539,197 +595,224 @@ Function102ec: ; 102ec (4:42ec) ld h, [hl] ld l, a ld a, [hl] - ld [wWinTextPointer], a - ret - -.table -; struct: -; walk direction -; facing -; x movement -; y movement -; tile collision pointer -.table1 - db STANDING, FACE_CURRENT, 0, 0 - dw wPlayerStandingTile -.table2 - db RIGHT, FACE_RIGHT, 1, 0 - dw wTileRight - db LEFT, FACE_LEFT, -1, 0 - dw wTileLeft - db UP, FACE_UP, 0, -1 - dw wTileUp - db DOWN, FACE_DOWN, 0, 1 - dw wTileDown - -Function10341: ; 10341 (4:4341) + ld [wWalkingTile], a + ret + +player_action: MACRO +; walk direction, facing, x movement, y movement, tile collision pointer + db \1, \2, \3, \4 + dw \5 +ENDM + +.action_table: +.action_table_1 + player_action STANDING, FACE_CURRENT, 0, 0, wPlayerStandingTile +.action_table_1_end + player_action RIGHT, FACE_RIGHT, 1, 0, wTileRight + player_action LEFT, FACE_LEFT, -1, 0, wTileLeft + player_action UP, FACE_UP, 0, -1, wTileUp + player_action DOWN, FACE_DOWN, 0, 1, wTileDown + +.CheckNPC: +; 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 ldh [hMapObjectIndexBuffer], a +; Load the next X coordinate into d ld a, [wPlayerStandingMapX] ld d, a ld a, [wWalkingX] add d ld d, a +; Load the next Y coordinate into e ld a, [wPlayerStandingMapY] ld e, a ld a, [wWalkingY] add e ld e, a - ld bc, wPlayerSprite - farcall Function7120 - jr nc, .asm_10369 - call Function1036f - jr c, .asm_1036c +; Find an object struct with coordinates equal to d,e + ld bc, wObjectStructs ; redundant + farcall IsNPCAtCoord + jr nc, .is_npc + call .CheckStrengthBoulder + jr c, .no_bump + xor a ret -.asm_10369 - ld a, $1 +.is_npc + ld a, 1 ret -.asm_1036c - ld a, $2 +.no_bump + ld a, 2 ret -Function1036f: ; 1036f (4:436f) +.CheckStrengthBoulder: ld hl, wBikeFlags - bit 0, [hl] - jr z, .asm_1039c - ld hl, $7 + bit BIKEFLAGS_STRENGTH_ACTIVE_F, [hl] + jr z, .not_boulder + + ld hl, OBJECT_DIRECTION_WALKING add hl, bc ld a, [hl] - cp $ff - jr nz, .asm_1039c - ld hl, $6 + cp STANDING + jr nz, .not_boulder + + ld hl, OBJECT_PALETTE add hl, bc - bit 6, [hl] - jr z, .asm_1039c - ld hl, $5 + bit STRENGTH_BOULDER_F, [hl] + jr z, .not_boulder + + ld hl, OBJECT_FLAGS2 add hl, bc set 2, [hl] + ld a, [wWalkingDirection] ld d, a - ld hl, $20 + ld hl, OBJECT_RANGE add hl, bc ld a, [hl] - and $fc + and %11111100 or d ld [hl], a + scf ret -.asm_1039c +.not_boulder xor a ret -Function1039e: ; 1039e (4:439e) +.CheckLandPerms: +; Return 0 if walking onto land and tile permissions allow it. +; Otherwise, return carry. + ld a, [wTilePermissions] ld d, a ld a, [wFacingDirection] and d - jr nz, .asm_103b2 - ld a, [wWinTextPointer] - call Function103d3 - jr c, .asm_103b2 + jr nz, .NotWalkable + + ld a, [wWalkingTile] + call .CheckWalkable + jr c, .NotWalkable + xor a ret -.asm_103b2 +.NotWalkable: scf ret -Function103b4: ; 103b4 (4:43b4) +.CheckSurfPerms: +; Return 0 if moving in water, or 1 if moving onto land. +; Otherwise, return carry. + ld a, [wTilePermissions] ld d, a ld a, [wFacingDirection] and d - jr nz, .asm_103c8 - ld a, [wWinTextPointer] - call Function103da - jr c, .asm_103c8 + jr nz, .NotSurfable + + ld a, [wWalkingTile] + call .CheckSurfable + jr c, .NotSurfable + and a ret -.asm_103c8 +.NotSurfable: scf ret -Function103ca: ; 103ca (4:43ca) +.BikeCheck: ld a, [wPlayerState] - cp $1 + cp PLAYER_BIKE ret z - cp $2 + cp PLAYER_SKATE ret -Function103d3: ; 103d3 (4:43d3) +.CheckWalkable: +; Return 0 if tile a is land. Otherwise, return carry. + call GetTileCollision - and a + and a ; LAND_TILE ret z scf ret -Function103da: ; 103da (4:43da) +.CheckSurfable: +; Return 0 if tile a is water, or 1 if land. +; Otherwise, return carry. + call GetTileCollision - cp $1 - jr z, .asm_103e6 - and a - jr z, .asm_103e8 - jr .asm_103ec + cp WATER_TILE + jr z, .Water + +; Can walk back onto land from water. + and a ; LAND_TILE + jr z, .Land -.asm_103e6 + jr .Neither + +.Water: xor a ret -.asm_103e8 - ld a, $1 +.Land: + ld a, 1 and a ret -.asm_103ec +.Neither: scf ret -Function103ee: ; 103ee (4:43ee) +.BumpSound: call CheckSFX ret c - ld de, $24 + ld de, SFX_BUMP call PlaySFX ret -Function103f9: ; 103f9 (4:43f9) +.GetOutOfWater: push bc - ld a, $0 + ld a, PLAYER_NORMAL ld [wPlayerState], a - call ReplaceChrisSprite + call ReplaceChrisSprite ; UpdateSprites pop bc ret CheckStandingOnIce:: ld a, [wPlayerTurningDirection] - cp $0 - jr z, .asm_10420 + cp 0 + jr z, .not_ice cp $f0 - jr z, .asm_10420 + jr z, .not_ice ld a, [wPlayerStandingTile] call CheckIceTile - jr nc, .asm_1041e + jr nc, .yep ld a, [wPlayerState] - cp $2 - jr nz, .asm_10420 -.asm_1041e + cp PLAYER_SKATE + jr nz, .not_ice + +.yep scf ret -.asm_10420 +.not_ice and a ret StopPlayerForEvent:: ld hl, wPlayerNextMovement - ld a, $3e + ld a, movement_step_sleep cp [hl] ret z + ld [hl], a - ld a, $0 + ld a, 0 ld [wPlayerTurningDirection], a ret diff --git a/engine/overworld/player_object.asm b/engine/overworld/player_object.asm index 627e3d3f..28323eba 100755 --- a/engine/overworld/player_object.asm +++ b/engine/overworld/player_object.asm @@ -5,38 +5,38 @@ BlankScreen: call ClearBGPalettes call ClearSprites hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld bc, wTilemapEnd - wTilemap ld a, " " call ByteFill - ld hl, wAttrmap - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + hlcoord 0, 0, wAttrmap + ld bc, wAttrmapEnd - wAttrmap ld a, $7 call ByteFill call WaitBGMap2 call SetPalettes ret -SpawnPlayer: ; 861a (2:461a) - ld a, $ff +SpawnPlayer: + ld a, -1 ld [wObjectFollow_Leader], a ld [wObjectFollow_Follower], a - ld a, $0 - ld hl, .PlayerObjectTemplate + ld a, PLAYER + ld hl, PlayerObjectTemplate call CopyPlayerObjectTemplate - ld b, $0 + ld b, PLAYER call PlayerSpawn_ConvertCoords - ld a, $0 + ld a, PLAYER_OBJECT ldh [hObjectStructIndexBuffer], a ld de, wObjectStructs - ld a, $0 + ld a, PLAYER_OBJECT ldh [hMapObjectIndexBuffer], a ld bc, wMapObjects call CopyMapObjectToObjectStruct - ld a, $0 + ld a, PLAYER ld [wCenteredObject], a ret -.PlayerObjectTemplate +PlayerObjectTemplate: ; A dummy map object used to initialize the player object. ; Shorter than the actual amount copied by two bytes. ; Said bytes seem to be unused. @@ -47,10 +47,10 @@ CopyDECoordsToMapObject:: ld a, b call GetMapObject pop de - ld hl, $3 + ld hl, MAPOBJECT_X_COORD add hl, bc ld [hl], d - ld hl, $2 + ld hl, MAPOBJECT_Y_COORD add hl, bc ld [hl], e ret @@ -58,10 +58,10 @@ CopyDECoordsToMapObject:: PlayerSpawn_ConvertCoords: push bc ld a, [wXCoord] - add $4 + add 4 ld d, a ld a, [wYCoord] - add $4 + add 4 ld e, a pop bc call CopyDECoordsToMapObject @@ -71,13 +71,14 @@ WriteObjectXY:: ld a, b call CheckObjectVisibility ret c - ld hl, $10 + + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld d, [hl] - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld e, [hl] - ldh a, [hConnectionStripLength] + ldh a, [hMapObjectIndexBuffer] ld b, a call CopyDECoordsToMapObject and a @@ -85,23 +86,23 @@ WriteObjectXY:: RefreshPlayerCoords: ld a, [wXCoord] - add $4 + add 4 ld d, a ld hl, wPlayerStandingMapX sub [hl] ld [hl], d - ld hl, wPlayerObjectXCoord + ld hl, wMapObjects + MAPOBJECT_X_COORD ld [hl], d ld hl, wPlayerLastMapX ld [hl], d ld d, a ld a, [wYCoord] - add $4 + add 4 ld e, a ld hl, wPlayerStandingMapY sub [hl] ld [hl], e - ld hl, wPlayerObjectYCoord + ld hl, wMapObjects + MAPOBJECT_Y_COORD ld [hl], e ld hl, wPlayerLastMapY ld [hl], e @@ -112,340 +113,375 @@ RefreshPlayerCoords: ret SpawnPlayer2: - ld a, $1 + ld a, 1 ld hl, .PlayerObjectTemplate call CopyPlayerObjectTemplate - ld b, $1 + ld b, 1 call PlayerSpawn_ConvertCoords ret .PlayerObjectTemplate: object_event -4, -4, SPRITE_CHRIS, SPRITEMOVEDATA_12, 15, 15, -1, -1, 0, OBJECTTYPE_SCRIPT, 0, 0, -1 -CopyObjectStruct:: ; 86d7 (2:46d7) +CopyObjectStruct:: call CheckObjectMask and a - ret nz - ld hl, wPlayerStructEnd - ld a, $1 - ld de, $28 -.asm_86e4 + ret nz ; masked + + ld hl, wObjectStructs + OBJECT_LENGTH * 1 + ld a, 1 + ld de, OBJECT_LENGTH +.loop ldh [hObjectStructIndexBuffer], a ld a, [hl] and a - jr z, .asm_86f4 + jr z, .done add hl, de - ldh a, [hConnectedMapWidth] + ldh a, [hObjectStructIndexBuffer] inc a - cp $d - jr nz, .asm_86e4 + cp NUM_OBJECT_STRUCTS + jr nz, .loop scf - ret + ret ; overflow -.asm_86f4 +.done ld d, h ld e, l call CopyMapObjectToObjectStruct ld a, [wVramState] bit 7, a ret z - ld hl, $5 + + ld hl, OBJECT_FLAGS2 add hl, de set 5, [hl] ret -CopyMapObjectToObjectStruct: ; 8706 (2:4706) - call CopyMapObjectToTempObject +CopyMapObjectToObjectStruct: + call .CopyMapObjectToTempObject call CopyTempObjectToObjectStruct ret -CopyMapObjectToTempObject: ; 870d (2:470d) - ldh a, [hConnectedMapWidth] - ld hl, $0 +.CopyMapObjectToTempObject: + ldh a, [hObjectStructIndexBuffer] + ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld [hl], a + ldh a, [hMapObjectIndexBuffer] ld [wTempObjectCopyMapObjectIndex], a - ld hl, $1 + + ld hl, MAPOBJECT_SPRITE add hl, bc ld a, [hl] - ld [wce9a], a + ld [wTempObjectCopySprite], a + call GetSpriteVTile - ld [wce9b], a + ld [wTempObjectCopySpriteVTile], a + ld a, [hl] call GetSpritePalette - ld [wce9c], a - ld hl, $8 + ld [wTempObjectCopyPalette], a + + ld hl, MAPOBJECT_COLOR add hl, bc ld a, [hl] and $f0 - jr z, .asm_873e + jr z, .skip_color_override swap a - and $7 - ld [wce9c], a -.asm_873e - ld hl, $4 + and PALETTE_MASK + ld [wTempObjectCopyPalette], a + +.skip_color_override + ld hl, MAPOBJECT_MOVEMENT add hl, bc ld a, [hl] - ld [wce9d], a - ld hl, $9 + ld [wTempObjectCopyMovement], a + + ld hl, MAPOBJECT_RANGE add hl, bc ld a, [hl] ld [wTempObjectCopyRange], a - ld hl, $3 + + ld hl, MAPOBJECT_X_COORD add hl, bc ld a, [hl] - ld [wce9f], a - ld hl, $2 + ld [wTempObjectCopyX], a + + ld hl, MAPOBJECT_Y_COORD add hl, bc ld a, [hl] - ld [wcea0], a - ld hl, $5 + ld [wTempObjectCopyY], a + + ld hl, MAPOBJECT_RADIUS add hl, bc ld a, [hl] - ld [wcea1], a + ld [wTempObjectCopyRadius], a ret InitializeVisibleSprites: ld bc, wMap2Object - ld a, $2 -.asm_876c - ldh [hConnectionStripLength], a - ld hl, $1 + ld a, 2 +.loop + ldh [hMapObjectIndexBuffer], a + ld hl, MAPOBJECT_SPRITE add hl, bc ld a, [hl] and a - jr z, .asm_87ab - ld hl, $0 + jr z, .next + + ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] - cp $ff - jr nz, .asm_87ab + cp -1 + jr nz, .next + ld a, [wXCoord] ld d, a ld a, [wYCoord] ld e, a - ld hl, $3 + + ld hl, MAPOBJECT_X_COORD add hl, bc ld a, [hl] - add $1 + add 1 sub d - jr c, .asm_87ab - cp $c - jr nc, .asm_87ab - ld hl, $2 + jr c, .next + + cp MAPOBJECT_SCREEN_WIDTH + jr nc, .next + + ld hl, MAPOBJECT_Y_COORD add hl, bc ld a, [hl] - add $1 + add 1 sub e - jr c, .asm_87ab - cp $b - jr nc, .asm_87ab + jr c, .next + + cp MAPOBJECT_SCREEN_HEIGHT + jr nc, .next + push bc call CopyObjectStruct pop bc - jp c, Function87b9 -.asm_87ab - ld hl, $10 + jp c, .ret + +.next + ld hl, MAPOBJECT_LENGTH add hl, bc ld b, h ld c, l ldh a, [hMapObjectIndexBuffer] inc a - cp $10 - jr nz, .asm_876c + cp NUM_OBJECTS + jr nz, .loop ret -Function87b9: ; 87b9 (2:47b9) +.ret ret CheckObjectEnteringVisibleRange:: nop ld a, [wPlayerStepDirection] - cp $ff + cp STANDING ret z - ld hl, .Jumptable + ld hl, .dw rst JumpTable ret -.Jumptable: - dw Function87d5 - dw Function87ce - dw Function8822 - dw Function8829 +.dw + dw .Down + dw .Up + dw .Left + dw .Right -Function87ce: +.Up: ld a, [wYCoord] - sub $1 - jr asm_87da + sub 1 + jr .Vertical -Function87d5: +.Down: ld a, [wYCoord] - add $9 -asm_87da: + add 9 +.Vertical: ld d, a ld a, [wXCoord] ld e, a ld bc, wMap2Object - ld a, $2 -.asm_87e4 - ldh [hConnectionStripLength], a - ld hl, $1 + ld a, 2 +.loop_v + ldh [hMapObjectIndexBuffer], a + ld hl, MAPOBJECT_SPRITE add hl, bc ld a, [hl] and a - jr z, .asm_8814 - ld hl, $2 + jr z, .next_v + ld hl, MAPOBJECT_Y_COORD add hl, bc ld a, d cp [hl] - jr nz, .asm_8814 - ld hl, $0 + jr nz, .next_v + ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] - cp $ff - jr nz, .asm_8814 - ld hl, $3 + cp -1 + jr nz, .next_v + ld hl, MAPOBJECT_X_COORD add hl, bc ld a, [hl] - add $1 + add 1 sub e - jr c, .asm_8814 - cp $c - jr nc, .asm_8814 + jr c, .next_v + cp MAPOBJECT_SCREEN_WIDTH + jr nc, .next_v push de push bc call CopyObjectStruct pop bc pop de -.asm_8814 - ld hl, $10 + +.next_v + ld hl, MAPOBJECT_LENGTH add hl, bc ld b, h ld c, l ldh a, [hMapObjectIndexBuffer] inc a - cp $10 - jr nz, .asm_87e4 + cp NUM_OBJECTS + jr nz, .loop_v ret -Function8822: +.Left: ld a, [wXCoord] - sub $1 - jr asm_882e + sub 1 + jr .Horizontal -Function8829: +.Right: ld a, [wXCoord] - add $a -asm_882e: + add 10 +.Horizontal: ld e, a ld a, [wYCoord] ld d, a ld bc, wMap2Object - ld a, $2 -.asm_8838 - ldh [hConnectionStripLength], a - ld hl, $1 + ld a, 2 +.loop_h + ldh [hMapObjectIndexBuffer], a + ld hl, MAPOBJECT_SPRITE add hl, bc ld a, [hl] and a - jr z, .asm_8868 - ld hl, $3 + jr z, .next_h + ld hl, MAPOBJECT_X_COORD add hl, bc ld a, e cp [hl] - jr nz, .asm_8868 - ld hl, $0 + jr nz, .next_h + ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] - cp $ff - jr nz, .asm_8868 - ld hl, $2 + cp -1 + jr nz, .next_h + ld hl, MAPOBJECT_Y_COORD add hl, bc ld a, [hl] - add $1 + add 1 sub d - jr c, .asm_8868 - cp $b - jr nc, .asm_8868 + jr c, .next_h + cp MAPOBJECT_SCREEN_HEIGHT + jr nc, .next_h push de push bc call CopyObjectStruct pop bc pop de -.asm_8868 - ld hl, $10 + +.next_h + ld hl, MAPOBJECT_LENGTH add hl, bc ld b, h ld c, l - ldh a, [hConnectionStripLength] + ldh a, [hMapObjectIndexBuffer] inc a - cp $10 - jr nz, .asm_8838 + cp NUM_OBJECTS + jr nz, .loop_h ret -CopyTempObjectToObjectStruct: ; 8876 (2:4876) +CopyTempObjectToObjectStruct: ld a, [wTempObjectCopyMapObjectIndex] - ld hl, $1 + ld hl, OBJECT_MAP_OBJECT_INDEX add hl, de ld [hl], a - ld a, [wce9d] + + ld a, [wTempObjectCopyMovement] call CopySpriteMovementData - ld a, [wce9c] - ld hl, $6 + + ld a, [wTempObjectCopyPalette] + ld hl, OBJECT_PALETTE add hl, de or [hl] ld [hl], a - ld a, [wcea0] - call InitTempObjectYCoord - ld a, [wce9f] - call InitTempObjectXCoord - ld a, [wce9a] - ld hl, $0 + + ld a, [wTempObjectCopyY] + call .InitYCoord + + ld a, [wTempObjectCopyX] + call .InitXCoord + + ld a, [wTempObjectCopySprite] + ld hl, OBJECT_SPRITE add hl, de ld [hl], a - ld a, [wce9b] - ld hl, $2 + + ld a, [wTempObjectCopySpriteVTile] + ld hl, OBJECT_SPRITE_TILE add hl, de ld [hl], a - ld hl, $9 + + ld hl, OBJECT_STEP_TYPE add hl, de - ld [hl], $0 - ld hl, $d + ld [hl], STEP_TYPE_00 + + ld hl, OBJECT_FACING_STEP add hl, de - ld [hl], $ff - ld a, [wcea1] - call InitTempObjectRadius + ld [hl], STANDING + + ld a, [wTempObjectCopyRadius] + call .InitRadius + ld a, [wTempObjectCopyRange] - ld hl, $20 + ld hl, OBJECT_RANGE add hl, de ld [hl], a + and a ret -InitTempObjectYCoord: ; 88c5 (2:48c5) - ld hl, $15 +.InitYCoord: + ld hl, OBJECT_INIT_Y add hl, de ld [hl], a - ld hl, $11 + + ld hl, OBJECT_NEXT_MAP_Y add hl, de ld [hl], a + ld hl, wYCoord sub [hl] and $f swap a ld hl, wPlayerBGMapOffsetY sub [hl] - ld hl, $18 + ld hl, OBJECT_SPRITE_Y add hl, de ld [hl], a ret -InitTempObjectXCoord: ; 88e1 (2:48e1) - ld hl, $14 +.InitXCoord: + ld hl, OBJECT_INIT_X add hl, de ld [hl], a - ld hl, $10 + ld hl, OBJECT_NEXT_MAP_X add hl, de ld [hl], a ld hl, wXCoord @@ -454,12 +490,12 @@ InitTempObjectXCoord: ; 88e1 (2:48e1) swap a ld hl, wPlayerBGMapOffsetX sub [hl] - ld hl, $17 + ld hl, OBJECT_SPRITE_X add hl, de ld [hl], a ret -InitTempObjectRadius: ; 88fd (2:48fd) +.InitRadius: ld h, a inc a and $f @@ -468,7 +504,7 @@ InitTempObjectRadius: ; 88fd (2:48fd) add $10 and $f0 or l - ld hl, $16 + ld hl, OBJECT_RADIUS add hl, de ld [hl], a ret @@ -480,75 +516,84 @@ TrainerWalkToPlayer:: call AppendToMovementBuffer ld a, [wWalkingIntoNPC] dec a - jr z, .asm_892b + jr z, .TerminateStep ldh a, [hLastTalked] ld b, a ld c, PLAYER - ld d, $1 - call GetTrainerPathToPlayer + ld d, 1 + call .GetPathToPlayer call DecrementMovementBufferCount -.asm_892b + +.TerminateStep: ld a, movement_step_end call AppendToMovementBuffer ret -GetTrainerPathToPlayer: ; 8931 (2:4931) +.GetPathToPlayer: push de push bc +; get player object struct, load to de ld a, c call GetMapObject - ld hl, $0 + ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] call GetObjectStruct ld d, b ld e, c + +; get last talked object struct, load to bc pop bc ld a, b call GetMapObject - ld hl, $0 + ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] call GetObjectStruct - ld hl, $10 + +; get last talked coords, load to bc + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, [hl] - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld c, [hl] ld b, a - ld hl, $10 + +; get player coords, load to de + ld hl, OBJECT_NEXT_MAP_X add hl, de ld a, [hl] - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, de ld e, [hl] ld d, a + pop af call ComputePathToWalkToPlayer ret -SurfStartStep: ; 8969 (2:4969) +SurfStartStep: call InitMovementBuffer - call GetInitialSurfStep + call .GetMovementData call AppendToMovementBuffer ld a, movement_step_end call AppendToMovementBuffer ret -GetInitialSurfStep: ; 8978 (2:4978) +.GetMovementData: ld a, [wPlayerDirection] srl a srl a - and $3 + maskbits NUM_DIRECTIONS ld e, a - ld d, $0 - ld hl, .Data ; $498a + ld d, 0 + ld hl, .movement_data add hl, de ld a, [hl] ret -.Data +.movement_data slow_step DOWN slow_step UP slow_step LEFT @@ -562,43 +607,48 @@ FollowNotExact:: ld e, c pop bc ret c + ld a, b call CheckObjectVisibility ret c - ld hl, $10 + +; object 2 is now in bc, object 1 is now in de + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, [hl] - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld c, [hl] ld b, a - ld hl, $10 + + ld hl, OBJECT_NEXT_MAP_X add hl, de ld a, [hl] cp b - jr z, .asm_89b7 - jr c, .asm_89b4 + jr z, .same_x + jr c, .to_the_left inc b - jr .asm_89c5 + jr .continue -.asm_89b4 +.to_the_left dec b - jr .asm_89c5 + jr .continue -.asm_89b7 - ld hl, $11 +.same_x + ld hl, OBJECT_NEXT_MAP_Y add hl, de ld a, [hl] cp c - jr z, .asm_89c5 - jr c, .asm_89c4 + jr z, .continue + jr c, .below inc c - jr .asm_89c5 + jr .continue -.asm_89c4 +.below dec c -.asm_89c5 - ld hl, $10 + +.continue + ld hl, OBJECT_NEXT_MAP_X add hl, de ld [hl], b ld a, b @@ -608,10 +658,10 @@ FollowNotExact:: swap a ld hl, wPlayerBGMapOffsetX sub [hl] - ld hl, $17 + ld hl, OBJECT_SPRITE_X add hl, de ld [hl], a - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, de ld [hl], c ld a, c @@ -621,169 +671,182 @@ FollowNotExact:: swap a ld hl, wPlayerBGMapOffsetY sub [hl] - ld hl, $18 + ld hl, OBJECT_SPRITE_Y add hl, de ld [hl], a ldh a, [hObjectStructIndexBuffer] - ld hl, $20 + ld hl, OBJECT_RANGE add hl, de ld [hl], a - ld hl, $3 + ld hl, OBJECT_MOVEMENTTYPE add hl, de - ld [hl], $1a - ld hl, $9 + ld [hl], SPRITEMOVEDATA_FOLLOWNOTEXACT + ld hl, OBJECT_STEP_TYPE add hl, de - ld [hl], $0 + ld [hl], STEP_TYPE_00 ret GetRelativeFacing:: +; Determines which way map object e would have to turn to face map object d. Returns carry if it's impossible for whatever reason. ld a, d call GetMapObject - ld hl, $0 + ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] - cp $d - jr nc, .asm_8a27 + cp NUM_OBJECT_STRUCTS + jr nc, .carry ld d, a ld a, e call GetMapObject - ld hl, $0 + ld hl, MAPOBJECT_OBJECT_STRUCT_ID add hl, bc ld a, [hl] - cp $d - jr nc, .asm_8a27 + cp NUM_OBJECT_STRUCTS + jr nc, .carry ld e, a - call GetFacing_e_relativeto_d + call .GetFacing_e_relativeto_d ret -.asm_8a27 +.carry scf ret -GetFacing_e_relativeto_d: ; 8a29 (2:4a29) +.GetFacing_e_relativeto_d: +; Determines which way object e would have to turn to face object d. Returns carry if it's impossible. +; load the coordinates of object d into bc ld a, d call GetObjectStruct - ld hl, $10 + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, [hl] - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld c, [hl] ld b, a push bc +; load the coordinates of object e into de ld a, e call GetObjectStruct - ld hl, $10 + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld d, [hl] - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld e, [hl] pop bc +; |x1 - x2| ld a, b sub d - jr z, .asm_8a5c - jr nc, .asm_8a50 + jr z, .same_x_1 + jr nc, .b_right_of_d_1 cpl inc a -.asm_8a50 + +.b_right_of_d_1 +; |y1 - y2| ld h, a ld a, c sub e - jr z, .asm_8a6a - jr nc, .asm_8a59 + jr z, .same_y_1 + jr nc, .c_below_e_1 cpl inc a -.asm_8a59 + +.c_below_e_1 +; |y1 - y2| - |x1 - x2| sub h - jr c, .asm_8a6a -.asm_8a5c + jr c, .same_y_1 + +.same_x_1 +; compare the y coordinates ld a, c cp e - jr z, .asm_8a78 - jr c, .asm_8a66 - ld d, $0 + jr z, .same_x_and_y + jr c, .c_directly_below_e +; c directly above e + ld d, DOWN and a ret -.asm_8a66 - ld d, $1 +.c_directly_below_e + ld d, UP and a ret -.asm_8a6a +.same_y_1 ld a, b cp d - jr z, .asm_8a78 - jr c, .asm_8a74 - ld d, $3 + jr z, .same_x_and_y + jr c, .b_directly_right_of_d +; b directly left of d + ld d, RIGHT and a ret -.asm_8a74 - ld d, $2 +.b_directly_right_of_d + ld d, LEFT and a ret -.asm_8a78 +.same_x_and_y scf ret -QueueFollowerFirstStep: ; 8a7a (2:4a7a) - call Function8a8d - jr c, .asm_8a87 +QueueFollowerFirstStep: + call .QueueFirstStep + jr c, .same ld [wFollowMovementQueue], a xor a ld [wFollowerMovementQueueLength], a ret -.asm_8a87 - ld a, $ff +.same + ld a, -1 ld [wFollowerMovementQueueLength], a ret -Function8a8d: ; 8a8d (2:4a8d) +.QueueFirstStep: ld a, [wObjectFollow_Leader] call GetObjectStruct - ld hl, $10 + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld d, [hl] - ld hl, $11 + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld e, [hl] ld a, [wObjectFollow_Follower] call GetObjectStruct - ld hl, $10 + ld hl, OBJECT_NEXT_MAP_X add hl, bc ld a, d cp [hl] - jr z, .asm_8ab5 - jr c, .asm_8ab1 + jr z, .check_y + jr c, .left and a - ld a, $f + ld a, movement_step + RIGHT ret -.asm_8ab1 +.left and a - ld a, $e + ld a, movement_step + LEFT ret -.asm_8ab5 - ld hl, $11 +.check_y + ld hl, OBJECT_NEXT_MAP_Y add hl, bc ld a, e cp [hl] - jr z, .asm_8ac7 - jr c, .asm_8ac3 + jr z, .same_xy + jr c, .up and a - ld a, $c + ld a, movement_step + DOWN ret -.asm_8ac3 +.up and a - ld a, $d + ld a, movement_step + UP ret -.asm_8ac7 +.same_xy scf ret diff --git a/engine/overworld/player_step.asm b/engine/overworld/player_step.asm index 2653fd2e..a290730c 100755 --- a/engine/overworld/player_step.asm +++ b/engine/overworld/player_step.asm @@ -2,26 +2,26 @@ _HandlePlayerStep:: ld a, [wPlayerStepFlags] and a ret z - bit 7, a - jr nz, .asm_d4b6 - bit 6, a - jr nz, .asm_d4c0 - bit 5, a - jr nz, .asm_d4c5 + bit PLAYERSTEP_START_F, a + jr nz, .update_overworld_map + bit PLAYERSTEP_STOP_F, a + jr nz, .update_player_coords + bit PLAYERSTEP_CONTINUE_F, a + jr nz, .finish ret -.asm_d4b6 - ld a, $4 +.update_overworld_map + ld a, 4 ld [wHandlePlayerStep], a call UpdateOverworldMap - jr .asm_d4c5 + jr .finish -.asm_d4c0 - call Functiond517 - jr .asm_d4c5 +.update_player_coords + call UpdatePlayerCoords + jr .finish -.asm_d4c5 - call Functiond4f2 +.finish + call HandlePlayerStep ld a, [wPlayerStepVectorX] ld d, a ld a, [wPlayerStepVectorY] @@ -47,7 +47,7 @@ ScrollScreen:: ldh [hSCY], a ret -Functiond4f2: ; d4f2 (3:54f2) +HandlePlayerStep: ld hl, wHandlePlayerStep ld a, [hl] and a @@ -58,49 +58,50 @@ Functiond4f2: ; d4f2 (3:54f2) rst JumpTable ret -.Jumptable +.Jumptable: dw GetMovementPermissions dw BufferScreen - dw Functiond515 - dw Functiond516 - dw Functiond515 - dw Functiond515 - dw Functiond515 - dw Functiond515 - dw Functiond515 - dw Functiond515 - dw Functiond515 + dw .fail1 + dw .fail2 +; The rest are never used. Ever. + dw .fail1 + dw .fail1 + dw .fail1 + dw .fail1 + dw .fail1 + dw .fail1 + dw .fail1 -Functiond515: +.fail1 ret -Functiond516: +.fail2 ret -Functiond517: ; d517 (3:5517) +UpdatePlayerCoords: ld a, [wPlayerStepDirection] and a - jr nz, .asm_d522 + jr nz, .check_step_down ld hl, wYCoord inc [hl] ret -.asm_d522 - cp $1 - jr nz, .asm_d52b +.check_step_down + cp UP + jr nz, .check_step_left ld hl, wYCoord dec [hl] ret -.asm_d52b - cp $2 - jr nz, .asm_d534 +.check_step_left + cp LEFT + jr nz, .check_step_right ld hl, wXCoord dec [hl] ret -.asm_d534 - cp $3 +.check_step_right + cp RIGHT ret nz ld hl, wXCoord inc [hl] diff --git a/engine/overworld/time.asm b/engine/overworld/time.asm index 5798ee20..17ddbd6a 100755 --- a/engine/overworld/time.asm +++ b/engine/overworld/time.asm @@ -1,5 +1,5 @@ -InitializeStartDay_: ; 117f1 (4:57f1) - call Function118c9 +_InitializeStartDay: + call InitializeStartDay ret ClearDailyTimers: @@ -12,38 +12,42 @@ ClearDailyTimers: InitCallReceiveDelay:: xor a ld [wTimeCyclesSinceLastCall], a -Function11804: + +NextCallReceiveDelay: ld a, [wTimeCyclesSinceLastCall] - cp $3 - jr c, .asm_1180d - ld a, $3 -.asm_1180d + cp 3 + jr c, .okay + ld a, 3 + +.okay ld e, a - ld d, $0 + ld d, 0 ld hl, .ReceiveCallDelays add hl, de ld a, [hl] - jp Function11849 + jp RestartReceiveCallDelay .ReceiveCallDelays: db 20, 10, 5, 3 CheckReceiveCallTimer: - call Function11857 + call CheckReceiveCallDelay ; check timer ret nc ld hl, wTimeCyclesSinceLastCall ld a, [hl] - cp $3 - jr nc, .asm_11829 + cp 3 + jr nc, .ok inc [hl] -.asm_11829 - call Function11804 + +.ok + call NextCallReceiveDelay ; restart timer scf ret -Function1182e: ; 1182e (4:582e) - ld a, $1 -Function11830: +InitOneDayCountdown: + ld a, 1 + +InitNDaysCountdown: ld [hl], a push hl call UpdateTime @@ -52,17 +56,17 @@ Function11830: call CopyDayToHL ret -Function1183b: ; 1183b (4:583b) +CheckDayDependentEventHL: inc hl push hl call CalcDaysSince - call Function119b4 + call GetDaysSince pop hl dec hl - call Function11972 + call UpdateTimeRemaining ret -Function11849: ; 11849 (4:5849) +RestartReceiveCallDelay: ld hl, wReceiveCallDelay_MinsRemaining ld [hl], a call UpdateTime @@ -70,32 +74,32 @@ Function11849: ; 11849 (4:5849) call CopyDayHourMinToHL ret -Function11857: ; 11857 (4:5857) +CheckReceiveCallDelay: ld hl, wReceiveCallDelay_StartTime call CalcMinsHoursDaysSince - call Function1199a + call GetMinutesSinceIfLessThan60 ld hl, wReceiveCallDelay_MinsRemaining - call Function11972 + call UpdateTimeRemaining ret -asm_11867: +RestartDailyResetTimer: ld hl, wDailyResetTimer - jp Function1182e + jp InitOneDayCountdown CheckDailyResetTimer:: ld hl, wDailyResetTimer - call Function1183b + call CheckDayDependentEventHL ret nc xor a ld hl, wDailyFlags1 ld [hli], a ld [hl], a - jr asm_11867 + jr RestartDailyResetTimer StartBugContestTimer: - ld a, 20 + ld a, BUG_CONTEST_MINUTES ld [wBugContestMinsRemaining], a - ld a, 0 + ld a, BUG_CONTEST_SECONDS ld [wBugContestSecsRemaining], a call UpdateTime ld hl, wBugContestStartTime @@ -107,35 +111,36 @@ CheckBugContestTimer:: call CalcSecsMinsHoursDaysSince ld a, [wDaysSince] and a - jr nz, .asm_118c0 + jr nz, .timed_out ld a, [wHoursSince] and a - jr nz, .asm_118c0 - ld a, [wSecsSince] + jr nz, .timed_out + ld a, [wSecondsSince] ld b, a ld a, [wBugContestSecsRemaining] sub b - jr nc, .asm_118ae + jr nc, .okay add 60 -.asm_118ae + +.okay ld [wBugContestSecsRemaining], a - ld a, [wMinsSince] + ld a, [wMinutesSince] ld b, a ld a, [wBugContestMinsRemaining] sbc b ld [wBugContestMinsRemaining], a - jr c, .asm_118c0 + jr c, .timed_out and a ret -.asm_118c0 +.timed_out xor a ld [wBugContestMinsRemaining], a ld [wBugContestSecsRemaining], a scf ret -Function118c9: ; 118c9 (4:58c9) +InitializeStartDay: call UpdateTime ld hl, wTimerEventStartDay call CopyDayToHL @@ -144,17 +149,17 @@ Function118c9: ; 118c9 (4:58c9) CheckPokerusTick:: ld hl, wTimerEventStartDay call CalcDaysSince - call Function119b4 + call GetDaysSince and a - jr z, .asm_118e6 + jr z, .done ; not even a day has passed since game start ld b, a - farcall ApplyPokerusTick ; same bank -.asm_118e6 + farcall ApplyPokerusTick +.done xor a ret SetUnusedTwoDayTimer: - ld a, $2 + ld a, 2 ld hl, wUnusedTwoDayTimer ld [hl], a call UpdateTime @@ -162,63 +167,69 @@ SetUnusedTwoDayTimer: call CopyDayToHL ret -Function118f8: ; 118f8 (4:58f8) +CheckUnusedTwoDayTimer: ld hl, wUnusedTwoDayTimerStartDate call CalcDaysSince - call Function119b4 + call GetDaysSince ld hl, wUnusedTwoDayTimer - call Function11972 + call UpdateTimeRemaining ret +; unused ld hl, wDailyFlags1 - set 2, [hl] + set DAILYFLAGS1_FISH_SWARM_F, [hl] ret +; unused and a ld hl, wDailyFlags1 - bit 2, [hl] + bit DAILYFLAGS1_FISH_SWARM_F, [hl] ret nz scf ret -Function11917: ; 11917 (4:5917) - call Function11920 +RestartLuckyNumberCountdown: + call .GetDaysUntilNextFriday ld hl, wLuckyNumberDayBuffer - jp Function11830 + jp InitNDaysCountdown -Function11920: ; 11920 (4:5920) +.GetDaysUntilNextFriday: call GetWeekday ld c, a - ld a, $5 + ld a, FRIDAY sub c - jr z, .asm_1192b - jr nc, .asm_1192d -.asm_1192b - add $7 -.asm_1192d + jr z, .friday_saturday + jr nc, .earlier ; could have done "ret nc" + +.friday_saturday + add 7 + +.earlier ret -Function1192e: ; 1192e (4:592e) +_CheckLuckyNumberShowFlag: ld hl, wLuckyNumberDayBuffer - jp Function1183b + jp CheckDayDependentEventHL -Function11934: ; 11934 (4:5934) +DoMysteryGiftIfDayHasPassed: ld a, BANK(sMysteryGiftTimer) call OpenSRAM ld hl, sMysteryGiftTimer ld a, [hli] - ld [wCurHPAnimMaxHP], a + ld [wBuffer1], a ld a, [hl] ld [wBuffer2], a call CloseSRAM - ld hl, wCurHPAnimMaxHP - call Function1183b - jr nc, .asm_1195e - ld hl, wCurHPAnimMaxHP - call Function1182e + + ld hl, wBuffer1 + call CheckDayDependentEventHL + jr nc, .not_timed_out + ld hl, wBuffer1 + call InitOneDayCountdown call CloseSRAM farcall Function2a4f6 -.asm_1195e + +.not_timed_out ld a, BANK(sMysteryGiftTimer) call OpenSRAM ld hl, wBuffer1 @@ -229,21 +240,24 @@ Function11934: ; 11934 (4:5934) call CloseSRAM ret -Function11972: ; 11972 (4:5972) - cp $ff - jr z, .asm_11981 +UpdateTimeRemaining: +; If the amount of time elapsed exceeds the capacity of its +; unit, skip this part. + cp -1 + jr z, .set_carry ld c, a - ld a, [hl] + ld a, [hl] ; time remaining sub c - jr nc, .asm_1197c + jr nc, .ok xor a -.asm_1197c + +.ok ld [hl], a - jr z, .asm_11981 + jr z, .set_carry xor a ret -.asm_11981 +.set_carry xor a ld [hl], a scf @@ -252,100 +266,103 @@ Function11972: ; 11972 (4:5972) GetSecondsSinceIfLessThan60: ld a, [wDaysSince] and a - jr nz, asm_119b8 + jr nz, GetTimeElapsed_ExceedsUnitLimit ld a, [wHoursSince] and a - jr nz, asm_119b8 - ld a, [wMinsSince] - jr nz, asm_119b8 - ld a, [wSecsSince] + jr nz, GetTimeElapsed_ExceedsUnitLimit + ld a, [wMinutesSince] + jr nz, GetTimeElapsed_ExceedsUnitLimit + ld a, [wSecondsSince] ret -Function1199a: ; 1199a (4:599a) +GetMinutesSinceIfLessThan60: ld a, [wDaysSince] and a - jr nz, asm_119b8 + jr nz, GetTimeElapsed_ExceedsUnitLimit ld a, [wHoursSince] and a - jr nz, asm_119b8 - ld a, [wMinsSince] + jr nz, GetTimeElapsed_ExceedsUnitLimit + ld a, [wMinutesSince] ret GetHoursSinceIfLessThan24: ld a, [wDaysSince] and a - jr nz, asm_119b8 + jr nz, GetTimeElapsed_ExceedsUnitLimit ld a, [wHoursSince] ret -Function119b4: ; 119b4 (4:59b4) +GetDaysSince: ld a, [wDaysSince] ret -asm_119b8: - ld a, $ff +GetTimeElapsed_ExceedsUnitLimit: + ld a, -1 ret -CalcDaysSince: ; 119bb (4:59bb) +CalcDaysSince: xor a - jr CalcDaysSince_ + jr _CalcDaysSince CalcHoursDaysSince: inc hl xor a - jr CalcHoursDaysSince_ + jr _CalcHoursDaysSince -CalcMinsHoursDaysSince: ; 119c2 (4:59c2) +CalcMinsHoursDaysSince: inc hl inc hl xor a - jr CalcMinsHoursDaysSince_ + jr _CalcMinsHoursDaysSince -CalcSecsMinsHoursDaysSince: ; 119c7 (4:59c7) +CalcSecsMinsHoursDaysSince: inc hl inc hl inc hl ldh a, [hSeconds] ld c, a sub [hl] - jr nc, .asm_119d2 + jr nc, .skip add 60 -.asm_119d2 - ld [hl], c +.skip + ld [hl], c ; current seconds dec hl - ld [wSecsSince], a -CalcMinsHoursDaysSince_: + ld [wSecondsSince], a ; seconds since + +_CalcMinsHoursDaysSince: ldh a, [hMinutes] ld c, a sbc [hl] - jr nc, .asm_119df + jr nc, .skip add 60 -.asm_119df - ld [hl], c +.skip + ld [hl], c ; current minutes dec hl - ld [wMinsSince], a -CalcHoursDaysSince_: + ld [wMinutesSince], a ; minutes since + +_CalcHoursDaysSince: ldh a, [hHours] ld c, a sbc [hl] - jr nc, .asm_119ec + jr nc, .skip add 24 -.asm_119ec - ld [hl], c +.skip + ld [hl], c ; current hours dec hl - ld [wHoursSince], a -CalcDaysSince_: + ld [wHoursSince], a ; hours since + +_CalcDaysSince: ld a, [wCurDay] ld c, a sbc [hl] - jr nc, .asm_119fa + jr nc, .skip add 20 * 7 -.asm_119fa - ld [hl], c - ld [wDaysSince], a +.skip + ld [hl], c ; current days + ld [wDaysSince], a ; days since ret -CopyDayHourMinSecToHL: ; 119ff (4:59ff) +CopyDayHourMinSecToHL: ld a, [wCurDay] ld [hli], a ldh a, [hHours] @@ -356,7 +373,7 @@ CopyDayHourMinSecToHL: ; 119ff (4:59ff) ld [hli], a ret -CopyDayToHL: ; 11a0d (4:5a0d) +CopyDayToHL: ld a, [wCurDay] ld [hl], a ret @@ -368,7 +385,7 @@ CopyDayHourToHL: ld [hli], a ret -CopyDayHourMinToHL: ; 11a1a (4:5a1a) +CopyDayHourMinToHL: ld a, [wCurDay] ld [hli], a ldh a, [hHours] diff --git a/engine/overworld/variables.asm b/engine/overworld/variables.asm index 6483232e..6f14c549 100755 --- a/engine/overworld/variables.asm +++ b/engine/overworld/variables.asm @@ -34,54 +34,58 @@ _GetVarAction:: ret .VarActionTable: - dwb wStringBuffer2, RETVAR_STRBUF2 - dwb wPartyCount, RETVAR_STRBUF2 - dwb .BattleResult, RETVAR_EXECUTE - dwb wBattleType, RETVAR_ADDR_DE - dwb wTimeOfDay, RETVAR_STRBUF2 - dwb .CountCaughtMons, RETVAR_EXECUTE - dwb .CountSeenMons, RETVAR_EXECUTE - dwb .CountBadges, RETVAR_EXECUTE - dwb wPlayerState, RETVAR_ADDR_DE - dwb .PlayerFacing, RETVAR_EXECUTE - dwb hHours, RETVAR_STRBUF2 - dwb .DayOfWeek, RETVAR_EXECUTE - dwb wMapGroup, RETVAR_STRBUF2 - dwb wMapNumber, RETVAR_STRBUF2 - dwb .UnownCaught, RETVAR_EXECUTE - dwb wEnvironment, RETVAR_STRBUF2 - dwb .BoxFreeSpace, RETVAR_EXECUTE - dwb wBugContestMinsRemaining, RETVAR_STRBUF2 - dwb wXCoord, RETVAR_STRBUF2 - dwb wYCoord, RETVAR_STRBUF2 - dwb wSpecialPhoneCallID, RETVAR_STRBUF2 - dwb NULL, RETVAR_STRBUF2 +; entries correspond to VAR_* constants + ; RETVAR_STRBUF2: copy [de] to wStringBuffer2 + ; RETVAR_ADDR_DE: return address in de + ; RETVAR_EXECUTE: call function + dwb wStringBuffer2, RETVAR_STRBUF2 + dwb wPartyCount, RETVAR_STRBUF2 + dwb .BattleResult, RETVAR_EXECUTE + dwb wBattleType, RETVAR_ADDR_DE + dwb wTimeOfDay, RETVAR_STRBUF2 + dwb .CountCaughtMons, RETVAR_EXECUTE + dwb .CountSeenMons, RETVAR_EXECUTE + dwb .CountBadges, RETVAR_EXECUTE + dwb wPlayerState, RETVAR_ADDR_DE + dwb .PlayerFacing, RETVAR_EXECUTE + dwb hHours, RETVAR_STRBUF2 + dwb .DayOfWeek, RETVAR_EXECUTE + dwb wMapGroup, RETVAR_STRBUF2 + dwb wMapNumber, RETVAR_STRBUF2 + dwb .UnownCaught, RETVAR_EXECUTE + dwb wEnvironment, RETVAR_STRBUF2 + dwb .BoxFreeSpace, RETVAR_EXECUTE + dwb wBugContestMinsRemaining, RETVAR_STRBUF2 + dwb wXCoord, RETVAR_STRBUF2 + dwb wYCoord, RETVAR_STRBUF2 + dwb wSpecialPhoneCallID, RETVAR_STRBUF2 + dwb NULL, RETVAR_STRBUF2 -.CountCaughtMons: ; 41cf +.CountCaughtMons: ; Caught mons. ld hl, wPokedexCaught - ld b, $20 + ld b, wEndPokedexCaught - wPokedexCaught call CountSetBits - ld a, [wd151] + ld a, [wNumSetBits] jp .loadstringbuffer2 -.CountSeenMons: ; 41dd +.CountSeenMons: ; Seen mons. ld hl, wPokedexSeen - ld b, $20 + ld b, wEndPokedexSeen - wPokedexSeen call CountSetBits - ld a, [wd151] + ld a, [wNumSetBits] jp .loadstringbuffer2 -.CountBadges: ; 41eb +.CountBadges: ; Number of owned badges. ld hl, wBadges ld b, 2 call CountSetBits - ld a, [wd151] + ld a, [wNumSetBits] jp .loadstringbuffer2 -.PlayerFacing: ; 41f9 +.PlayerFacing: ; The direction the player is facing. ld a, [wPlayerDirection] and $c @@ -89,18 +93,18 @@ _GetVarAction:: rrca jp .loadstringbuffer2 -.DayOfWeek: ; 4203 +.DayOfWeek: ; The day of the week. call GetWeekday jp .loadstringbuffer2 -.UnownCaught: ; 4209 +.UnownCaught: ; Number of unique Unown caught. - call CountUnown ; gold: c5ac | silver: c5aa + call CountUnown ld a, b jp .loadstringbuffer2 -.BoxFreeSpace: ; 4210 +.BoxFreeSpace: ; Remaining slots in the current box. ld a, BANK(sBoxCount) call OpenSRAM @@ -112,8 +116,8 @@ _GetVarAction:: ld a, b jp .loadstringbuffer2 -.BattleResult: ; 4223 +.BattleResult: ld a, [wBattleResult] - and $7f + and $ff ^ BATTLERESULT_BITMASK jp .loadstringbuffer2 -; 422b + @@ -1786,10 +1786,10 @@ wRequested1bpp:: ds 1 ; ce6c wRequested1bppSource:: dw ; ce6d wRequested1bppDest:: dw ; ce6f -wSecsSince:: ds 1 ; ce71 -wMinsSince:: ds 1 ; ce72 -wHoursSince:: ds 1 ; ce73 -wDaysSince:: ds 1 ; ce74 +wSecondsSince:: db ; ce71 +wMinutesSince:: db ; ce72 +wHoursSince:: db ; ce73 +wDaysSince:: db ; ce74 wce75:: ds 1 ; ce75 wce76:: ds 1 ; ce76 wce77:: ds 1 ; ce77 @@ -1827,15 +1827,16 @@ wMovementPointer:: dw ; ce94 ds 3 wTempObjectCopyMapObjectIndex:: db ; ce99 -wce9a:: ds 1 ; ce9a -wce9b:: ds 1 ; ce9b -wce9c:: ds 1 ; ce9c -wce9d:: ds 1 ; ce9d +wTempObjectCopySprite:: db ; ce9a +wTempObjectCopySpriteVTile:: db ; ce9b +wTempObjectCopyPalette:: db ; ce9c +wTempObjectCopyMovement:: db ; ce9d wTempObjectCopyRange:: db ; ce9e -wce9f:: ds 1 ; ce9f -wcea0:: ds 1 ; cea0 -wcea1:: ds 1 ; cea1 -wcea2:: ds 1 ; cea2 +wTempObjectCopyX:: db ; ce9f +wTempObjectCopyY:: db ; cea0 +wTempObjectCopyRadius:: db ; cea1 + + ds 1 wTileDown:: ds 1 ; cea3 wTileUp:: ds 1 ; cea4 @@ -2704,7 +2705,6 @@ wCmdQueue:: ds CMDQUEUE_CAPACITY * CMDQUEUE_ENTRY_SIZE ; d405 ds 40 -; TODO these should be wMapObject1 etc. wMapObjects:: ; d445 wPlayerObject:: map_object wPlayer ; d445 wMap1Object:: map_object wMap1 ; d455 @@ -2750,7 +2750,7 @@ wd56a:: ds 1 ; d56a wd56b:: ds 1 ; d56b wd56c:: ds 1 ; d56c wd56d:: ds 1 ; d56d -wTimeOfDayPalset:: ds 1 ; d56e +wTimeOfDayPalset:: db ; d56e wd56f:: ds 1 ; d56f wd570:: ds 1 ; d570 wPlayerData2End:: @@ -3373,7 +3373,10 @@ wPartyMonNicknamesEnd:: ds 22 ; equivalent to NAME_LENGTH + MON_NAME_LENGTH, possibly a reference to 7 pokemon? wPokedexCaught:: flag_array NUM_POKEMON ; dbe4 +wEndPokedexCaught:: + wPokedexSeen:: flag_array NUM_POKEMON ; dc04 +wEndPokedexSeen:: wUnownDex:: ds NUM_UNOWN ; dc24 wUnlockedUnowns:: ds 1 ; dc3e |