home *** CD-ROM | disk | FTP | other *** search
/ Game Killer / Game_Killer.bin / 260.DISTANCE.INC < prev    next >
Text File  |  1991-07-08  |  3KB  |  103 lines

  1. procedure TwoWayDistances( sec : sector; var D : distanceArray;
  2.                            inward, outward : boolean );
  3. { inward = accept TOWARD sec; outward = accept LEAVING sec }
  4. { D[j].d = distance from sec;
  5.   D[j].s = one node close }
  6. var
  7.   si : sectorIndex;
  8.   wi : warpIndex;
  9.   breadth : queue;
  10.   s,
  11.   daddy, sonny : sector;
  12.   i : warpindex;
  13.   entered : array [ sector ] of boolean;
  14. begin
  15.   if inward then
  16.     write('(This may take a while.)  ');
  17.   writeln('Computing distances...');
  18.   for s := 1 to maxSector do
  19.     begin
  20.       D[s].d := -1;
  21.       entered[ s ] := false;
  22.     end; {for}
  23.   breadth.front := 0;
  24.   enqueue( breadth, sec, sec );
  25.   entered[sec] := true;
  26.   while breadth.front > 0 do
  27.     begin
  28.       serve( breadth, daddy, sonny );
  29.       if D[ sonny ].d = -1 then {haven't hit him before:}
  30.         begin
  31.           D[ sonny ].d := D[ daddy ].d + 1;
  32.           D[ sonny ].s := daddy;
  33.           if outward then
  34.             with space.sectors[ sonny ] do if number > 0 then
  35.               for wi := 1 to number do
  36.                 if not entered[ data[wi] ] then
  37.                   begin
  38.                     enqueue( breadth, sonny, data[ wi ] );
  39.                     entered[ data[wi] ] := true;
  40.                   end; {if with for if}
  41.           if inward then
  42.             for s := 1 to maxSector do
  43.               if not entered[ s ] then
  44.                 if IsWarp( s, sonny ) then
  45.                   begin
  46.                     enqueue( breadth, sonny, s );
  47.                     entered[ s ] := true;
  48.                   end; {if for if if}
  49.         end; {if}
  50.     end; {while}
  51.   for s := 1 to maxSector do if D[s].d = -1 then D[s].d := maxint;
  52. end; {FixDistances}
  53.  
  54. function CountDist(var D : distancearray; howfar : integer ):integer;
  55. var
  56.   c : integer;
  57.   s : sector;
  58. begin
  59.   c := 0;
  60.   for s := 1 to maxSector do
  61.     if D[ s ].d <= howfar then
  62.       c := c + 1;
  63.   countDist := c;
  64. end; {CountDist}
  65.  
  66. procedure SortDistances( var D : distancearray; largest : sector );
  67. { sort, based upon "d" field.  }
  68. var
  69.   smallest : dist;
  70.   where    : sector;
  71.   s, t     : sector;
  72. begin
  73.   for s := 1 to largest - 1 do
  74.     begin
  75.       smallest := d[s];
  76.       where := s;
  77.       for t := s + 1 to largest do
  78.         if smallest.d > d[t].d then
  79.           begin
  80.             smallest := d[t];
  81.             where := t;
  82.           end; {for t}
  83.         d[where] := d[s];
  84.         d[s] := smallest;
  85.     end; {for s}
  86. end; {Sort Distances}
  87.  
  88. function SetupDistances : boolean;
  89. { return false if they aborted }
  90. var
  91.   s, n : integer;
  92. begin
  93.   s := GetSector;
  94.   if s <> 0 then
  95.     begin
  96.       TwoWayDistances( s, distances, false, true );
  97.       for n := 1 to maxSector do distances[ n ].s := n;
  98.       SetUpDistances := true;
  99.     end {if}
  100.   else
  101.     SetUpDistances := false;
  102. end; {SetUpDistances}
  103.