home *** CD-ROM | disk | FTP | other *** search
/ Game Killer / Game_Killer.bin / 097.MOREPAIR.INC < prev    next >
Text File  |  1992-07-26  |  5KB  |  139 lines

  1. function match( classification : str3; s : sector) : boolean;
  2. { return true when port in sector s matches the classification }
  3. const
  4.   powertwo : array [1..3] of integer = (1, 2, 4);
  5. var
  6.   ThisPort : stuff;
  7.   matchall : boolean;
  8.   i        : 1..3;
  9. begin
  10.   matchall := false;
  11.   ThisPort := space.sectors[s].porttype;
  12.   if length( classification ) <> 3 then
  13.     writeln('error -- wrong length of string passed to "match"')
  14.   else if ThisPort = NotAPort then
  15.     writeln('error -- matched called on sector that isn''t a port')
  16.   else if ThisPort <> Class0 then
  17.     begin
  18.       matchall := true;
  19.       for i := 1 to 3 do
  20.         case classification[i] of
  21.           'B' : matchall := matchall and ( ThisPort and powertwo[i] = 0);
  22.           'S' : matchall := matchall and ( ThisPort and powertwo[i] <> 0);
  23.           'X' : ;
  24.         else
  25.           writeln('error: bad character in classification passed to "match"');
  26.         end; {case}
  27.     end;
  28.   match := matchall;
  29. end;
  30.  
  31. procedure AddPortsInsideRadius( CurrentSector : sector;
  32.                                 matchtype     : str3;
  33.                                 HowFar        : integer;
  34.                             var MasterList    : sectorList );
  35. { add all ports to "master list" that match the described "match type"
  36.   within "How Far" of "Current Sector". }
  37. var
  38.   t : warpindex;
  39. begin
  40.   if space.sectors[ currentSector ].porttype <> NotAPort then
  41.     if match( matchtype, CurrentSector ) then
  42.       AddToList( MasterList, currentSector );
  43.   if HowFar > 0 then {recurse}
  44.     begin
  45.       for t := 1 to space.sectors[ CurrentSector ].number do
  46.         AddPortsInsideRadius( space.sectors[ CurrentSector ].data[ t ],
  47.                               matchtype, howFar - 1, MasterList );
  48.     end;
  49. end;
  50.  
  51. function SearchForPair( ShowLevels   : boolean;
  52.                          baseSector  : sector;
  53.                          destination : str3;
  54.                          limit       : integer ) : integer;
  55. var
  56.   s          : sector;
  57.   FoundPorts : sectorlist;
  58.   i          : sectorindex;
  59.   lines      : integer;
  60.   g, g1      : stuff;
  61.   f          : text;  {dummy}
  62. begin
  63.   FoundPorts.size := 0;
  64.   lines := 0;
  65.   g := space.sectors[baseSector].porttype;
  66.   AddPortsInsideRadius( baseSector, destination, limit, FoundPorts );
  67.   if FoundPorts.size > 0 then
  68.     begin
  69.       write('Base point ', baseSector:4);
  70.       write( ' ', status( g ) );
  71.       if space.sectors[ baseSector].etc and HasFighters <> Nothing then
  72.         write(' F');
  73.       if space.sectors[ BaseSector].etc and SpaceLane <> Nothing then
  74.         write(' SL');
  75.       writeln(' ', DisplayPort(portNumber(baseSector)));
  76.       lines := lines + 1;
  77.       for i := 1 to FoundPorts.size do
  78.         begin
  79.           s := FoundPorts.data[i];
  80.           g1 := space.sectors[s].porttype;
  81.           write('Pair:      ', s:4);
  82.           write(' (', FixPath( s, baseSector, maxSector ):1, ')');
  83.           write(' ', status( g1 ) );
  84.           if space.sectors[ s ].etc and HasFighters <> Nothing then
  85.             write(' F');
  86.           writeln(' ', DisplayPort(portNumber(s)));
  87.           if ShowLevels then
  88.             PortTradeFactor( baseSector, s, deal( g, g1), deal( g1, g ),
  89.                              AllTrades, false, f );
  90.           lines := lines + 1;
  91.         end;
  92.     end; {if}
  93.   SearchForPair := lines;
  94. end;
  95.  
  96. procedure PairSearch( target, destination : str3 );
  97. { this will look for ports of type "target" (wildcards allowed) to type
  98.   "destination".}
  99. var
  100.   linecount,              { number of lines printed this screen }
  101.   lines      : integer;   { number of lines printed this search }
  102.   NumSectors : sectorindex;
  103.   maxDist    : integer;
  104.   i          : sector;
  105.   candidates : sectorlist;
  106.   response   : string;
  107.   showfactor : boolean;
  108.   ch         : char;
  109. begin
  110.   linecount := 0;
  111.   SortPorts( NumSectors );
  112.   candidates.size := 0;
  113.   for i := 1 to NumSectors do
  114.     if match( target, distances[i].s) then
  115.       AddToList( candidates, distances[i].s );
  116.   write('Maximum distance for pair? [0 to abort] ');
  117.   maxDist := readNumberFromTerminal;
  118.   showFactor := prompt('Show port trade factors? ');
  119.   for i := 1 to candidates.size do
  120.     begin
  121.       lines := SearchForPair( showfactor, candidates.data[i], destination, maxDist );
  122.       if lines > 0 then
  123.         begin
  124.           linecount := linecount + lines;
  125.           if showFactor then
  126.             linecount := linecount + (lines - 1); {one factor level per line}
  127.           if linecount > 10 then
  128.             begin
  129.               writeln;
  130.               if prompt('enough? ') then
  131.                 exit;
  132.               linecount := 0;
  133.             end {if linecount}
  134.           else
  135.             writeln;
  136.         end; {if lines}
  137.     end;  {if match}
  138. end;
  139.