-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ X Move_A_Greebly(Right); `7BMoves And S Vets Moved to TRUE `7D X End X Else X Begin X If Not ((Screen`5BY_Pos,1`5D = 'X') Or X (Screen`5BY_pos,1`5D = '#') Or X (Not fightback and (lastmove = V Left))) Then X Move_A_Greebly(Right); `7BMoves And S Vets Moved to TRUE `7D X End X End X Else`20 X Begin X If (Pred(X_Pos)<>0) Then X Begin X If Not ((Screen`5BY_Pos,Pred(X_Pos)`5 VD = 'X') Or X (Screen`5BY_pos,Pred(X_Pos)`5D V = '#') Or X (Not Fightback and (lastmove = V Right))) Then X Move_A_Greebly(Left); `7BMoves An Vd Sets Moved to TRUE `7D X End X Else X Begin X If Not ((Screen`5BY_Pos,40`5D = 'X') V Or X (Screen`5BY_pos,40`5D = '#') O Vr X (Not Fightback and (lastmove = V Right))) Then X Move_A_Greebly(Left); `7BMoves An Vd Sets Moved to TRUE `7D X End; X End; X End; X End; X End; X Vertical : Begin X Case Quality Of X Good : Begin X If Y_Dist > 0 Then `7B Want to move DOWN `7D X BEGIN X If Not ((Screen`5BSucc(Y_Pos),X_Pos`5D = ' VX') Or X (Screen`5BSucc(Y_pos),X_Pos`5D = ' V#') Or`20 X (Screen`5BSucc(Y_pos),X_pos`5D = ' V`5E') Or X (Not Fightback and (lastmove = Up) V)) Then X Move_A_Greebly(Down); `7BMoves And Sets Mo Vved to TRUE `7D X END X Else`20 X If Not ((Screen`5BPred(Y_Pos),X_Pos`5D = ' VX') Or X (Screen`5BPred(Y_pos),X_Pos`5D = ' V#') Or X (Not Fightback and (lastmove = Dow Vn))) Then X Move_A_Greebly(Up); `7BMoves And Sets Move Vd to TRUE `7D X End; X Bad : Begin X If Y_Dist <= 0 Then `7B Want to move DOWN `7 VD X BEGIN X If Not ((Screen`5BSucc(Y_Pos),X_Pos`5D = ' VX') Or X (Screen`5BSucc(Y_pos),X_Pos`5D = ' V#') Or`20 X (Screen`5BSucc(Y_pos),X_pos`5D = ' V`5E') Or X (Not Fightback and (lastmove = Up) V)) Then X Move_A_Greebly(Down); `7BMoves And Sets Mo Vved to TRUE `7D X END X Else`20 X If Not ((Screen`5BPred(Y_Pos),X_Pos`5D = ' VX') Or X (Screen`5BPred(Y_pos),X_Pos`5D = ' V#') Or X (Not Fightback and (lastmove = Dow Vn))) Then X Move_A_Greebly(Up); `7BMoves And Sets Move Vd to TRUE `7D X End; X End; X End; X End; X End; X End; X X XProcedure Move_Greebly; XBegin X Moved := False; X With Greebly Do X Begin X X_Dist := Pacman.X_pos - X_pos;`20 X Y_Dist := Pacman.Y_pos - Y_pos; X If (X_dist = 0) And (Y_dist = 0) Then Eat; X If ( Y_Pos = 12 ) or ( Y_Pos = 13 ) Then `7B Optimize for Tunnel `7 VD X If Abs ( X_Dist ) > 20 Then X X_Dist := -X_Dist; X If Abs(X_dist) > Abs(Y_dist) Then `7B We want to move towards it `7 VD X `7B horizontally this move `7 VD X Begin X If Fightback Then X Begin X Find_A_Move(Bad,Vertical); X If Not Moved Then`20 X Find_A_Move(Bad,Horizontal); X If Not Moved Then X Find_A_Move(Good,Horizontal); X If Not Moved Then X Find_A_Move(Good,Vertical); X End X Else X Begin X Find_A_Move(Good,Horizontal); X If Not Moved Then X Find_A_Move(Good,Vertical); X If Not Moved Then X Find_A_Move(Bad,Vertical); X If Not Moved Then`20 X Find_A_Move(Bad,Horizontal); X End; X End X Else`20 X Begin X If Fightback Then X Begin X Find_A_Move(Bad,Horizontal); X If Not Moved Then X Find_A_Move(Bad,Vertical); X If Not Moved Then X Find_A_Move(Good,Horizontal); X If Not Moved Then X Find_A_Move(Good,Vertical); X End X Else X Begin X Find_A_Move(Good,Vertical); X If Not Moved Then X Find_A_Move(Good,Horizontal); X If Not Moved Then X Find_A_Move(Bad,Horizontal); X If Not Moved Then X Find_A_Move(Bad,Vertical); X End; X End; X end; XEnd; X XProcedure Greebly_start; X Begin X save_x := Pacman.x_pos; X save_y := Pacman.y_pos; X Fightback := false; X Lastmove := Nowhere; X Greebly.X_Pos := 20; X Greebly.Y_Pos := 12; X pacman.x_pos := 20; X pacman.y_pos := 1; X Move_Greebly; X Move_Greebly; X pacman.x_pos := save_x; X pacman.y_pos := save_y; X End; X XProcedure Pacman_Start; X Begin X Pacman.x_pos := 20; X Pacman.Y_pos := 19; X strength := 0; X Move_Pacman; X End; X XProcedure Eat; X Begin X Put_Screen(Bell,1,1); X If Fightback Then X Begin X Greebly_Val := 2*Greebly_Val; X Add_To_Score(Greebly_Val); X Strength := 40; X Dots_left := succ(Dots_left); X Greebly_Start; X End X Else X Begin X Lives := pred(lives); X If lives = 0 Then`20 X BEGIN X qio_Write (VT100_Esc+'<'+VT100_Esc+'(B'+VT100_Esc+'`5Bm'+VT100_ VEsc+'`5B?8h'); X Top_ten(Score); X $exit(1); X END; X qio_Write (VT100_graphics_off); X posn (15,1); X qio_write ('Frames :'+dec(Frames)+' Lives '+VT100_Graphics_on+Pa Vd(Pad('','`60',lives),' ',3)); X Greebly_Start; X Put_Screen(Blank,Pacman.Y_Pos,Pacman.X_Pos); X Pacman_Start; X End; X End; X XProcedure Move_Pacman; XBegin X Command := ord(qio_1_Char_Now); X If (Pacman.X_pos = Greebly.X_pos) and X (Pacman.Y_Pos = Greebly.Y_Pos) Then Eat; X If Command <> 255 Then X Case Command Of X 56 : Direction := Up; X 54 : Direction := Right; X 52 : Direction := Left; X 50 : Direction := Down; X 81,113 : BEGIN X qio_Write (VT100_Esc+'<'+VT100_Esc+'(B'+VT100_Esc+'`5Bm'+ VVT100_Esc+'`5B?8h'); X Top_ten(Score); X $exit(1); X END; X Otherwise Direction := Nowhere; X End; X If Direction <> Nowhere Then X Put_Screen(Blank,pacman.y_pos,pacman.x_pos); X Case Direction Of X Up : If (pacman.y_pos > 0) And X (Not( Screen`5BPred(pacman.y_pos),pacman.x_pos`5D = 'X')) T Vhen`20 X pacman.y_pos := Pred ( pacman.y_pos ); X Right : If (pacman.x_pos < 40) Then X Begin X If Not( Screen`5Bpacman.y_pos,Succ(pacman.x_pos)`5D = 'X V') Then`20 X pacman.x_pos := Succ ( pacman.x_pos ); X End X Else`20 X Pacman.x_pos := 1; X Left : If (pacman.x_pos > 1) Then X Begin X If Not( Screen`5Bpacman.y_pos,Pred( pacman.x_pos)`5D = 'X V') Then`20 X pacman.x_pos := Pred ( pacman.x_pos ); X end X Else`20 X Pacman.x_pos := 40; X Down : If (pacman.y_pos < 24) And`20 X (Not( Screen`5BSucc(pacman.y_pos),pacman.x_pos`5D = 'X')) T Vhen`20 X pacman.y_pos := Succ ( pacman.y_pos ); X Otherwise X End; X If Direction <> Nowhere Then X Put_Screen(Pacman.Shape,pacman.y_pos,pacman.x_pos); X If Screen`5Bpacman.y_pos,pacman.x_pos`5D = '`7E' Then X Add_to_Score(1) X Else`20 X If Screen`5Bpacman.y_pos,pacman.x_pos`5D = '*' Then X Begin X Add_To_Score(5); X Fightback := True; X Greebly.Shape := 'a'; X End; XEnd; X XBegin XInitialise; Xqio_Write (VT100_Esc+'<'+VT100_Esc+'`5B?8l');`20 XWhile lives > 0 Do X Begin X qio_purge; X Frames := Frames + 1; X If Skill < 95 Then X Skill := Skill + 5 X Else X Skill := Skill + 1; X Draw_maze; X qio_Write (VT100_graphics_off); X posn (15,1); X qio_Write ('Frames :'+dec(Frames)+' Lives '+VT100_graphics_on); X For I := 1 To lives Do qio_Write ('`60'); X For I := lives To 3 Do qio_Write (' '); X Pacman.X_Pos := 20; X Pacman.Y_pos := 19; X Greebly.Shape := '#'; X Greebly_Start; X Pacman_Start; X Dots_left := 288; X Greebly_Val := 10; X While Dots_Left > 0 Do X Begin X Sleep_Start (15); X Move_Pacman; X If Fightback Then X Strength := Succ (Strength); X If Strength = 40 Then X Begin X Fightback := False; X Greebly.Shape := '#'; X Strength := 0; `20 X End; X If Random(4)<>1 then X Move_Greebly; X posn (1,1); X Sleep_Wait; X End; X End; Xqio_Write (VT100_Esc+'<'+VT100_Esc+'(B'+VT100_Esc+'`5Bm'+VT100_Esc+'`5B?8h') V; XTop_ten(Score); XEnd. $ CALL UNPACK PACMAN.PAS;1 322038769 $ create 'f' X`1B`5BH`1B`5BJ`1B#6 X`1B`5B2;1H`1B#6`1B`5B7m `20 X`1B`5B3;1H`1B#6 `1B`5Bm`1B(0`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E V`7E`7E`7E`1B`5B7m `1B`5Bm`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E V`7E`1B`5B7m`20 X`1B`5B4;1H`1B#6 `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m `1B`5Bm` V7E`1B`5B7m `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B` V5B7m`20 X`1B`5B5;1H`1B#6 `1B`5Bm`1B(B*`1B`5B7m `1B`5Bm`1B(0`7E`1B`5B7m V `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m V `1B`5Bm`1B(B*`1B`5B7m`20 X`1B`5B6;1H`1B#6 `1B`5Bm`1B(0`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E V`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`1B`5B7m`2 V0 X`1B`5B7;1H`1B#6 `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m V `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m `20 X`1B`5B8;1H`1B#6`1B`5B8;10H `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`7E`7E`7E`7E`7E`7E`7 VE`1B`5B7m `1B`5Bm`7E`7E`7E`7E`7E`7E`7E`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m`20 X`1B`5B9;1H`1B#6`1B`5B9;10H `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m `1B` V5Bm`7E`1B`5B7m `20 X`1B`5B9;29H `1B`5Bm`7E`1B`5B7m`20 X`1B`5B10;1H`1B#6 `1B`5Bm`7E`1B`5B7m `1B`5Bm `1B`5B7m `1B`5Bm V `1B`5B7m `1B`5Bm`7E`1B`5B7m `20 X`1B`5B11;1H`1B#6`1B`5B11;11H`1B`5Bm`7E`1B`5B11;31H`7E X`1B`5B12;1H`1B#6`1B`5B12;11H`7E `1B`5B7m `1B`5Bm `1B`5B7m `1B`5 VBm `7E X`1B`5B13;1H`1B#6`1B`5B7m `1B`5Bm`7E`1B`5B7m `1B`5Bm `1B`5B7m `1B`5B V13;28H`20 X`1B`5B13;29H`1B`5Bm `1B`5B7m `1B`5Bm`7E`1B`5B7m `20 X`1B`5B14;1H`1B#6`1B`5B14;10H `1B`5Bm`7E`1B`5B7m `1B`5Bm `1B`5B7m V `1B`5Bm `1B`5B7m `1B`5Bm`7E`1B`5B7m`20 X`1B`5B15;1H`1B#6`1B`5B15;10H `1B`5Bm`7E`1B`5B7m `1B`5B15;30H `1B`5Bm`7E`1B`5 VB7m`20 X`1B`5B16;1H`1B#6 `1B`5Bm`7E`1B`5B7m `1B`5Bm `1B`5B7m V `1B`5Bm `1B`5B7m `1B`5Bm`7E`1B`5B7m `20 X`1B`5B17;1H`1B#6 `1B`5Bm`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E` V7E`7E`1B`5B7m `1B`5Bm`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E` V1B`5B7m`20 X`1B`5B18;1H`1B#6 `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m `1B`5Bm V`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m `20 X`1B`5B18;25H `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m`20 X`1B`5B19;1H`1B#6 `1B`5Bm`1B(B*`1B(0`7E`7E`7E`7E`7E`7E`7E`7E`1B`5B7m `1B`5Bm` V7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`1B`5B7m `1B`5Bm`7E` V7E`7E`7E`7E`7E`7E`1B(B*`1B`5B7m`20 X`1B`5B20;1H`1B#6 `1B`5Bm`1B(0`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m V `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m `20 X`1B`5B21;1H`1B#6 `1B`5Bm`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E` V7E`7E`1B`5B7m `1B`5Bm`7E`7E`7E`1B`5B21;25H`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E` V7E`7E`7E`7E`1B`5B7m`20 X`1B`5B22;1H`1B#6 `1B`5Bm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m `1B`5 VBm`7E`1B`5B7m `1B`5Bm`7E`1B`5B7m`20 X`1B`5B23;1H`1B#6 `1B`5Bm`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E` V7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`1B`5B7m `1B`5 VB1;1H X`1B`5B24;1H`1B#6`1B`5B7m `20 X`1B`5Bm`1B(B`1B* $ GOTO PART3