-+-+-+-+-+-+-+-+ START OF PART 4 -+-+-+-+-+-+-+-+ 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 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 ('VMS/VT300 graphics created by Zamphir, master of the pan flutes',W VIDTH); 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 1546011546 $ create 'f' Xdisk$userdisk1:bd.caves Xdisk$userdisk1:bd200.font Xdisk$userdisk1:bd300.font X1352`F6#@`5D $ CALL UNPACK BD.POINTER;1 1298081341 $ 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' X`1BP1;0;1;4;1;1;`7B.A 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; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X; X`1B\`1B).A`0E $ CALL UNPACK BD200.FONT;1 255471931 $ create 'f' X`1BP1;0;1;15;1;2;12;0;`7B.A X; X;`7E`7E`7E`7EBBBBBBBBBBB/`7E`7E`7E`7Eooooooooooo X;BBBBBBBBBBB`7E`7E`7E`7E/ooooooooooo`7E`7E`7E`7E X;rrrrXXXXKKKKeee/KKKKeeeerrrrXXX X;KKKKXXXXrrrreee/rrrreeeeKKKKXXX X;@SAgAPcJCQc@gQG/AhShAS`60IS`60CgAHS X;@qKOjCQlOiCjOdI/AG@QcHQGaTAkQHS X;rzNc`7BEQ`7DeZtvDjX/rv`7BKHYPSXqu_hac X;ntj`7CJrmmQEs`5B`5Ezr/hqdwbsXYUXKH`7Bvr X;owKc`7BEQ`7DeZtvDjX/BFKKHYPSXqu_hac X;ntj`7CJrmmQEs`5B`5Bwo/hqdwbsXYUXKHKFB X;OwggGKK`5BSQyyUVP/???@@BAECKGXV`7Dw X;PVUyyQS`5BKKGggwO/w`7DVXGKCEAB@@ X;M`5DqieSGWoaeC?ow/`5B`5DRTXICEB@@??FN X;o?CeaoWGSeiq`5DM/F??@@BECIXTR`5D`5B +-+-+-+-+-+-+-+- END OF PART 4 +-+-+-+-+-+-+-+-