Routines 
Prev: 30888  Up: Map  Next: 31034 
Used by the routine at 27196. Makes a teacher who has been knocked over give lines to the closest main kid (if any).


30890  PUSH HL  
30891  LD A,(32763)  Copy ERIC's status flags from 32763 to A  
30894  LD HL,44130  Pick up ERIC's coordinates in DE  
30897  LD E,(HL)  
30898  DEC L  
30899  LD D,(HL)  
30900  LD BC,910  B=3 (number of main kids besides ERIC), C=LSB of 32654  
30903  BIT 2,A  Is ERIC jumping?  
30905  JR Z,30924  Jump if not  
30907  LD A,D  A=ERIC's ycoordinate  
30908  LD D,155  This is the ycoordinate of the top floor  
30910  CP 156  Is ERIC jumping on the top floor?  
30912  JR C,30927  Jump if so  
30914  LD D,162  This is the ycoordinate of the middle floor  
30916  CP 163  Is ERIC jumping on the middle floor?  
30918  JR C,30927  Jump if so  
30920  LD D,169  This is the ycoordinate of the bottom floor  
30922  JR 30927  
30924  CALL 28310  Get the floor nearest ERIC (155, 162, 169) in D  
30927  LD (32652),DE  Store ERIC's normalised coordinates in 32652  
Here we enter a loop that calculates BOY WANDER's, ANGELFACE's and EINSTEIN's normalised coordinates and stores them in 32654, 32656 and 32658 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.)


30931  LD H,167  167=BOY WANDER  
30933  CALL 28304  D=floor nearest the kid (155, 162, 169)  
30936  LD L,C  L=142, 144 or 146  
30937  LD A,H  Store the kid's character number in A temporarily  
30938  LD H,127  HL=32654, 32656 or 32658  
30940  LD (HL),E  Store the kid's normalised coordinates here  
30941  INC L  
30942  LD (HL),D  
30943  INC L  Point HL at the next normalised coordinates slot  
30944  LD C,L  Save L in C temporarily  
30945  LD H,A  Restore the kid's character number (167169) to H  
30946  INC H  Next kid  
30947  DJNZ 30933  Jump back until the three main kids have been done  
30949  POP HL  Restore the teacher's character number (163166) to H  
30950  PUSH HL  
30951  LD L,98  Pick up the teacher's coordinates in DE  
30953  LD E,(HL)  
30954  DEC L  
30955  LD D,(HL)  
30956  CALL 28327  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.


30959  LD HL,32659  Point HL at EINSTEIN's normalised ycoordinate  
30962  LD A,4  There are four main kids to check  
30964  PUSH AF  
30965  LD A,(HL)  Pick up a kid's normalised ycoordinate  
30966  DEC HL  Point HL at the kid's xcoordinate  
30967  CP D  Compare the normalised ycoordinate with the teacher's ycoordinate  
30968  LD A,(HL)  A=kid's xcoordinate  
30969  LD (HL),255  Default assumption: kid and teacher are on different floors  
30971  JR NZ,30987  Jump unless the kid's normalised ycoordinate matches the teacher's ycoordinate  
30973  CP B  Jump forward if the teacher cannot see the kid  
30974  JR Z,30978  
30976  JR NC,30987  
30978  CP C  
30979  JR C,30987  
30981  SUB E  A=distance between the teacher and the kid (possibly < 0)  
30982  JR NC,30986  Jump if the kid is to the right of the teacher (A>=0)  
30984  NEG  
30986  LD (HL),A  Store the absolute distance between the teacher and the kid (if they are close to each other)  
30987  DEC HL  Point HL at the normalised ycoordinate of the next main kid and jump back until all four have been checked  
30988  POP AF  
30989  DEC A  
30990  JR NZ,30964  
Finally, we enter a loop to determine which main kid (if any) is closest to the teacher.


30992  INC HL  HL=32652 (holding ERIC's distance from the teacher)  
30993  LD B,4  There are four main kids to consider  
30995  LD A,255  255 was used to signal that the kid was not on the same floor as the teacher  
30997  CP (HL)  When this loop is finished, A will hold the distance between the teacher and the closest main kid (or 255 if none of the kids were nearby)  
30998  JR C,31001  
31000  LD A,(HL)  
31001  INC HL  
31002  INC HL  
31003  DJNZ 30997  
31005  INC A  Were any of the main kids close to the teacher?  
31006  JR NZ,31010  Jump if so  
31008  POP HL  Restore the teacher's character number to H  
31009  RET  
So at least one of the main kids is within range. Which one will get lines?


31010  DEC A  A=distance between the teacher and the nearest kid  
31011  LD L,140  HL=32652 (holding ERIC's distance from the teacher)  
31013  INC D  D=teacher's ycoordinate + 1  
31014  LD BC,2220  B=8 (NOW DON'T DO IT AGAIN), C=172 (ERIC)  
31017  CP (HL)  Is ERIC closest to the teacher?  
31018  JR Z,31028  Jump if so  
31020  LD C,166  On exit from this loop, C will hold 167 (BOY WANDER), 168 (ANGELFACE), or 169 (EINSTEIN)  
31022  INC C  
31023  INC L  
31024  INC L  
31025  CP (HL)  
31026  JR NZ,31022  
31028  LD A,C  A=character number of the kid closest to the teacher  
31029  CALL 30464  Give lines to the kid who is closest to the teacher  
31032  POP HL  Restore the teacher's character number to H  
31033  RET 
Prev: 30888  Up: Map  Next: 31034 