Difference between revisions of "Starstat & Starinfo"

From Stars!wiki
Jump to: navigation, search
 
Line 4: Line 4:
 
*[[local:starinfo.zip|download starinfo.zip v1.0 86kb]]
 
*[[local:starinfo.zip|download starinfo.zip v1.0 86kb]]
 
*author:blprice
 
*author:blprice
[[Starstat & Starinfo]] are otherwise identical DOS and Windows programs, respectively, that report on various aspects of the Stars! gamefiles such as the version, the presence of multiple turns in a .m file etc. Both incorrectly, but consistently, report the Stars version for v1.1a(reports 1.2a), v2.0a(2.65), 2.6i(2.81j) and 2.6JRC4(2.83) game files.</onlyinclude>
+
[[Starstat & Starinfo]] are otherwise identical DOS and Windows programs, respectively, that report on various aspects of the Stars! gamefiles such as the version, the presence of multiple turns in a .m file etc. Both incorrectly, but consistently, report the Stars version for v1.1a(reports 1.2a), v2.0a(2.65), 2.6i(2.81j) and 2.6JRC4(2.83) game files.
 +
*[[Perl conversion of starstat utility by ricks03 - 30 Jan 2012]]
 +
</onlyinclude>
  
 
==Source Code==
 
==Source Code==

Latest revision as of 05:00, 18 May 2012

Starstat & Starinfo are otherwise identical DOS and Windows programs, respectively, that report on various aspects of the Stars! gamefiles such as the version, the presence of multiple turns in a .m file etc. Both incorrectly, but consistently, report the Stars version for v1.1a(reports 1.2a), v2.0a(2.65), 2.6i(2.81j) and 2.6JRC4(2.83) game files.


Source Code

I have no idea whether this source code applies to the download available (and authored by Hilton Lange?) however...

On R.G.C.S at Feb 8 2003, 8:04 am James McGuigan wrote:[1]

... a copy of starstat.c which is the code the Jeffs used to encode the .xy file ...
starstat.c <file start> 
---------------------------------------------------------------------- 
#include <stdio.h> 
#include <ctype.h> 
#include <string.h> 
#define dtXY   0 
#define dtLog  1 
#define dtHost 2 
#define dtTurn 3 
#define dtHist 4 
#define dtRace 5 
#define dtMax  6 
#define rtBOF  8  // Begining Of File Record Type 
typedef struct _rtbof 
{ 
   char rgid[4];       // Magic number: "J3J3" 
   long lidGame;        // Game ID 
   unsigned short verInc   : 5,    // 1.04c 
                  verMinor : 7,    // 1.04 
                  verMajor : 4;    // 1.00 
   unsigned short turn; 
   short iPlayer:5, 
         lSaltTime:11;  // Encryption salt 
   unsigned short dt         : 8, // File type dtXY, dtHost, dtLog, dtHist etc. 
                  fDone      : 1, // Player has submitted this turn (dtLog only). 
                  fInUse     : 1, // Host instance is using this file (dtHost, dtTurn). 
                  fMulti     : 1, // Multiple turns in this file (dtTurn only). 
                  fGameOver  : 1, // A winner has been declared 
                  fShareware : 1, // The shareware version 
                  unused     : 3; 
} RTBOF; 

typedef struct _hdr 
{ 
   unsigned short cb : 10,  // Size of the record in bytes not counting this header. 
                  rt :  6;  // Record Type (rtBOF etc) 
} HDR; 

char *szMagic = "J3J3"; 
char *rgszdt[7] = { "Universe Definition File", "Player Log File", "Host File", "Player Turn File", 
                     "Player History File", "Race Definition File", "Unknown File" }; 
int main(int argc, char *argv[]) 
{ 
   FILE *in; 
   short w; 
   HDR hdr; 
   RTBOF rtbof; 
   if(argc < 2) 
     { 
     fprintf(stderr, "StarStat filename\n\tDisplays status information about a Stars! game file.\n"); 
     return 1; 
     } 
   in = fopen(argv[1], "rb"); 
   if(!in) 
     { 
     fprintf(stderr, "StarStat: Unable to open '%s' for reading.\n", argv[1]); 
     return 2; 
     } 
   if (fread(&hdr, 1, sizeof(HDR), in) != sizeof(HDR) || hdr.rt != rtBOF 
              || hdr.cb < sizeof(RTBOF) || fread(&rtbof, 1, sizeof(RTBOF), in) != sizeof(RTBOF) 
              || strncmp(szMagic, &rtbof.rgid[0], 4) || rtbof.dt >= dtMax) 
     { 
     fprintf(stderr, "StarStat: %s does not appear to be a Stars! file.\n", argv[1]); 
     fclose(in); 
     return 3; 
     } 
   printf("Stars! Version: %d.%02d%c ", rtbof.verMajor, 
                 rtbof.verMinor, !rtbof.verInc ? ' ' : ('a' - 1 + rtbof.verInc)); 
   printf("%s", rgszdt[rtbof.dt]); 
   if (rtbof.fInUse) 
     printf(" (In Use)"); 
   printf("\n"); 
   printf("Unique Game Id Number: %08lx\n", (unsigned long) rtbof.lidGame); 
   switch (rtbof.dt) 
     { 
   case dtLog: 
   case dtHost: 
   case dtTurn: 
     printf("Game Year: %u", rtbof.turn+2400); 
     if (rtbof.dt == dtTurn && rtbof.fMulti) 
       { 
       fseek(in, -2, SEEK_END); 
       fread(&w, 1, 2, in); 
       printf(" to %u", w + 2400); 
       } 
     if (rtbof.fGameOver) 
       printf(" - Game Over"); 
     printf("\n"); 
     if (rtbof.iPlayer != -1) 
       { 
       printf("Player: %d", rtbof.iPlayer+1); 
       if (rtbof.fShareware) 
         printf(" - Shareware"); 
       if (rtbof.dt == dtLog && rtbof.fDone) 
         printf(" - Submitted"); 
       printf("\n"); 
       } 
     break; 
     } 
   fclose(in); 
   return 0; 
} 

---------------------------------------------------------------------- 
starstat.c <file end>