home *** CD-ROM | disk | FTP | other *** search
/ Game Killer / Game_Killer.bin / 102.GSDATA.INC < prev    next >
Text File  |  1992-07-23  |  11KB  |  377 lines

  1. {GSDATA.INC}
  2. const
  3.   SectorFieldMarker = 'Sector data starts here...';
  4.   
  5. procedure writeSectors( var g : text; var ss : SectorArray );
  6. var
  7.   s : sector;
  8.   i : 0..maxWarps;
  9. begin
  10.   writeln( g, SectorFieldMarker);
  11.   for s := 1 to maxSector do
  12.     with ss[s] do
  13.       if (number <> Unexplored) or (PortType <> NotAPort) or (etc <> Nothing) then
  14.       begin
  15.         write( g, s : 5, number:3 );
  16.         for i := 1 to number do
  17.           write( g, data[i] : 5);
  18.         write( g, portType : 3 );
  19.         write( g, etc : 6 );
  20.         writeln( g );
  21.       end; {for if}
  22. end; {writeSectors}
  23.  
  24. procedure WriteDock( var g : text; d : integer );
  25. begin
  26.   writeln( g, 'SpaceDock is ', d : 5 );
  27. end;
  28.  
  29. procedure WriteNotes( var g : text; var n : NoteList );
  30. var
  31.   i : 1..MaxNote;
  32. begin
  33.   writeln( g, n.top, '  <- number of notes' );
  34.   if n.top > 0 then
  35.     for i := 1 to n.top do
  36.       writeln( g, n.data[ i ].reference : 5, ' ', n.data[i].info );
  37. end; {WriteNotes}
  38.  
  39. function portOrdering( first, second : portsales; which : portfield ) : boolean;
  40. begin
  41.   case which of
  42.     location : portordering := first.where > second.where;
  43.     bust     : portordering := first.bustdate > second.bustdate;
  44.   end; {case}
  45. end;
  46.  
  47.  
  48. procedure sortPortRecs( var Ports : portlist; ordering : portfield );
  49. { sort the port record, based upon one of its fields.  Note that the port
  50.   records are a list, and independent of ordering.  For storage, it might
  51.   be convenient to sort on "where" (=field location) and for display it
  52.   might be convenient to sort on "bustdate" (=field bust) }
  53. var
  54.  j, k     : portIndex;
  55.  temp     : portsales;
  56.  smaller  : boolean;
  57.  
  58. begin {insertion best choice here, since often already nearly sorted }
  59.   for k := ports.top downto 1 do
  60.     begin
  61.       j := k + 1;
  62.       temp := ports.data[k];
  63.       while (j < ports.top + 1) and portordering( temp, ports.data[j], ordering) do
  64.         begin
  65.           ports.data[j-1] := ports.data[j];
  66.           j := j + 1;
  67.         end; {while}
  68.       ports.data[ j-1 ] := temp;
  69.     end; {for k}
  70. end; {sortPorts}
  71.  
  72. procedure WritePorts( var g : text; var p : PortList );
  73. var
  74.   i : 1..MaxPorts;
  75. begin
  76.   writeln( g, p.top, '  <- number of Port Infos' );
  77.   SortPortRecs( p, location );
  78.   if p.top > 0 then
  79.     for i := 1 to p.top do
  80.       with p.data[i] do
  81.         writeln( g, where : 5, amts[ Fuel ] : 8, amts[ Organics ] : 8, 
  82.                  amts[ Equipment ] : 8, usage[ Fuel ] : 4,
  83.                  usage[ Organics ] : 4, usage[ Equipment ] : 4, ' ',
  84.                  change[ Fuel ] : 5, ' ', change[ Organics ] : 5,
  85.                  ' ', change[ Equipment ] : 5, ' ', bustdate );
  86. end; {WritePorts}
  87.  
  88. const
  89.  DataFileIdentifier = '::Tradewars Data file::';
  90.  
  91. procedure SaveData( var g : text; var Space : TheVoid );
  92. begin
  93.   writeln(g, DataFileIdentifier );
  94.   writeDock( g, Space.dock );
  95.   writeNotes( g, Space.notes );
  96.   writePorts( g, space.ports );
  97.   writeSectors( g, space.sectors );
  98.   close( g );
  99. end; {SaveData}
  100.  
  101. procedure InitSectors( var s : SectorArray );
  102. var
  103.   r : sector;
  104. begin
  105.   for r := 1 to maxSector do
  106.     with s[r] do
  107.       begin
  108.         number  := UnExplored;
  109.         portType:= NotAPort;
  110.         etc     := Nothing;
  111.       end; {for with}
  112. end; {Init Sectors}
  113.  
  114.  
  115. function bval( line : string; var n : integer) : boolean;
  116. { convert  nonnegative numeric value at front of line into n; return whether
  117. conversion was successful. }
  118. var
  119.   i : integer;
  120.   error : boolean;
  121.  
  122. begin
  123.   i := 1;
  124.   n := 0;
  125.   Error := true;
  126.   while ( i <= length( line ) ) do
  127.     if line[i] = ' ' then
  128.       i := i + 1
  129.     else if line[ i ] in ['0'..'9'] then
  130.       begin
  131.         Error := false;
  132.         n := 10 * n + ord( line[ i ] ) - ord('0');
  133.         i := i + 1;
  134.       end
  135.     else
  136.       i := length( line ) + 1;
  137.   bval := error;
  138. end;
  139.  
  140. procedure InitPorts( var p : portList );
  141. const
  142.   emptyg  : goodsArray = ( 0, 0, 0 );
  143.   emptyp  : percentarray = ( 0, 0, 0 );
  144. var
  145.   i : portIndex;
  146. begin
  147.   p.top := 0;
  148.   for i := 1 to MaxPorts do
  149.     with p.data[i] do
  150.       begin
  151.         where := 1;
  152.         amts := emptyg;
  153.         usage := emptyp;
  154.         change := emptyg;
  155.         bustdate := 0;
  156.       end;
  157. end;
  158.  
  159. procedure InitSpace( var s : TheVoid );
  160. begin
  161.   s.dock  := 0;
  162.   s.notes.top := 0;
  163.   InitPorts( s.ports );
  164.   InitSectors( s.sectors );
  165. end;
  166.  
  167. procedure ReadSectors( var h : text; var ss : SectorArray );
  168. var
  169.   r : sector;
  170.   i : 0..maxSector;
  171.   temp,
  172.   etccount,
  173.   portcount,
  174.   sectorcount :integer;
  175.   line : string;
  176. begin
  177.   portcount := 0; sectorcount := 0; etccount := 0;
  178.   readln( h, line);   { "Sector data starts here..." }
  179.   if line <> SectorFieldMarker then
  180.     writeln('Sector data missing?  Found ', line )
  181.   else
  182.     while not eof( h ) do
  183.       begin
  184.         read( h, r );
  185.         sectorcount := sectorcount + 1;
  186.         with ss[r] do
  187.           begin
  188.             read( h, number );
  189.             for i := 1 to number do
  190.               begin
  191.                 read( h, temp );
  192.                 if (temp >= 1) and (temp <= maxSector) then
  193.                   data[ i ] := temp
  194.                 else
  195.                   writeln('bad data for sector ', r);
  196.               end; {for}
  197.             read( h, temp );
  198.             if temp <> NotAPort then
  199.               PortType := temp;
  200.             if PortType <> NotAPort then
  201.               portcount := portcount + 1;
  202.             read( h, temp );
  203.             etc := etc or temp;
  204.             if etc <> Nothing then
  205.               etccount := etccount + 1;
  206.           end; {with}
  207.         readln( h );
  208.       end; {while}
  209.   writeln('Finished reading ', sectorcount, ' sectors, ',
  210.            portcount, ' ports, ', etccount, ' etc.');
  211. end; {ReadSectors}
  212.  
  213. procedure ReadDock( var f : text; var d : SectorIndex );
  214. begin
  215.   if d = 0 then
  216.     begin
  217.       skip( f, 12);    { "SpaceDock is" }
  218.       readln( f, d );
  219.       if d = 0 then
  220.         writeln('Space Dock location unknown')
  221.       else
  222.         writeln('Space Dock location ', d );
  223.     end
  224.   else  {already known, just skip line}
  225.     readln( f );
  226. end; {ReadDock}
  227.  
  228. procedure ReadNotes( var f : text; var sn : NoteList );
  229. var
  230.   NoteIndex,
  231.   i : 0..MaxNote;
  232.   more,
  233.   j : integer;
  234.   n : string;
  235. begin
  236.   readln( f, more );
  237.   if more > 0 then
  238.     for i := 1 to more do
  239.       begin
  240.         readln( f, n );
  241.         if not bval( copy( n, 1, 5 ), j ) then
  242.           begin
  243.             NoteIndex := NoteNumber( j );         { is this note new? }
  244.             if NoteIndex = 0 then                 { yes, so add to    }
  245.               if sn.top = MaxNote then
  246.                 writeln('Too many notes.  Can''t record information')
  247.               else
  248.                 begin                             { # notes, and work }
  249.                   sn.top := sn.top + 1;           { with that entry   }
  250.                   NoteIndex := sn.top;
  251.                 end; {if}
  252.             with sn.data[ NoteIndex ] do          { then store it     }
  253.               begin
  254.                 reference := j;
  255.                 info := copy( n, 7, NoteSize);
  256.               end {with}
  257.           end {if}
  258.         else
  259.           writeln('Error with note ', n );
  260.       end; {for}
  261.   writeln('Info for ', sn.top, ' notes ');
  262. end; {ReadNotes}
  263.  
  264. procedure ReadPorts( var f : text; var sp : PortList );
  265. const
  266.   debug = false;
  267. var
  268.   p, i : 0..MaxPorts;
  269.   location : sector;
  270.   more : integer;
  271. begin
  272.   readln( f, more );
  273.   if debug then write('Should get ', more, ' ports.');
  274.   if debug then writeln('Top currently ', sp.top );
  275.   if more > 0 then
  276.     for i := 1 to more do
  277.       begin
  278.         read( f, location );
  279.         p := portnumber( location );
  280.         if debug then write( location : 5, ' to ', p : 3 );
  281.         if p = 0 then
  282.           begin
  283.             sp.top := sp.top + 1;
  284.             p := sp.top;
  285.             if debug then write (' => ', p : 3, ' ');
  286.           end; {if}
  287.         sp.data[p].where := location;
  288.         with sp.data[ p ] do
  289.           begin
  290.             read( f, amts[ Fuel ], amts[ Organics ], amts[ Equipment ]);
  291.             if not eoln( f ) then
  292.                read( f, usage[Fuel], usage[Organics], usage[Equipment] )
  293.             else
  294.               begin
  295.                 usage[fuel] := 0;
  296.                 usage[organics] := 0;
  297.                 usage[equipment] := 0;
  298.               end;
  299.             if not eoln( f ) then
  300.               read( f, change[Fuel], change[Organics], change[Equipment] )
  301.             else
  302.               begin
  303.                 change[Fuel] := amts[Fuel];
  304.                 change[Organics] := amts[Organics];
  305.                 change[Equipment] := amts[Equipment];
  306.               end;
  307.             if not eoln( f ) then
  308.               read( f, bustdate )
  309.             else
  310.               bustdate := 0;
  311.             readln( f );
  312.           end; {with}
  313.       end; {if for}
  314.   writeln('Info for ', sp.top, ' ports');
  315. end; {ReadPorts}
  316.  
  317. procedure GetData( var space : TheVoid; var name : string; Convert : boolean );
  318. var
  319.   userhappy : boolean;
  320.   h : text;
  321.   line,
  322.   filename : string;
  323. begin
  324.   if name = '' then
  325.     begin
  326.       if not convert then
  327.         writeln('Hit carriage return to abort.');
  328.       write('Name of data file?  ');
  329.       readln( filename );
  330.     end {if}
  331.   else
  332.     filename := name;
  333.   if (filename = '') then
  334.     if not convert then
  335.       halt
  336.     else
  337.       begin
  338.         writeln('Initializing with empty space.');
  339.         exit;
  340.       end;
  341.   userHappy := false;
  342.   repeat
  343.     assign( h, filename );
  344.   {$I-}
  345.     reset( h );
  346.   {$I+}
  347.     if ioresult = 0 then           { file exists, so read it }
  348.       begin
  349.         userhappy := true;
  350.         readln( h, line );
  351.         if line <> DataFileIdentifier then
  352.           begin
  353.             writeln('This is not a trade wars database file!');
  354.             writeln('If you are generating a file for the first time, don''t');
  355.             writeln('read in the CIM reports, hit return for the database name.');
  356.             halt;
  357.           end; {Error}
  358.         ReadDock( h, Space.dock );
  359.         ReadNotes( h, Space.notes );
  360.         ReadPorts( h, space.ports );
  361.         ReadSectors( h, space.sectors );
  362.         close( h );
  363.       end; {if}
  364.     if pos( '.', filename) <> 0 then
  365.       name := copy( filename, 1, pos( '.', filename) - 1 )
  366.     else
  367.       name := '';
  368.     if not UserHappy then
  369.       begin
  370.         writeln('Couldn'' find the file ', filename, '.');
  371.         writeln('Hit return to confirm creation of a new database, or');
  372.         writeln('type name of database to use: ');
  373.         readln( filename );
  374.         userHappy := filename = '';
  375.       end;
  376.   until UserHappy;
  377. end; {GetData}