-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ X`09 qio_write (VT100_esc+'`5BD'+bckgrd+VT100_esc+'`5BD'+VT100_esc+'`5BB'+ VVT100_esc+'`5B1m'+obj+VT100_esc+'`5Bm'); X`09 END; XEND; X X`7B************************************************************************* V****`7D X XPROCEDURE MoveRight(obj,bckgrd : char); XBEGIN X`09If not (map`5Bx,y+1`5D in `5B'a','q','x','k','l','m','j'`5D) then X`09 BEGIN X`09 y := y+1; X`09 qio_write (VT100_esc+'`5BD'+bckgrd+VT100_esc+'`5BD'+VT100_esc+'`5BC'+ VVT100_esc+'`5B1m'+obj+VT100_esc+'`5Bm'); X`09 END; XEND; X X`7B************************************************************************* V****`7D X XPROCEDURE MoveLeft(obj,bckgrd : char); XBEGIN X`09If not (map`5Bx,y-1`5D in `5B'a','q','x','k','l','m','j'`5D) then X`09 BEGIN X`09 y := y-1; X`09 qio_write (VT100_esc+'`5BD'+bckgrd+VT100_esc+'`5BD'+VT100_esc+'`5BD'+ VVT100_esc+'`5B1m'+obj+VT100_esc+'`5Bm'); X`09 END; XEND; X X`7B************************************************************************* V****`7D X XPROCEDURE DropRock(Rx,Ry : integer); XBEGIN X`09pos(Rx,Ry); X`09REPEAT X`09 WHILE map`5Bx+1,y`5D = ' ' do X`09 BEGIN X`09 pos(x,y); X`09 map`5Bx,y`5D := ' '; X`09 MoveDown('a',' '); X`09 map`5Bx,y`5D := 'a'; X`09 END; X`09 If map`5Bx+1,y`5D = '`60' then X`09 BEGIN X`09 dead := true; X`09 map`5Bx+1,y`5D := ' '; X`09 END X`09 Else X`09 If (map`5Bx+1,y`5D in `5B'0'..'9'`5D) then X`09 killspook(map`5Bx+1,y`5D,'R'); X`09UNTIL (map`5Bx+1,y`5D in `5B'.','O','@','a','q','U','T'`5D); XEND; X X`7B************************************************************************* V****`7D X XPROCEDURE spookrun; XBEGIN X`09pos(spook`5B'0'`5D.X,spook`5B'0'`5D.Y); X`09If x <= 2 then X`09 BEGIN X`09 map`5Bx,y`5D := ' '; X`09 If (y < MeY) then X`09 MoveLeft('*',' ') X`09 Else X`09 MoveRight('*',' '); X`09 map`5Bx,y`5D := '0'; X`09 If ((y <= 2) or (y >= 39)) then X`09 BEGIN X`09 qio_write (VT100_esc+'`5BD '); X`09 spookgone := true; X`09 END; X`09 END X`09Else X`09 BEGIN X`09 If (map`5Bx-1,y`5D <> 'a')and(map`5Bx-1,y`5D <> '`60') then X`09 BEGIN X`09`09map`5Bx,y`5D := ' '; X`09 MoveUp('*',' '); X`09`09map`5Bx,y`5D := '0'; X`09 END X`09 Else X`09 BEGIN X`09`09If (y-MeY) > 0 then X`09`09 If map`5Bx,y+1`5D in `5B'x'`5D then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := ' '; X`09`09 MoveLeft('*',' '); X`09`09 map`5Bx,y`5D := '0'; X`09`09 END X`09`09 Else X`09`09 BEGIN X`09`09 map`5Bx,y`5D := ' '; X`09`09 MoveRight('*',' '); X`09`09 map`5Bx,y`5D := '0'; X`09`09 END X`09`09Else X`09`09 If map`5Bx,y-1`5D in `5B'x'`5D then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := ' '; X`09`09 MoveRight('*',' '); X`09`09 map`5Bx,y`5D := '0'; X`09`09 END X`09`09 Else X`09`09 BEGIN X`09`09 map`5Bx,y`5D := ' '; X`09`09 MoveLeft('*',' '); X`09`09 map`5Bx,y`5D := '0'; X`09`09 END; X`09 END; X`09 END; X`09spook`5B'0'`5D.X := x; X`09spook`5B'0'`5D.Y := y; X`09If map`5Bx-1,y`5D = 'a' then X`09 DropRock(x-1,y); XEND; X X`7B************************************************************************* V****`7D X XPROCEDURE MoveSpooks; XVAR X`09i `09: char; X`09dx, X`09dy`09: integer; X`09movesucc: boolean; X X`7B------------------------------------------------------------------------- V----`7D X X`09PROCEDURE MoveMadMole; X`09BEGIN X`09 If spook`5Bi`5D.state = 'M' then X`09 If (abs(x-MeX) > abs(y-MeY)) then X`09 BEGIN X`09`09If ((x-MeX) > 0) then X`09`09 BEGIN X`09`09 If (map`5Bx-1,y`5D in `5B' ','`60'`5D) then X`09`09 BEGIN X`09`09`09map`5Bx,y`5D := ' '; X`09`09`09MoveUp('*',' '); X`09`09`09spook`5Bi`5D.dir := 0; X`09`09`09movesucc := true; X`09`09 END; X`09`09 END X`09`09Else X`09`09 If (map`5Bx+1,y`5D in `5B' ','`60'`5D) then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := ' '; X`09`09 MoveDown('*',' '); X`09`09 spook`5Bi`5D.dir := 3; X`09`09 movesucc := true; X`09`09 END; X`09`09If not movesucc then X`09`09 BEGIN X`09`09 If ((y-MeY) > 0) then X`09`09 BEGIN X`09`09`09If (map`5Bx,y-1`5D in `5B' ','`60'`5D)and((y-MeY) <> 0) then X`09`09`09 BEGIN X`09`09`09 map`5Bx,y`5D := ' '; X`09`09`09 MoveLeft('*',' '); X`09`09`09 spook`5Bi`5D.dir := 1; X`09`09`09 movesucc := true; X`09`09`09 END X`09`09`09Else X`09`09`09 spook`5Bi`5D.state := 'G'; X`09`09 END X`09`09 Else X`09`09 BEGIN X`09`09`09If (map`5Bx,y+1`5D in `5B' ','`60'`5D)and((y-MeY) <> 0) then X`09`09`09 BEGIN X`09`09`09 map`5Bx,y`5D := ' '; X`09`09`09 MoveRight('*',' '); X`09`09 `09 spook`5Bi`5D.dir := 2; X`09`09`09 movesucc := true; X`09`09`09 END X`09`09`09Else X`09`09`09 spook`5Bi`5D.state := 'G'; X`09`09 END; X`09`09 END; X`09 END X`09 Else X`09 BEGIN X`09 If ((y-MeY) > 0) then X`09`09BEGIN X`09`09 If (map`5Bx,y-1`5D in `5B' ','`60'`5D) then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := ' '; X`09`09 MoveLeft('*',' '); X`09`09 spook`5Bi`5D.dir := 1; X`09`09 movesucc := true; X`09`09 END; X`09`09END X`09 Else X`09`09If (map`5Bx,y+1`5D in `5B' ','`60'`5D) then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := ' '; X`09`09 MoveRight('*',' '); X`09`09 spook`5Bi`5D.dir := 2; X`09`09 movesucc := true; X`09`09 END; X`09 If not movesucc then X`09`09If ((x-MeX) > 0) then X`09`09 If (map`5Bx-1,y`5D in `5B' ','`60'`5D)and((x-MeX) <> 0) then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := ' '; X`09`09 MoveUp('*',' '); X`09`09 spook`5Bi`5D.dir := 0; X`09`09 movesucc := true; X`09`09 END X`09`09 Else X`09`09 spook`5Bi`5D.state := 'G' X`09`09Else X`09`09 If (map`5Bx+1,y`5D in `5B' ','`60'`5D)and((x-MeX) <> 0) then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := ' '; X`09`09 MoveDown('*',' '); X`09`09 spook`5Bi`5D.dir := 3; X`09`09 movesucc := true; X`09`09 END X`09`09 Else X`09`09 spook`5Bi`5D.state := 'G'; X`09 END; X`09END; X X`7B------------------------------------------------------------------------- V----`7D X X`09PROCEDURE MoveGhost; X`09BEGIN X`09 If (abs(x-MeX)) >= (abs(y-MeY)) then X`09 BEGIN X`09 If (x-MeX) > 0 then X`09`09BEGIN X`09`09 If (map`5Bx-1,y`5D in `5B' ','`60'`5D) then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := dirt; X`09`09 MoveUp('*',dirt); X`09 spook`5Bi`5D.dir := 0; X`09`09 spook`5Bi`5D.state := 'M'; X`09`09 movesucc := true; X`09`09 END X`09`09 Else X`09`09 BEGIN X`09`09 If not (map`5Bx-1,y`5D in `5B'0'..'9','T','a'`5D) then X`09`09`09BEGIN X`09`09`09 map`5Bx,y`5D := dirt; X`09`09`09 MoveUp('#',dirt); X`09`09`09 spook`5Bi`5D.dir := 0; X`09`09`09 movesucc := true; X`09`09`09END; X`09`09 END; X`09`09END X`09 Else X`09`09BEGIN X`09`09 If (map`5Bx+1,y`5D in `5B' ','`60'`5D) then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := dirt; X`09`09 MoveDown('*',dirt); X`09 spook`5Bi`5D.dir := 3; X`09`09 spook`5Bi`5D.state := 'M'; X`09`09 movesucc := true; X`09`09 END X`09`09 Else X`09`09 BEGIN X`09`09 If not (map`5Bx+1,y`5D in `5B'0'..'9','T','a'`5D) then X`09`09`09BEGIN X`09`09`09 map`5Bx,y`5D := dirt; X`09`09`09 MoveDown('#',dirt); X`09`09`09 spook`5Bi`5D.dir := 3; X`09`09`09 movesucc := true; X`09`09`09END; X`09`09 END; X`09`09END; X`09 END X`09 Else X`09 BEGIN X`09 If (y-MeY) > 0 then X`09 BEGIN X`09 If (map`5Bx,y-1`5D in `5B' ','`60'`5D) then X`09`09BEGIN X`09`09 map`5Bx,y`5D := dirt; X`09`09 MoveLeft('*',dirt); X`09`09 spook`5Bi`5D.dir := 1; X`09`09 spook`5Bi`5D.state := 'M'; X`09`09 movesucc := true; X`09`09END X`09 Else X`09`09BEGIN X`09`09 If not (map`5Bx,y-1`5D in `5B'0'..'9','T','a'`5D) then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := dirt; X`09`09 MoveLeft('#',dirt); X`09`09 spook`5Bi`5D.dir := 1; X`09`09 movesucc := true; X`09`09 END; X`09`09END; X`09 END X`09 Else X`09 BEGIN X`09 If (map`5Bx,y+1`5D in `5B' ','`60'`5D) then X`09`09BEGIN X`09`09 map`5Bx,y`5D := dirt; X`09`09 MoveRight('*',dirt); X`09`09 spook`5Bi`5D.dir := 2; X`09`09 spook`5Bi`5D.state := 'M'; X`09`09 movesucc := true; X`09`09END X`09 Else X`09`09BEGIN X`09`09 If not (map`5Bx,y+1`5D in `5B'0'..'9','T','a'`5D) then X`09`09 BEGIN X`09`09 map`5Bx,y`5D := dirt; X`09`09 MoveRight('#',dirt); X`09`09 spook`5Bi`5D.dir := 1; X`09`09 movesucc := true; X`09`09 END; X`09`09END; X`09 END; X`09 END; X`09 If not movesucc then X`09 If map`5Bx-1,y`5D in `5B'.','O','@'`5D then X`09 BEGIN X`09 map`5Bx,y`5D := dirt; X`09 MoveUp('#',dirt); X`09`09spook`5Bi`5D.dir := 0; X`09`09movesucc := true; X`09 END X`09 Else X`09 If map`5Bx+1,y`5D in `5B'.','O','@'`5D then X`09 BEGIN X`09 map`5Bx,y`5D := dirt; X`09 MoveDown('#',dirt); X`09`09 spook`5Bi`5D.dir := 3; X`09 `09 movesucc := true; X`09 END X`09 Else X`09 `09If map`5Bx,y-1`5D in `5B'.','O','@'`5D then X`09 BEGIN X`09 map`5Bx,y`5D := dirt; X`09 MoveLeft('#',dirt); X`09`09 spook`5Bi`5D.dir := 1; X`09`09 movesucc := true; X`09 END X`09 `09Else X`09 BEGIN X`09 map`5Bx,y`5D := dirt; X`09 MoveRight('#',dirt); X`09`09 spook`5Bi`5D.dir := 2; X`09`09 movesucc := true; X`09 END; X`09END; X X`7B------------------------------------------------------------------------- V----`7D X X`09PROCEDURE MoveMildMole; X`09VAR X`09 next, X`09 tries`09: integer; X`09BEGIN X`09 tries := 0; X`09 If (spook`5Bi`5D.dir IN `5B0,2`5D) then X`09 next := 1 X`09 Else X`09 next := -1; X`09 REPEAT X`09 CASE spook`5Bi`5D.dir of X`09 0 : BEGIN X`09`09 If (map`5Bx-1,y`5D IN `5B' ','`60'`5D) then X`09`09 BEGIN X`09`09`09map`5Bx,y`5D := ' '; X`09`09`09MoveUp('*',' '); X`09`09`09movesucc := true; X`09`09 END X`09`09 Else X`09`09 BEGIN X`09`09`09spook`5Bi`5D.dir := (spook`5Bi`5D.dir+next) mod 4; X`09`09`09tries := tries+1; X`09`09 END; X`09`09 END; X`09 1 : BEGIN X`09`09 If (map`5Bx,y-1`5D in `5B' ','`60'`5D) then X`09`09 BEGIN X`09`09`09map`5Bx,y`5D := ' '; X`09`09`09MoveLeft('*',' '); X`09`09`09movesucc := true; X`09`09 END X`09`09 Else X`09`09 BEGIN X`09`09`09spook`5Bi`5D.dir := (spook`5Bi`5D.dir+next) mod 4; X`09`09`09tries := tries+1; X`09`09 END; X`09`09 END; X`09 2 : BEGIN X`09`09 If (map`5Bx,y+1`5D in `5B' ','`60'`5D) then X`09`09 BEGIN X`09`09`09map`5Bx,y`5D := ' '; X`09`09`09MoveRight('*',' '); X`09`09`09movesucc := true; X`09`09 END X`09`09 Else X`09`09 BEGIN X`09`09`09spook`5Bi`5D.dir := (spook`5Bi`5D.dir+next) mod 4; X`09`09`09tries := tries+1; X`09`09 END; X`09`09 END; X`09 3 : BEGIN X`09`09 If (map`5Bx+1,y`5D in `5B' ','`60'`5D) then X`09`09 BEGIN X`09`09`09map`5Bx,y`5D := ' '; X`09`09`09MoveDown('*',' '); X`09`09`09movesucc := true; X`09`09 END X`09`09 Else X`09`09 BEGIN X`09`09`09spook`5Bi`5D.dir := (spook`5Bi`5D.dir+next) mod 4; X`09`09`09tries := tries+1; X`09`09 END; X`09`09 END; X`09 Otherwise `7B do nothing `7D X`09 END; X`09 UNTIL (movesucc or (tries = 4)); X`09END; X X`7B------------------------------------------------------------------------- V----`7D X XBEGIN X`09For i := '0' to SpookNo do X`09 BEGIN X`09 pos(spook`5Bi`5D.X,spook`5Bi`5D.Y); X`09 dx := abs(spook`5Bi`5D.X-MeX); X`09 dy := abs(spook`5Bi`5D.Y-MeY); X`09 movesucc := false; X`09 If (((dx < 8) and (dy < 8)) or (spook`5Bi`5D.state = 'G')) then X`09 BEGIN X`09 If spook`5Bi`5D.state <> 'G' then X`09 `09 MoveMadMole; X`09 If spook`5Bi`5D.state = 'G' then X`09 `09 MoveGhost; X`09`09If not movesucc then X`09`09 MoveMildMole; X`09 END X`09 Else X`09 MoveMildMole; X`09 If not movesucc then X`09 spook`5Bi`5D.state := 'G'; X`09 spook`5Bi`5D.X := x; X`09 spook`5Bi`5D.Y := y; X`09 If map`5Bx,y`5D = '`60' then X`09 dead := true X`09 Else X `09 map`5Bx,y`5D := i; X`09 END; X`09For i := '0' to SpookNo do X`09 If map`5Bspook`5Bi`5D.X-1,spook`5Bi`5D.Y`5D = 'a' then X`09 DropRock(spook`5Bi`5D.X-1,spook`5Bi`5D.Y); X END; X X`7B************************************************************************* V****`7D X XPROCEDURE fire; XVAR X`09FireX, X`09FireY, X `09count`09: integer; X XBEGIN X`09FireX := MeX; X`09FireY := MeY; X`09If move = 50 then X`09 BEGIN X`09 WHILE (FireX <> (MeX+8))and(map`5BFireX+1,FireY`5D = ' ') do X`09 BEGIN X`09 qio_write (VT100_esc+'`5BD'+VT100_esc+'(B'+VT100_esc+'`5BBv'); X`09 FireX := FireX+1; X`09 END; X`09 If map`5BFireX+1,FireY`5D in `5B'0'..'9'`5D then X`09 killspook(map`5BFireX+1,FireY`5D) X`09 Else X`09 If map`5BFireX+1,FireY`5D in `5B'a','T','U'`5D then X`09 qio_write (VT100_esc+'`5B1m'); X`09 qio_write (VT100_esc+'(0'+VT100_esc+'`5BB'+VT100_esc+'`5BD'+map`5BFir VeX+1,FireY`5D+VT100_esc+'`5Bm'); X`09 If FireX > MeX then X`09 BEGIN X`09 For count := MeX to (FireX-1) do X`09`09 Begin X `09 qio_write (VT100_esc+'`5BD'+VT100_esc+'`5BA '); X`09`09 End; X`09 END; X`09 END X`09Else X`09 If move = 52 then X`09 BEGIN X`09 WHILE (FireY <> (MeY-8))and(map`5BFireX,FireY-1`5D = ' ') do X`09`09BEGIN X`09`09 qio_write (VT100_esc+'`5B2D'+VT100_esc+'(B<'); X`09`09 FireY := FireY-1; X`09`09END; X`09 If map`5BFireX,FireY-1`5D in `5B'0'..'9'`5D then X`09`09killspook(map`5BFireX,FireY-1`5D) X`09 Else X`09 If map`5BFireX,FireY-1`5D = 'a' then X`09 qio_write (VT100_esc+'`5B1m'); X `09 qio_write (VT100_esc+'(0'+VT100_esc+'`5B2D'+map`5BFireX,FireY-1`5 VD+VT100_esc+'`5Bm'); X`09 If FireY < MeY then X`09 BEGIN X`09 For count := FireY to (MeY-1) do X`09`09 qio_write (' '); X`09`09END; X`09 END X`09 Else X`09 If move = 54 then X`09 BEGIN X`09`09WHILE (FireY <> (MeY+8))and(map`5BFireX,FireY+1`5D = ' ') do X`09`09 BEGIN X`09`09 qio_write (VT100_esc+'(B>'); X`09`09 FireY := FireY+1; X`09`09 END; +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-