Prev: 36564 Up: Map Next: 37046
36796: Move Willy (3)
Used by the routines at 36307 and 36564. This routine moves Willy left or right if necessary.
36796 LD A,(34256) Pick up Willy's direction and movement flags from 34256
36799 AND 2 Is Willy moving left or right?
36801 RET Z Return if not
36802 LD A,(34262) Pick up the rope status indicator from 34262
36805 DEC A Is Willy on a rope?
36806 BIT 7,A
36808 RET Z Return if so (Willy's movement along a rope is handled at 37726)
36809 LD A,(34256) Pick up Willy's direction and movement flags from 34256
36812 AND 1 Is Willy facing right?
36814 JP Z,36930 Jump if so
Willy is moving left.
36817 LD A,(34258) Pick up Willy's animation frame from 34258
36820 OR A Is it 0?
36821 JR Z,36828 If so, jump to move Willy's sprite left across a cell boundary
36823 DEC A Decrement Willy's animation frame at 34258
36824 LD (34258),A
36827 RET
Willy's sprite is moving left across a cell boundary. In the comments that follow, (x,y) refers to the coordinates of the top-left cell currently occupied by Willy's sprite.
36828 LD A,(34257) Pick up the airborne status indicator from 34257
36831 LD BC,0 Prepare BC for later addition
36834 CP 0 Is Willy jumping?
36836 JR NZ,36874 Jump if so
36838 LD HL,(34259) Collect Willy's attribute buffer coordinates from 34259
36841 LD BC,0 Prepare BC for later addition (again, redundantly)
36844 LD A,(32986) Pick up the direction byte of the ramp definition for the current room from 32986
36847 DEC A Now A=31 if the ramp goes up to the left, or 65 if it goes up to the right
36848 OR 161
36850 XOR 224
36852 LD E,A Point HL at the cell at (x-1,y+1) if the ramp goes up to the left, or at the cell at (x+1,y+2) if the ramp goes up to the right
36853 LD D,0
36855 ADD HL,DE
36856 LD A,(32964) Pick up the attribute byte of the ramp tile for the current room from 32964
36859 CP (HL) Is there a ramp tile in the cell pointed to by HL?
36860 JR NZ,36874 Jump if not
36862 LD BC,32 Prepare BC for later addition
36865 LD A,(32986) Pick up the direction byte of the ramp definition for the current room from 32986
36868 OR A Does the ramp go up to the right?
36869 JR NZ,36874 Jump if so
36871 LD BC,65504 BC=-32 (the ramp goes up to the left)
36874 LD HL,(34259) Collect Willy's attribute buffer coordinates from 34259
36877 LD A,L Is Willy's screen x-coordinate 0 (on the far left)?
36878 AND 31
36880 JP Z,38026 If so, move Willy into the room to the left
36883 ADD HL,BC Point HL at the cell at (x-1,y+1), or at the cell at (x-1,y) if Willy is on or about to step onto a ramp that goes up to the left, or at the cell at (x-1,y+2) if Willy is walking down a ramp
36884 DEC HL
36885 LD DE,32
36888 ADD HL,DE
36889 LD A,(32946) Pick up the attribute byte of the wall tile for the current room from 32946
36892 CP (HL) Is there a wall tile in the cell pointed to by HL?
36893 RET Z Return if so without moving Willy (his path is blocked)
36894 LD A,(34255) Pick up Willy's y-coordinate (Y) from 34255
36897 SRA C Now B=Y (if Willy is neither on nor about to step onto a ramp), or Y+16 (if Willy is walking down a ramp), or Y-16 (if Willy is on or about to step onto a ramp that goes up to the left); this will be Willy's new y-coordinate
36899 ADD A,C
36900 LD B,A
36901 AND 15 Is Willy at a point in a jump (left) where his sprite occupies three rows of cells?
36903 JR Z,36914 Jump if not (Willy's sprite is cell-aligned)
36905 LD A,(32946) Pick up the attribute byte of the wall tile for the current room from 32946
36908 ADD HL,DE Point HL at the cell at (x-1,y+2)
36909 CP (HL) Is there a wall tile there?
36910 RET Z Return if so without moving Willy (his path is blocked)
36911 OR A Point HL at the cell at (x-1,y+1)
36912 SBC HL,DE
36914 OR A Point HL at the cell at (x-1,y), or at the cell at (x-1,y-1) if Willy is on or about to step onto a ramp that goes up to the left, or at the cell at (x-1,y+1) if Willy is walking down a ramp
36915 SBC HL,DE
36917 LD (34259),HL Save Willy's new attribute buffer coordinates (in HL) at 34259
36920 LD A,B Save Willy's new y-coordinate at 34255
36921 LD (34255),A
36924 LD A,3 Change Willy's animation frame at 34258 from 0 to 3
36926 LD (34258),A
36929 RET
Willy is moving right.
36930 LD A,(34258) Pick up Willy's animation frame from 34258
36933 CP 3 Is it 3?
36935 JR Z,36942 If so, jump to move Willy's sprite right across a cell boundary
36937 INC A Increment Willy's animation frame at 34258
36938 LD (34258),A
36941 RET
Willy's sprite is moving right across a cell boundary. In the comments that follow, (x,y) refers to the coordinates of the top-left cell currently occupied by Willy's sprite.
36942 LD A,(34257) Pick up the airborne status indicator from 34257
36945 LD BC,0 Prepare BC for later addition
36948 OR A Is Willy jumping?
36949 JR NZ,36984 Jump if so
36951 LD HL,(34259) Collect Willy's attribute buffer coordinates from 34259
36954 LD A,(32986) Pick up the direction byte of the ramp definition for the current room from 32986
36957 DEC A Now A=64 if the ramp goes up to the left, or 34 if it goes up to the right
36958 OR 157
36960 XOR 191
36962 LD E,A Point HL at the cell at (x,y+2) if the ramp goes up to the left, or at the cell at (x+2,y+1) if the ramp goes up to the right
36963 LD D,0
36965 ADD HL,DE
36966 LD A,(32964) Pick up the attribute byte of the ramp tile for the current room from 32964
36969 CP (HL) Is there a ramp tile in the cell pointed to by HL?
36970 JR NZ,36984 Jump if not
36972 LD BC,32 Prepare BC for later addition
36975 LD A,(32986) Pick up the direction byte of the ramp definition for the current room from 32986
36978 OR A Does the ramp go up to the left?
36979 JR Z,36984 Jump if so
36981 LD BC,65504 BC=-32 (the ramp goes up to the right)
36984 LD HL,(34259) Collect Willy's attribute buffer coordinates from 34259
36987 ADD HL,BC Point HL at the cell at (x+2,y), or at the cell at (x+2,y+1) if Willy is walking down a ramp, or at the cell at (x+2,y-1) if Willy is on or about to step onto a ramp that goes up to the right
36988 INC HL
36989 INC HL
36990 LD A,L Is Willy's screen x-coordinate 30 (on the far right)?
36991 AND 31
36993 JP Z,38046 If so, move Willy into the room on the right
36996 LD DE,32 Prepare DE for addition
36999 LD A,(32946) Pick up the attribute byte of the wall tile for the current room from 32946
37002 ADD HL,DE Point HL at the cell at (x+2,y+1), or at the cell at (x+2,y+2) if Willy is walking down a ramp, or at the cell at (x+2,y) if Willy is on or about to step onto a ramp that goes up to the right
37003 CP (HL) Is there a wall tile in the cell pointed to by HL?
37004 RET Z Return if so without moving Willy (his path is blocked)
37005 LD A,(34255) Pick up Willy's y-coordinate (Y) from 34255
37008 SRA C Now B=Y (if Willy is neither on nor about to step onto a ramp), or Y+16 (if Willy is walking down a ramp), or Y-16 (if Willy is on or about to step onto a ramp that goes up to the right); this will be Willy's new y-coordinate
37010 ADD A,C
37011 LD B,A
37012 AND 15 Is Willy at a point in a jump (right) where his sprite occupies three rows of cells?
37014 JR Z,37025 Jump if not (Willy's sprite is cell-aligned)
37016 LD A,(32946) Pick up the attribute byte of the wall tile for the current room from 32946
37019 ADD HL,DE Point HL at the cell at (x+2,y+2)
37020 CP (HL) Is there a wall tile there?
37021 RET Z Return if so without moving Willy (his path is blocked)
37022 OR A Point HL at the cell at (x+2,y+1)
37023 SBC HL,DE
37025 LD A,(32946) Pick up the attribute byte of the wall tile for the current room from 32946
37028 OR A Point HL at the cell at (x+2,y), or at the cell at (x+2,y+1) if Willy is walking down a ramp, or at the cell at (x+2,y-1) if Willy is on or about to step onto a ramp that goes up to the right
37029 SBC HL,DE
37031 CP (HL) Is there a wall tile in the cell pointed to by HL?
37032 RET Z Return if so without moving Willy (his path is blocked)
37033 DEC HL Point HL at the cell at (x+1,y), or at the cell at (x+1,y+1) if Willy is walking down a ramp, or at the cell at (x+1,y-1) if Willy is on or about to step onto a ramp that goes up to the right
37034 LD (34259),HL Save Willy's new attribute buffer coordinates (in HL) at 34259
37037 XOR A Change Willy's animation frame at 34258 from 3 to 0
37038 LD (34258),A
37041 LD A,B Save Willy's new y-coordinate at 34255
37042 LD (34255),A
37045 RET
Prev: 36564 Up: Map Next: 37046