-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ X`20 XBEGIN XRDUMMY := MTH$RANDOM (RANDOM_SEED); XRANDOM := ORD (RANDOM_SEED MOD 2147483648) MOD N; XEND; X`20 X`20 X`20 X(*************************** TYPES **************************) X`20 X`20 X`20 XFUNCTION THETHING (I:INTEGER) : THING; X(* CONVERSION INTEGER -> THING (GNAGNA) *) XTYPE TRIX = RECORD CASE BOOLEAN OF X FALSE:(T:THING); X TRUE:(I:INTEGER); X END; XVAR T:TRIX; XBEGIN XT.I := I; XTHETHING := T.T; XEND; X`20 X`20 X`20 X(****************************** OUTPUT *******************************) X`20 XPROCEDURE OUTIT; X(* PUFFER OUTBUF AUF DEN BILDSCHIRM *) XBEGIN XIF OUTINX>0 THEN X $QIOW (CHAN:=CHOUT, X FUNC:=IO$_WRITEVBLK, X P1:=OUTBUF,P2:=OUTINX); XOUTINX := 0; XEND; X`20 XPROCEDURE OUTCHR (C:CHAR); XBEGIN XIF OUTINX = OUTBUFLEN THEN OUTIT; XOUTINX := OUTINX+1; XOUTBUF `5BOUTINX`5D := C; XEND; X`20 XPROCEDURE OUTSTR (S:STRING); XVAR I:INTEGER; XBEGIN XI := 1; XWHILE I <= LENGTH (S) DO X BEGIN X OUTCHR (S `5BI`5D); X I := I+1; X END; XEND; X`20 XPROCEDURE OUTINT (I,L:INTEGER); XVAR S:STRING; XBEGIN XWRITEV (S,I:L); XOUTSTR (S); XEND; X`20 XPROCEDURE CENTRIX (S:STRING; WIDTH:INTEGER); XVAR I:INTEGER; XBEGIN XI := WIDTH+WIDTH; XI := I+I+4-LENGTH (S); XWHILE I > 0 DO X BEGIN X OUTCHR (' '); X I := I-2; X END; XI := 1; XWHILE I <= LENGTH (S) DO X BEGIN X OUTCHR (S `5BI`5D); X I := I+1; X END; XOUTSTR (CRLF); XEND; X`20 XPROCEDURE FLASHMODE (ON:CHAR); X(* SET SCREEN FLASH MODE *) XBEGIN XIF ON <> IS_FLASH THEN X BEGIN X IS_FLASH := ON; X OUTSTR (CSI); OUTCHR (ON); OUTCHR ('m'); X END; XEND; X`20 X`20 X(***************************** ERROR *************************) X`20 XPROCEDURE ERROR (N:STRING); X(* ERROR & STOP *) XVAR K:INTEGER; XBEGIN XWRITE (XXERR01:42); XFOR K := 0 TO 50 DO WRITELN; XWRITELN (XXERR02,N,XXERR03); XHALT; XEND; X`20 X`20 X`20 X(********************* TIMING *********************) X`20 XPROCEDURE SCHEDULE (LOTIME:INTEGER); XBEGIN XTIMER.LO := -LOTIME; X$SCHDWK (DAYTIM := TIMER); XEND; X`20 X`20 X`20 X(****************************** SCREEN *******************************) X`20 XPROCEDURE GOTOXY (X,Y:INTEGER); X(* CURSOR NACH (X,Y), LINXOBEN IST (0,0) *) XBEGIN XOUTSTR (CSI); OUTINT (Y+1,1); OUTCHR (';'); OUTINT (X+1,1); OUTCHR ('H'); XEND; X`20 XPROCEDURE GOTOPS (H,V:INTEGER); X(* POSITION FUER DEN KLOTZ BEI (H,V) *) XBEGIN XGOTOXY (H+H,V+V+1); XEND; X`20 XPROCEDURE GOTOQS (H,V:INTEGER); X(* POSITION FUER DEN KLOTZ BEI (H,V) (UNTERE HAELFTE) *) XBEGIN XGOTOXY (H+H,V+V+2); XEND; X`20 XPROCEDURE GOTOHD (X:INTEGER); X(* POSITION CURSOR FOR HEADLINE *) XBEGIN XOUTSTR (XXAA901); OUTINT (X+1,1); OUTCHR ('H'); XEND; X`20 XPROCEDURE PAGE; X(* BILDSCHIRM LOESCHEN *) XBEGIN XOUTSTR (XXPAG01); (* CLEAR *) XEND; X`20 XPROCEDURE PREPPAGE; X(* BILDSCHIRM LOESCHEN UND EINTEILEN ("ELFMAL" 2HEIGHT, EINMAL NORMAL) *) XVAR I:INTEGER; XBEGIN XOUTSTR (XXPRP01); XI := 2; XWHILE I <= HEIGHT+HEIGHT+2 DO X BEGIN X OUTSTR (CSI); X OUTINT (I,1); X OUTSTR (XXPRP03); X I := I+2; X END; XEND; X`20 XPROCEDURE PUTPIC (X,Y:INTEGER; T:THING); X(* AN DER POSITION (X,Y) DAS DING T *) XVAR N:INTEGER; XBEGIN XGOTOPS (X,Y); XN := PICTURE `5BCYCLE4,T`5D; XFLASHMODE (FLASHPICT `5BT`5D); XOUTCHR (CHR(N)); OUTCHR (CHR(N+1)); XOUTCHR (CHR(8)); OUTCHR (CHR(8)); OUTCHR (CHR(10)); XOUTCHR (CHR(N)); OUTCHR (CHR(N+1)); XEND; X`20 XPROCEDURE PUTPIC0 (X,Y:INTEGER; VAR F:GAME_AREA; A,B:GAME_INDX); X(* AN DER POSITION (X,Y) AUS DEM FELD F *) XBEGIN XPUTPIC (X,Y,F `5BB+Y,A+X`5D); XEND; X`20 XPROCEDURE PUTPICX (Y:INTEGER; VAR F:GAME_AREA; A,B:GAME_INDX); X(* AN DER POSITION (0..,Y) AUS DEM FELD F *) XVAR X,N:INTEGER; X T:THING; XBEGIN XOUTSTR (CSI); OUTINT (Y+Y+2,1); OUTSTR (';1H'); XFOR X := 0 TO WIDTH DO X BEGIN X T := F `5BB+Y,A+X`5D; X N := PICTURE `5BCYCLE4,T`5D; X FLASHMODE (FLASHPICT `5BT`5D); X OUTCHR (CHR (N)); OUTCHR (CHR (N+1)); X END; XOUTSTR (CRLF); XFOR X := 0 TO WIDTH DO X BEGIN X T := F `5BB+Y,A+X`5D; X N := PICTURE `5BCYCLE4,T`5D; X FLASHMODE (FLASHPICT `5BT`5D); X OUTCHR (CHR (N)); OUTCHR (CHR (N+1)); X END; XEND; X`20 XPROCEDURE PUTPICY (X:INTEGER; VAR F:GAME_AREA; A,B:GAME_INDX); X(* AN DER POSITION (X,0..) AUS DEM FELD F *) XVAR Y,N:INTEGER; X T:THING; XBEGIN XOUTSTR (XXAA902); OUTINT (X+X+1,1); OUTCHR ('H'); XFOR Y := 0 TO HEIGHT DO X BEGIN X T := F `5BB+Y,A+X`5D; X N := PICTURE `5BCYCLE4,T`5D; X FLASHMODE (FLASHPICT `5BT`5D); X OUTCHR (CHR (N)); OUTCHR (CHR (N+1)); X OUTCHR (CHR (8)); OUTCHR (CHR (8)); OUTCHR (CHR (10)); X OUTCHR (CHR (N)); OUTCHR (CHR (N+1)); X IF YOB THEN X BEGIN X OB := OB+1; X OUTSTR (XXABD01); X OUTINT (HEIGHT+HEIGHT+3,1); X OUTSTR (XXABD02); X OUTINT (HEIGHT+HEIGHT+3,1); X OUTSTR (XXABD03); X OUTINT (HEIGHT+HEIGHT+4,1); X OUTCHR ('r'); (* SCROLL REGION 0..23 *) X PUTPICX (HEIGHT,FN,OA,NB); X Y1 := HEIGHT-1; X END; XIF NBOA THEN X BEGIN X OA := OA+1; X OUTSTR (XXABD06); X Y := HEIGHT+HEIGHT+1; X WHILE Y >= 0 DO X BEGIN X OUTSTR (XXABD07); X Y := Y-1; X END; X PUTPICY (WIDTH,FN,NA,NB); X X1 := WIDTH-1; X END; XIF NA= 0 DO X BEGIN X OUTSTR (XXABD09); X Y := Y-1; X END; X PUTPICY (0,FN,NA,NB); X X0 := 1; X END; XFOR Y := Y0 TO Y1 DO X BEGIN X FOR X := X0 TO X1 DO X TO_BE_GIVEN_OUT `5BX`5D := PICTURE `5BCYCLE4,FN `5BNB+Y,NA+X`5D`5D <> X PICTURE `5BPREDCYC4 `5BCYCLE4`5D,FO `5BOB+Y,OA+X` V5D`5D; X TO_BE_GIVEN_OUT `5BX1+1`5D := FALSE; X FOR X := X0 TO X1 DO X IF TO_BE_GIVEN_OUT `5BX`5D THEN X BEGIN X XA := X; X GOTOPS (X,Y); X REPEAT X T := FN `5BNB+Y,NA+XA`5D; X FLASHMODE (FLASHPICT `5BT`5D); X N := PICTURE `5BCYCLE4,T`5D; X OUTCHR (CHR(N)); OUTCHR (CHR(N+1)); X TO_BE_GIVEN_OUT `5BXA`5D := FALSE; X XA := XA+1; X UNTIL NOT TO_BE_GIVEN_OUT `5BXA`5D; X IF XA-1 = X THEN X BEGIN X OUTCHR (CHR(8)); OUTCHR (CHR(8)); OUTCHR (CHR(10)); X OUTCHR (CHR(N)); OUTCHR (CHR(N+1)); X END X ELSE X BEGIN X GOTOQS (X,Y); X FOR XB := X TO XA-1 DO X BEGIN X T := FN `5BNB+Y,NA+XB`5D; X FLASHMODE (FLASHPICT `5BT`5D); X N := PICTURE `5BCYCLE4,T`5D; X OUTCHR (CHR(N)); OUTCHR (CHR(N+1)); X END; X END; X END; X END; XFLASHMODE ('0'); XOUTSTR (XXABD10); (* SI FOR SELECT G0 AS LOWER HALF FONT (00.7F) *) XIF L_STAT IN `5BL_COMIN,L_COMOUT`5D THEN X BEGIN X GOTOHD (0); X CENTRIX (' *** '+CAVE_ID+XXABD12,WIDTH); X END ELSE XIF CYCLE4=0 THEN X BEGIN X OUTSTR (XXABD13); OUTINT (HAVE_DIAM,5); X OUTSTR (' NEED:'); X IF HAVE_DIAM 0 THEN X BEGIN X IF LEFT_TIME < 16 THEN FLASHMODE ('7'); X OUTINT (LEFT_TIME,4); X FLASHMODE ('0'); X END X ELSE OUTSTR ('****'); X END; X OUTSTR (' MEN:'); X OUTINT (NUMP,3); X OUTSTR (' SCORE:'); X OUTINT (SCORE,9); X END; XEND; X`20 X`20 X`20 X(***************************** KOPPLUNG ***************************) X`20 XPROCEDURE INCSCORE (I:INTEGER); XBEGIN XIF (SCORE+I) DIV 500 > SCORE DIV 500 THEN X BEGIN X NUMP := NUMP+1; X OUTSTR (XXINC01); X END; XSCORE := SCORE + I; XEND; X`20 XFUNCTION RANDOMAGMA : BOOLEAN; XBEGIN XRANDOMAGMA := RANDOM (MAGMA_GROW) = 0; XMAGMA_SURROUNDED := FALSE; XEND; X`20 XPROCEDURE EINDRUCK (VAR F,O:GAME_AREA); XCONST SETWAYBOR = `5BWAYOUT,BORDER`5D; XVAR X,Y:GAME_INDX; X WENT:BOOLEAN; XBEGIN XMAGMA_SURROUNDED := TRUE; XFOR Y := 0 TO SIZ_Y DO X FOR X := 0 TO SIZ_X DO X IF O `5BY,X`5D = F `5BY,X`5D THEN X CASE F `5BY,X`5D OF X MAGMA: X IF MAGMA_CLOSED THEN F `5BY,X`5D := LYINGDIAMONT ELSE X IF LEFT_TIME <= MAGMA_COOL THEN F `5BY,X`5D := LYINGSTONE ELSE X BEGIN X CASE F `5BY-1,X`5D OF X NOTHING,EARTH: X IF RANDOMAGMA THEN F `5BY-1,X`5D := MAGMA; X BUTTERFLY0,BUTTERFLY1,BUTTERFLY2,BUTTERFLY3: X F `5BY-1,X`5D := SMASH0; X SQUAREFLY0,SQUAREFLY1,SQUAREFLY2,SQUAREFLY3: X F `5BY-1,X`5D := CRASH0; X END; X CASE F `5BY+1,X`5D OF X NOTHING,EARTH: X IF RANDOMAGMA THEN F `5BY+1,X`5D := MAGMA; X BUTTERFLY0,BUTTERFLY1,BUTTERFLY2,BUTTERFLY3: X F `5BY+1,X`5D := SMASH0; X SQUAREFLY0,SQUAREFLY1,SQUAREFLY2,SQUAREFLY3: X F `5BY+1,X`5D := CRASH0; X END; X CASE F `5BY,X-1`5D OF X NOTHING,EARTH: X IF RANDOMAGMA THEN F `5BY,X-1`5D := MAGMA; X BUTTERFLY0,BUTTERFLY1,BUTTERFLY2,BUTTERFLY3: X F `5BY,X-1`5D := SMASH0; X SQUAREFLY0,SQUAREFLY1,SQUAREFLY2,SQUAREFLY3: X F `5BY,X-1`5D := CRASH0; X END; X CASE F `5BY,X+1`5D OF X NOTHING,EARTH: X IF RANDOMAGMA THEN F `5BY,X+1`5D := MAGMA; X BUTTERFLY0,BUTTERFLY1,BUTTERFLY2,BUTTERFLY3: X F `5BY,X+1`5D := SMASH0; X SQUAREFLY0,SQUAREFLY1,SQUAREFLY2,SQUAREFLY3: X F `5BY,X+1`5D := CRASH0; X END; X END; X LYINGSTONE: X CASE F `5BY+1,X`5D OF X NOTHING: X BEGIN X F `5BY,X`5D := NOTHING; X F `5BY+1,X`5D := ROLLINGSTONE; X END; X LYINGSTONE,LYINGDIAMONT,NORMALWALL: X IF (F `5BY,X+1`5D = NOTHING) AND (F `5BY+1,X+1`5D = NOTHING) THE VN X BEGIN X F `5BY,X+1`5D := ROLLINGSTONE; X F `5BY,X`5D := NOTHING; X END ELSE X IF (F `5BY,X-1`5D = NOTHING) AND (F `5BY+1,X-1`5D = NOTHING) THE VN X BEGIN X F `5BY,X-1`5D := ROLLINGSTONE; X F `5BY,X`5D := NOTHING; X END; X END; X ROLLINGSTONE: X IF F `5BY+1,X`5D = NOTHING THEN X BEGIN X F `5BY+1,X`5D := ROLLINGSTONE; X F `5BY,X`5D := NOTHING; X END ELSE X IF F `5BY+1,X`5D = SLEEPINGWALL THEN X BEGIN X IF LW_ACTIVE < 0 THEN LW_ACTIVE := MAGMA_GROW; X F `5BY,X`5D := NOTHING; X IF LW_ACTIVE <> 0 THEN X IF F`5BY+2,X`5D = NOTHING THEN F`5BY+2,X`5D := ROLLINGDIAMONT; X END ELSE X IF F `5BY+1,X`5D = LIVINGWALL THEN X BEGIN X F `5BY,X`5D := NOTHING; X IF F`5BY+2,X`5D = NOTHING THEN F`5BY+2,X`5D := ROLLINGDIAMONT; X END ELSE X IF F `5BY+1,X`5D IN `5BSQUAREFLY0..SQUAREFLY3`5D THEN F `5BY+1,X`5D V := CRASH0 ELSE X IF F `5BY+1,X`5D IN `5BBUTTERFLY0..BUTTERFLY3`5D THEN F `5BY+1,X`5D V := SMASH0 X ELSE F `5BY,X`5D := LYINGSTONE; X LYINGDIAMONT: X CASE F `5BY+1,X`5D OF X NOTHING: X BEGIN X F `5BY,X`5D := NOTHING; X F `5BY+1,X`5D := ROLLINGDIAMONT; X END; X LYINGSTONE,LYINGDIAMONT,NORMALWALL: X IF (F `5BY,X+1`5D = NOTHING) AND (F `5BY+1,X+1`5D = NOTHING) THE VN X BEGIN X F `5BY,X+1`5D := ROLLINGDIAMONT; X F `5BY,X`5D := NOTHING; X END ELSE X IF (F `5BY,X-1`5D = NOTHING) AND (F `5BY+1,X-1`5D = NOTHING) THE VN X BEGIN X F `5BY,X-1`5D := ROLLINGDIAMONT; X F `5BY,X`5D := NOTHING; X END; X END; X ROLLINGDIAMONT: X IF F `5BY+1,X`5D = NOTHING THEN X BEGIN X F `5BY+1,X`5D := ROLLINGDIAMONT; X F `5BY,X`5D := NOTHING; X END ELSE X IF F `5BY+1,X`5D = SLEEPINGWALL THEN X BEGIN X IF LW_ACTIVE < 0 THEN LW_ACTIVE := MAGMA_GROW; X F `5BY,X`5D := NOTHING; X IF LW_ACTIVE <> 0 THEN X IF F`5BY+2,X`5D = NOTHING THEN F`5BY+2,X`5D := ROLLINGSTONE; X END ELSE X IF F `5BY+1,X`5D = LIVINGWALL THEN X BEGIN X F `5BY,X`5D := NOTHING; X IF F`5BY+2,X`5D = NOTHING THEN F`5BY+2,X`5D := ROLLINGSTONE; X END ELSE X IF F `5BY+1,X`5D IN `5BSQUAREFLY0..SQUAREFLY3`5D THEN F `5BY+1,X`5D V := CRASH0 ELSE X IF F `5BY+1,X`5D IN `5BBUTTERFLY0..BUTTERFLY3`5D THEN F `5BY+1,X`5D V := SMASH0 X ELSE F `5BY,X`5D := LYINGDIAMONT; X BUTTERFLY0: X IF F `5BY-1,X`5D = NOTHING THEN X BEGIN X F `5BY-1,X`5D := BUTTERFLY1; X F `5BY,X`5D := NOTHING; X END ELSE X IF F `5BY,X-1`5D = NOTHING THEN X BEGIN X F `5BY,X-1`5D := BUTTERFLY0; X F `5BY,X`5D := NOTHING; X END X ELSE F `5BY,X`5D := BUTTERFLY3; X BUTTERFLY1: X IF F `5BY,X+1`5D = NOTHING THEN X BEGIN X F `5BY,X+1`5D := BUTTERFLY2; X F `5BY,X`5D := NOTHING; X END ELSE +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-