Routines |
Prev: 26222 | Up: Map | Next: 26328 |
|
||||||||||||||
26224 | PUSH AF | Save the sniper's animatory state | ||||||||||||
26225 | LD A,D | A=sniper's next y-coordinate (34-37) | ||||||||||||
26226 | EXX | |||||||||||||
26227 | PUSH AF | Save the sniper's next y-coordinate | ||||||||||||
26228 | LD C,3 | There are three columns in the sniper's sprite | ||||||||||||
26230 | SUB 33 | E'=1 (sniper is at full height), 2 (sniper is at half-height), 3 (only the sniper's head is visible), or 4 (the sniper has ducked out of sight) | ||||||||||||
26232 | LD E,A | |||||||||||||
26233 | CPL | D'=5-E' (number of rows of the sniper's sprite that will be filled with non-blank tiles) | ||||||||||||
26234 | ADD A,6 | |||||||||||||
26236 | LD D,A | |||||||||||||
The next section of code modifies the sprite tile references for animatory states 54/182 column by column.
|
||||||||||||||
26237 | LD H,215 | 215 is the base page for sprite tile references | ||||||||||||
26239 | LD B,D | B=number of non-blank tiles to initialise in this column | ||||||||||||
26240 | LD L,162 | Animatory state 162 (gangster) will be used as a template for the sniper's sprite | ||||||||||||
26242 | LD A,(HL) | Collect a sprite tile reference from the template | ||||||||||||
26243 | LD L,182 | Copy the sprite tile reference into place | ||||||||||||
26245 | LD (HL),A | |||||||||||||
26246 | INC H | Move down a row | ||||||||||||
26247 | DJNZ 26240 | Jump back until all non-blank rows in this column have been done | ||||||||||||
26249 | LD A,E | A=number of blank rows in the sniper's sprite (1-4) | ||||||||||||
26250 | AND A | Are there any? | ||||||||||||
26251 | JR Z,26259 | Jump if not (this jump is never made) | ||||||||||||
26253 | LD B,E | Fill the remaining slots in this column with blank tiles | ||||||||||||
26254 | LD (HL),0 | |||||||||||||
26256 | INC H | |||||||||||||
26257 | DJNZ 26254 | |||||||||||||
26259 | DEC C | Have we done all three columns yet? | ||||||||||||
26260 | JR NZ,26239 | Jump back if not | ||||||||||||
26262 | POP AF | Restore the sniper's next y-coordinate (34-37) to A | ||||||||||||
26263 | JR NC,26323 | Jump unless the sniper is firing | ||||||||||||
The sniper is firing, so some further modifications to the sniper's sprite are required.
|
||||||||||||||
26265 | LD H,217 | Set the reference for tile 2 to 234 | ||||||||||||
26267 | LD (HL),234 | |||||||||||||
26269 | INC H | Set the reference for tile 3 to 0 (blank tile) | ||||||||||||
26270 | LD (HL),0 | |||||||||||||
26272 | LD H,222 | Set the reference for tile 7 to 235 | ||||||||||||
26274 | LD (HL),235 | |||||||||||||
Now we initialise a bullet.
|
||||||||||||||
26276 | LD HL,32706 | Point HL' at the third byte of bullet buffer 1 (at 32704) | ||||||||||||
26279 | SUB 18 | D=16 or 17 (bullet's initial screen y-coordinate) | ||||||||||||
26281 | LD D,A | |||||||||||||
26282 | LD A,(HL) | Is bullet buffer 1 at 32704 already being used? | ||||||||||||
26283 | AND A | |||||||||||||
26284 | JR Z,26288 | Jump if not | ||||||||||||
26286 | LD L,198 | Point HL' at the third byte of bullet buffer 2 | ||||||||||||
26288 | LD (HL),D | Store the bullet's initial screen y-coordinate | ||||||||||||
26289 | LD A,(32766) | A=x-coordinate of the leftmost column of the play area on screen | ||||||||||||
26292 | LD B,A | Copy this to B' | ||||||||||||
26293 | INC L | Point HL' at the fourth byte of the bullet buffer | ||||||||||||
26294 | CALL 61823 | Get a random number in A | ||||||||||||
26297 | AND 112 | Keep only bits 4-6 | ||||||||||||
26299 | ADD A,4 | The initial pixel row at which the bullet will be drawn inside a cell is 4 | ||||||||||||
26301 | LD (HL),A | Initialise bits 0-6 of the fourth byte of the bullet buffer | ||||||||||||
26302 | POP AF | Restore the sniper's animatory state to A | ||||||||||||
26303 | PUSH AF | Save the animatory state again | ||||||||||||
26304 | AND 128 | Keep only bit 7 (the direction bit) | ||||||||||||
26306 | OR (HL) | Initialise bit 7 of the fourth byte of the bullet buffer (the bullet's direction bit) | ||||||||||||
26307 | LD (HL),A | |||||||||||||
26308 | DEC L | Store the x-coordinate of the leftmost column of the play area on screen in the first byte of the bullet buffer | ||||||||||||
26309 | DEC L | |||||||||||||
26310 | DEC L | |||||||||||||
26311 | LD (HL),B | |||||||||||||
26312 | INC L | Point HL' at the second byte of the bullet buffer | ||||||||||||
26313 | EXX | |||||||||||||
26314 | RLCA | Set the carry flag if the sniper is facing right | ||||||||||||
26315 | LD A,E | A=sniper's x-coordinate | ||||||||||||
26316 | EXX | |||||||||||||
26317 | JR NC,26321 | Jump if the sniper is facing left | ||||||||||||
26319 | INC A | Add 2 to the sniper's x-coordinate | ||||||||||||
26320 | INC A | |||||||||||||
26321 | SUB B | Subtract the x-coordinate of the leftmost column of the play area on screen to obtain the bullet's initial screen x-coordinate | ||||||||||||
26322 | LD (HL),A | Store this in the second byte of the bullet buffer | ||||||||||||
26323 | EXX | |||||||||||||
26324 | POP AF | Restore the sniper's animatory state to A | ||||||||||||
26325 | JP 59861 | Update the sniper's animatory state and location and update the SRB |
Prev: 26222 | Up: Map | Next: 26328 |