$! ------------------ CUT HERE -----------------------
$ v='f$verify(f$trnlnm("SHARE_VERIFY"))'
$!
$! This archive created by VMS_SHARE Version 7.2-007  22-FEB-1990
$!   On 30-MAY-1992 03:44:40.07   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 2 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. GRANNY.JAI;1
$!       3. GRANNY.PAS;1
$!       4. GRANNY.PIC;1
$!       5. GRANNY.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 GRANNY
X$ LINK GRANNY, INTERACT/LIB
X$ DELETE *.OBJ;*/NOCONFIRM
X$ EXIT
$ CALL UNPACK BUILD.COM;1 253301427
$ create 'f'
X`1B`5BH`1B`5BJ`1B(B`1B`5B0m
X`1B`5B1;1H`1B#6`1B`5B2;1H`1B#3      Y E S   T H A T   W A S   A`1B`5B3;1H`1B
V#4      Y E S   T H A T   W A S   A`1B`5B4;1H`1B#6`1B`5B5;1H`1B#6`1B`5B5;12H
VP O L I C E M A N
X`1B`5B6;1H`1B#6`1B`5B7;1H`1B#6  `1B`5B7m                                `1B`
V5B8;1H`1B#6`1B`5B8;11H `1B`5B0m  `1B(0xx  xx  xx  `1B`5B7m `1B`5B9;1H`1B#6`1
VB`5B9;10H  `1B`5B0m  xx  xx  xx  `1B`5B7m`20
X`1B`5B9;27H `1B`5B10;1H`1B#6`1B`5B10;11H `1B`5B0m  xx  xx  xx  `1B`5B7m `1B`
V5B11;1H`1B#6`1B`5B11;10H  `1B`5B0m  xx  xx  xx  `1B`5B7m  `1B`5B12;1H`1B#6`1
VB`5B12;11H `1B`5B0m  xx  xx  xx  `1B`5B7m`20
X`1B`5B13;1H`1B#6`1B`5B13;10H  `1B`5B0m  xx  xx  xx  `1B`5B7m  `1B`5B14;1H`1B
V#6`1B`5B14;11H `1B`5B0m  xx  xx  xx  `1B`5B7m `1B`5B15;1H`1B#6`1B`5B15;10H
V  `1B`5B0m  xx  xx  xx  `1B`5B7m `20
X`1B`5B16;1H`1B#6`1B`5B16;11H      `1B(B/  \      `1B`5B17;1H`1B#6`1B`5B17;16
VH`1B`5B0m/    \`1B`5B18;1H`1B#6`1B`5B18;15H`1B(0lqqqqqqk`1B`5B19;1H`1B#6`1B`
V5B19;15Hx HOME x`1B`5B20;1H`1B#6`1B`5B20;15Hx SWEETx
X`1B`5B21;1H`1B#6`1B`5B21;15Hx JAIL x`1B`5B22;1H`1B#6`1B`5B22;15Hmqqqqqqj`1B`
V5B23;1H`1B#6`1B`5B1;1H
X`1B(B`1B*
$ CALL UNPACK GRANNY.JAI;1 2101957680
$ create 'f'
X`5B
X  Inherit`20
X    (
X      'SYS$LIBRARY:STARLET',
X      'INTERACT'
X    )
X`5D
X
XPROGRAM  Granny;
X
XCONST
X  max_victims = 20;
X  black  = 'B';
X  child  = 'C';
X  dog    = 'D';
X  granny = 'G';
X  mother = 'M';
X  police = 'P';
X  building  = 50;
X  building1 = 100;
X  building2 = 200;
X  building3 = 300;
X  building4 = 400;
X  building5 = 500;
X  building6 = 600;
X  building7 = 700;
X  building8 = 800;
X  building9 = 900;
X  road     = 0;
X  beep     = chr(7);
X
XTYPE
X  v_array  = varying `5B100`5D of char;
X
XVAR
X  x_posn        : integer;
X  y_posn        : integer;
X  direct        : integer;
X  score         : integer;
X  screen        : array `5B1..40,1..21`5D of integer;
X  command       : char;
X  person_killed : boolean;
X  victim        : array `5B1..max_victims`5D of char;
X  victim_x      : array `5B1..max_victims`5D of integer;
X  victim_y      : array `5B1..max_victims`5D of integer;
X  victim_d      : array `5B1..max_victims`5D of integer;
X  victim_o      : array `5B1..max_victims`5D of integer;
X  odd_even      : boolean;
X
X
XPROCEDURE  Finish;
XBEGIN
X  reset_screen;
X  qio_purge;
X  clear;
X  top_ten (score);
XEND;
X
X
XPROCEDURE Refresh_screen;
XVAR
X  i, x, y, r : integer;
XBEGIN
X  command := ' ';
X  show_graphedt ('granny.scn',wait:=false);
X  posn (x_posn,y_posn);
X  qio_write (VT100_graphics_on+'`60'+VT100_graphics_off);
XEND;
X
X
XPROCEDURE  Setup;
XVAR
X  i, x, y, r : integer;
XBEGIN
X  For x := 1 to 40 do
X    BEGIN
X      screen`5Bx,1`5D := building1;
X      screen`5Bx,2`5D := building1;
X      screen`5Bx,20`5D := building2;
X      screen`5Bx,21`5D := building2;
X    END;
X  For y := 1 to 20 do
X    BEGIN
X      screen`5B1,y`5D := building3;
X      screen`5B2,y`5D := building3;
X      screen`5B39,y`5D := building4;
X      screen`5B40,y`5D := building4;
X    END;
X  For x := 8 to 19 do
X    BEGIN
X      screen`5Bx,6`5D := building5;
X      screen`5Bx,7`5D := building5;
X      screen`5Bx,8`5D := building5;
X      screen`5Bx,9`5D := building5;
X      screen`5Bx,13`5D := building6;
X      screen`5Bx,14`5D := building6;
X      screen`5Bx,15`5D := building6;
X      screen`5Bx,16`5D := building6;
X    END;
X  For x := 24 to 34 do
X    BEGIN
X      screen`5Bx,6`5D := building7;
X      screen`5Bx,7`5D := building7;
X      screen`5Bx,8`5D := building7;
X      screen`5Bx,9`5D := building7;
X      screen`5Bx,13`5D := building8;
X      screen`5Bx,14`5D := building8;
X      screen`5Bx,15`5D := building8;
X      screen`5Bx,16`5D := building8;
X    END;
X
X  For x := 17 to 26 do
X    For y := 8 to 14 do
X      screen`5Bx,y`5D := road;
X
X  For x := 20 to 23 do
X    For y := 10 to 12 do
X      screen`5Bx,y`5D := building9;
X
X  For i := 1 to max_victims do
X    victim`5Bi`5D := ' ';
X
X  x_posn := 22;
X  y_posn := 18;
X  direct := 5;
X  refresh_screen;
XEND;
X
X
XPROCEDURE  Initialize;
XBEGIN
X  show_graphedt ('granny.pic');
X  score := 0;
XEND;
X
X
XPROCEDURE  Get_command;
XBEGIN
X  command := qio_1_char_now;
X  IF ( Upper_case(command) = 'W' ) then
X    refresh_screen;
XEND;
X
X
XPROCEDURE  Check_for_victim;
XVAR
X  i : integer;
XBEGIN
X  For i := 1 to max_victims do
X    IF ( victim`5Bi`5D <> ' ' ) and`20
X       ( victim_x`5Bi`5D = x_posn ) and ( victim_y`5Bi`5D = y_posn ) then
X      BEGIN
X        CASE victim`5Bi`5D of
X          granny : BEGIN
X                     score := score + 100;
X                     posn (16,22);
X                     qio_write ('Gota Granny'+beep);
X                     victim`5Bi`5D := ' ';
X                   END;
X          mother : BEGIN
X                     score := score + 25;
X                     posn (16,22);
X                     qio_write ('Gota Mother'+beep);
X                     victim`5Bi`5D := ' ';
X                   END;
X          black  : BEGIN
X                     score := score + 50;
X                     posn (16,22);
X                     qio_write ('Gota Bonus '+beep);
X                     victim`5Bi`5D := ' ';
X                   END;
X          child  : BEGIN
X                     score := score + 20;
X                     posn (16,22);
X                     qio_write ('Hit The Kid'+beep);
X                     victim`5Bi`5D := ' ';
X                   END;
X          dog    : BEGIN
X                     score := score + 10;
X                     posn (16,22);
X                     qio_write ('Dog Gone   '+beep);
X                     victim`5Bi`5D := ' ';
X                   END;
X          police : BEGIN
X                     show_graphedt ('granny.jai',wait:=false);
X                     sleep (2);
X                     person_killed := true;
X                   END;
X          otherwise;
X        End;
X      END;
XEND;
X
X
XPROCEDURE  Move;
XBEGIN
X  posn (24,23);
X  qio_write (dec(score));
X
X  CASE command of
X    '2' : direct := 2;
X    '4' : direct := 4;
X    '6' : direct := 6;
X    '8' : direct := 8;
X    otherwise;
X  End;
X
X  posn (x_posn,y_posn);
X  CASE direct of
X    2 : BEGIN
X          qio_write (' '+VT100_lf+VT100_bs+VT100_graphics_on+'`60'+VT100_gra
Vphics_off);
X          y_posn := y_posn + 1;
X        END;
X    4 : BEGIN
X          qio_write (' '+VT100_bs+VT100_bs+VT100_graphics_on+'`60'+VT100_gra
Vphics_off);
X          x_posn := x_posn - 1;
X        END;
X    6 : BEGIN
X          qio_write (' '+VT100_graphics_on+'`60'+VT100_graphics_off);
X          x_posn := x_posn + 1;
X        END;
X    8 : BEGIN
X          qio_write (' '+VT100_bs+VT100_esc+'`5BA'+VT100_graphics_on+'`60'+V
VT100_graphics_off);
X          y_posn := y_posn - 1;
X        END;
X    otherwise;
X  End; `7Bcase`7D
X
X  IF ( screen`5Bx_posn,y_posn`5D > building ) then
X    person_killed := true;
X
X  check_for_victim;
XEND;
X
X
XFUNCTION  Possible_door ( x , y : integer; VAR origin : integer ) : boolean;
XVAR
X  i : integer;
X  j : integer;
XBEGIN
X  possible_door := false;
X  IF ( screen`5Bx,y`5D = road ) then
X    FOR i := -1 to 1 do
X      FOR j := -1 to 1 do
X        IF ( screen`5Bx+i,y+j`5D > building ) then
X          BEGIN
X            possible_door := true;
X            origin := screen`5Bx+i,y+j`5D;
X          END;
XEND;
X
X
XPROCEDURE  Move_in_square ( VAR x, y, d : integer );
XBEGIN
X  IF ( d in `5B1,2,3`5D ) then
X    y := y + 1;
X  IF ( d in `5B7,8,9`5D ) then
X    y := y - 1;
X  IF ( d in `5B1,4,7`5D ) then
X    x := x - 1;
X  IF ( d in `5B3,6,9`5D ) then
X    x := x + 1;
XEND;
X
X
XFUNCTION  Move_onto_street ( x,y,d : integer ) : boolean;
XBEGIN
X  move_in_square ( x,y,d );
X  move_onto_street := ( screen `5Bx,y`5D = road );
XEND;
X
X
XPROCEDURE  Picka ( VAR victim : char );
XVAR
X  r : integer;
XBEGIN
X  r := random(15);
X  IF r < 2 then
X    victim := granny
X  ELSE
X  IF r < 6 then
X    victim := dog
X  ELSE
X  IF r < 9 then
X    victim := child
X  ELSE
X  IF r < 11 then
X    victim := black
X  ELSE
X  IF r < 14 then
X    victim := mother
X  ELSE
X    victim := police;
XEND;
X
X
XPROCEDURE  Create_victim;
XVAR
X  nu : integer;
X  n  : integer;
XBEGIN
X  nu := ( score div 100 ) + 3;
X  IF nu > max_victims then
X    nu := max_victims;
X
X  n := 1;
X  WHILE ( n < nu ) and ( victim`5Bn`5D <> ' ' ) do
X    n := n + 1;
X  IF ( n <= nu ) and ( victim`5Bn`5D = ' ' ) then
X    BEGIN
X      picka (victim`5Bn`5D);
X      REPEAT
X        victim_x`5Bn`5D := random(38)+1;
X        victim_y`5Bn`5D := random(19)+1;
X      UNTIL ( possible_door(victim_x`5Bn`5D,victim_y`5Bn`5D,victim_o`5Bn`5D)
V and`20
X            (( victim`5Bn`5D <> police ) or
X           ((( victim_x`5Bn`5D > x_posn + 2 ) or ( victim_x`5Bn`5D < x_posn
V - 2 )) or
X            (( victim_y`5Bn`5D > y_posn + 2 ) or ( victim_y`5Bn`5D < y_posn
V - 2 )))));
X      reset_randomizer;
X      REPEAT
X        victim_d`5Bn`5D := randomize(8);
X        IF victim_d`5Bn`5D > 4 then
X          victim_d`5Bn`5D := victim_d`5Bn`5D + 1;
X      UNTIL ( move_onto_street ( victim_x`5Bn`5D,victim_y`5Bn`5D,victim_d`5B
Vn`5D ) );
X    END;
XEND;
X
X
XPROCEDURE  Turn_and_run ( VAR d : integer );
XVAR
X  r : integer;
XBEGIN
X  reset_randomizer;
X  REPEAT
X    r := randomize(8);
X      IF r > 4 then
X        r := r + 1;
X   UNTIL ( r <> d );
X  d := r;
XEND;
X
X
XPROCEDURE  Move_victims;
XVAR
X  nu : integer;
X  r : integer;
X  x : integer;
X  y : integer;
X  d : integer;
X  outline : v_array;
XBEGIN
X  odd_even := not odd_even;
X  FOR nu := 1 to max_victims do
X    BEGIN
X      outline := '';
X      IF ( victim`5Bnu`5D = '`7E' ) then
X        BEGIN
X          outline := outline +`20
X              get_posn (victim_x`5Bnu`5D,victim_y`5Bnu`5D) + VT100_inverse +
V ' ' + VT100_normal;
X          victim`5Bnu`5D := ' ';
X        END
X      ELSE
X      IF (( odd(nu) and odd_even ) or ( not odd(nu) and not odd_even )) and
X       ( victim`5Bnu`5D <> ' ' ) then
X        BEGIN
X          outline := outline + get_posn (victim_x`5Bnu`5D,victim_y`5Bnu`5D)
V + ' ';
X `20
X          r := random(3);
X          IF r = 1 then
X            BEGIN
X              victim_d`5Bnu`5D := random(8);
X              IF victim_d`5Bnu`5D > 4 then
X                victim_d`5Bnu`5D := victim_d`5Bnu`5D + 1;
X            END;
X          x := victim_x`5Bnu`5D;
X          y := victim_y`5Bnu`5D;
X          d := victim_d`5Bnu`5D;
X          move_in_square ( x,y,d );
X          WHILE (( x = x_posn ) and ( y = y_posn ) and`20
X                not ( victim`5Bnu`5D = police )) or ( screen`5Bx,y`5D = vict
Vim_o`5Bnu`5D ) do
X            BEGIN
X              turn_and_run ( victim_d`5Bnu`5D );
X              x := victim_x`5Bnu`5D;
X              y := victim_y`5Bnu`5D;
X              d := victim_d`5Bnu`5D;
X              move_in_square ( x,y,d );
X            END;
X `20
X          move_in_square ( victim_x`5Bnu`5D,victim_y`5Bnu`5D,victim_d`5Bnu`5
VD );
X  `20
X          IF ( screen `5Bvictim_x`5Bnu`5D,victim_y`5Bnu`5D`5D > building ) t
Vhen
X            victim`5Bnu`5D := '`7E';
X `20
X          outline := outline + get_posn (victim_x`5Bnu`5D,victim_y`5Bnu`5D)
V + victim`5Bnu`5D;
X      END;
X      qio_write (outline);
X    END;
XEND;
X
XBEGIN
X  Initialize;
X  setup;
X  REPEAT
+-+-+-+-+-+-+-+-  END  OF PART 1 +-+-+-+-+-+-+-+-
