Prev: 41633 Up: Map Next: 41961
41767: Update state of cannon and projectile
Used by the routine at 41211.
41767 CALL 41961 Update state of cannon's projectile
41770 LD IX,45508 Load IX with address of complex state data for cannon (level 4)
41774 BIT 2,(IX+9) If cannon's just-loaded flag is reset...
41778 JR Z,41805 ...then skip ahead to 41805
41780 DEC (IX+12) Decrease cannon's fire timer...
41783 JR Z,41791 ...and if now zero then skip ahead to 41791
41785 LD BC,42519 Set cannon's graphic layout data address to point to graphic layout data for cannon (rocking) and return...
41788 JP 42512 ...
41791 RES 2,(IX+9) Reset cannon's just-loaded flag
41795 LD (IX+12),50 Set cannon's fire timer to 50
41799 LD BC,42530 Set cannon's graphic layout data address to point to graphic layout data for cannon (dormant) and return...
41802 JP 42512 ...
Cannon's just-loaded flag is reset, so cannon has finished its rocking phase.
41805 LD A,(34209) If cannon has no ammunition...
41808 OR A ...
41809 JR Z,41799 ...then jump to 41799 (cannon dormant)
41811 BIT 5,(IX+10) If cannon has its is-being-carried flag set...
41815 JR NZ,41799 ...then jump to 41799 (cannon dormant)
41817 LD IY,(34240) Load IY with address of current level's complex state data for Berk
41821 LD A,(IX+0) If Berk's current room is the same as the cannon's room...
41824 CP (IY+0) ...
41827 JR Z,41833 ...then skip ahead to 41833
41829 JR C,41860 If index of Berk's current room is greater than the index of the cannon's room then skip ahead to 41860
41831 JR 41871 Skip ahead to 41871
Berk and cannon in same room
41833 LD A,(IX+7) If x-coordinate of cannon's right side is smaller than x-coordinate of Berk's left side (i.e. cannon is to left of Berk)...
41836 CP (IY+5) ...
41839 JR C,41860 ...then skip ahead to 41860
41841 LD A,(IY+7) If x-coordinate of Berk's right side is smaller than x-coordinate of cannon's left side (i.e. cannon is to right of Berk)...
41844 CP (IX+5) ...
41847 JR C,41871 ...then skip ahead to 41871
Berk and cannon overlapping horizontally
41849 LD E,1 Load E with 1 (as projectile will appear one character to the right of the cannon's coordinate position)
41851 LD (IX+9),0 Prepare to set projectile's state to zero (fired vertically)
41855 LD BC,42530 Load BC with graphic layout data address for cannon (upright)
41858 JR 41880 Skip ahead to 41880
Berk is to the right of the cannon
41860 LD (IX+9),1 Prepare to set projectile's state to 1 (fired left)
41864 LD E,2 Load E with 2 (as projectile will appear two characters to the right of the cannon's coordinate position)
41866 LD BC,42556 Load BC with graphic layout data address for cannon (tilted right)
41869 JR 41880 Skip ahead to 41880
Berk is to the left of the cannon
41871 LD (IX+9),2 Prepare to set projectile's state to 2 (fired right)
41875 LD BC,42594 Load BC with graphic layout data address for cannon (tilted left)
41878 LD E,0 Load E with 0 (as projectile will appear at the same x-coordinate as in the cannon's coordinate position)
41880 CALL 42512 Set cannon's graphic layout data address to value in BC
41883 LD A,(IX+1) If cannon's depth is 2...
41886 CP 2 ...
41888 RET Z ...then return (cannon won't fire if it is placed behind Berk)
41889 LD A,(IX+12) If cannon's fire timer is at zero...
41892 OR A ...
41893 JR Z,41899 ...then skip ahead to 41899
41895 DEC (IX+12) Decrease cannon's fire timer
41898 RET Return
Cannon's fire timer is at zero
41899 LD HL,34209 Decrease ammunition level of cannon (level 4) by one...
41902 DEC (HL) ...
41903 LD (IX+12),50 Set cannon's fire timer to 50
41907 LD IY,45599 Load IY with address of complex state data for cannon's projectile
41911 LD A,(IX+5) Set x-coordinate of projectile's left and right sides to E plus x-coordinate of cannon's left side...
41914 ADD A,E ...
41915 LD (IY+5),A ...
41918 LD (IY+7),A ...
41921 LD A,(IX+4) Set y-coordinates of top and bottom of projectile to be one less than cannon's top y-coordinate...
41924 DEC A ...
41925 LD (IY+4),A ...
41928 LD (IY+6),A ...
41931 LD A,(IX+0) Set projectile's room to same as cannon's room...
41934 LD (IY+0),A ...
41937 LD (IY+1),1 Set projectile's depth to 1
41941 LD A,(IX+9) Set projectile's state to value prepared previously...
41944 LD (IY+9),A ...
41947 LD (IY+12),251 Set projectile's y-velocity to -5
41951 LD BC,51483 Set projectile's graphic layout data address to that for explosion (Bubo's projectile / fallen drips, level 4)...
41954 LD (IY+2),C ...as projectile is launched from cannon in an explosion...
41957 LD (IY+3),B ...
41960 RET Return
Prev: 41633 Up: Map Next: 41961