home *** CD-ROM | disk | FTP | other *** search
/ Game Killer / Game_Killer.bin / 105.MISC.INC < prev    next >
Text File  |  1992-07-19  |  10KB  |  415 lines

  1. function upstring( s : string ) : string;
  2. { return string in all uppercase }
  3. var
  4.   i : byte;
  5. begin
  6.   for i := 1 to length( s ) do
  7.     s[i] := upcase( s[i] );
  8.   upstring := s;
  9. end; {upstring}
  10.  
  11. function str( n : integer; width : integer ) : string;
  12. { convert integer to string }
  13. var
  14.   negative : boolean;
  15.   s : string;
  16. begin
  17.   if n = 0 then
  18.     s := '0'
  19.   else
  20.     begin
  21.       negative := false;
  22.       s := '';
  23.       if n < 0 then
  24.         begin
  25.           negative := true;
  26.           n := -n;
  27.         end;
  28.       while n > 0 do
  29.         begin
  30.           s := chr( n mod 10 + ord('0') ) + s;
  31.           n := n div 10;
  32.         end; {while}
  33.       if negative then
  34.         s := '-'+s;
  35.     end; {else}
  36.   while length(s) < width do
  37.     if odd( length(s) ) then
  38.       s := s + ' '
  39.     else
  40.       s := ' ' + s;
  41.   str := s;
  42. end; {str}
  43.  
  44. function die( size : integer ) : integer;
  45. begin
  46.   die := random( size )  + 1;
  47. end;
  48.  
  49. function prompt( p : string ) : boolean;
  50. { returns true if they say yes }
  51. var
  52.   ch : string;
  53. begin
  54.   write(p);
  55.   readln( ch );
  56.   prompt := (ch = '') or (ch[1] in ['Y','y']);
  57. end; {again}
  58.  
  59. function BackupString( s : string ) : string;
  60. { given a filename, create an appropriate backup }
  61. var
  62.   i : integer;
  63.   ext : string;
  64. begin
  65.   i := pos( '.', s);
  66.   if i = 0 then
  67.     BackupString := s + '.bak'
  68.   else
  69.     begin
  70.       ext := copy( s, i + 1, 3 );
  71.       ext[1] := upcase( ext[1] );
  72.       ext[2] := upcase( ext[2] );
  73.       ext[3] := upcase( ext[3] );
  74.       if ext = 'BAK' then
  75.         BackupString := copy( s, 1, i ) + 'bar'
  76.       else
  77.         BackupString := copy( s, 1, i ) + 'bak';
  78.     end; {else}
  79. end;
  80.  
  81. procedure MakeBackup( fname : string );
  82. { copy current to backup, erasing backup if needed. }
  83. var
  84.   f : text;
  85.   bname : string;
  86. begin
  87.   bname := backupstring( fname );
  88.   assign( f, bname );
  89. {$I-}
  90.   reset( f );
  91. {$I+}
  92.   if IOResult = 0 then
  93.     begin
  94.       close( f );
  95.       erase( f );
  96.     end;
  97.   assign( f, fname );
  98.   rename( f, bname );
  99. end; {MakeBackup}
  100.  
  101. function GetNewFileName( promptstring : string; default : string ) : string;
  102. { Get a valid filename.  Warn if clobbering existing file. }
  103. var
  104.   filename : string;
  105.   g        : text;
  106.   errorcode: integer;
  107.  begin
  108.   repeat
  109.     write( promptstring, '[', default, ']  ' );
  110.     readln( filename );
  111.     if filename = '' then
  112.       if default = abort then
  113.         halt
  114.       else
  115.         filename := default;
  116.     if filename = abort then
  117.       halt;
  118.     assign( g, filename );
  119.     {$I-}
  120.     reset( g );
  121.     {$I+}
  122.     errorCode := ioResult;
  123.     if errorCode = 0 then 
  124.       begin
  125.         close( g );
  126.         write('File already exists! ');
  127.         if prompt('Backup? ') then
  128.           begin
  129.             MakeBackup( filename );
  130.             errorcode := FileNotFound;
  131.           end
  132.         else if prompt('Overwrite? ') then
  133.           errorcode := FileNotFound;
  134.       end; {if}
  135.   until errorcode = FileNotFound;
  136.   GetNewFilename := filename;
  137. end; {GetNewFilename}
  138.  
  139. function GetOldFileName( promptstring : string; default : string ) : string;
  140. var
  141.   filename : string;
  142.   f        : text;
  143.   errorcode: integer;
  144. begin
  145.   repeat
  146.     write( promptstring, '[', default, ']  ' );
  147.     readln( filename );
  148.     if filename = '' then
  149.       if default = abort then
  150.         halt
  151.       else
  152.         filename := default;
  153.     if filename = abort then
  154.       halt;
  155.     assign( f, filename );
  156.     {$I-}
  157.     reset( f );
  158.     {$I+}
  159.     errorCode := ioResult;
  160.     if errorcode = 0 then
  161.       close( f )
  162.     else
  163.       writeln('Error ', errorCode, ' opening file!');
  164.   until errorCode = 0;
  165.   GetOldFileName := filename;
  166. end; {GetOldFileName}
  167.  
  168. function min( a, b : integer ) : integer;
  169. begin
  170.   if a > b then
  171.     min := b
  172.   else
  173.     min := a;
  174. end;
  175.  
  176. function minreal( a, b : real ) : real;
  177. begin
  178.   if a > b then
  179.     minreal := b
  180.   else
  181.     minreal := a;
  182. end; {minreal}
  183.  
  184. function IsWarp( from, OverTo : sector ) : boolean;
  185. { true if you can go from from to OverTo in one step }
  186. var
  187.   t : warpIndex;
  188. begin
  189.   IsWarp := false;
  190.   if space.sectors[ from ].number <> UnExplored then
  191.     for t := 1 to space.sectors[ from ].number do
  192.       if space.sectors[ from ].data[t] = OverTo then
  193.         IsWarp := true;
  194. end; {IsWarp}
  195.  
  196. function GetSector : SectorIndex;
  197. var
  198.   l : string;
  199.   s, err : integer;
  200. begin
  201.   repeat
  202.     write('Sector? [0 to abort]  ');
  203.     readln( l );
  204.     if l = '' then
  205.       begin
  206.         s := 0;
  207.         err := 0;
  208.       end
  209.     else
  210.       val( l, s, err);
  211.   until (err=0) and (s>=0) and (s<=MaxSector);
  212.   GetSector := s;
  213. end; {GetSector}
  214.  
  215. function LogToDisk( var f : text; message : string; default : string ) : boolean;
  216. var
  217.   filename : string;
  218.   ch       : char;
  219. begin
  220.   if not prompt( message ) then
  221.     LogToDisk := false
  222.   else
  223.     begin
  224.       LogToDisk := true;
  225.       assign( f, GetNewFilename( 'Log file? ', default) );
  226.       rewrite( f );
  227.     end; {else}
  228. end; {LogToDisk}
  229.  
  230. function upcase( ch : char ) : char;
  231. { if letter in 'a'..'z' give upper case equivalent }
  232. begin
  233.   if ch in ['a'..'z'] then
  234.     upcase := chr( ord( ch ) - ord('a') + ord('A') )
  235.   else
  236.     upcase := ch;
  237. end; {upcase}
  238.  
  239. function appearanceCount ( base : sector ) : integer;
  240. { returns number of sectors that warp into base sector }
  241. var
  242.   s : sector;
  243.   count : integer;
  244.   i : warpIndex;
  245. begin
  246.   count := 0;
  247.   for s := 1 to maxSector do
  248.     with space.sectors[s] do
  249.       for i := 1 to number do
  250.         if data[i] = base then
  251.           count := count + 1;
  252.   appearanceCount := count;
  253. end;
  254.  
  255. function HowFar( base : sector ) : integer;
  256. { return length of path leaving base sector }
  257. var
  258.   previous, current, NextUp : sector;
  259.   len : integer;
  260. begin
  261.   previous := base;
  262.   current := space.sectors[base].data[1];
  263.   len := 1;
  264.   while (space.sectors[current].number = 2) do
  265.     begin
  266.       NextUp := space.sectors[current].data[1];
  267.       if NextUp = previous then
  268.         NextUp := space.sectors[current].data[2];
  269.       previous := current;
  270.       current := nextUp;
  271.       len := len + 1;
  272.     end; {while}
  273.   HowFar := len;
  274. end;
  275.  
  276. procedure skip( var f : text; n : integer);
  277. var
  278.   ch : char;
  279. begin
  280.   for n := 1 to n do
  281.     read( f, ch );
  282. end; {skip}
  283.  
  284. function ReadNumber( var f : text) : integer;
  285. { Read the next number from text file f.  If there is no next number,
  286. return 0.}
  287. var
  288.   number : integer;
  289.   ch : char;
  290.   i  : integer;
  291. begin
  292.   number := 0;
  293.   if not eof( f ) then
  294.     begin
  295.       read( f, ch );
  296.       while (ch <= ' ') and (not eof(f)) do begin read( f, ch ); end;
  297.       repeat
  298.         if ch in ['0'..'9'] then
  299.           number := number * 10 + ord( ch ) - ord( '0' );
  300.         if not eof( f ) then
  301.           begin read( f, ch ); end
  302.         else
  303.           ch := #26;
  304.       until (not (ch in ['0'..'9']));
  305.       if ch = '[' then     {hit [PAUSE]^h^h^h^h^h^h^h}
  306.         skip( f, 32 );
  307.     end;
  308.   ReadNumber := number;
  309. end;
  310.  
  311. function ReadNumberFromTerminal : integer;
  312. { read a number from the keyboard, with error checking.  Return 0 if bad. }
  313. const
  314.   return = #13;
  315. var
  316.   number : integer;
  317.   ch     : char;
  318. begin
  319.   number := 0;
  320.   if not eof then
  321.     begin
  322.       read( ch );
  323.       if ch = #13 then
  324.         readln;
  325.       while (ch <= ' ') and (not eoln) do read( ch );
  326.       while ch in ['0'..'9'] do
  327.         begin
  328.           if ch in ['0'..'9'] then
  329.             number := number * 10 + ord( ch ) - ord( '0' );
  330.           read( ch );
  331.         end;
  332.     end;
  333.   if ch = return then  { clear crlf }
  334.     read( ch );
  335.   ReadNumberFromTerminal := number;
  336. end;
  337.  
  338. function PortNumber( s : sector ) : PortIndex;
  339. { return the entry into the list of ports corresponding to port s;
  340.   return 0 if port not found. }
  341. var
  342.   i : portptr;
  343. begin
  344.   PortNumber := 0;
  345.   if space.Ports.top > 0 then
  346.     for i := 1 to space.Ports.top do
  347.       if space.Ports.data[ i ].where = s then
  348.         PortNumber := i;
  349. end; {PortNumber}
  350.  
  351. function NoteNumber( s : sectorIndex ) : integer;
  352. { return the entry into the list of notes corresponding to sector s;
  353.   return 0 if note not found. }
  354. var
  355.   i : 0..MaxNote;
  356. begin
  357.   NoteNumber := 0;
  358.   if space.Ports.top > 0 then
  359.     for i := 1 to space.Notes.top do
  360.       if space.notes.data[ i ].reference = s then
  361.         NoteNumber := i;
  362. end; {PortNumber}
  363.  
  364. function GetPortType : stuff;
  365. var
  366.   pt : integer;
  367.   ch : char;
  368. begin
  369.   repeat
  370.     writeln('Describe this port:');
  371.     writeln(' 0 : BBB Buy all products');
  372.     writeln(' 1 : SBB Sell Fuel Ore; buy Organics and Equipment');
  373.     writeln(' 2 : BSB Sell Organics; buy Fuel Ore and Equipment');
  374.     writeln(' 3 : SSB Sell Fuel Ore and Organics; buy Equipment');
  375.     writeln(' 4 : BBS Sell Equipment; buy Fuel Ore and Organics');
  376.     writeln(' 5 : SBS Sell Equipment and Fuel Ore; buy Organics');
  377.     writeln(' 6 : BSS Sell Equipment and Organics; buy Fuel Ore');
  378.     writeln(' 7 : SSS Sell all products');
  379.     writeln(' 8 : Sell fighter, shields, holds (Class 0)');
  380.     writeln;
  381.     write('Port description? ');
  382.     pt := readNumberFromTerminal;
  383.   until (0<=pt) and (pt <= 8);
  384.   GetPortType := pt;
  385. end; {Get Port Type}
  386.  
  387. function LeapYear( y : integer ) : boolean;
  388. begin
  389.   LeapYear := (y mod 4 = 0) and (y mod 1000 <> 0);
  390. end;
  391.  
  392. function DateWord : word;
  393. const
  394.   months : array [1..12] of integer
  395.          = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
  396.   BaseYear = 1992;
  397. var
  398.   i : integer;
  399.   currDate : word;
  400.   y, m, d, dow : word;
  401. begin
  402.   GetDate(y, m, d, dow );
  403.   currDate := 0;
  404.   for i := baseYear to y-1 do
  405.     if LeapYear( i ) then
  406.       currDate := currDate + 366
  407.     else
  408.       currDate := currDate + 365;
  409.   if LeapYear( y ) then                      { feb has 29 days }
  410.     months[2] := 29;
  411.   for i := 1 to m-1 do
  412.     currDate := currDate + months[i];
  413.   DateWord := currDate + d;
  414. end;
  415.