Prev: E39C Up: Map Next: E454
E3F9: Controls: Left
Used by the routine at Controls_CheckRight.
Did the player press left?
Controls_CheckLeft E3F9 CP $02 Jump to Controls_CheckDown if the player didn't press left (02).
E3FB JR NZ,Controls_CheckDown
Left movement checks for boundaries and the home box.
MoveLeft_Checks E3FD LD A,($D82D) A=*DestinationCursor_X_Position.
Can the player move left?
E400 CP $05 If *DestinationCursor_X_Position is at or beyond the left-most boundary jump to *Handler_CursorMovement.
E402 JP M,Handler_CursorMovement
Is the player about to enter the home box?
This is position 06/ 02:
cursor-06-02
E405 CP $06 If *DestinationCursor_X_Position is not 06 (which confirms the player can't be beside the home box), jump to MoveLeft.
E407 JR NZ,MoveLeft
If the horizontal co-ordinate is 06 and the vertical co-ordinate is 02 then the player IS beside the home box.
E409 LD A,($D82C) Now compare *DestinationCursor_Y_Position with 02.
E40C CP $02
E40E LD A,($D82D) Reload *DestinationCursor_X_Position into A.
E411 JR NZ,MoveLeft If *DestinationCursor_Y_Position is not 02 (which confirms the player can't be beside the home box), jump to MoveLeft.
Else the player is entering the home box, so the treatment of the cursor isn't quite so simple.
E413 SUB $04 Move *DestinationCursor_X_Position to 04 character blocks to the left.
E415 LD ($D82D),A
E418 DEC (HL) Update the tile ID the player will land on.
E419 CALL Remove_PlayerCursor Call Remove_PlayerCursor.
Animate the cursor entering the home box.
E41C LD HL,$D82F HL=CurrentCursor_X_Position.
Each valid direction moves the cursor one-cursor-width character blocks and rather than simply jump the whole way, the game auto-moves one character block at a time until the cursor reaches it's destination.
I've called these "frames" here, but it's the same cursor just moving between positions, there are no differently stored frames.
E41F LD B,$04 Set a counter in B for 04 animation "frames".
E421 CP $02 Jump to MoveLeft_Checks if A is equal to 02.
E423 JR Z,MoveLeft_Checks
AnimateMoveLeft_Loop E425 PUSH BC Stash the frame counter and horizontal position on the stack.
E426 PUSH HL
To demonstrate the four "frames" of movement:
06 05 04 03
cursor-06-02 cursor-05-02 cursor-04-02 cursor-03-02
If the code only called Draw_Cursor then the above is what would actually display! Instead the default attributes are written to the home box very quickly, and then the code forces a HALT to wait for the next frame to avoid any flicker.
So this is what is actually displayed:
06 05 04 03
cursor-good-06-02 cursor-good-05-02 cursor-good-04-02 cursor-good-03-02
And then position 02 is handled below by setting *PlayerCursor_Flag to 00.
E427 CALL Draw_Cursor Call Draw_Cursor.
E42A CALL Home_DefaultAttributes Call Home_DefaultAttributes.
E42D CALL Sound_Cursor Call Sound_Cursor.
Wait for the next frame.
E430 HALT Halt operation (suspend CPU until the next interrupt).
E431 CALL Remove_PlayerCursorAttributes Call Remove_PlayerCursorAttributes.
E434 POP HL Restore the horizontal position and frame counter from the stack.
E435 POP BC
E436 DEC (HL) Move the cursor position left by one character block.
E437 DJNZ AnimateMoveLeft_Loop Decrease the frame counter by one and loop back to AnimateMoveLeft_Loop until all 04 frames have played.
Mark that the cursor is now inside the home box.
E439 LD A,$00 Write 00 to *PlayerCursor_Flag.
E43B LD ($D835),A
Update the stored cursor positions.
E43E LD A,($D82C) Write *DestinationCursor_Y_Position to *StorageCursor_Y_Position.
E441 LD ($D830),A
E444 LD A,($D82D) Write *DestinationCursor_X_Position to *StorageCursor_X_Position.
E447 LD ($D831),A
E44A RET Return.
Normal left movement.
MoveLeft E44B SUB $04 Move 04 character blocks left.
E44D LD ($D82D),A Update *DestinationCursor_X_Position.
Update the tile ID the player has now landed on.
E450 DEC (HL) Decrease *HL by one.
E451 JP Handler_CursorMovement Jump to Handler_CursorMovement.
Prev: E39C Up: Map Next: E454