Routines 
Prev: 78A8  Up: Map  Next: 793A 
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 ycoordinate  
78BC  LD D,$9B  This is the ycoordinate 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 ycoordinate 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 ycoordinate 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 ycoordinate 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 (0xA70xA9) 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 (0xA30xA6) 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 ycoordinate  
78F2  LD A,$04  There are four main kids to check  
78F4  PUSH AF  
78F5  LD A,(HL)  Pick up a kid's normalised ycoordinate  
78F6  DEC HL  Point HL at the kid's xcoordinate  
78F7  CP D  Compare the normalised ycoordinate with the teacher's ycoordinate  
78F8  LD A,(HL)  A=kid's xcoordinate  
78F9  LD (HL),$FF  Default assumption: kid and teacher are on different floors  
78FB  JR NZ,$790B  Jump unless the kid's normalised ycoordinate matches the teacher's ycoordinate  
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 ycoordinate 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 ycoordinate + 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  Next: 793A 