Routines |
Prev: F99A | Up: Map | Next: F9FC |
|
||||||||
F9AB | LD B,$54 | 0x54: water fired from the pistol, phase 1 (facing left) | ||||||
F9AD | LD L,$00 | Point HL at byte 0x00 of ERIC's buffer | ||||||
F9AF | LD A,(HL) | A=ERIC's animatory state | ||||||
F9B0 | INC L | L=0x01 | ||||||
F9B1 | RLCA | Is ERIC facing left? | ||||||
F9B2 | JR NC,$F9B6 | Jump if so | ||||||
F9B4 | LD B,$D4 | 0xD4: water fired from the pistol, phase 1 (facing right) | ||||||
F9B6 | SBC A,A | Set A=-2 if ERIC's facing left, 2 if he's facing right | ||||||
F9B7 | ADD A,A | |||||||
F9B8 | CPL | |||||||
F9B9 | ADD A,A | |||||||
F9BA | ADD A,(HL) | Add ERIC's x-coordinate to get the initial x-coordinate of the water | ||||||
F9BB | CP $BF | Is ERIC too close to (and facing) the far left wall of the boys' skool or the far right wall of the girls' skool? | ||||||
F9BD | RET NC | Return if so | ||||||
F9BE | LD E,A | Copy the water's initial x-coordinate to E | ||||||
F9BF | INC L | L=0x02 | ||||||
F9C0 | LD D,(HL) | D=ERIC's y-coordinate | ||||||
F9C1 | DEC D | Subtract 2 to get the initial y-coordinate of the water | ||||||
F9C2 | DEC D | |||||||
F9C3 | LD A,B | A=initial animatory state of the water | ||||||
F9C4 | PUSH AF | Save the water's initial animatory state briefly | ||||||
F9C5 | PUSH DE | Save the water's initial coordinates briefly | ||||||
F9C6 | CALL $F978 | Make a water pistol sound effect | ||||||
F9C9 | LD A,$88 | Message 0x88: NO WATERPISTOLS | ||||||
F9CB | CALL $F898 | Give ERIC lines if any teacher is nearby | ||||||
F9CE | POP DE | Restore the water's initial coordinates to DE | ||||||
F9CF | POP AF | Restore the water's initial animatory state to A | ||||||
F9D0 | LD HL,$D613 | Point HL at byte 0x13 of the water's buffer | ||||||
F9D3 | LD (HL),$97 | Initialise the water animation phase identifier | ||||||
F9D5 | CALL $7746 | Place address F9D8 (below) into bytes 0x11 and 0x12 of the water's buffer and update the SRB for the water's appearance | ||||||
The address of this entry point is placed into bytes 0x11 and 0x12 of the water's buffer by the instruction above just after the water has been fired from the pistol, and is used throughout the water's lifespan. First, check whether the water has hit a cup, a plant, or the floor.
|
||||||||
F9D8 | LD L,$13 | Increment the water animation phase identifier (which starts off at 0x97) held in byte 0x13 of the buffer | ||||||
F9DA | INC (HL) | |||||||
F9DB | LD B,(HL) | Pick up this identifier (0x98-0x9C) in B | ||||||
F9DC | LD C,$FF | Point BC at the appropriate entry in the water animation table (see below) | ||||||
F9DE | LD A,(BC) | Pick up the entry in A | ||||||
F9DF | AND A | Deal with the water at phase 3 (when it can hit a cup), 6 (when it can hit a plant) or 7+ (when it hits the floor) | ||||||
F9E0 | CALL NZ,$FA4D | |||||||
Next, determine the water's new animatory state and coordinates as it moves through the air. For this we use the water animation table, which comprises five 4-byte entries located in bytes 0xFC-0xFF of pages 0x98-0x9C, corresponding to the phases of animation of the water as it flies from the pistol to the ground. Each entry contains the animatory state (AS), the x-coordinate increment (x+), the y-coordinate increment (y+), and a parameter (P) that is passed to the routine at FA4D when non-zero. When P=1, the water is at the right phase to fill a cup; when P=2, the water may have hit a plant or the ground.
|
||||||||
F9E3 | DEC C | C=0xFE | ||||||
F9E4 | PUSH BC | Save the water animation table pointer | ||||||
F9E5 | CALL $61B4 | Update the SRB for the water's current animatory state and location | ||||||
F9E8 | LD A,D | A=water's current y-coordinate | ||||||
F9E9 | POP HL | Restore the water animation table pointer to HL | ||||||
F9EA | ADD A,(HL) | Add the entry from the table to obtain the water's new y-coordinate | ||||||
F9EB | LD D,A | Copy this to D | ||||||
F9EC | DEC L | L=0xFD | ||||||
F9ED | LD C,(HL) | Pick up the x-coordinate increment in C | ||||||
F9EE | DEC L | L=0xFC | ||||||
F9EF | LD A,(HL) | A=water's new animatory state (facing left) | ||||||
F9F0 | LD HL,$D600 | Point HL at byte 0x00 of the water's buffer | ||||||
F9F3 | RL (HL) | Set the carry flag if the water's travelling to the right | ||||||
F9F5 | RLA | Copy the carry flag into the 'direction' bit (bit 7) of the animatory state | ||||||
F9F6 | RRCA | |||||||
F9F7 | LD B,A | B=water's new animatory state (facing the correct way) | ||||||
F9F8 | LD A,E | A=water's current x-coordinate | ||||||
F9F9 | JP $FA39 | Jump over the data table at FA00 to continue this routine |
Prev: F99A | Up: Map | Next: F9FC |