$! ------------------ CUT HERE -----------------------
$ v='f$verify(f$trnlnm("SHARE_VERIFY"))'
$!
$! This archive created by VMS_SHARE Version 7.2-007  22-FEB-1990
$!   On  7-APR-1993 18:54:43.71   By user MASTER 
$!
$! 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. BUILD.COM;1
$!       2. TANK.PAS;1
$!       3. TANK.SCN;1
$!       4. TANKH.FOR;1
$!       5. TANKM.MAR;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$ MACRO TANKM
X$ PASCAL TANK`09`09! ignore the warnings
X$ FORTRAN TANKH
X$!
X$ LINK /NOTRACE TANK,TANKM,TANKH,UTIL/LIB
X$ DELETE /NOCONFIRM *.OBJ;*
X$ EXIT
$ CALL UNPACK BUILD.COM;1 1249736874
$ create 'f'
X
X`7B$S-`7D
X`7B$C+`7D
X`7B
X
X`09`09Program`09: Tank
X
X`09`09Authors`09: Rex Croft       - Macro
X
X                          Murray Speight - Pascal`20
X
X`09`09Place`09: University Of Waikato`20
X
X`09`09Date `09: May 1982`20
X
X`09Software Is Subject To Change Without Notification
X        The Author And His Family assume No Rsponsability For
X`09Its Reliabliity Or Use.`20
X
X         `7D
X
XProgram Tank(Input,Output);
X
XLabel`099999;  `7B For Abortive exit Of Pgm `7D
X
X
XConst `09Max_Num_Players`09= 8;             `7B Up To 8 Players `7D
X`09Screen_Dim_X `09= 23;            `7B PLaying Board 40 * 23 `7D
X`09Screen_Dim_Y`09= 40;
X`09Len_Of_Buff`09= 1024;          `7B Buffer to Write Chars `7D
X        Max_Name_Length = 32;            `7B Lenngth of a players name `7D
X
XType `09Player_Responce = Packed Array `5B1..Max_Num_Players`5D Of Char;
X`09Buffer`09`09= Packed Array `5B1..Len_Of_Buff`5D Of Char;`09
X`09Positions`09= Array `5B1..Max_Num_Players`5D Of INteger;
X`09Players_Screen`09= Array `5B1..Screen_Dim_X,1..Screen_Dim_Y`5D Of Char;
X`09Died_Type`09= Array `5B1..Max_NUm_Players`5D Of Boolean;
X`09Name_Line`09= Packed array `5B1..max_Name_Length`5D of Char;
X        Name_Table`09= Array `5B1..Max_Num_Players`5D of name_LIne;
X
XVar `09Responce `09,`09`09`09`7B What Players Have Typed `7D
X`09Head_Sym`09: Player_Responce;      `7B What Symbol is THe Head `7D
X`09Screen`09`09: Players_Screen;       `7B 23 * 40 Array For Screen`7D
X`09Name`09`09: Name_Table;           `7B Names Of Each Player `7D
X        Init_Pos_X`09,                       `7B Where initaially Players St
Vart `7D
X        Init_Pos_Y      ,                       `7B  "" "" For Y Coord `7D
X`09Score`09`09,                       `7B Score Of Each PLayer `7D
X        Game`09`09,                       `7B Num Games Each PLayer Played `
V7D
X`09Games_Won `09,                       `7B Games Won By Each PLayer `7D
X`09Move_X`09`09,                       `7B What Dir Each Playe Is Moving X C
Voord `7D
X`09Move_Y`09`09,                       `7B "" "" Y Coord `7D
X`09Head_X`09`09,                       `7B Where The Head Is For Each Player
V X Coord `7D
X`09Head_Y`09 `09,                       `7B "" "" Y Coord `7D
X`09Start_X`09`09,
X`09Start_Y`09`09,
X        Rand`09`09,
X        Laser_Charge`09,
X`09End_X`09`09,
X`09End_Y`09`09: Positions;            `7B "" "" Y Cord `7D
X`09TT_Buff`09`09: Buffer;               `7B Lenght Of Buffer To Hold Screen
V Output `7D
X`09TT_Len`09`09,                       `7B String To Hold Screen Output `7D
X        Who_Is_PLaying  ,                       `7B Word With Bits Set As To
V Who is Playing `7D
X`09You`09`09,                       `7B Which Number You are `7D`20
X`09Dummy `09`09,                       `7B Dummy argument `7D
X`09Num_players     ,                       `7B How Many people are Playing `
V7D
X`09Max_Player_Number ,                     `7B The Highest PLayers Number wh
Vo is Playing `7D
X`09Move_Count`09,
X        Num_Moved_Last_Round    ,               `7B Number of players who mo
Vved last Round ( Last Screen Update ) `7D
X`09Players_Removing`09: Integer;      `7B Are We Removing Odd 1 or even 2 pl
Vayers Tails `7D
X`09Fired`09`09,
X        Shields         ,
X`09Quit`09`09,                       `7B Has The PLayer Quit (not playing )
V or is He Playing `7D
X`09Died `09`09: Died_Type;            `7B Has The PLayer Died ( Died If He h
Vas Quit ) `7D
X`09Back_space`09,
X`09Line_Feed`09,
X`09Up_Line`09`09,
X`09Esc`09`09: Char;                 `7B esc For escape sequences `7D
X`09Seed`09`09: Real;                 `7B Seed for random number generaotor `
V7D
X        Time_Now`09: Packed array `5B1..11`5D Of Char;
X
XProcedure Break_Buff;
X
X   Procedure Snake_Screen( Var Line : Buffer ; Var Lenght : Integer );extern
V;`20
X
X`7B Only Call This Once From The Add_head Function`20
X
X   Does not write array to screen `7D
X
XBegin
X   Snake_Screen(TT_Buff,TT_Len);`20
X   TT_Len := 0;
Xend;
X
X
XProcedure Help_Screen;extern;
X
XProcedure Buff_Pos_Char_1( X,Y : Integer ; Ch : Char );
X
X`7B Write Char at Pos X,Y in Buffer `7D
X
XBegin
X   TT_Buff`5BTT_Len+1`5D := Esc;
X   TT_Buff`5BTT_Len+2`5D := 'Y';
X   TT_Buff`5BTT_Len+3`5D := Chr(31+X);
X   TT_Buff`5BTT_Len+4`5D := Chr(31+Y);
X   TT_Buff`5BTT_Len+5`5D := Ch;
X   TT_Len := TT_Len + 5;
Xend;
X
XProcedure Buff_Pos( X,Y : Integer);
X
X`7B Write Char at Pos X,Y in Buffer `7D
X
XBegin
X   TT_Buff`5BTT_Len+1`5D := Esc;
X   TT_Buff`5BTT_Len+2`5D := 'Y';
X   TT_Buff`5BTT_Len+3`5D := Chr(31+X);
X   TT_Buff`5BTT_Len+4`5D := Chr(31+Y);
X   TT_Len := TT_Len + 4;
Xend;
X
XProcedure Buff_Char_1( Ch : Char );
X
X`7B Write Char at Pos X,Y in Buffer `7D
X
XBegin
X   TT_Buff`5BTT_Len+1`5D := Ch;
X   TT_Len := TT_Len + 1;
Xend;
X
XProcedure Buff_Char_3( Ch_1,Ch_2,Ch_3 : Char );
X
X`7B Write Char at Pos X,Y in Buffer `7D
X
XBegin
X   TT_Buff`5BTT_Len+1`5D := Ch_1;
X   TT_Buff`5BTT_Len+2`5D := Ch_2;
X   TT_Buff`5BTT_Len+3`5D := Ch_3;
X   TT_Len := TT_Len + 3;
Xend;
X
X
XFunction at(X,Y: Integer):Char;
X
X`7B Posotion Cursor at X , Y this Is For Use In Write Statments `7D
X
XBegin
X   Write(esc,'Y',chr(31+X),Chr(31+Y));
X   at := Chr(0);
Xend;
X
X
XFunction Snake_Init(Var You :  INteger ; Var Game_going : Integer):Integer;e
Vxtern;
X
XProcedure Name_Set(Var Name : Name_Line );extern;
X
XProcedure Name_Get(Var Name : Name_Line ; var Play : Integer );extern;
X
XProcedure Score_Set( Var Player,Score,Games_PLayed,wins : INteger);extern;
X
XProcedure Score_Get( Var Player,Score,Games_Played,wins : Integer );extern;
X
XProcedure Snake_Start(var Whos_PLaying : Integer ; var Rand : Positions );Ex
Vtern;
X
XProcedure Snake_Read(Var Directions : Player_Responce );Extern;
X
XProcedure Snake_Game_End;extern;
X
XProcedure Snake_Wait;Extern;
X
XProcedure Snake_Game_count( Var Num : Integer);extern;
X
XProcedure Snake_Dead(Var PLayer : Integer );extern;
X
XProcedure Sleep( Num_Sec : Integer);extern;
X
XFunction Mth$Random(var Seed : real):Real;extern;
X
XProcedure Draw_Scores;
X
XConst Len_Scale = 50;
X
XVar I,num_on_table,play,Top_play,Total_Num_Games: Integer;
X    This_Score,`09Max_score , Score_Ratio : Real;
X
X
XBegin
X   Time(Time_Now);
X   Num_on_Table := 0;
X   Write(esc,'H',Esc,'J',Esc,'G',esc,'<');
X   Write(' Player   User         Name               Score  Game  Won     ');
X   If ( Time_Now`5B1`5D = '2' ) Then Begin
X      If ( Time_Now`5B2`5D >= '2' ) Then Begin
X         Time_Now`5B1`5D := '1';
X         Time_Now`5B2`5D := chr( Ord(Time_Now`5B2`5D) - 2);
X      end Else begin
X         Time_Now`5B1`5D := ' ';
X         Time_Now`5B2`5D := chr( Ord(Time_Now`5B2`5D) + 8);
X      end;
X      Write(esc,'`5B1m',Time_Now:5);
X      Writeln(' pm',esc,'`5B0m');
X   End Else Begin
X      If (( Time_Now`5B1`5D = '1' ) and ( Time_Now`5B2`5D > '2' )) THen Begi
Vn
X         Time_Now`5B1`5D := ' ';
X         Time_Now`5B2`5D := chr( Ord(Time_Now`5B2`5D) - 2);
X         Write(esc,'`5B1m',Time_Now:5);
X         Writeln(' pm',esc,'`5B0m');
X      end Else Begin
X         If Time_Now`5B1`5D = '0' Then`20
X            Time_Now`5B1`5D := ' ';
X         Write(esc,'`5B1m',Time_Now:5);
X         If Time_Now`5B2`5D = '2' Then`20
X            Writeln(' pm',esc,'`5B0m')
X         else
X            Writeln(' am',esc,'`5B0m');
X      end;
X   end;
X   writeln;
X   Max_score := -99999.0;
X
X   `7B Find The Top Player  goes By The his Score And Num Of Games Played `7
VD
X   For PLay := 1 to Max_Num_PLayers do  begin
X      Score_get(Play,Score`5BPLay`5D,Game`5BPLay`5D,Games_won`5Bplay`5D);
X      If Game`5BPlay`5D > 0 Then Begin
X         This_score := (Score`5Bplay`5D+ Games_won`5Bplay`5D*10) / (Game`5Bp
Vlay`5D)**(0.9);
X         If This_score > Max_score Then Begin
X            Top_Play := Play;
X            Max_score := This_score + 1.0;
X         end;
X      end;
X   end;
X   For Play := 1 to Max_Num_PLayers do Begin
X      If Game`5BPLay`5D > 0  Then Begin   `7B IF Games PLayed > 0 Then You A
Vre PLaying  `7D
X         Num_On_Table := Num_On_Table + 1;
X         If PLay = Top_PLay Then`20
X            Write(esc,'`5B1m');  `7B High intensity Flash `7D
X         Write(Play:4);
X         Write('    ',Name`5BPlay`5D:32);
X         write(Score`5BPLay`5D:7);         `7B Print Info `7D
X         Write(Game`5BPlay`5D:6);
X         Writeln(Games_won`5Bplay`5D:5,esc,'`5B0m'); `7B Exit High Intens `7
VD
X      End;
X   End;
X   writeln;`20
X   Writeln(' Player  Score Indicator ');
X   Writeln;
X   For Play := 1 to Max_Num_PLayers do Begin
X      If Game`5BPLay`5D > 0  Then Begin   `7B IF Games PLayed > 0 Then You A
Vre PLaying  `7D
X         If PLay = Top_PLay Then`20
X            Write(esc,'`5B1m');  `7B High intensity Flash `7D
X         Write(Play:4);
X         Write('     ',Esc,'`5B7m'); `7B Rev Video `7D
X         Score_Ratio := (Score`5Bplay`5D+Games_won`5BPLay`5D*10)*Len_Scale
X                            / ((Game`5Bplay`5D)**(0.9)*Round(max_score));
X         For I := 1 to Round(Score_Ratio) do`20
X            Write(' ');
X         If PLay = Top_PLay Then`20
X             Write(Esc,'`5B0m',Esc,'`5B1;5m ** Champ ** ');
X         Writeln(esc,'`5B0m'); `7B Normal Video `7D
X      end;
X    End;
X
X`7B Print The Games You Have Played With The Totak Num of Games Played so Fa
Vr `7D
X   Snake_Game_Count( Total_Num_games );
X   writeln;
X   Writeln(' Game # ',Game`5BYou`5D:1,'    Total # ',Total_Num_Games:1,
X           '`09`09Please Wait For Next Game ... ',Esc,'`5B?2l',Esc,'F');
X   If Num_on_Table <= 1 Then`20
X      Goto 9999;
Xend;
X
XProcedure Draw_screen;
X
XVar play,I,X,Y,Line_at : Integer;
X
X   Function Min(A,B:Integer):Integer;
X
X   Begin
X      If A < B Then`20
X         Min := A`20
X      Else
X         Min := B
X   end;
X
XBegin `7B Draw Screen `7D
X   Write(at(1,1),esc,'J',esc,'<',esc,'(0',esc,'<',esc,'(0');     `7B Clear H
Vome `7D
X   Write(esc,'#6l');
X   For Y := 1 To (Screen_Dim_Y-2) Do`20
X      Write('q');
X   Writeln('k');
X   For X := 2 To ( Screen_dim_X - 1 )  Do begin
X      Write(esc,'#6x');
X      Writeln(Esc,'`5B',(Screen_dim_Y-2):1,'Cx');
X   end;
X   write(esc,'#6m');
X   For Y := 1 to (Screen_Dim_Y-1) Do`20
X      Write('q');
X   Writeln('j');
X   Writeln(Esc,'`5B1;1H',Esc,'`5B?2l',esc,'F');
X
Xend;
X
X  `20
XProcedure initalise_Positions;
X
X
X
XVar Mult,Play,X,Y : Integer;
X
X
XBegin
X
XPlayers_Removing := -1;  `7B On First Few Moves Want To Draw Hazzards `7D
X
XSnake_Start(Who_Is_Playing,Rand);
X
X
X`7B Randomly Position The Starting Pos Of The PLayers `7D
XFor play := 1 to Max_num_players do  Begin
X   Head_X`5BPlay`5D := Init_Pos_X`5BRand`5BPlay`5D`5D;
X   Head_Y`5Bplay`5D := Init_Pos_Y`5BRand`5BPLay`5D`5D;
X   Laser_Charge`5Bplay`5D := 0;
X   Shields`5Bplay`5D := True;
X   Fired`5Bplay`5D := False;
X   Move_X`5BPlay`5D := 0;
X   Move_Y`5BPLay`5D := 0;
Xend;
X
XMult := 2**(Max_num_Players - 1 );  `7B 2 ** Number of PLayers - 1`7D
XNum_Players := 0;
X
X`7B Examine Each Bit In Mult To See If You Are Playing `7D
XMax_player_number := 0;
XFor Play := Max_Num_PLayers downto 1 do begin
X   If ( Who_Is_PLaying div Mult ) = 1 Then begin
X      Name_Get(Name`5BPlay`5D,Play);
X      Num_Players := Num_PLayers + 1;
X      Quit`5Bplay`5D := False;   `7B Bit Set You Are Playing `7D
X      Who_is_Playing := Who_is_Playing - Mult;
+-+-+-+-+-+-+-+-  END  OF PART 1 +-+-+-+-+-+-+-+-
