$! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_VERIFY"))' $! $! This archive created by VMS_SHARE Version 7.2-007 22-FEB-1990 $! On 21-MAY-1992 00:51:49.41 By user MASMUMMY $! $! This VMS_SHARE Written by: $! Andy Harper, Kings College London UK $! $! Acknowledgements to: $! James Gray - Original VMS_SHARE $! Michael Bednarek - Original Concept and implementation $! $!+ THIS PACKAGE DISTRIBUTED IN 5 PARTS, TO KEEP EACH PART $! BELOW 30 BLOCKS $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. BD.CAVES;1 $! 2. BD.COM;1 $! 3. BD.HELP;1 $! 4. BD.PAS;1 $! 5. BD.PICTURES;1 $! 6. BD.POINTER;1 $! 7. BD.TXT;1 $! 8. BOULDER.DASH;1 $! $set="set" $set symbol/scope=(nolocal,noglobal) $f=f$parse("SHARE_TEMP","SYS$SCRATCH:.TMP_"+f$getjpi("","PID")) $e="write sys$error ""%UNPACK"", " $w="write sys$output ""%UNPACK"", " $ if f$trnlnm("SHARE_LOG") then $ w = "!" $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto START $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $UNPACK: SUBROUTINE ! P1=filename, P2=checksum $ if f$search(P1) .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped." $ delete 'f'* $ exit $file_absent: $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'." $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn'. File skipped." $ delete 'f'* $ exit $dirok: $ w "-I-PROCESS, Processing file ''P1'." $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT 'f'/OUT='P1' PROCEDURE Unpacker ON_ERROR ENDON_ERROR;SET(FACILITY_NAME,"UNPACK");SET( SUCCESS,OFF);SET(INFORMATIONAL,OFF);f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);p:=SPAN(" ")@r&LINE_END;POSITION(BEGINNING_OF(b)); LOOP EXITIF SEARCH(p,FORWARD)=0;POSITION(r);ERASE(r);ENDLOOP;POSITION( BEGINNING_OF(b));g:=0;LOOP EXITIF MARK(NONE)=END_OF(b);x:=ERASE_CHARACTER(1); IF g=0 THEN IF x="X" THEN MOVE_VERTICAL(1);ENDIF;IF x="V" THEN APPEND_LINE; MOVE_HORIZONTAL(-CURRENT_OFFSET);MOVE_VERTICAL(1);ENDIF;IF x="+" THEN g:=1; ERASE_LINE;ENDIF;ELSE IF x="-" THEN IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+")= 1 THEN g:=0;ENDIF;ENDIF;ERASE_LINE;ENDIF;ENDLOOP;t:="0123456789ABCDEF"; POSITION(BEGINNING_OF(b));LOOP r:=SEARCH("`",FORWARD);EXITIF r=0;POSITION(r); ERASE(r);x1:=INDEX(t,ERASE_CHARACTER(1))-1;x2:=INDEX(t,ERASE_CHARACTER(1))-1; COPY_TEXT(ASCII(16*x1+x2));ENDLOOP;WRITE_FILE(b,GET_INFO(COMMAND_LINE, "output_file"));ENDPROCEDURE;Unpacker;QUIT; $ delete/nolog 'f'* $ CHECKSUM 'P1' $ IF CHECKSUM$CHECKSUM .eqs. P2 THEN $ EXIT $ e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ ENDSUBROUTINE $START: $ create 'f' X21 X40 22 3 2 12 10 15 150 0 8492 0 XCAVE A XB# 1 1 38 20 XR% 1 1 38 20 160 XR 1 1 38 20 50 XR' 1 1 38 20 18 XB9 1 7 30 1 XB9 9 14 30 1 XS! 38 16 XX! X40 22 18 19 10 20 50 180 0 3912 0 XCAVE B XB# 1 1 38 20 XR% 1 1 38 20 150 XR 1 1 38 20 40 XR' 1 1 38 20 19 XB9 8 1 1 20 XB9 16 1 1 20 XB9 24 1 1 20 XB9 32 1 1 20 XB9 1 6 38 1 XB9 1 13 38 1 XB 20 1 1 20 XB 1 3 38 1 XB 1 9 38 1 XB 1 16 38 1 XS- 1 17 XS! 18 20 XX! X40 22 3 2 24 15 0 320 0 3910 0 XCAVE C XB# 1 1 38 20 XR9 1 1 38 20 200 XR% 1 1 38 20 200 XR' 1 1 39 20 26 XS! 39 18 XX! X40 22 1 1 36 5 20 150 0 4412 0 XCAVE D XB# 1 1 38 20 XR% 1 1 38 20 40 XB 9 9 2 2 XB 17 9 2 2 XB 25 9 2 2 XB 33 9 2 2 XL) 9 9 8 0 4 XS! 38 20 XX! X19 11 3 3 6 30 0 255 1 0 0 XBONUS XB 1 1 17 9 XS% 9 2 XS# 9 3 XS+ 6 9 XS! 17 9 XX! X40 22 1 1 4 50 90 190 0 0 0 XCAVE E XB# 1 1 38 20 XB 8 8 3 3 XB 16 8 3 3 XB 24 8 3 3 XB 32 8 3 3 XB 8 14 3 3 XB 16 14 3 3 XB 24 14 3 3 XB 32 14 3 3 XL- 10 9 8 0 4 XL- 10 15 8 0 4 XL' 9 10 8 0 4 XL' 9 16 8 0 4 XS! 39 20 XX! X40 22 3 18 4 40 60 180 0 2249 0 XCAVE F XB# 1 1 38 20 XR% 1 1 38 20 200 XB9 1 1 9 13 XB9 30 1 9 13 XB 2 2 8 2 XB 2 5 8 2 XB 2 8 8 2 XB 2 11 8 2 XB 30 2 8 2 XB 30 5 8 2 XB 30 8 8 2 XB 30 11 8 2 XL' 3 3 0 3 4 XL' 36 3 0 3 4 XL- 4 3 0 3 4 XL- 35 3 0 3 4 XS! 38 18 XX! X40 22 20 1 15 10 20 200 0 7705 77 XCAVE G XB# 1 1 38 20 XR% 1 1 38 20 200 XR 1 1 38 20 150 XR' 1 1 38 20 10 XR- 1 1 38 20 10 XB9 1 5 12 1 XB9 28 3 11 1 XS$ 20 19 XS! 39 5 XX! X40 22 20 1 10 10 20 200 0 4312 101 XCAVE H XB# 1 1 38 20 XR% 1 1 38 20 200 XR 1 1 38 20 150 XR' 1 1 38 20 7 XR- 1 1 38 20 7 XB9 1 5 12 1 XB9 28 3 11 1 XB9 1 13 12 1 XB9 28 11 11 1 XB; 14 15 8 1 XS! 0 3 XX! X19 11 1 2 15 10 0 255 1 0 0 XBONUS XB# 1 1 17 9 XL- 2 1 1 1 7 XL% 1 1 1 1 8 XL' 2 3 1 1 7 XL% 1 4 1 1 6 XL% 9 8 1 -1 9 XL' 9 9 1 -1 8 XL% 11 9 1 -1 7 XS! 17 1 XX! X40 22 7 10 75 5 10 200 0 1440 0 XCAVE I XB% 1 1 38 20 XR' 1 1 38 20 500 XR# 1 1 38 20 50 XF9 5 8 13 13 XF9 25 8 13 13 XB 6 9 11 11 XB 26 9 11 11 XB9 17 16 9 1 XB 17 17 9 1 XS# 12 8 XS# 31 8 XS! 8 10 XX! X40 22 13 1 12 25 60 240 0 0 0 XCAVE J XB# 1 1 38 20 XF9 1 2 21 17 XB9 3 4 3 14 XL' 6 3 2 2 8 XL' 6 17 2 -2 8 XB 6 9 15 3 XB- 6 10 15 1 XF9 7 4 13 13 XF9 9 6 9 9 XF9 11 8 5 5 XB- 4 5 1 9 XB' 4 14 1 4 XL 13 2 0 2 4 XS 4 4 XS! 39 20 XX! X40 22 20 18 6 50 100 280 0 2434 0 XCAVE K XB# 1 1 38 20 XR% 1 1 38 20 200 XR 1 1 38 20 80 XR- 1 1 38 20 9 XR' 1 1 38 20 3 XB9 10 1 1 8 XB9 20 1 1 8 XB9 30 1 1 8 XB9 5 9 9 1 XB9 15 9 9 1 XB9 25 9 9 1 XB9 9 12 1 9 XB9 12 13 17 1 XL9 28 17 1 -1 8 XL' 4 1 10 0 4 XS! 38 15 XX! X40 22 3 13 15 20 35 240 0 2427 0 XCAVE L XB# 1 1 38 20 XR% 1 1 38 20 175 XR' 1 1 38 20 23 XR 1 1 38 20 40 XB9 2 16 11 1 XB9 2 12 15 1 XB9 10 3 1 18 XB9 14 3 1 18 XB9 18 3 1 18 XB9 22 3 1 18 XB9 2 8 11 1 XB9 2 4 11 1 XB 31 3 2 2 XB 31 8 2 2 XB 31 13 2 2 XF# 30 2 4 4 XF# 30 7 4 4 XF# 30 12 4 4 XL- 31 3 0 5 3 XS! 11 21 XX! X19 11 9 2 5 10 20 255 1 0 0 XBONUS XB 1 1 17 9 XB' 1 9 13 1 XB- 14 6 4 4 XS! 17 4 XX! X40 22 20 1 50 5 8 240 0 2410 123 XCAVE M XB# 1 1 38 20 XR% 1 1 38 20 200 XB9 5 16 30 1 XB) 5 17 30 1 XB% 5 18 30 1 XB# 4 19 32 2 XS$ 22 1 XS! 12 1 XX! X40 22 4 1 30 10 20 200 0 0 0 XCAVE N XB# 1 1 38 20 XL- 23 5 2 0 6 XL% 23 6 2 0 6 XB 20 9 1 11 XB 18 9 1 11 XB 16 9 1 11 XB 14 9 1 11 XB 12 9 1 11 XB 10 9 1 11 XL, 10 9 2 2 6 XS! 39 18 XX! X40 22 20 1 15 10 20 200 0 9 96 XCAVE O XB# 1 1 38 20 XR% 1 1 38 20 200 XR 1 1 38 20 60 XR- 1 1 38 20 8 XL9 2 2 1 1 10 XL9 15 11 1 -1 10 XB# 12 11 3 2 XB; 12 13 3 1 XS! 20 20 XX! X40 22 1 1 12 10 20 220 0 555 103 XCAVE P XB# 1 1 38 20 XR% 1 1 38 20 150 XF9 7 8 6 8 XF9 15 8 6 8 XB; 7 8 6 1 XB; 15 8 6 1 XF# 8 17 4 4 XF# 16 17 4 4 XF# 24 17 4 4 XF# 32 17 4 4 XB 9 18 2 2 XB 17 18 2 2 XB 25 18 2 2 XB 33 18 2 2 XL- 10 18 8 0 4 XS! 39 2 XX! X19 12 3 1 6 30 0 255 1 0 16 XBONUS XB# 1 1 17 10 XB% 10 1 3 2 XB; 10 4 3 1 XB 10 5 3 3 XB; 10 8 3 1 XB 10 9 3 2 XL% 7 5 1 1 3 XS! 8 8 XX! X40 22 20 1 23 17 42 220 0 555 103 XCAVE Q XB# 1 1 38 20 XR% 1 1 38 20 180 XB# 1 9 38 1 XB 1 10 38 7 XB# 1 17 38 4 XB9 32 1 1 20 XB9 7 1 1 20 XL- 9 16 5 0 4 XL* 1 10 0 3 3 XL+ 38 10 0 3 3 XS! 20 20 XX! $ CALL UNPACK BD.CAVES;1 2104154584 $ create 'f' X$write sys$output "Terminal/Port auf 19200 Baud stellen!" X$write sys$output "You *MUST* be on a VT200 or higher to run this well" X$wait 00:00:01 X$set term/dev=vt200/speed=19200 X$def/nolog b$dash_in disk$userdisk1:bd.pointe Vr X$def/nolog b$dash disk$userdisk1: X$def/user sys$input tt: X$run b$dash:bd $ CALL UNPACK BD.COM;1 1918638669 $ create 'f' X1 BOULDERDASH XA well written version of the popular game "Boulderdash". Not sure what Xthe goal is so there is no external help :-). If you can translate the XGerman text, please send e-mail to user MASTER@UBVMS X XRead "Hardware Requirements"!!! X X2 PossibleHelp X+-------------------------------------------------------+ X`7C`09`09`09`09`09`09`09`7C X`7C`09`09 BOULDER DASH`09`09`09`7C X`7C`09`09`09`09`09`09`09`7C X+-------------------------------------------------------+ X X(w) 1988 Oskar Schirmer X XEs handelt sich hierbei um den versuch, ein echtzeitspiel Xauf einem grossrechner unterzubringen (...). X X0. wichtig: nach dem starten titelseite lesen ! X X1. boulder dash (als spiel): Xes geht darum, ein maenneken durch eine hoehle zu steuern, Xdiamanten zu finden, zu sammeln und schliesslich den ausgang Xzu benutzen. fuer gesammelte diamanten gibz punkte (DIAM:), Xdie zahl der benoetigten diamanten steht unter NEED:. Xfuer die ganze aktion steht die unter LEFT: gezaehlte zeit Xzur verfuegung. im uebrigen sind die level mehr oder weniger Xvom original auf dem apple uebernommen und sie sind alle Xmachbar !!! viel spass. X X2 HardwareRequirements Xan hardware wird benoetigt: X Xeine hinreichend eilige vax mit allem drum&dran (was das genau ist, Xsagt ihnen bestimmt gerne die auskunft). Xzum beispiel ein vt220-terminal, das in der lage ist, sixel-grafic Xanzuzeigen und zwar sollte das die daten mit einer rate von einigen Xkbaud, will heissen etwa 9600 oder 19200 baud. alles andere hat mit Xechtzeit nix mehr zu tun. X XYou *MUST* be on a VT200 or greater series terminal to play this. $ CALL UNPACK BD.HELP;1 2018800252 $ create 'f' X`7B`5E86$2ytDhhb23hg$67fg3765GHU&y `7D X`5BINHERIT('SYS$LIBRARY:STARLET')`5D XPROGRAM SPIELCHEN (INPUT,OUTPUT); X`20 X(******************************) X(* BOULDER DASH *) X(* WRITTEN 1988 BY *) X(* OSKAR SCHIRMER *) X(******************************) X`20 XCONST GAME_SIZE = 127; X MAGMA_COOL = 50; X SECOND = 10000000; X MOMENT = 2400000; X OUTBUFLEN = 256; X`20 X CSI = CHR(27)+'`5B'; X CRLF = CHR (13)+CHR (10); X XXERR01 = CHR(7)+CHR(27)+'`5B2J'+CHR(27)+'`5B?25h'+CHR(27)+'`5B?8h'; X XXABD10 = CHR(15)+CHR(27)+'`5B?5l'; X XXMNU01 = CHR(27)+'#6'+CHR(27)+'#'; X XXAA901 = CHR(27)+'`5B1;'; X XXABD06 = CHR(27)+'`5B1;1H'+CHR (13)+CHR (10); X XXABD08 = XXABD06; X XXPAG01 = CHR(27)+'`5B1;1H'+CHR(27)+'`5B2J'; X XXPRP01 = CHR(27)+'`5B1;1H'+CHR(27)+'`5B2J'+CHR(27)+'`5B?8l'+CHR(27)+' V`5B?25l'+CHR(27)+'`5B?7l' X +CHR(27)+'`5B1;1H'+CHR (27)+'#5'+CHR(10); X XXABD13 = CHR(27)+'`5B1;1HGOT:'; X XXABD01 = CHR(27)+'`5B2;'; X XXAA902 = XXABD01; X XXABD04 = XXABD01; X XXABD09 = CHR(27)+'`5B2@'+CHR(13)+CHR(10); X XXPLY01 = CHR(27)+'`5B2J'+CHR(27)+'`5B?25h'+CHR(27)+'`5B?8h'; X XXABD07 = CHR(27)+'`5B2P'+CHR (13)+CHR (10); X XXERR02 = CHR(27)+'`5B7m**** ERROR: '; X XXINC01 = CHR(27)+'`5B?5h'; X XXEIN01 = XXINC01; X XXMNU03 = CHR(27)+'`5BK'; X XXABD11 = ' '+CHR(27)+'`5B7mPAUSE'+CHR(27)+'`5B0m '; X XXABD12 = ' ***'+CHR(27)+'`5BK'; X XXERR03 = ' ****'+CHR(27)+'`5B0m'+CHR(7); X XXPRP03 = ';1H'+CHR(27)+'#6'+CHR(27)+'#3'+CHR(10)+CHR(27)+'#6'+CHR(27) V+'#4'; X XXABD03 = ';1H'+CHR(27)+'D'+CHR(27)+'#6'+CHR(27)+'#3'+CHR(27)+'D'+CHR( V27) X +'#6'+CHR(27)+'#4'+CHR(27)+'`5B1;'; X XXMNU02 = '`5D'+CHR (13)+CHR (10); X XXABD02 = 'r'+CHR(27)+'`5B'; X XXABD05 = 'r'+CHR(27)+'`5B2;1H'+CHR(27)+'M'+CHR(27)+'#6'+CHR(27)+'#4'+ VCHR(27)+'M' X +CHR(27)+'#6'+CHR(27)+'#3'+CHR(27)+'`5B1;'; X`20 X`20 XTYPE GAME_INDX = 0..GAME_SIZE; X STRING = VARYING `5B255`5D OF CHAR; X THING = (NOTHING,WAYOUT,BORDER,EARTH,MAGMA, `7B !"#$`7D X LYINGSTONE,ROLLINGSTONE,LYINGDIAMONT,ROLLINGDIAMONT, `7B%&'(`7 VD X BUTTERFLY0,BUTTERFLY1,BUTTERFLY2,BUTTERFLY3, `7B)*+,`7D X SQUAREFLY0,SQUAREFLY1,SQUAREFLY2,SQUAREFLY3, `7B-./0`7D X SMASH0,SMASH1,SMASH2,SMASH3, `7B1234`7D X CRASH0,CRASH1,CRASH2,CRASH3, `7B5678`7D X NORMALWALL,LIVINGWALL,SLEEPINGWALL, `7B9:;`7D X HAMSTER, `7B<`7D X THING_HIGH); X GAME_STATUS = (L_COMIN,L_ALIVE,L_DEAD,L_COUNT,L_COMOUT,L_ENDLVL); X GAME_AREA = ARRAY `5BGAME_INDX,GAME_INDX`5D OF THING; X T_CAVE_NAMES = `5E R_CAVE_NAMES; X R_CAVE_NAMES = RECORD NEXT : T_CAVE_NAMES; NAME : STRING; END; X $SQUAD = `5BQUAD,UNSAFE`5D RECORD LO,HI:INTEGER; END; X`20 XVAR AREA,OLDY:GAME_AREA; X PREDCYC4:ARRAY `5B0..3`5D OF 0..3; X L_STAT:GAME_STATUS; X CAVE_NAMES:T_CAVE_NAMES; X COMMAND,TASTE_LINX,TASTE_REXZ,TASTE_OBEN,TASTE_UNTN, X SCHAU_LINX,SCHAU_REXZ,SCHAU_OBEN,SCHAU_UNTN,MAINC,IS_FLASH:CHAR; X OK,GO,PAUSE,WINNY,MAGMA_CLOSED,MAGMA_SURROUNDED:BOOLEAN; X CAVE_ID,LINE,NEXTCAVE,FIRSTCAVE,GAMEFONT,CAVEROOT:STRING; X PICTURE:ARRAY `5B0..3,THING`5D OF 0..255; X FLASHPICT:ARRAY `5BTHING`5D OF CHAR; X SIZ_X,SIZ_Y,CYCLE4,QOS_A,QOS_B,POS_A,POS_B,HAM_A,HAM_B,HAMPA,HAMPB, X NUMP,SCORE,NEED_DIAM,HAVE_DIAM,VAL0_DIAM,VAL1_DIAM,LEFT_TIME,DOPLAY, X LW_ACTIVE,SCRPA,SCRPB,BONUS_HAM,HEIGHT,WIDTH,STATUS_C,MAXCAVE, X MAGMA_GROW,NOKEYDONE:INTEGER; X INPCH:PACKED ARRAY `5B1..1`5D OF CHAR; X CHIN,CHOUT:`5BWORD`5D 0..65535; X TIMER:$SQUAD; X OUTINX:INTEGER; X OUTBUF:PACKED ARRAY `5B1..OUTBUFLEN`5D OF CHAR; X RANDOM_SEED:UNSIGNED; X TO_BE_GIVEN_OUT:PACKED ARRAY `5B0..GAME_SIZE`5D OF BOOLEAN; X WIZARD:BOOLEAN; X DOIT,DOITTOO:BOOLEAN:=FALSE; X DATF:TEXT; X`20 X(************************* RANDOM *************************) X`20 XPROCEDURE RANDOMIZE; XTYPE QUADWORD = ARRAY `5BBOOLEAN`5D OF UNSIGNED; XVAR TEMP:QUADWORD; XBEGIN X$GETTIM (TEMP); XRANDOM_SEED := TEMP `5BFALSE`5D; XEND; X`20 XFUNCTION RANDOM (N:INTEGER) : INTEGER; XVAR RDUMMY:REAL; X`20 X FUNCTION MTH$RANDOM (VAR SEED:UNSIGNED) : REAL; X EXTERN; 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; +-+-+-+-+-+-+-+- END OF PART 1 +-+-+-+-+-+-+-+- * Program BOULDERDASH by Oskar Schirmer (1988). * BOULDERDASH.$PACKAGE BOULDERDASH.1 BOULDERDASH.2 BOULDERDASH.3 BOULDERDASH.4 BOULDERDASH.5 -+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ 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 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 X ELSE F `5BY,X`5D := BUTTERFLY0; X BUTTERFLY2: X IF F `5BY+1,X`5D = NOTHING THEN X BEGIN X F `5BY+1,X`5D := BUTTERFLY3; 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 := BUTTERFLY2; X F `5BY,X`5D := NOTHING; X END X ELSE F `5BY,X`5D := BUTTERFLY1; X BUTTERFLY3: X IF F `5BY,X-1`5D = NOTHING THEN X BEGIN +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+- -+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+ X F `5BY,X-1`5D := BUTTERFLY0; X F `5BY,X`5D := NOTHING; X END ELSE X IF F `5BY+1,X`5D = NOTHING THEN X BEGIN X F `5BY+1,X`5D := BUTTERFLY3; X F `5BY,X`5D := NOTHING; X END X ELSE F `5BY,X`5D := BUTTERFLY2; X SQUAREFLY0: X IF F `5BY+1,X`5D = NOTHING THEN X BEGIN X F `5BY+1,X`5D := SQUAREFLY3; 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 := SQUAREFLY0; X F `5BY,X`5D := NOTHING; X END X ELSE F `5BY,X`5D := SQUAREFLY1; X SQUAREFLY1: X IF F `5BY,X-1`5D = NOTHING THEN X BEGIN X F `5BY,X-1`5D := SQUAREFLY0; X F `5BY,X`5D := NOTHING; X END ELSE X IF F `5BY-1,X`5D = NOTHING THEN X BEGIN X F `5BY-1,X`5D := SQUAREFLY1; X F `5BY,X`5D := NOTHING; X END X ELSE F `5BY,X`5D := SQUAREFLY2; X SQUAREFLY2: X IF F `5BY-1,X`5D = NOTHING THEN X BEGIN X F `5BY-1,X`5D := SQUAREFLY1; 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 := SQUAREFLY2; X F `5BY,X`5D := NOTHING; X END X ELSE F `5BY,X`5D := SQUAREFLY3; X SQUAREFLY3: X IF F `5BY,X+1`5D = NOTHING THEN X BEGIN X F `5BY,X+1`5D := SQUAREFLY2; X F `5BY,X`5D := NOTHING; X END ELSE X IF F `5BY+1,X`5D = NOTHING THEN X BEGIN X F `5BY+1,X`5D := SQUAREFLY3; X F `5BY,X`5D := NOTHING; X END X ELSE F `5BY,X`5D := SQUAREFLY0; X SMASH0: X BEGIN X F `5BY ,X `5D := SMASH1; X IF NOT (F `5BY+1,X `5D IN SETWAYBOR) THEN F `5BY+1,X `5D := SMASH1 V; X IF NOT (F `5BY-1,X `5D IN SETWAYBOR) THEN F `5BY-1,X `5D := SMASH1 V; X IF NOT (F `5BY ,X+1`5D IN SETWAYBOR) THEN F `5BY ,X+1`5D := SMASH1 V; X IF NOT (F `5BY+1,X+1`5D IN SETWAYBOR) THEN F `5BY+1,X+1`5D := SMASH1 V; X IF NOT (F `5BY-1,X+1`5D IN SETWAYBOR) THEN F `5BY-1,X+1`5D := SMASH1 V; X IF NOT (F `5BY ,X-1`5D IN SETWAYBOR) THEN F `5BY ,X-1`5D := SMASH1 V; X IF NOT (F `5BY+1,X-1`5D IN SETWAYBOR) THEN F `5BY+1,X-1`5D := SMASH1 V; X IF NOT (F `5BY-1,X-1`5D IN SETWAYBOR) THEN F `5BY-1,X-1`5D := SMASH1 V; X END; X SMASH1: X F `5BY,X`5D := SMASH2; X SMASH2: X F `5BY,X`5D := SMASH3; X SMASH3: X F `5BY,X`5D := LYINGDIAMONT; X CRASH0: X BEGIN X F `5BY ,X `5D := CRASH1; X IF NOT (F `5BY+1,X `5D IN SETWAYBOR) THEN F `5BY+1,X `5D := CRASH1 V; X IF NOT (F `5BY-1,X `5D IN SETWAYBOR) THEN F `5BY-1,X `5D := CRASH1 V; X IF NOT (F `5BY ,X+1`5D IN SETWAYBOR) THEN F `5BY ,X+1`5D := CRASH1 V; X IF NOT (F `5BY+1,X+1`5D IN SETWAYBOR) THEN F `5BY+1,X+1`5D := CRASH1 V; X IF NOT (F `5BY-1,X+1`5D IN SETWAYBOR) THEN F `5BY-1,X+1`5D := CRASH1 V; X IF NOT (F `5BY ,X-1`5D IN SETWAYBOR) THEN F `5BY ,X-1`5D := CRASH1 V; X IF NOT (F `5BY+1,X-1`5D IN SETWAYBOR) THEN F `5BY+1,X-1`5D := CRASH1 V; X IF NOT (F `5BY-1,X-1`5D IN SETWAYBOR) THEN F `5BY-1,X-1`5D := CRASH1 V; X END; X CRASH1: X F `5BY,X`5D := CRASH2; X CRASH2: X F `5BY,X`5D := CRASH3; X CRASH3: X F `5BY,X`5D := NOTHING; X LIVINGWALL: X IF LW_ACTIVE <= 0 THEN F `5BY,X`5D := SLEEPINGWALL; X SLEEPINGWALL: X IF LW_ACTIVE > 0 THEN F `5BY,X`5D := LIVINGWALL; X END; XIF MAGMA_SURROUNDED THEN MAGMA_CLOSED := TRUE; XIF L_STAT = L_ALIVE THEN X IF (F `5BHAM_B,HAM_A`5D = SMASH1) OR X (F `5BHAM_B,HAM_A`5D = CRASH1) THEN L_STAT := L_DEAD; XIF L_STAT = L_ALIVE THEN X BEGIN X WENT := FALSE; X CASE F `5BHAM_B+HAMPB,HAM_A+HAMPA`5D OF X NOTHING,EARTH: X WENT := TRUE; X WAYOUT: X IF GO THEN X IF HAVE_DIAM >= NEED_DIAM THEN X BEGIN X F `5BHAM_B,HAM_A`5D := NOTHING; X HAM_A := HAM_A + HAMPA; X HAM_B := HAM_B + HAMPB; X L_STAT := L_COUNT; X WINNY := TRUE; X END; X LYINGSTONE: X IF HAMPB=0 THEN X IF CYCLE4=0 THEN X IF F `5BHAM_B,HAM_A+HAMPA+HAMPA`5D = NOTHING THEN X BEGIN X F `5BHAM_B,HAM_A+HAMPA+HAMPA`5D := LYINGSTONE; X WENT := TRUE; X END; X LYINGDIAMONT: X BEGIN X WENT := TRUE; X IF HAVE_DIAM < NEED_DIAM THEN INCSCORE (VAL0_DIAM) X ELSE INCSCORE (VAL1_DIAM); X HAVE_DIAM := HAVE_DIAM+1; X OUTCHR (CHR (7)); X IF HAVE_DIAM = NEED_DIAM THEN X BEGIN X OUTSTR (XXEIN01); X OUTIT; X END; X END; X END; X IF WENT THEN X IF GO THEN X BEGIN X F `5BHAM_B,HAM_A`5D := NOTHING; X HAM_A := HAM_A + HAMPA; X HAM_B := HAM_B + HAMPB; X F `5BHAM_B,HAM_A`5D := HAMSTER; X END X ELSE F `5BHAM_B+HAMPB,HAM_A+HAMPA`5D := NOTHING; X END; XIF L_STAT = L_ALIVE THEN X BEGIN X IF (`5BF `5BHAM_B,HAM_A+1`5D,F `5BHAM_B,HAM_A-1`5D,F `5BHAM_B+1,HAM_A`5D,F V `5BHAM_B-1,HAM_A`5D`5D X * `5BSQUAREFLY0..SQUAREFLY3`5D) <> `5B`5D THEN X BEGIN X F `5BHAM_B,HAM_A`5D := CRASH0; X L_STAT := L_DEAD; X END ELSE X IF (`5BF `5BHAM_B,HAM_A+1`5D,F `5BHAM_B,HAM_A-1`5D,F `5BHAM_B+1,HAM_A`5D,F V `5BHAM_B-1,HAM_A`5D`5D X * `5BBUTTERFLY0..BUTTERFLY3`5D) <> `5B`5D THEN X BEGIN X F `5BHAM_B,HAM_A`5D := SMASH0; X L_STAT := L_DEAD; X END; X END; XIF L_STAT = L_ALIVE THEN X IF F `5BHAM_B-1,HAM_A`5D IN `5BROLLINGSTONE,ROLLINGDIAMONT`5D THEN X BEGIN X F `5BHAM_B,HAM_A`5D := CRASH0; X L_STAT := L_DEAD; X END ELSE X IF O `5BHAM_B-1,HAM_A`5D IN `5BROLLINGSTONE,ROLLINGDIAMONT`5D THEN X BEGIN X F `5BHAM_B,HAM_A`5D := CRASH0; X L_STAT := L_DEAD; X END; XIF L_STAT = L_ALIVE THEN X IF (LEFT_TIME = 0) AND NOT WIZARD THEN X BEGIN X F `5BHAM_B,HAM_A`5D := CRASH0; X L_STAT := L_DEAD; X END; XIF WIZARD THEN XBEGIN X F `5BHAM_B,HAM_A`5D := HAMSTER; X IF L_STAT = L_DEAD THEN L_STAT := L_ALIVE; X IF DOITTOO THEN`20 X IF F `5BHAM_B+HAMPB,HAM_A+HAMPA`5D = LYINGSTONE THEN`20 X F `5BHAM_B+HAMPB,HAM_A+HAMPA`5D := NOTHING; X IF DOIT THEN X IF NOT (F `5BHAM_B+HAMPB,HAM_A+HAMPA`5D IN SETWAYBOR) THEN`20 X IF NOT (F `5BHAM_B+2*HAMPB,HAM_A+2*HAMPA`5D IN SETWAYBOR) THEN`20 X F `5BHAM_B+2*HAMPB,HAM_A+2*HAMPA`5D := CRASH0; X DOIT:=FALSE; XEND; XEND; X`20 XPROCEDURE INIT_PROG; X(* DO INITIALIZE PROGRAM *) X`20 XCONST VT200 = 110; X`20 XVAR LINE:STRING; X I:INTEGER; X C:CHAR; X THI:THING; X HELP:T_CAVE_NAMES; X DEV_RESULT:RECORD X CLASS,TYP:`5BBYTE`5D0..255; X SIZE:`5BWORD`5D0..65535; X BTC1,BTC2,BTC3,PLEN:`5BBYTE`5D0..255; X EXTTC:UNSIGNED; X END; X IOSB:`5BQUAD`5DRECORD X IOSTAT,BUF_LEN,TERM_LEN,TERMINATOR:`5BWORD`5D0..65535; X END; X`20 XBEGIN X$ASSIGN ('SYS$OUTPUT',CHOUT); X$ASSIGN ('SYS$INPUT',CHIN); X$QIOW (CHAN:=CHOUT,FUNC:=IO$_SENSEMODE,IOSB:=IOSB,P1:=DEV_RESULT,P2:=12); XIF NOT (DEV_RESULT.TYP IN `5BVT200`5D) THEN X ERROR ('terminal device mode must be VT200.'); XWIDTH := (DEV_RESULT.SIZE-1) DIV 4-1; XHEIGHT := (DEV_RESULT.PLEN-2) DIV 2-1; XOUTINX := 0; XTIMER.HI := -1; XIS_FLASH := '0'; XDOPLAY := 0; XSCORE := 0; XPREDCYC4 `5B0`5D := 1; XPREDCYC4 `5B1`5D := 2; XPREDCYC4 `5B2`5D := 3; XPREDCYC4 `5B3`5D := 0; XRANDOMIZE; XOPEN (DATF,'B$DASH_IN',HISTORY:=READONLY); XRESET (DATF); XREADLN (DATF,CAVEROOT); XREADLN (DATF,GAMEFONT); XREADLN (DATF,TASTE_LINX,TASTE_REXZ,TASTE_OBEN,TASTE_UNTN, X SCHAU_LINX,SCHAU_REXZ,SCHAU_OBEN,SCHAU_UNTN); XIF (`5BTASTE_LINX,TASTE_REXZ,TASTE_OBEN,TASTE_UNTN, X SCHAU_LINX,SCHAU_REXZ,SCHAU_OBEN,SCHAU_UNTN`5D * `5B' ','O'..'R'`5D) X <> `5B`5D THEN ERROR ('key defined twice (QRPO ).'); XCLOSE (DATF); XOPEN (DATF,GAMEFONT,HISTORY:=READONLY); XRESET (DATF); XWHILE NOT EOF (DATF) DO X BEGIN X READLN (DATF,LINE); X OUTSTR (LINE); X END; XCLOSE (DATF); XOPEN (DATF,CAVEROOT,HISTORY:=READONLY); XRESET (DATF); XREADLN (DATF,MAXCAVE); XCAVE_NAMES := NIL; XFOR I := 1 TO MAXCAVE DO X BEGIN X IF EOF (DATF) THEN ERROR ('wrong number of caves.'); X HELP := CAVE_NAMES; X NEW (CAVE_NAMES); X CAVE_NAMES`5E.NEXT := HELP; X READLN (DATF); X READLN (DATF,CAVE_NAMES`5E.NAME); X REPEAT READLN (DATF,C); UNTIL EOF (DATF) OR (C = 'X'); X END; XPICTURE `5B0,NOTHING`5D := 32; XPICTURE `5B0,WAYOUT`5D := 34; XPICTURE `5B0,BORDER`5D := 36; XPICTURE `5B0,EARTH`5D := 38; XPICTURE `5B0,MAGMA`5D := 40; XPICTURE `5B0,LYINGSTONE`5D := 42; XPICTURE `5B0,ROLLINGSTONE`5D := 42; XPICTURE `5B0,LYINGDIAMONT`5D := 44; XPICTURE `5B0,ROLLINGDIAMONT`5D := 44; XPICTURE `5B0,BUTTERFLY0`5D := 46; XPICTURE `5B0,BUTTERFLY1`5D := 46; XPICTURE `5B0,BUTTERFLY2`5D := 46; XPICTURE `5B0,BUTTERFLY3`5D := 46; XPICTURE `5B0,SQUAREFLY0`5D := 48; XPICTURE `5B0,SQUAREFLY1`5D := 48; XPICTURE `5B0,SQUAREFLY2`5D := 48; XPICTURE `5B0,SQUAREFLY3`5D := 48; XPICTURE `5B0,CRASH0`5D := 50; XPICTURE `5B0,CRASH1`5D := 52; XPICTURE `5B0,CRASH2`5D := 54; XPICTURE `5B0,CRASH3`5D := 56; XPICTURE `5B0,SMASH0`5D := 58; XPICTURE `5B0,SMASH1`5D := 60; XPICTURE `5B0,SMASH2`5D := 62; XPICTURE `5B0,SMASH3`5D := 64; XPICTURE `5B0,NORMALWALL`5D := 66; XPICTURE `5B0,LIVINGWALL`5D := 68; XPICTURE `5B0,SLEEPINGWALL`5D := 66; XPICTURE `5B0,HAMSTER`5D := 74; XPICTURE `5B1`5D := PICTURE `5B0`5D; XPICTURE `5B1,BUTTERFLY0`5D := 72; XPICTURE `5B1,BUTTERFLY1`5D := 72; XPICTURE `5B1,BUTTERFLY2`5D := 72; XPICTURE `5B1,BUTTERFLY3`5D := 72; XPICTURE `5B1,SQUAREFLY0`5D := 70; XPICTURE `5B1,SQUAREFLY1`5D := 70; XPICTURE `5B1,SQUAREFLY2`5D := 70; XPICTURE `5B1,SQUAREFLY3`5D := 70; XPICTURE `5B2`5D := PICTURE `5B0`5D; XPICTURE `5B3`5D := PICTURE `5B1`5D; XFOR THI := NOTHING TO THING_HIGH DO X FLASHPICT `5BTHI`5D := '0'; XFLASHPICT `5BMAGMA`5D := '5'; XFLASHPICT `5BLIVINGWALL`5D := '5'; XEND; X`20 XPROCEDURE PLAY_UP (CAVE,NUMH:INTEGER); X(* LET NUMH TIMES PLAY IN CAVE *) X`20 XPROCEDURE MANEKEN (A,B,C,D:INTEGER); XBEGIN XCASE CYCLE4 OF X 0:PICTURE `5B0,HAMSTER`5D := A; X 1:PICTURE `5B1,HAMSTER`5D := B; X 2:PICTURE `5B2,HAMSTER`5D := C; X 3:PICTURE `5B3,HAMSTER`5D := D; X END; XEND; X`20 XPROCEDURE INIT_UP (VAR AREA:GAME_AREA); X(* INIT WITH GAMEUP *) XVAR X,Y,W,H,N,RAND_PRIV:INTEGER; X D:CHAR; X C:TEXT; X`20 X FUNCTION PRIVR (M:INTEGER) : INTEGER; X BEGIN X RAND_PRIV := (43 * RAND_PRIV + 713) MOD 16777259; X PRIVR := RAND_PRIV MOD M; X END; X`20 X PROCEDURE PUTPIF (D:CHAR; X,Y:INTEGER); X BEGIN X IF (X>=0) AND (X<=SIZ_X) AND (Y>=0) AND (Y<=SIZ_Y) THEN X IF (ORD (D) - ORD (' ')) IN `5BORD (NOTHING) .. ORD (PRED (HAMSTER))`5D V THEN X AREA `5BY,X`5D := THETHING (ORD (D) - ORD (' ')) X ELSE ERROR ('illegal field in cave.') X ELSE ERROR ('coordinate out of range.'); X END; X`20 X PROCEDURE PUTBOX (D:CHAR; X,Y,W,H:INTEGER); X VAR I,J:INTEGER; X BEGIN X FOR I := Y TO Y+H-1 DO X FOR J := X TO X+W-1 DO X PUTPIF (D,J,I); X END; X`20 XBEGIN XFOR Y := 0 TO GAME_SIZE DO X FOR X := 0 TO GAME_SIZE DO X AREA `5BY,X`5D := NOTHING; XRESET (DATF); XREADLN (DATF); XN := CAVE; XWHILE N > 0 DO X BEGIN X READLN (DATF); X READLN (DATF); X REPEAT X READLN (DATF,D); X UNTIL D = 'X'; X N := N-1; X END; XREADLN (DATF,SIZ_X,SIZ_Y,HAM_A,HAM_B,NEED_DIAM,VAL0_DIAM,VAL1_DIAM, X LEFT_TIME,BONUS_HAM,RAND_PRIV,MAGMA_GROW); XREADLN (DATF,CAVE_ID); XSIZ_X := SIZ_X-1; XSIZ_Y := SIZ_Y-1; XIF (SIZ_X > GAME_SIZE) OR (SIZ_Y > GAME_SIZE) THEN X ERROR ('cave too big.'); XREPEAT X READ (DATF,D); X IF NOT (D IN `5B'S','B','F','R','L','X'`5D) THEN ERROR ('unknown cave comm Vand.'); X CASE D OF X 'S':BEGIN X READLN (DATF,D,X,Y); X PUTPIF (D,X,Y); X END; X 'B':BEGIN X READLN (DATF,D,X,Y,W,H); X PUTBOX (D,X,Y,W,H); X END; X 'F':BEGIN X READLN (DATF,D,X,Y,W,H); X PUTBOX (D,X,Y,W,1); X PUTBOX (D,X,Y+H-1,W,1); X PUTBOX (D,X,Y,1,H); X PUTBOX (D,X+W-1,Y,1,H); X END; X 'R':BEGIN X READLN (DATF,D,X,Y,W,H,N); X WHILE N > 0 DO X BEGIN X PUTPIF (D,PRIVR (W)+X,PRIVR (H)+Y); X N := N-1; X END; X END; X 'L':BEGIN X READLN (DATF,D,X,Y,W,H,N); X WHILE N > 0 DO X BEGIN X PUTPIF (D,X,Y); X X := X+W; X Y := Y+H; X N := N-1; X END; X END; X END; XUNTIL D = 'X'; XAREA `5BHAM_B,HAM_A`5D := HAMSTER; XFOR Y := 0 TO SIZ_Y DO X BEGIN X IF AREA `5BY,0`5D <> WAYOUT THEN AREA `5BY,0`5D := BORDER; X IF AREA `5BY,SIZ_X`5D <> WAYOUT THEN AREA `5BY,SIZ_X`5D := BORDER; X END; XFOR X := 1 TO SIZ_X DO X BEGIN X IF AREA `5B0,X`5D <> WAYOUT THEN AREA `5B0,X`5D := BORDER; X IF AREA `5BSIZ_Y,X`5D <> WAYOUT THEN AREA `5BSIZ_Y,X`5D := BORDER; X END; XL_STAT := L_COMIN; XSTATUS_C := 8; XHAVE_DIAM := 0; XCYCLE4 := 1; XPICTURE `5BCYCLE4,HAMSTER`5D := 32; XPOS_A := HAM_A - WIDTH DIV 2; XPOS_B := HAM_B - HEIGHT DIV 2; XIF POS_A > SIZ_X - WIDTH THEN POS_A := SIZ_X - WIDTH; XIF POS_A < 0 THEN POS_A := 0; XIF POS_B > SIZ_Y - HEIGHT THEN POS_B := SIZ_Y - HEIGHT; XIF POS_B < 0 THEN POS_B := 0; XPREPPAGE; XPUTPIC1 (AREA,POS_A,POS_B); XQOS_A := POS_A; XQOS_B := POS_B; XHAMPA := 0; XHAMPB := 0; XINPCH `5B1`5D := ' '; XPAUSE := FALSE; XWINNY := FALSE; XSCRPA := 0; XSCRPB := 0; XLW_ACTIVE := -1; XMAGMA_CLOSED := FALSE; XNOKEYDONE := 0; XSCHEDULE (2*MOMENT); XOUTIT; X$HIBER; XOUTCHR (CHR(7)); XOUTIT; XEND; X`20 XBEGIN XSCORE := 0; XNUMP := NUMH; XREPEAT X INIT_UP (AREA); X REPEAT X SCHEDULE (MOMENT); X OLDY := AREA; X INPCH `5B1`5D := CHR (0); X $QIOW(CHAN:=CHIN, X FUNC:=IO$_READVBLK+IO$M_NOECHO+IO$M_NOFILTR+IO$M_TIMED, X P1:=INPCH,P2:=1); X IF INPCH `5B1`5D = CHR (0) THEN NOKEYDONE := NOKEYDONE + 1 X ELSE X BEGIN X NOKEYDONE := 0; X IF (INPCH `5B1`5D IN `5B'O','P','Q','R','o','p','q','r'`5D) OR X ((INPCH `5B1`5D IN `5B'B','b','D','d'`5D) AND WIZARD) THEN X BEGIN +-+-+-+-+-+-+-+- END OF PART 3 +-+-+-+-+-+-+-+- -+-+-+-+-+-+-+-+ START OF PART 4 -+-+-+-+-+-+-+-+ X IF INPCH `5B1`5D > 'Z' THEN X INPCH `5B1`5D := CHR (ORD (INPCH `5B1`5D) - (ORD ('o') - ORD ('O') V)); X CASE INPCH `5B1`5D OF X 'B':DOIT := TRUE; X 'D':DOITTOO := NOT DOITTOO; X 'O':PAUSE := FALSE; X 'P':PAUSE := TRUE; X 'Q':BEGIN X BONUS_HAM := 0; X NUMP := 0; X L_STAT := L_COMOUT; X STATUS_C := 4; X END; X 'R':BEGIN X L_STAT := L_COMOUT; X STATUS_C := 4; X END; X END; X END X ELSE X CASE L_STAT OF X L_ALIVE: X BEGIN X IF INPCH `5B1`5D = TASTE_LINX THEN BEGIN HAMPA :=-1; HAMPB := 0; G VO := TRUE END ELSE X IF INPCH `5B1`5D = TASTE_OBEN THEN BEGIN HAMPA := 0; HAMPB :=-1; G VO := TRUE END ELSE X IF INPCH `5B1`5D = TASTE_REXZ THEN BEGIN HAMPA := 1; HAMPB := 0; G VO := TRUE END ELSE X IF INPCH `5B1`5D = TASTE_UNTN THEN BEGIN HAMPA := 0; HAMPB := 1; G VO := TRUE END ELSE X IF INPCH `5B1`5D = SCHAU_LINX THEN BEGIN HAMPA :=-1; HAMPB := 0; G VO := FALSE END ELSE X IF INPCH `5B1`5D = SCHAU_OBEN THEN BEGIN HAMPA := 0; HAMPB :=-1; G VO := FALSE END ELSE X IF INPCH `5B1`5D = SCHAU_REXZ THEN BEGIN HAMPA := 1; HAMPB := 0; G VO := FALSE END ELSE X IF INPCH `5B1`5D = SCHAU_UNTN THEN BEGIN HAMPA := 0; HAMPB := 1; G VO := FALSE END ELSE X IF INPCH `5B1`5D = ' ' THEN BEGIN HAMPA := 0; HAMPB := 0 EN VD; X END; X L_DEAD: X IF WIZARD THEN L_STAT:=L_ALIVE ELSE X BEGIN X IF INPCH `5B1`5D = TASTE_LINX THEN POS_A := POS_A-1 ELSE X IF INPCH `5B1`5D = TASTE_OBEN THEN POS_B := POS_B-1 ELSE X IF INPCH `5B1`5D = TASTE_REXZ THEN POS_A := POS_A+1 ELSE X IF INPCH `5B1`5D = TASTE_UNTN THEN POS_B := POS_B+1; X END; X END; X END; X IF PAUSE OR (L_STAT <> L_ALIVE) THEN X BEGIN X HAMPA := 0; X HAMPB := 0; X END; X IF NOT PAUSE THEN X BEGIN X IF LW_ACTIVE > 0 THEN LW_ACTIVE := LW_ACTIVE - 1; X IF CYCLE4 = 0 THEN X IF LEFT_TIME > 0 THEN LEFT_TIME := LEFT_TIME-1; X EINDRUCK (AREA,OLDY); X END; X IF L_STAT = L_ALIVE THEN X BEGIN X IF HAM_A - WIDTH DIV 4 < POS_A THEN SCRPA := -1 ELSE X IF HAM_A - 3 * WIDTH DIV 4 > POS_A THEN SCRPA := 1 ELSE X IF (HAM_A - WIDTH DIV 2) DIV 2 = POS_A DIV 2 THEN SCRPA := 0; X IF HAM_B - HEIGHT DIV 4 < POS_B THEN SCRPB := -1 ELSE X IF HAM_B - 3 * HEIGHT DIV 4 > POS_B THEN SCRPB := 1 ELSE X IF (HAM_B - HEIGHT DIV 2) DIV 2 = POS_B DIV 2 THEN SCRPB := 0; X POS_A := POS_A + SCRPA; X POS_B := POS_B + SCRPB; X END; X IF POS_A > SIZ_X - WIDTH THEN POS_A := SIZ_X - WIDTH; X IF POS_A < 0 THEN POS_A := 0; X IF POS_B > SIZ_Y - HEIGHT THEN POS_B := SIZ_Y - HEIGHT; X IF POS_B < 0 THEN POS_B := 0; X IF CYCLE4=0 THEN CYCLE4 := 3 X ELSE CYCLE4 := CYCLE4-1; X IF L_STAT = L_COUNT THEN X BEGIN X IF LEFT_TIME > 0 THEN X IF LEFT_TIME > 7 THEN X BEGIN X INCSCORE (7); X LEFT_TIME := LEFT_TIME-7; X STATUS_C := 1; X END X ELSE X BEGIN X INCSCORE (LEFT_TIME); X LEFT_TIME := 0; X STATUS_C := 0; X END X ELSE L_STAT := L_COMOUT; X GOTOHD (48); X OUTINT (LEFT_TIME,4); X GOTOHD (68); X OUTINT (SCORE,9); X OUTIT; X END; X IF STATUS_C = 0 THEN X CASE L_STAT OF X L_COMIN: L_STAT := L_ALIVE; X L_COUNT: BEGIN STATUS_C := 4; L_STAT := L_COMOUT END; X L_COMOUT: L_STAT := L_ENDLVL; X END X ELSE STATUS_C := STATUS_C-1; X CASE L_STAT OF X L_ALIVE: X BEGIN X IF NOKEYDONE < 0 THEN MANEKEN (76,78,76,78) ELSE X IF HAMPA > 0 THEN MANEKEN (80,82,80,82) ELSE X IF HAMPA < 0 THEN MANEKEN (84,86,84,86) ELSE X IF HAMPB <> 0 THEN MANEKEN (88,90,88,90) X ELSE X BEGIN X IF (NOKEYDONE > 23) AND (RANDOM (14) = 0) THEN X NOKEYDONE := - 8 - RANDOM (8); X MANEKEN (74,74,74,74); X END; X END; X L_COMIN: X CASE STATUS_C OF X 7:PICTURE `5BCYCLE4,HAMSTER`5D := 50; X 6:PICTURE `5BCYCLE4,HAMSTER`5D := 54; X 5:PICTURE `5BCYCLE4,HAMSTER`5D := 56; X 4:PICTURE `5BCYCLE4,HAMSTER`5D := 58; X 3:PICTURE `5BCYCLE4,HAMSTER`5D := 60; X 2:PICTURE `5BCYCLE4,HAMSTER`5D := 62; X 1:PICTURE `5BCYCLE4,HAMSTER`5D := 64; X END; X END; X ABDRUCK (AREA,OLDY,POS_A,POS_B,QOS_A,QOS_B); X OUTIT; X $HIBER; X UNTIL L_STAT = L_ENDLVL; X IF BONUS_HAM > 0 THEN X BEGIN X IF WINNY THEN NUMP := NUMP + BONUS_HAM; X WINNY := TRUE; X END; X IF WINNY THEN X CAVE := (CAVE+1) MOD MAXCAVE X ELSE X BEGIN X NUMP := NUMP-1; X IF NUMP<1 THEN CAVE := -1; X END; X SCHEDULE (2*MOMENT); X $HIBER; XUNTIL CAVE < 0; XOUTSTR (XXPLY01); XEND; X`20 XPROCEDURE MENUE; XVAR C:CHAR; X HELP:T_CAVE_NAMES; X D:INTEGER; XBEGIN XPAGE; XOUTCHR (CHR(15)); XFOR C := '3' TO '4' DO X BEGIN X OUTSTR (XXMNU01); X OUTCHR (C); X CENTRIX ('BOULDER DASH',WIDTH DIV 2); X END; XOUTSTR (CRLF); XCENTRIX ('VMS/VT200 version 2.1 (w)1988 Oskar Schirmer',WIDTH); XCENTRIX ('-',WIDTH); XCENTRIX ('Es geht darum, Diamanten zu sammeln...',WIDTH); XCENTRIX ('Ein Maennlein kann man steuern mit den Tasten ' X +TASTE_OBEN+' und '+TASTE_UNTN+' (vertical)',WIDTH); XCENTRIX ('sowie '+TASTE_LINX+' und '+TASTE_REXZ+ X ' (horizontal), die Leertaste stoppt es.',WIDTH); XCENTRIX ('Greifen kann man entsprechend mit den Tasten '+SCHAU_LINX+ X ' nach links, '+SCHAU_REXZ+' nach rechts,',WIDTH); XCENTRIX ('mit '+SCHAU_OBEN+' hoch & mit '+SCHAU_UNTN+' runter.',WIDTH); XCENTRIX ('Abbrechen kann man das Spiel mit Q, die aktuelle Runde mit R.',WID VTH); XCENTRIX ('Mit P kann man eine Pause einlegen, die per O beendet wird.',WIDTH V); XCENTRIX ('Wenns einen erwischt hat, wiederholt R die Runde,',WIDTH); XCENTRIX ('man kann aber noch das Fenster bewegen (...).',WIDTH); XGOTOXY (2*WIDTH-6,2*HEIGHT-3); XOUTSTR ('`5BSCORE = '); XOUTINT (SCORE,1); XOUTSTR (XXMNU02); XCENTRIX ('ENTRY CAVE: ',WIDTH); XCENTRIX ('Bitte mit < und > waehlen, dann SPACE druecken, Ende per X.',WIDTH V); XREPEAT X GOTOXY (2*WIDTH+4,2*HEIGHT-2); X D := MAXCAVE - DOPLAY - 1; X HELP := CAVE_NAMES; X WHILE D>0 DO X BEGIN X D := D-1; X HELP := HELP`5E.NEXT; X END; X OUTSTR (HELP`5E.NAME); X OUTSTR (XXMNU03); X GOTOXY (2*WIDTH,2*HEIGHT); X OUTIT; X $QIOW (CHAN:=CHIN, X FUNC:=IO$_READVBLK+IO$M_NOECHO+IO$M_CVTLOW+IO$M_NOFILTR, X P1:=INPCH,P2:=1); X MAINC := INPCH `5B1`5D; X IF MAINC = '>' THEN DOPLAY := (DOPLAY+1) MOD MAXCAVE ELSE X IF MAINC = '<' THEN DOPLAY := (DOPLAY-1+MAXCAVE) MOD MAXCAVE; XUNTIL MAINC IN `5B'X',' ','W'`5D; XWIZARD:=MAINC = 'W';`20 XEND; X`20 XBEGIN XINIT_PROG; XREPEAT X MENUE; X IF MAINC <> 'X' THEN PLAY_UP (DOPLAY,3); XUNTIL MAINC = 'X'; XCLOSE (DATF); XOUTIT; XEND. $ CALL UNPACK BD.PAS;1 1730835363 $ create 'f' X`1BP1;0;1;0;0;0;`7B.A`7EBBDDHHp/NKKIIHHG X;????????/???????? X;`7E`7EBBBBBB/NNKKKKKK X;BBBBB`7E`7E?/KKKKKNN? X;WWWWKKKE/KKKKEEEB X;EEbbbppp/BB@@@GGG X;HuI`60SYcP/K?JC@EHA X;_XegQDoX/GADAID?I X;BBogSkQ`7D/KK?@BADF X;UiUkSgoB/DEDAB@?K X;wK`7DIqlb\/@ACDCHGJ X;pneMuKw?/GJCFEA@? X;ooGGCsqJ/??@@AACL X;qsCGGoo?/CAA@@??? X;NpqCGp?`7B/NGCA@??B X;?pGCqpN?/??@ACGN? X;`7E@@`7CDDtt/NGGJIIII X;tDD`7C@@`7E?/IIIJGGN? X;ooEE???r/??EE???K X;???EEoo?/???EE??? X;????G_Co/????A?A? X;?CO?G???/?D?@???? X;G_AODOc?/AGC@?I?? X;aGOCAcO?/CAG@C?G? X;?_AO@?c?/??C??G?? X;a?O?A_??/?A??C??? X;ooEE???r/??EE???K X;???EEoo?/???EE??? X;??????oG/???????@ X;o???????/???????? X;???oo??K/???????B X;??oo????/???????? X;oo??C??r/????A??K X;??C??oo?/??A????? X;`7Err`7EKK`7Er/NKKNBBNK X;`7EKK`7Err`7EK/NBBNKKNB X;?rr?KK?r/?KK?BB?K X;?KK?rr?K/?BB?KK?B X;?`7DAAyIII/?FCCDDDD X;IIyAA`7D??/DDDCCF?? X;??NqCHo`7B/??NCA@?B X;oHCqN???/?@ACN??? X;G`5BGGGGI`7E/??GGKA@@ X;IGGGG`5BG?/@AKGG??? X;???WgGI`7E/??GHKA@@ X;IGgW????/@AKHG??? X;???WgGI`7E/??CDKA@@ X;IGgW????/@AKHG??? X;??wGGGi`7E/??CII@?? X;iGGGK???/?@AKGG?? X;???_OGI`7E/???@@KJG X;iGOO_O??/?NGG???? X;??KGGGi`7E/?GGKA@?? X;iGGGw???/?@IIC??? X;?O_OOGi`7E/???GGN?? X;IGO_????/JK@@???? X;?_oGGGi`7E/??CCE@?? X;IGGGo_??/@AKGG??? X;?_oGGGI`7E/??GGKA@? X;iGGGo_??/?@ECC??? X`1B\`1B).A`0E $ CALL UNPACK BD.PICTURES;1 407128735 $ create 'f' Xdisk$userdisk1:bd.caves Xdisk$userdisk1:bd.pictures X1352`F6#@`5D $ CALL UNPACK BD.POINTER;1 521107416 $ create 'f' X+-------------------------------------------------------+ X`7C`09`09`09`09`09`09`09`7C X`7C`09`09 BOULDER DASH`09`09`09`7C X`7C`09`09`09`09`09`09`09`7C X+-------------------------------------------------------+ X X(w) 1988 Oskar Schirmer X XEs handelt sich hierbei um den versuch, ein echtzeitspiel Xauf einem grossrechner unterzubringen (...). X X0. wichtig: nach dem starten titelseite lesen ! X X1. boulder dash (als spiel): Xes geht darum, ein maenneken durch eine hoehle zu steuern, Xdiamanten zu finden, zu sammeln und schliesslich den ausgang Xzu benutzen. fuer gesammelte diamanten gibz punkte (DIAM:), Xdie zahl der benoetigten diamanten steht unter NEED:. Xfuer die ganze aktion steht die unter LEFT: gezaehlte zeit Xzur verfuegung. im uebrigen sind die level mehr oder weniger Xvom original auf dem apple uebernommen und sie sind alle Xmachbar !!! viel spass. X X2. boulder dash (als vax/vms-program): X Xfuer das program werden folgende dateien benoetigt: XBD.EXE`09`09enthaelt das program XBD.POINTER`09enthaelt zwei zeiger auf die folgenden dateien sowie X`09`09die tastaturbelegung. XBD.PICTURES`09enthaelt den vt200-sixel-grafic-zeichensatz. XBD.CAVES`09enthaelt die einzelnen levels. XBD.TEXT`09`09unerlaesslich fuer den anleitungsfreak. X Xbd.exe erwartet die definition von B$DASH_IN als zeiger auf die Xdatei bd.pointer. X Xan hardware wird benoetigt: Xeine hinreichend eilige vax mit allem drum&dran (was das genau ist, Xsagt ihnen bestimmt gerne die auskunft). Xzum beispiel ein vt220-terminal, das in der lage ist, sixel-grafic Xanzuzeigen und zwar sollte das die daten mit einer rate von einigen Xkbaud, will heissen etwa 9600 oder 19200 baud. alles andere hat mit Xechtzeit nix mehr zu tun. X X2a. die datei bd.pointer enthaelt in der ersten zeile den namen der Xdatei bd.pictures, in der zweiten zeile den der datei bd.caves. Xdie dritte zeile muss 8 buchstaben enthalten, die tasten zum laufen Xund greifen, jeweils in der reihenfolge linx, rechz, oben, unten. X X2b. aufbau der datei bd.caves. die entsprechende definition fuer onecave Xwird zum laden des levels ausgefuehrt: X Xcaves : --> (num of caves) -----> `5Bonecave`5D --+--> . X`09`09`09 `5E`09`09 `7C X`09`09`09 +----------------+ X Xonecave : -> (sizeofcave) -> (startpos) -> (num of diams need) X`09 -> (val of diam while need) -> (val of diam when enough) X`09 -> (time left) -> (bonus men) -> (random generator seed) X`09 -> (magma & living timer) ---cr---> (name of cave) X`09 -cr----> `5Bcommandline`5D --+--> (X!) --cr---> . X`09 `5E`09`09`09 `7C X`09 +--------------------+ X Xcommandline : --+--> (S) -> (char) -> (coord) ----------------------------cr V-> . X`09`09+--> (B) -> (char) -> (coord) -> (size) --------------->`5E X`09`09+--> (F) -> (char) -> (coord) -> (size) --------------->`7C X`09`09+--> (R) -> (char) -> (coord) -> (size) -> (number) --->`7C X`09`09+--> (L) -> (char) -> (coord) -> (summand) -> (number) -+ X Xcoord, sizeofcave, startpos : --> (x) -> (y) --> . X Xcr fordert eine neue zeile. die 5 commandos bringen folgende aktionen: XS setzt ein einzelnes teil nach (x,y). XB fuellt ein rechteck von (x,y) bis (x+width-1,y+height-1). XF umrahmt das angegebene rechteck. XR setzt number einzelne teile zufaellig in das angegebene rechteck XL setzt teile an die stellen (x+i*sx,y+i*sy) fuer i=0..number-1. X Xdie zuordnung von buchstaben zu teilen ist wie folgt: X `09nothing X!`09wayout X#`09earth X$`09magma X%`09lyingstone X'`09lyingdiamont X)*+,`09butterfly X-./0`09squarefly X9`09normalwall`09`09 X;`09sleepingwall X Xweitere (allerdinx zum entwurf einer hoehle weniger geeignete) teile finde Xman im programtext bd.pas). X X3. boulder dash (als pascal-program) Xder programtext ist nicht als beispiel fuer ordentliches programmieren Xgedacht. die gesammte ausgabe auf SYS$OUTPUT wird direkt ueber QIOs Xvorgenommen (unter umgehung der pascalausgabekanaele, die sind naemlich Xsaumaessig langsam). X Xalsdann (oskar). $ CALL UNPACK BD.TXT;1 587344170 $ create 'f' XI received a translated version of this file after asking a friend of mine a Vt Xthe Oldenburg University of Germany to help me out with the words. Most of V it Xmakes sense but still some is hard to understand. Hopefully, though, this w Vill Xgive you an idea of what is said in the help file. X`20 XGood luck and auf wiedersehn....Jeff Imes`20 X V222LRTV X============================================================================ V==== X============================================================================ V==== X`20 XBOULDERDASH V `20 X `20 V `20 X A well written version of the popular game "Boulderdash". Not sure what V `20 X the goal is so there is no external help :-). If you can translate the V `20 X German text, please send e-mail to user MASTER@UBVMS V `20 X `20 V `20 X Read "Hardware Requirements"!!! V `20 X `20 V `20 X `20 V `20 X `20 V `20 X Additional information available: V `20 +-+-+-+-+-+-+-+- END OF PART 4 +-+-+-+-+-+-+-+- -+-+-+-+-+-+-+-+ START OF PART 5 -+-+-+-+-+-+-+-+ X `20 V `20 X PossibleHelp HardwareRequirements V `20 X `20 V `20 X `20 V `20 XBOULDERDASH V `20 X `20 V `20 X HardwareRequirements V `20 X `20 V `20 X an hardware wird benoetigt: V `20 X needed hardware V `20 X `20 V `20 X eine hinreichend eilige vax mit allem drum&dran (was das genau ist, V `20 X `20 V `20 X sagt ihnen bestimmt gerne die auskunft). V `20 X a decent-fast vax with alot of nifty gadgets.Ask the informations , V `20 X they'll be happy to tell you. V `20 X `20 V `20 X `20 V `20 X zum beispiel ein vt220-terminal, das in der lage ist, sixel-grafic V `20 X a vt220-terminal, for example, which is able to show sixel-graphic V `20 X `20 V `20 X anzuzeigen und zwar sollte das die daten mit einer rate von einigen V `20 X with a rate of circa 9600 or 19200 baud. V `20 X everthing else isn't realtime anymore. V `20 X kbaud, will heissen etwa 9600 oder 19200 baud. alles andere hat mit V `20 X echtzeit nix mehr zu tun. V `20 X `20 V `20 X You *MUST* be on a VT200 or greater series terminal to play this. V `20 X `20 V `20 X `20 V `20 XBOULDERDASH V `20 X `20 V `20 X PossibleHelp V `20 X `20 V `20 X +-------------------------------------------------------+ V `20 X `7C `7C V `20 X `7C BOULDER DASH `7C V `20 X `7C `7C V `20 X +-------------------------------------------------------+ V `20 X `20 V `20 X (w) 1988 Oskar Schirmer V `20 X `20 V `20 X Es handelt sich hierbei um den versuch, ein echtzeitspiel V `20 X auf einem grossrechner unterzubringen (...). V `20 X This is a try to install a real-time game on a mainframe. V `20 X `20 V `20 X `20 V `20 X 0. wichtig: nach dem starten titelseite lesen ! V `20 X important: read title-page after you started ! V `20 X `20 V `20 X 1. boulder dash (als spiel): V `20 X (as a game) V `20 X es geht darum, ein maenneken durch eine hoehle zu steuern, V `20 X `20 V `20 Xthe goal is to move a 'man' thru a cave, find and collect diamonds V `20 Xand use the exit at the end. ` V20 Xyoull get points for collected diamonds. `2 V0 Xthe number of needed diamonds is (written7given) under DIAM. V `20 X: diamanten zu finden, zu sammeln und schliesslich den ausgang V `20 X `20 V `20 X zu benutzen. fuer gesammelte diamanten gibz punkte (DIAM:), V `20 X die zahl der benoetigten diamanten steht unter NEED:. V `20 X `20 V `20 XBehind LEFT: is the time you're given to complete this level. V `20 X `20 V `20 X fuer die ganze aktion steht die unter LEFT: gezaehlte zeit V `20 X `20 V `20 X `20 V `20 X zur verfuegung. im uebrigen sind die level mehr oder weniger V `20 X vom original auf dem apple uebernommen und sie sind alle V `20 X machbar !!! viel spass. V `20 Xthe levels are more or less the same as on the Apple and they are all (....) V `20 X `20 V `20 X(..) Don't know the word: it mean, that you can do any levels, none of them V `20 Xare impossible. V `20 X `20 V `20 X `20 V `20 X `20 V `20 XThat's it. Hope the game runs and I could help you. Have fun. Peter V `20 X============================================================================ V==== XWell, that's all I can help you with. Thanks to Peter (don't remember his l Vast`20 Xname) at Oldenburg. --Jeff $ CALL UNPACK BOULDER.DASH;1 175652434 $ v=f$verify(v) $ EXIT