![]() |
Routines |
| Prev: AD59 | Up: Map | Next: AE75 |
|
This drives the searchlights. It is called when day_or_night is non-zero.
Used by the routine at main_loop.
|
||||
| nighttime | ADBD | LD HL,$81BD | Point HL at searchlight_state | |
| ADC0 | LD A,(HL) | Fetch the state | ||
| ADC1 | CP $FF | Is it in searchlight_STATE_SEARCHING state? ($FF) | ||
| ADC3 | JP Z,searching | If so, jump to searching | ||
| ADC6 | LD A,($68A0) | Fetch the global current room index | ||
| ADC9 | AND A | Are we outdoors? | ||
| ADCA | JR Z,nighttime_0 | If so, jump to searchlight movement code | ||
|
If the hero goes indoors then the searchlight loses track.
|
||||
| ADCC | LD (HL),$FF | Set the searchlight state to searchlight_STATE_SEARCHING | ||
| ADCE | RET | Return | ||
|
The hero is outdoors.
If the searchlight previously caught the hero, then track him.
|
||||
| nighttime_0 | ADCF | LD A,(HL) | Fetch the searchlight state again - it's a counter | |
| ADD0 | CP $1F | Does it equal searchlight_STATE_CAUGHT? ($1F) | ||
| ADD2 | JP NZ,nighttime_8 | If not, jump to single searchlight code. This will draw the searchlight in the place where the hero was last seen | ||
|
Caught in searchlight.
|
||||
| ADD5 | LD HL,($81BB) | Fetch map_position into HL | ||
| ADD8 | LD A,L | Compute map_x as map_position.x + 4 | ||
| ADD9 | ADD A,$04 | |||
| ADDB | LD E,A | |||
| ADDC | LD D,H | map_y is just map_position.y | ||
| ADDD | LD HL,($AE76) | Fetch the searchlight_caught_coord x/y into HL | ||
| ADE0 | LD A,L | Does caught_x equal map_x? | ||
| ADE1 | CP E | |||
| ADE2 | JR NZ,nighttime_1 | Jump if not | ||
| ADE4 | LD A,H | Does caught_y equal map_y? | ||
| ADE5 | CP D | |||
| ADE6 | RET Z | If both are equal the highlight doesn't need to move so return | ||
| ADE7 | JR nighttime_4 | (else) | ||
|
Move searchlight left/right to focus on the hero.
|
||||
| nighttime_1 | ADE9 | JP NC,nighttime_2 | Jump to decrement case if caught_x exceeds map_x | |
| ADEC | INC A | Increment caught_x | ||
| ADED | JR nighttime_3 | (else) | ||
| nighttime_2 | ADEF | DEC A | Decrement caught_x | |
| nighttime_3 | ADF0 | LD L,A | Save to HL | |
|
Move searchlight up/down to focus on the hero.
|
||||
| nighttime_4 | ADF1 | LD A,H | Does caught_y equal map_y? (Note: This looks like a duplicated check but isn't - the equivalent above doesn't always execute) | |
| ADF2 | CP D | |||
| ADF3 | JR Z,nighttime_7 | Skip movement code if so | ||
| ADF5 | JP NC,nighttime_5 | Jump to decrement case if caught_y exceeds map_y | ||
| ADF8 | INC A | Increment caught_y | ||
| ADF9 | JR nighttime_6 | (else) | ||
| nighttime_5 | ADFB | DEC A | Decrement caught_y | |
| nighttime_6 | ADFC | LD H,A | Save to HL | |
| nighttime_7 | ADFD | LD ($AE76),HL | Save HL back to searchlight_caught_coord | |
|
When tracking the hero a single searchlight is used.
|
||||
| nighttime_8 | AE00 | LD DE,($81BB) | Fetch map_position into HL | |
| AE04 | LD HL,$AE77 | Point HL at searchlight_caught_coord plus a byte to compensate for the 'DEC HL' at the jump target | ||
| AE07 | LD B,$01 | 1 iteration / 1 searchlight | ||
| AE09 | PUSH BC | Preserve loop counter | ||
| AE0A | PUSH HL | Preserve searchlight movement pointer | ||
| AE0B | JR nighttime_10 | Jump | ||
|
When not tracking the hero all three searchlights are cycled through.
|
||||
| searching | AE0D | LD HL,$AD29 | Point HL at searchlight_movements[0] | |
| AE10 | LD B,$03 | 3 iterations / 3 searchlights | ||
|
Start loop
|
||||
| nighttime_9 | AE12 | PUSH BC | Preserve loop counter | |
| AE13 | PUSH HL | Preserve searchlight movement pointer | ||
| AE14 | CALL searchlight_movement | Decide searchlight movement | ||
| AE17 | POP HL | Restore searchlight movement pointer | ||
| AE18 | PUSH HL | |||
| AE19 | CALL searchlight_caught | Is the hero caught in the searchlight? | ||
| AE1C | POP HL | Restore searchlight movement pointer | ||
| AE1D | PUSH HL | |||
| AE1E | LD DE,($81BB) | Point DE at map_position | ||
| AE22 | LD A,E | If map_x + 23 < searchlight.x (off right hand side) goto next | ||
| AE23 | ADD A,$17 | |||
| AE25 | CP (HL) | |||
| AE26 | JP C,next_searchlight | |||
| AE29 | LD A,(HL) | If searchlight.x + 16 < map_x (off left hand side) goto next | ||
| AE2A | ADD A,$10 | |||
| AE2C | CP E | |||
| AE2D | JP C,next_searchlight | |||
| AE30 | INC HL | Point HL at searchlight.y | ||
| AE31 | LD A,D | If map_y + 16 < searchlight.y (off top side) goto next | ||
| AE32 | ADD A,$10 | |||
| AE34 | CP (HL) | |||
| AE35 | JP C,next_searchlight | |||
| AE38 | LD A,(HL) | If searchlight.y + 16 < map_y (off bottom side) goto next | ||
| AE39 | ADD A,$10 | |||
| AE3B | CP D | |||
| AE3C | JP C,next_searchlight | |||
| nighttime_10 | AE3F | XOR A | Set the clip flag to zero | |
| AE40 | EX AF,AF' | Bank the clip flag | ||
| AE41 | DEC HL | Point HL at searchlight.x (or caught_coord.x depending on how it was entered) | ||
|
Calculate the column
|
||||
| AE42 | LD B,$00 | Clear top part of 'column' skip | ||
| AE44 | LD A,(HL) | Calculate the left side skip = searchlight.x - map_x | ||
| AE45 | SUB E | |||
| AE46 | JP NC,nighttime_11 | Jump if left hand skip is +ve | ||
| AE49 | LD B,$FF | Invert the top part of 'column' | ||
| AE4B | EX AF,AF' | Bitwise complement the banked clip flag | ||
| AE4C | CPL | |||
| AE4D | EX AF,AF' | |||
| nighttime_11 | AE4E | LD C,A | Finalise BC as column | |
|
Calculate the row
|
||||
| AE4F | INC HL | Point HL at searchlight.y | ||
| AE50 | LD A,(HL) | Fetch searchlight.y | ||
| AE51 | LD H,$00 | Clear top part of 'row' skip | ||
| AE53 | SUB D | Calculate the top side skip = searchlight.y - map_y | ||
| AE54 | JP NC,nighttime_12 | Jump if top side skip is +ve | ||
| AE57 | LD H,$FF | Invert the top part of 'row' | ||
| nighttime_12 | AE59 | LD L,A | Finalise HL as row | |
|
HL is row, BC is column
|
||||
| AE5A | ADD HL,HL | Multiply row by 32 | ||
| AE5B | ADD HL,HL | |||
| AE5C | ADD HL,HL | |||
| AE5D | ADD HL,HL | |||
| AE5E | ADD HL,HL | |||
| AE5F | ADD HL,BC | Add column to it | ||
| AE60 | LD BC,$5846 | Point HL at the address of the top-left game window attribute | ||
| AE63 | ADD HL,BC | Add row+column to base, producing our plot pointer | ||
| AE64 | EX DE,HL | Move it to DE | ||
| AE65 | EX AF,AF' | Unbank the clip flag | ||
| AE66 | LD ($AE75),A | Assign it to searchlight_clip_left | ||
| AE69 | CALL searchlight_plot | Plot the searchlight | ||
| next_searchlight | AE6C | POP HL | Restore searchlight_movement pointer | |
| AE6D | POP BC | Restore loop counter | ||
| AE6E | LD DE,$0007 | Step to the next searchlight_movement | ||
| AE71 | ADD HL,DE | |||
| AE72 | DJNZ nighttime_9 | ...loop | ||
| AE74 | RET | Return | ||
| Prev: AD59 | Up: Map | Next: AE75 |