home *** CD-ROM | disk | FTP | other *** search
/ Game Killer / Game_Killer.bin / 111.TEXTDISP.INC < prev    next >
Text File  |  1992-07-16  |  9KB  |  238 lines

  1. function DisplayPort( WhichPort : Portindex ) : string;
  2. begin
  3.   if WhichPort = 0 then
  4.     DisplayPort := ' Port data not found!'
  5.   else
  6.     with space.ports.data[ WhichPort ] do
  7.       DisplayPort :=  ' F:' + str(amts[fuel], 5) + ' ' + str(usage[fuel],3) +
  8.                       '% O:' + str( amts[ organics], 5) + ' ' + str(usage[organics],3) +
  9.                       '% E:' + str( amts[ equipment ], 5 )+ ' ' + str(usage[equipment],3) + '%';
  10. end; {DisplayPort}
  11.  
  12. function DisplayNote( s : sector ) : string;
  13. { print the note associated with sector s }
  14. var
  15.   n : 0..MaxNote;
  16. begin
  17.   n := NoteNumber( s );
  18.   if n = 0 then
  19.     Displaynote := ' Missing note! '
  20.   else
  21.     Displaynote := ' ' + space.notes.data[n].info;
  22. end; {write note}
  23.  
  24. procedure DisplaySector( s : sector; whatIs : string; dist : integer;  
  25.                          ToFile : boolean; var TheFile : text);
  26. var
  27.   line : string;
  28. begin
  29.   with space.sectors[s] do
  30.     begin
  31.       line := 'Sctr:' + str( s, 3);
  32.       if dist <> Error then
  33.         line := line + WhatIs + str( dist, 2 );
  34.       if number = UnExplored then
  35.         if verbose then
  36.           line := line + ' Unexplored sector'
  37.         else
  38.           line := line + ' UEX';
  39.       if portType <> NotAPort then
  40.         begin
  41.           line := line + ' port ' + status( portType );
  42.           if portType <> Class0 then
  43.             line := line + DisplayPort( portnumber( s ) );
  44.         end; {if port}
  45.       if (etc and SpaceLane) <> Nothing then
  46.         if verbose then
  47.           line := line + ' space lane'
  48.         else
  49.           line := line + ' SL';
  50.       if (etc and StarDock) <> Nothing then
  51.         if verbose then
  52.           line := line + ' Star Dock'
  53.         else
  54.           line := line + ' SD';
  55.       if (etc and Avoid) <> Nothing then
  56.         if verbose then
  57.           line := line + ' avoid'
  58.         else
  59.           line := line + ' AV';
  60.       if (etc and HasFighters) <> Nothing then
  61.         if verbose then
  62.           line := line + ' has fighters'
  63.         else
  64.           line := line + ' F';
  65.       if (etc and NoteExists) <> Nothing then
  66.         line := line + DisplayNote( s );
  67.       if number = 1 then
  68.         if AppearanceCount(s) = 1 then
  69.           if verbose then
  70.             line := line + ' dead end (' + str(HowFar( s ),1) + ')'
  71.           else
  72.             line := line + ' DE(' + str(HowFar(s),1) + ')';
  73.       if (etc and Busted ) <> Nothing then
  74.         if verbose then
  75.           line := line + ' busted'
  76.         else
  77.           line := line + ' X';
  78.       writeln( line);
  79.       if ToFile then
  80.         writeln( TheFile, line );
  81.     end; {with}
  82. end; {DisplaySector}
  83.  
  84. function HasGoods( sales : PortSales ) : boolean;
  85. { return true if there are 365 equipment or 660 organics available for
  86.   robbing.  Basically, set return value to true and exit if it really is,
  87.   otherwise return false. }
  88. begin
  89.   HasGoods := true;
  90.   if sales.amts[ equipment ] > 365 then
  91.     exit
  92.   else if (sales.usage[ equipment ] > 0)  {blocked: guess no}
  93.        and (sales.amts[ equipment ] * (100 - sales.usage[ equipment ])
  94.            / sales.usage[ equipment ] >= 365) then
  95.     exit
  96.   else if sales.amts[ organics ] >= 660 then
  97.     exit
  98.   else if (sales.usage[ organics ] > 0) {blocked: best no}
  99.        and (sales.amts[ organics ] * (100 - sales.usage[ organics ])
  100.            / sales.usage[ organics ] >= 365) then
  101.     exit;
  102.   HasGoods := false;
  103. end; {hasGoods}
  104.  
  105. type
  106.   WhichStuff = (any, PortOnly, NoteOnly, UnExpOnly, FighterOnly, SpecPort,
  107.                 RobHolds, BuyEquipSellOrganic, BuyOrganicSellEquip );
  108.  
  109. procedure EliminateUnwanted( var distances   : distanceArray;
  110.                                  keepMe      : WhichStuff;
  111.                              var HowManyLeft : sectorIndex;
  112.                                  PortClass   : stuff );
  113. { Remove the sectors you don't want in the list by pushing them to the back}
  114. var
  115.   pindex : portIndex;
  116.   whichSector : sector;
  117.   keep : boolean;
  118. begin
  119.   HowManyLeft := 0;
  120.   for whichSector := 1 to MaxSector do
  121.     begin
  122.       case keepMe of
  123.         any : keep := distances[ whichSector ].d <> maxint;
  124.         PortOnly : keep := space.sectors[whichSector].porttype <> NotAPort;
  125.         NoteOnly : keep := space.sectors[whichSector].etc and NoteExists
  126.                            <> Nothing;
  127.         UnExpOnly: keep := (space.sectors[whichSector].number = UnExplored)
  128.                            and (distances[ whichSector ].d <> maxint);
  129.         FighterOnly : keep := (space.sectors[whichSector].etc and HasFighters)
  130.                            <> Nothing;
  131.         SpecPort : keep := space.sectors[whichSector].porttype = PortClass;
  132.         RobHolds : begin
  133.                      pindex := PortNumber( whichsector );
  134.                      if pindex = 0 then
  135.                        keep := false
  136.                      else
  137.                        keep :=  (space.ports.data[pindex].bustdate = 0)
  138.                             and HasGoods( space.ports.data[pindex] );
  139.                    end; {Robbing}
  140.         BuyEquipSellOrganic,
  141.         BuyOrganicSellEquip : begin
  142.                                 pindex := PortNumber( whichsector );
  143.                                 if pindex = 0 then
  144.                                   keep := false
  145.                                 else
  146.                                   if keepme = BuyOrganicSellEquip then
  147.                                     keep := space.sectors[WhichSector].porttype in [2, 3]
  148.                                   else
  149.                                     keep := space.sectors[WhichSector].porttype in [4, 5];
  150.                               end; {BE & SO or BO & SE}
  151.       end; {case}
  152.       if keep then
  153.         begin
  154.           HowManyLeft := HowManyLeft + 1;
  155.           distances[ howManyLeft ] := distances[ whichSector ];
  156.         end; {if}
  157.     end; {for}
  158.   write('Total of ', HowManyLeft );
  159.   case keepMe of
  160.     any      : writeln(' sectors from base sector');
  161.     PortOnly : writeln(' known ports');
  162.     NoteOnly : writeln(' sectors with notes');
  163.     UnExpOnly: writeln(' unexplored sectors with known position');
  164.     FighterOnly : writeln(' fighter clouds');
  165.     SpecPort : writeln(' ports of type ', status( PortClass ) );
  166.     RobHolds : writeln(' ports that can be robbed for holds');
  167.     BuyEquipSellOrganic : writeln(' ports buying equipment and selling organics.');
  168.     BuyOrganicSellEquip : writeln(' ports buying organic and selling equipment.');
  169.   end; {case}
  170. end; {EliminateUnwanted}
  171.  
  172. procedure FindSmallest( var distances : DistanceArray;
  173.                         lowest, highest : sector );
  174. { Examine the distance array from lowest to highest, and move the
  175. sector at smallest distance into the "lowest" slot. }
  176. var
  177.   temp     : dist;
  178.   s,
  179.   smallest : sector;
  180. begin
  181.   Smallest := lowest;
  182.   for s := lowest to highest do
  183.     if distances[ s ].d < distances[ smallest ].d then
  184.       smallest := s;
  185.   temp := distances[ smallest ];
  186.   distances[ smallest ] := distances[ lowest ];
  187.   distances[ lowest ] := temp;
  188. end; {FindSmallest}
  189.  
  190. procedure nearestStuff( Filter : WhichStuff; StuffType : stuff );
  191. var
  192.   Number : sectorIndex;
  193.   s, n : integer;
  194.   log  : boolean;
  195.   f    : text;
  196. begin
  197.   write('Stuff Nearby ');
  198.   if SetUpDistances then
  199.     begin
  200.       EliminateUnwanted( distances, filter, Number, StuffType );
  201.       log := prompt( 'Log to disk? ');
  202.       if log then
  203.         begin
  204.           assign( f, GetNewFileName('File name for report?  ', 'report.txt') );
  205.           rewrite( f );
  206.         end;
  207.       if Number <> 0 then
  208.         begin
  209.           for n := 1 to Number do
  210.             begin
  211.               FindSmallest( distances, n, Number );
  212.               DisplaySector( distances[ n ].s, ' Dist:', distances[n].d, log, f );
  213.               if n mod 20 = 0 then
  214.                 if not prompt( 'more? ') then
  215.                   begin
  216.                     if log then
  217.                       close( f );
  218.                       exit;
  219.                   end;
  220.             end; {for}
  221.         end; {if}
  222.       if log then
  223.         close( f );
  224.     end; {if}
  225. end; {nearport}
  226.  
  227. procedure SortPorts( var NumPorts : sectorindex );
  228. var
  229.   s, n : integer;
  230. begin
  231.   NumPorts := 0;
  232.   if SetUpDistances then
  233.     begin
  234.       EliminateUnwanted( distances, PortOnly, NumPorts, 0 );
  235.       writeln('Sorting...');
  236.       SortDistances( distances, NumPorts )
  237.     end; {if}
  238. end; {SortPorts}