Prev: E958 Up: Map Next: E9DD
E987: Calculate change to servant/cursor icon vertical screen position
eye cursor icon servant graphic
This routine calculates the vertical direction and speed of the servant/spell cursor icon, and adds/subtracts it from the sprite's vertical pixel position.
E987 LD A,($EB02) Get sprite vertical movement speed
E98A LD C,A
E98B LD A,($EAFE) Get up/down sprite control value (determine whether the sprite is moving and in which direction)
E98E CALL $DFBC Calculate the new sprite speed/position offset based on direction/speed (returned in H register)
E991 LD A,H Retrieve calculated offset from H register...
E992 LD ($EB02),A ...and store
E995 LD A,($EAFF) Get the sprite's current vertical screen position
E998 LD C,A Temp store in C register
E999 ADD A,H Add (or subtract) the offset calculated earlier
Check top of playing area boundary
E99A CP $E0 If new position is < 8 or a negative value, upwards movement will have taken the graphic past the top border of the playing area
E99C JR NC,$E9A2
E99E CP $08
E9A0 JR NC,$E9A9
E9A2 LD A,$00 ...If so, reset movement speed to zero...
E9A4 LD ($EB02),A
E9A7 LD A,$08 ...And vertical pixel position to 8, two pixels below the top of the playing area (top of playing area is zero, but the servant and cursor icon both have a -6 vertical pixel offset).
E9A9 LD ($EAFF),A Store the new (or reset) vertical pixel position
Check bottom of playing area boundary
E9AC CP $78 Check if vertical sprite position is greater than 120 pixels from top of playing area
E9AE JR C,$E9B5
E9B0 LD A,$00 If so, set vertical movement speed to zero. HTML[<br/>]No further action is required at this point because the spell will be cancelled in the following routine.
E9B2 LD ($EB02),A
E9B5 LD A,$00
E9B7 LD ($EAD4),A High byte of screen position (0 = current viewport, no offset)
Erase the graphic at the old position and draw it at its new one
E9BA LD ($EACF),A ...Set draw/erase flag to ERASE
E9BD LD HL,($EC94) Get the graphic address pointer ready to ERASE the graphic
E9C0 CALL $DB98 Run screen boundary checks and erase the servant/icon graphic
E9C3 LD A,($EB00) Copy the (new) horizontal pixel position into store
E9C6 LD ($EAD3),A
E9C9 LD A,($EAFF) ...and also the vertical pixel position
E9CC LD ($EAD2),A
E9CF LD A,$01 Set draw/erase flag to DRAW
E9D1 LD ($EACF),A
E9D4 LD HL,($EB51) Copy graphic address pointer to (table at 97C3) into store
E9D7 LD ($EC94),HL
E9DA CALL $DB98 Run screen boundary checks and draw the servant/icon graphic in its new position
Prev: E958 Up: Map Next: E9DD