Prev: 46490 Up: Map Next: 46742
46560: Update position of axe, display, and decrease Magic Knight's strength if in contact
Used by the routines at 40235 and 40239.
Input
A Axe number (0, 1, 2 or 3)
46560 ADD A,A Multiply value of A by eight...
46561 ADD A,A ...
46562 ADD A,A ...
46563 LD C,A Store in C
46564 LD B,0 Set B to zero
46566 LD IX,46752 Set IX to point to data for axes
46570 ADD IX,BC Add eight times axe number as offset to IX pointer
46572 LD C,(IX+0) Load axe's x-coordinate into C
46575 LD B,(IX+1) Load axe's y-coordinate into B
46578 PUSH BC Store BC
46579 LD (23677),BC Load BC into coordinate storage
46583 LD A,(IX+4) Load A with axe's current frame number
46586 PUSH IX Store IX
46588 CALL 63040 Draw axe to screen
46591 POP IX Restore IX
46593 POP BC Restore BC
46594 LD A,(IX+2) Load x-velocity into A
46597 ADD A,C Add x-coordinate to A
46598 LD C,A Load new x-coordinate back into C
46599 LD A,(IX+3) Load y-velocity into A
46602 ADD A,B Add y-coordinate to A
46603 LD B,A Load new y-coordinate back into B
46604 LD (IX+0),C Update data with new x-...
46607 LD (IX+1),B ...and y-coordinates
46610 LD (23677),BC Update coordinate storage
46614 LD A,(IX+4) Load A with axe frame data
46617 SUB 116 Subtract 116 (frame number of first axe frame) to get "absolute frame number" (see trivia)
46619 INC A Advance absolute frame number by one
46620 AND 3 Cap absolute frame number to 3, and wrap round from 3 to 0 as there are only four frames
46622 ADD A,116 Add 116 to absolute frame number to give relative frame number again
46624 LD (IX+4),A Store new frame number
46627 PUSH IX Store IX
46629 CALL 63040 Draw axe to screen
46632 POP IX Restore IX
46634 LD A,(IX+0) Load x-coordinate of axe
46637 OR A If x-coordinate is zero...
46638 CALL Z,46742 ...multiply x "velocity" by minus one
46641 CP 244 If x-coordinate is 244...
46643 CALL Z,46742 ...multiply x "velocity" by minus one
46646 INC IX Temporarily advance IX pointer to work with y "velocities"
46648 LD A,(IX+0) Load y-coordinate of axe
46651 CP 172 If y-coordinate is 172...
46653 CALL Z,46742 ...multiply y "velocity" by minus one
46656 CP 100 If y-coordinate is 100...
46658 CALL Z,46742 ...multiply y "velocity" by minus one
46661 DEC IX Move IX back one again (reversing instruction at 46646)
46663 LD A,(24840) Load A with Magic Knight's current x-coordinate
46666 LD B,A Copy into B
46667 LD A,(IX+0) Load A with x-coordinate of axe
46670 ADD A,6 Add 6 to x-coordinate of axe
46672 SUB B Subtract B to get x-distance between Magic Knight and the axe, plus 6
46673 CP 21 If this value is not less than 21 then...
46675 JP NC,46741 ...return
46678 LD A,(24841) Else, load B with Magic Knight's y-coordinate...
46681 LD B,A ...
46682 LD A,(IX+1) Load A with y-coordinate of axe (uses same coordinate system as PLOT command, i.e. y=0 is at bottom of screen)
46685 SUB B Subtract B to get y-distance between Magic Knight and the axe
46686 CP 39 If this value is not less than 39 then...
46688 JP NC,46741 ...return
46691 LD A,30 If Magic Knight is wearing the Shield...
46693 CALL 45505 ...
46696 JP Z,46719 ...then skip ahead to 46719
46699 LD A,(24768) Else, decrease Magic Knight's current strength by one...
46702 DEC A ...
46703 LD (24768),A ...
46706 CALL 46463 Print Magic Knight's current strength at (6, 2) as text if he is carrying the Mirror
46709 LD A,(24768) Load Magic Knight's current strength into A...
46712 OR A If Magic Knight's strength is zero...
46713 LD HL,51071 ...point HL to "YOU DIED OF EXHAUSTION" text...
46716 JP Z,64582 ...and jump to "game over" window routine and exit
46719 LD C,32 Set C to 32 (number of times to repeat loop below)
46721 LD A,16 Set speaker bit...
46723 OUT (254),A ...
46725 LD A,R Load A with random number between 0 - 15 (as R register increases with each instruction executed)...
46727 AND 15 ...
46729 LD B,A Load value into B
46730 DJNZ 46730 Pause by repeating this line B times
46732 XOR A Set A to zero
46733 OUT (254),A Reset speaker bit
46735 DEC C Decrease C...
46736 JR NZ,46721 ...and repeat loop if C is not zero
46738 XOR A Reset speaker bit...
46739 OUT (254),A ...
46741 RET Return
Prev: 46490 Up: Map Next: 46742