![]() |
Routines |
| Prev: 78A8 | Up: Map |
|
Used by the routine at 6A3C. Makes a teacher who has been knocked over give lines to the closest main kid (if any).
|
||||||||||
| 78AA | PUSH HL | |||||||||
| 78AB | LD A,($7FFB) | Copy ERIC's status flags from 7FFB to A | ||||||||
| 78AE | LD HL,$AC62 | Pick up ERIC's coordinates in DE | ||||||||
| 78B1 | LD E,(HL) | |||||||||
| 78B2 | DEC L | |||||||||
| 78B3 | LD D,(HL) | |||||||||
| 78B4 | LD BC,$038E | B=3 (number of main kids besides ERIC), C=LSB of 7F8E | ||||||||
| 78B7 | BIT 2,A | Is ERIC jumping? | ||||||||
| 78B9 | JR Z,$78CC | Jump if not | ||||||||
| 78BB | LD A,D | A=ERIC's y-coordinate | ||||||||
| 78BC | LD D,$9B | This is the y-coordinate of the top floor | ||||||||
| 78BE | CP $9C | Is ERIC jumping on the top floor? | ||||||||
| 78C0 | JR C,$78CF | Jump if so | ||||||||
| 78C2 | LD D,$A2 | This is the y-coordinate of the middle floor | ||||||||
| 78C4 | CP $A3 | Is ERIC jumping on the middle floor? | ||||||||
| 78C6 | JR C,$78CF | Jump if so | ||||||||
| 78C8 | LD D,$A9 | This is the y-coordinate of the bottom floor | ||||||||
| 78CA | JR $78CF | |||||||||
| 78CC | CALL $6E96 | Get the floor nearest ERIC (0x9B, 0xA2, 0xA9) in D | ||||||||
| 78CF | LD ($7F8C),DE | Store ERIC's normalised coordinates in 7F8C | ||||||||
|
Here we enter a loop that calculates BOY WANDER's, ANGELFACE's and EINSTEIN's normalised coordinates and stores them in 7F8E, 7F90 and 7F92 respectively. (If a character's coordinates are (x, y), then his normalised coordinates are (x, Y), where Y=155, 162, 169, i.e. the y-coordinate of the floor he is closest to.)
|
||||||||||
| 78D3 | LD H,$A7 | 0xA7=BOY WANDER | ||||||||
| 78D5 | CALL $6E90 | D=floor nearest the kid (0x9B, 0xA2, 0xA9) | ||||||||
| 78D8 | LD L,C | L=0x8E, 0x90 or 0x92 | ||||||||
| 78D9 | LD A,H | Store the kid's character number in A temporarily | ||||||||
| 78DA | LD H,$7F | HL=7F8E, 7F90 or 7F92 | ||||||||
| 78DC | LD (HL),E | Store the kid's normalised coordinates here | ||||||||
| 78DD | INC L | |||||||||
| 78DE | LD (HL),D | |||||||||
| 78DF | INC L | Point HL at the next normalised coordinates slot | ||||||||
| 78E0 | LD C,L | Save L in C temporarily | ||||||||
| 78E1 | LD H,A | Restore the kid's character number (0xA7-0xA9) to H | ||||||||
| 78E2 | INC H | Next kid | ||||||||
| 78E3 | DJNZ $78D5 | Jump back until the three main kids have been done | ||||||||
| 78E5 | POP HL | Restore the teacher's character number (0xA3-0xA6) to H | ||||||||
| 78E6 | PUSH HL | |||||||||
| 78E7 | LD L,$62 | Pick up the teacher's coordinates in DE | ||||||||
| 78E9 | LD E,(HL) | |||||||||
| 78EA | DEC L | |||||||||
| 78EB | LD D,(HL) | |||||||||
| 78EC | CALL $6EA7 | Get the lower and upper limits of the teacher's visibility range in C and B | ||||||||
|
Now we enter a loop to calculate the distance of each main kid from the teacher.
|
||||||||||
| 78EF | LD HL,$7F93 | Point HL at EINSTEIN's normalised y-coordinate | ||||||||
| 78F2 | LD A,$04 | There are four main kids to check | ||||||||
| 78F4 | PUSH AF | |||||||||
| 78F5 | LD A,(HL) | Pick up a kid's normalised y-coordinate | ||||||||
| 78F6 | DEC HL | Point HL at the kid's x-coordinate | ||||||||
| 78F7 | CP D | Compare the normalised y-coordinate with the teacher's y-coordinate | ||||||||
| 78F8 | LD A,(HL) | A=kid's x-coordinate | ||||||||
| 78F9 | LD (HL),$FF | Default assumption: kid and teacher are on different floors | ||||||||
| 78FB | JR NZ,$790B | Jump unless the kid's normalised y-coordinate matches the teacher's y-coordinate | ||||||||
| 78FD | CP B | Jump forward if the teacher cannot see the kid | ||||||||
| 78FE | JR Z,$7902 | |||||||||
| 7900 | JR NC,$790B | |||||||||
| 7902 | CP C | |||||||||
| 7903 | JR C,$790B | |||||||||
| 7905 | SUB E | A=distance between the teacher and the kid (possibly < 0) | ||||||||
| 7906 | JR NC,$790A | Jump if the kid is to the right of the teacher (A>=0) | ||||||||
| 7908 | NEG | |||||||||
| 790A | LD (HL),A | Store the absolute distance between the teacher and the kid (if they are close to each other) | ||||||||
| 790B | DEC HL | Point HL at the normalised y-coordinate of the next main kid and jump back until all four have been checked | ||||||||
| 790C | POP AF | |||||||||
| 790D | DEC A | |||||||||
| 790E | JR NZ,$78F4 | |||||||||
|
Finally, we enter a loop to determine which main kid (if any) is closest to the teacher.
|
||||||||||
| 7910 | INC HL | HL=7F8C (holding ERIC's distance from the teacher) | ||||||||
| 7911 | LD B,$04 | There are four main kids to consider | ||||||||
| 7913 | LD A,$FF | 0xFF was used to signal that the kid was not on the same floor as the teacher | ||||||||
| 7915 | CP (HL) | When this loop is finished, A will hold the distance between the teacher and the closest main kid (or 0xFF if none of the kids were nearby) | ||||||||
| 7916 | JR C,$7919 | |||||||||
| 7918 | LD A,(HL) | |||||||||
| 7919 | INC HL | |||||||||
| 791A | INC HL | |||||||||
| 791B | DJNZ $7915 | |||||||||
| 791D | INC A | Were any of the main kids close to the teacher? | ||||||||
| 791E | JR NZ,$7922 | Jump if so | ||||||||
| 7920 | POP HL | Restore the teacher's character number to H | ||||||||
| 7921 | RET | |||||||||
|
So at least one of the main kids is within range. Which one will get lines?
|
||||||||||
| 7922 | DEC A | A=distance between the teacher and the nearest kid | ||||||||
| 7923 | LD L,$8C | HL=7F8C (holding ERIC's distance from the teacher) | ||||||||
| 7925 | INC D | D=teacher's y-coordinate + 1 | ||||||||
| 7926 | LD BC,$08AC | B=0x08 (NOW DON'T DO IT AGAIN), C=0xAC (ERIC) | ||||||||
| 7929 | CP (HL) | Is ERIC closest to the teacher? | ||||||||
| 792A | JR Z,$7934 | Jump if so | ||||||||
| 792C | LD C,$A6 | On exit from this loop, C will hold 0xA7 (BOY WANDER), 0xA8 (ANGELFACE), or 0xA9 (EINSTEIN) | ||||||||
| 792E | INC C | |||||||||
| 792F | INC L | |||||||||
| 7930 | INC L | |||||||||
| 7931 | CP (HL) | |||||||||
| 7932 | JR NZ,$792E | |||||||||
| 7934 | LD A,C | A=character number of the kid closest to the teacher | ||||||||
| 7935 | CALL $7700 | Give lines to the kid who is closest to the teacher | ||||||||
| 7938 | POP HL | Restore the teacher's character number to H | ||||||||
| 7939 | RET | |||||||||
| Prev: 78A8 | Up: Map |