$! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_VERIFY"))' $! $! This archive created by VMS_SHARE Version 7.2-007 22-FEB-1990 $! On 31-MAY-1992 00:06:37.21 By user MASLIB $! $! 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 3 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. BUILD.COM;1 $! 2. PACMAN.INS;1 $! 3. PACMAN.PAS;1 $! 4. PACMAN.SCN;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' X$ PASCAL PACMAN X$ LINK PACMAN, INTERACT/LIB X$ DEL *.OBJ;*/NOCONFIRM X$ EXIT $ CALL UNPACK BUILD.COM;1 589376479 $ create 'f' X`1B`5BH`1B`5BJ`1B(B`1B`5B0m X`1B`5B1;1H`1B#6`1B`5B7m `20 X`1B`5B2;1H`1B#6 `1B`5B2;40H`20 X`1B`5B3;1H`1B#6 `1B`5B0m WELCOME TO THE WONDERFUL WORLD OF `1B`5B7m`20 X`1B`5B4;1H`1B#6 `1B`5B4;40H`20 X`1B`5B5;1H`1B#6 `1B`5B5;40H`20 X`1B`5B6;1H`1B#6 `1B`5B0m `1B(0lqqqk lqqqk lqqq lqklqk lqqqk lk x `1B`5B7m` V20 X`1B`5B7;1H`1B#6 `1B`5B0m x x x x x x xx x x`20 X`1B`5B7;29H x xx x `1B`5B7m`20 X`1B`5B8;1H`1B#6 `1B`5B0m x x x x x x xx x x x xx x `1B`5B7m`20 X`1B`5B9;1H`1B#6 `1B`5B0m x x x x x x xx x x`20 X`1B`5B9;29H x xmk x `1B`5B7m`20 X`1B`5B10;1H`1B#6 `1B`5B0m tqqqj tqqqu x x mj x tqqqu x mkx `1B`5B7m`20 X`1B`5B11;1H`1B#6 `1B`5B0m x x x x x x x`20 X`1B`5B11;29H x x xx `1B`5B7m`20 X`1B`5B12;1H`1B#6 `1B`5B0m x x x x x x x x x xx `1B`5B7m`20 X`1B`5B13;1H`1B#6 `1B`5B0m x x x mqqq x x x`20 X`1B`5B13;29H x x mj `1B`5B7m`20 X`1B`5B14;1H`1B#6 `1B`5B14;40H`20 X`1B`5B15;1H`1B#6 `1B`5B15;40H`20 X`1B`5B16;1H`1B#6 `1B`5B16;34H`1B`5B0m8 `1B`5B7m`20 X`1B`5B17;1H`1B#6 `1B`5B17;16H`1B`5B0m`7E `1B(B= 10 pts `5E`20 X`1B`5B17;36H `1B`5B7m`20 X`1B`5B18;1H`1B#6 `1B`5B0m `1B(0`60 `1B(B= YOU`1B`5B18;34H`1B(0x `1B`5B7m V`20 X`1B`5B19;1H`1B#6 `1B`5B19;16H`1B`5B0m`1B(B* = 50 pts 4<`1B(0q q`1B(B>6 ` V20 X`1B`5B19;40H`1B`5B7m`20 X`1B`5B20;1H`1B#6 `1B`5B0m # = ENEMY`1B`5B20;34H`1B(0x `1B`5B7m`20 X`1B`5B21;1H`1B#6 `1B`5B21;16H`1B`5B0m`1B(0a`1B(B = 200 pts v `1B`5 VB7m`20 X`1B`5B22;1H`1B#6 `1B`5B22;34H`1B`5B0m2 `1B`5B7m`20 X`1B`5B23;1H`1B#6 `1B`5B1;5mPRESS RETURN TO START`1B`5B0;7m V `1B`5B1;1H X`1B* $ CALL UNPACK PACMAN.INS;1 1935368459 $ create 'f' X`5B Inherit ('SYS$LIBRARY:STARLET','INTERACT') `5D X X`7B Pacman is brought to you courtesy of : X X Martin Reid, X University Of Waikato, X Hamilton, X New Zealand. X X Creation Date: Feb 1982 X X`7D X XProgram Pac_man; X X`7B Simulation of Arcade Game Pacman `7D X XType`20 X How_Good = (Good,Bad); `7B Used to specify whether the Greebly wil Vl X move towards or away from the pacman - th Vis X depends upon whether the pacman has recen Vtly X eaten a Pep pill. `7D X General_Direction X = (Horizontal,Vertical); X Ch = Packed Array`5B1..1`5D Of Char; `7B String Descriptor V For Put_Screen `7D X Way = (Up,Right,Down,Left,Nowhere); `7B Direction Of Movement V `7D X Screen_Line = Packed Array`5B1..40`5D of Char; `7B Line to be read i Vn from a File `7D X Screen_Array = Array`5B1..24`5D of Screen_line; `7B Contains Every Ch Var in Screen `7D X Horrible_little_object = Record X y_pos,x_pos : Integer; X Shape : Char; X End; XVar Direction : Way; X Moved_Once : Boolean; X Frames : Integer; X Greebly_Val : Integer; X achar : Char; X J : Integer; X Adate,Atime : Packed Array `5B1..11`5D Of Char; X Lowest : Integer; X Skill : Integer; X Dots_left : Integer; X Save_x,Save_y : Integer; X Lives : Integer; X Strength : Integer; X Fightback : Boolean; X Lastmove : Way; X X_Dist,Y_dist : Integer; X Score : Integer; X Moved : Boolean; X Greebly : Horrible_little_object; X Command : Integer; X a,I : Integer; X Maze_line : Screen_line; X Pacman : Horrible_little_object; X Bell,Dot,Asterisk,Blank : Char; X Screen : Screen_Array; X Zap : Char; X XProcedure Eat; Forward; XProcedure Move_pacman; Forward; XProcedure Move_Greebly; Forward; X XProcedure Initialise; XBegin X Moved_Once := False; X Skill := 75; X (*Frames := -4;*) X Frames := -1; X Lives := 3; X Score := 0; X Bell := Chr(7); X Blank := ' '; X Pacman.Shape := '`60'; X Dot := '`7E'; X Asterisk := '*'; X Greebly.Shape := '#'; X Image_dir; X show_graphedt('PACMAN.INS'); XEnd; X XProcedure Draw_Maze; XBegin X show_graphedt('PACMAN.SCN',wait:=false); X qio_Write (VT100_Esc+'<'+VT100_Esc+'`5Bm'+VT100_Esc+'(B'); X posn (1,1); X qio_Write (VT100_Esc+'#6SCORE:'+VT100_Esc+'`5B1;8H'+dec(score,,5)); X Screen`5B2`5D := 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; X Screen`5B3`5D := 'X`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E V`7EX`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7EX'; X Screen`5B4`5D := 'X`7EXXXXXXX`7EXXXXXXXXX`7EX`7EXXXXXXXXX`7EXXXXXX`7EX'; X Screen`5B5`5D := 'X*XXXXXXX`7EXXXXXXXXX`7EX`7EXXXXXXXXX`7EXXXXXX*X'; X Screen`5B6`5D := 'X`7E`7E`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`7EX'; X Screen`5B7`5D := 'XXXXXXXXXX`7EX`7EXXXXXXXXXXXXXXX`7EX`7EXXXXXXXXX'; X Screen`5B8`5D := ' X`7EX`7E`7E`7E`7E`7E`7E`7E`7EX`7E`7E`7E`7E`7E` V7E`7E`7EX`7EX '; X Screen`5B9`5D := ' X`7EXXXXXXXX`7EX`7EXXXXXXXX`7EX '; X Screen`5B10`5D := 'XXXXXXXXXX`7EX X X`7EXXXXXXXXX'; X Screen`5B11`5D := ' `7E `7E '; X Screen`5B12`5D := ' `7E XXXXXXXXXXXXXXX `7E '; X Screen`5B13`5D := 'XXXXXXXXXX`7EX X X X`7EXXXXXXXXX'; X Screen`5B14`5D := ' X`7EX XXXXXXXXXXXXXXX X`7EX '; X Screen`5B15`5D := ' X`7EX X`7EX '; X Screen`5B16`5D := 'XXXXXXXXXX`7EX XXXXXXXXXXXXXXX X`7EXXXXXXXXX'; X Screen`5B17`5D := 'X`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7 VE`7EX`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7EX'; X Screen`5B18`5D := 'X`7EXXXXXXXXX`7EXXXXXXX`7EX`7EXXXXXXX`7EXXXXXXXX`7EX'; X Screen`5B19`5D := 'X*`7E`7E`7E`7E`7E`7E`7E`7EX`7E`7E`7E`7E`7E`7E`7E`7E`7E V`7E`7E`7E`7E`7E`7E`7E`7E`7E`7EX`7E`7E`7E`7E`7E`7E`7E*X'; X Screen`5B20`5D := 'XXXXXXXXX`7EX`7EXXXXXXXXXXXXXXXXX`7EX`7EXXXXXXXX'; X Screen`5B21`5D := 'X`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7 VE`7EX`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7EX'; X Screen`5B22`5D := 'X`7EXXXXXXXXXXXXXXXXX`7EX`7EXXXXXXXXXXXXXXXX`7EX'; X Screen`5B23`5D := 'X`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7 VE`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7E`7EX'; X Screen`5B24`5D := 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; XEnd; X XProcedure Put_Screen(What : Char; Y,X : Integer); X Begin X If Not ((Y < 1) Or (Y > 24) Or ( X < 1 ) Or ( X > 40)) Then X qio_write (get_posn(x,y)+What); X End; X X XProcedure Add_To_Score(Number : Integer); X Begin X Score := Score + Number; X If Number > 5 Then X Begin X qio_Write (get_posn(19,13)+dec(Number,,4)); X qio_Write (get_posn(8,1)+dec(Score,,5)); X End X Else`20 X If Score Mod 10 = 0 Then X qio_Write (get_posn(8,1)+dec(Score,,5)); X If Number = 5 Then Fightback := True; X Dots_left := Pred(Dots_left); X Screen`5Bpacman.y_pos,pacman.x_pos`5D := ' '; X End; X XProcedure Move_A_Greebly(Which_Way : Way); X Begin X Lastmove := Which_way; X Moved := True; X With Greebly Do X Begin X If Random(100) < Skill Then X Begin X If Screen`5BY_Pos,X_pos`5D = '`7E' Then X Put_Screen(Dot,Y_pos,X_Pos) X Else`20 X If Screen`5BY_Pos,X_pos`5D = '*' Then`20 X Put_Screen(Asterisk,Y_Pos,X_Pos) X Else Put_Screen(Blank,Y_Pos,X_Pos); X Case Which_way Of X Up : Y_Pos := Pred(Y_Pos); X Right : Begin X If X_Pos > 38 Then X_Pos := 0; X X_Pos := Succ(X_Pos); X End; X Down : Y_Pos := Succ(Y_Pos); X Left : Begin X If X_Pos < 3 Then X_Pos := 41; X X_Pos := Pred(X_Pos); X End; X End; X End; X Put_Screen(Shape,Y_pos,X_Pos); X If Skill > 100 Then X If random (100) < (Skill mod 100) Then`20 X If Not Moved_Once Then X Begin`20 X Move_Greebly; X Moved_Once := True; X End X Else X Moved_Once := False; X End; XEnd; X `20 X XProcedure Find_A_Move(Quality : How_Good ; X Indicator : General_Direction); X Begin X With Greebly Do X Begin X Case Indicator Of X Horizontal : Begin X Case Quality Of X Good : Begin X If X_Dist > 0 Then `7B Want to move RIGHT `7 VD X Begin X If (Succ(X_Pos) <> 41) Then X Begin X If Not ((Screen`5BY_Pos,Succ(X_Pos)`5D V = 'X') Or X (Screen`5BY_pos,Succ(X_Pos)`5D V = '#') 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 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 If (Pred(X_Pos) <> 0) then X Begin X If Not ((Screen`5BY_Pos,Pred(X_Pos)`5D = V 'X') Or X (Screen`5BY_pos,Pred(X_Pos)`5D = ' V#') Or X (Not Fightback and (lastmove = Rig Vht))) Then X Move_A_Greebly(Left); `7BMoves And Sets M Voved to TRUE `7D X End X Else X Begin X If Not ((Screen`5BY_Pos,40`5D = 'X') Or X (Screen`5BY_pos,40`5D = '#') Or X (Not Fightback and (lastmove = Rig Vht))) Then X Move_A_Greebly(Left); `7BMoves And Set Vs Moved to TRUE `7D X End; X End; X Bad : Begin X If X_Dist <= 0 Then `7B Want to move RIGHT ` V7D X Begin X If (Succ(X_Pos)<>41) Then X Begin X If Not ((Screen`5BY_Pos,Succ(X_Pos)`5D V = 'X') Or X (Screen`5BY_pos,Succ(X_Pos)`5D V = '#') Or X (Not fightback and (lastmove = V Left))) Then +-+-+-+-+-+-+-+- END OF PART 1 +-+-+-+-+-+-+-+-