Improvements to the testing machinery, including the replay option.
authorEric S. Raymond <esr@thyrsus.com>
Tue, 19 Sep 2006 08:05:42 +0000 (08:05 +0000)
committerEric S. Raymond <esr@thyrsus.com>
Tue, 19 Sep 2006 08:05:42 +0000 (08:05 +0000)
TODO
doc/sst-doc.xml
doc/sst.xml
src/events.c
src/io.c
src/sst.c
src/sst.h

diff --git a/TODO b/TODO
index 893194ada70a526b0d0004669b46b4ee75ac46d3..57dd6046e447c6f143c8f15eb17f857007defc73 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,5 +1,72 @@
                Super Star Trek TO-DO list
 
+Bugs:
+
+-----------------------------------------------------------------------------
+     Short-range scan
+    1 2 3 4 5 6 7 8 9 10
+ 1  E . . . . . . . . . Stardate      3800.9, Time Left 6.14
+ 2  . . . . . . . . . C Condition     RED, 0 DAMAGES
+ 3  . @ . * . . . . . . Position      1 - 3 , 1 - 1
+ 4  . . . . . . . . . . Life Support  ACTIVE
+ 5  . . . . . . . . . . Warp Factor   5.0
+ 6  . . . . . . . . . . Energy        3871.68
+ 7  . . . . * . . . . . Torpedoes     10
+ 8  . . . . . . . . . . Shields       UP, 92% 2294.3 units
+ 9  . . . . . . R . . . Klingons Left 8
+10  . . . . . . * . . . Major system  Capella IV (Kohath)
+
+
+COMMAND> phot 2
+Target sector for torpedo number 1- 2 10
+Target sector for torpedo number 2- 2 10
+
+***Commander at Sector 2 - 10 damaged-- displaced by blast to Sector 3 - 10
+
+
+***Commander at Sector 2 - 10 destroyed.
+=== ATTACK!
+
+***TORPEDO INCOMING From Unknown?? at Sector 3 - 10
+
+Torpedo missed.
+-----------------------------------------------------------------------------
+
+Here's the log that reproduces it
+
+-----------------------------------------------------------------------------
+seed 1158606492
+sr
+phasers
+auto
+391
+sensors
+planets
+lr
+chart
+probe
+y
+n
+a
+1 8
+shields up
+sr
+m a 10 10
+
+chart
+m a 1 3 1 1
+
+n
+chart
+sr
+phot 2
+2 10
+2 10
+-----------------------------------------------------------------------------
+
+The bug is the 'Unknown??' in the incoming-torpedo message.  What
+happened here is that the Commander launched a torp just before being
+killed.  The torpedo knows its origin but not who fired it.
 
 Short-term items:
 
index 3e47deec2c4425950eb8513970d6c9193c63c2c4..7cd86dba356ac3ffa7ae086ab0362e8a6081b2db 100644 (file)
@@ -1440,6 +1440,11 @@ inform you how long the base under attack can last.  Since the
 <quote>Super-Commander</quote> is more powerful than an ordinary
 commander, he can destroy a base more quickly.</para>
 
+<para>Inhabited worlds can be attacked, enslaved, and forced to 
+build more Klingon starships.  They will send out a distress call
+by subspace radio when they are attacked, and you will lose contact
+with them when they are enslaved.</para>
+
 <para>The <quote>Super-Commander</quote> travels around the galaxy at
 a speed of about warp 6 or 7.  His movement is strictly time based;
 the more time passes, the further he can go.</para>
@@ -1507,11 +1512,12 @@ the game, your kill rate is based on a minimum of 5 stardates.</para>
 <para>You lose&mdash;</para>
 
 <orderedlist>
+<listitem><para>300 points for each inhabited world you destroy,</para></listitem>
 <listitem><para>200 points if you get yourself killed,</para></listitem>
 <listitem><para>100 points for each starbase you destroy,</para></listitem>
 <listitem><para>100 points for each starship you lose,</para></listitem>
 <listitem><para>45 points for each time you had to call for help,</para></listitem>
-<listitem><para>10 points for each planet you destroyed,</para></listitem>
+<listitem><para>10 points for each uninhabited planet you destroyed,</para></listitem>
 <listitem><para>5 points for each star you destroyed, and</para></listitem>
 <listitem><para>1 point for each casualty you incurred.</para></listitem>
 </orderedlist>
index 5a5658446623d94d22585d774855069c1e46a56f..a1ab4b667939e348cdc34a35012c4b6484a8c65e 100644 (file)
 
 <cmdsynopsis>
 <command>sst</command>
-<arg choice='opt'>-t </arg> 
-<arg rep='repeat' ><replaceable>command</replaceable></arg>  
+      <arg choice='opt'>-r <replaceable>filename</replaceable></arg> 
+      <arg choice='opt'>-t </arg> 
+      <arg choice='opt'>-x </arg> 
+      <arg rep='repeat' ><replaceable>command</replaceable></arg>  
 </cmdsynopsis>
 
 </refsynopsisdiv>
@@ -38,10 +40,17 @@ url='http://sst.berlios.de/sst-doc.html'>browseable</ulink>.  On
 systems where <filename>/usr/share/doc/sst/</filename> is a legal
 filename, it will probably be installed there as well.</para>
 
-<para>There is one option -t, which forces the original pure-tty mode.
+<para>The option -t forces the original pure-tty mode.
 Normally sst tries to come up in full-screen mode that assumes it is
 running on a cursor-addressable terminal or terminal emulator.</para>
 
+<para>The option -r sets up replay of a session logfile.  Commands
+in the logfile are executed, then additional commands are taken
+from stdin as normal.  The -r option forces -t mode.</para>
+
+<para>The option -x enables some debugging features of interest
+probably only to sst2k developers.</para>
+
 <para>Input tokens for the setup prompts will be read from the
 remainder of the command line before standard input.  Thus, for
 example, you can invoke the program as</para>
@@ -54,11 +63,34 @@ sst regular medium good fancy
 mode (all features enabled).</para>
 </refsect1>
 
+<refsect1 id='files'><title>FILES</title>
+<variablelist>
+<varlistentry>
+<term>/usr/share/doc/sst/sst.doc</term>
+<listitem>
+<para>Documentation file.</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>sst-input.log</term>
+<listitem>
+<para>Where user input is saved to (send this with your bug reports).</para>
+</listitem>
+</varlistentry>
+<varlistentry>
+<term>emsave.trk</term>
+<listitem>
+<para>Save file produced by EMEXIT command.</para>
+</listitem>
+</varlistentry>
+</variablelist>
+</refsect1>
+
 <refsect1 id='authors'><title>AUTHORS</title> 
 <para>Super Star Trek was designed and written by David Matuszek, Paul
 Reynolds, and Don Smith in the 1970s.  It was resurrected by Tom Almy.
 The screen-oriented interface is by Stas Sergeev. This version has
-been cleaned up and documented by Eric S. Raymond
+been improved, cleaned up and documented by Eric S. Raymond
 <email>esr@snark.thyrsus.com</email>.  There is a <ulink
 url='https://developer.berlios.de/projects/sst/'>project
 page</ulink>.</para>
index 7d4392109697e2fdcf6ab88b1b1ecf3be2d601ca..b6a168796e2c8e6e3fec74801943e1ebb99bc41e 100644 (file)
@@ -410,7 +410,7 @@ void events(void)
            }
            break;
        case FDISTR: /* inhabited system issues distress call */
-           schedule(FDISTR, expran(0.5*game.intime));
+           unschedule(FDISTR);
            /* try a whole bunch of times to find something suitable */
            i = 100;
            do {
@@ -434,8 +434,6 @@ void events(void)
            ev = schedule(FENSLV, expran(game.intime));
            ev->quadrant = w;
            q->status = distressed;
-           if (idebug)
-               prout("=== Distress call set at %d, %d.", w.x, w.y);
 
            /* tell the captain about it if we can */
            if (game.damage[DRADIO] == 0.0 || game.condit == IHDOCKED)
index 5d4ea9a13154752c0ed904fc55f3116ee41fb936..dc4ce744fee5cf1350af13c2c991a2096ba46441 100644 (file)
--- a/src/io.c
+++ b/src/io.c
@@ -203,7 +203,10 @@ void cgetline(char *line, int max)
        strcat(line, "\n");
        wrefresh(curwnd);
     } else {
-       fgets(line, max, stdin);
+       if (replayfp && !feof(replayfp))
+           fgets(line, max, replayfp);
+       else
+           fgets(line, max, stdin);
     }
     if (logfp)
        fputs(line, logfp);
index 90b2b307a6ba536b964e2b89cf00621e93633248..7fbbfc2ef558af029e37e827537410314a35ef4f 100644 (file)
--- a/src/sst.c
+++ b/src/sst.c
@@ -176,8 +176,7 @@ double perdate;
 char citem[10];
 int seed;              // the random-number seed
 bool idebug;           // debug mode
-bool randready;                // Has the random-number generator initialized?
-FILE *logfp;
+FILE *logfp, *replayfp;
 
 char *device[NDEVICES] = {
        "S. R. Sensors",
@@ -595,8 +594,20 @@ int main(int argc, char **argv)
     else
        game.options |= OPTION_TTY;
 
-    while ((option = getopt(argc, argv, "tx")) != -1) {
+    seed = (int)time(NULL);
+    while ((option = getopt(argc, argv, "r:tx")) != -1) {
        switch (option) {
+       case 'r':
+           replayfp = fopen(optarg, "r");
+           if (replayfp == NULL) {
+               fprintf(stderr, "sst: can't open replay file %s\n", optarg);
+               exit(1);        
+           }
+           if (fscanf(replayfp, "seed %d\n", &seed) != 1) {
+               fprintf(stderr, "sst: replay file %s is ill-formed\n", optarg);
+               exit(1);        
+           }
+           /* FALL THROUGH */
        case 't':
            game.options |= OPTION_TTY;
            game.options &=~ OPTION_CURSES;
@@ -612,8 +623,10 @@ int main(int argc, char **argv)
     /* where to save the input in case of bugs */
     logfp = fopen("sst-input.log", "w");
     setlinebuf(logfp);
+    fprintf(logfp, "seed %d\n", seed);
+    srand(seed);
 
-    randomize();
+    srand(seed);
     iostart();
 
     line[0] = '\0';
@@ -715,14 +728,6 @@ double expran(double avrage)
 
 double Rand(void) 
 {
-    if (!randready) {
-       if (seed == 0)
-           seed = (unsigned)time(NULL);
-       if (logfp)
-           fprintf(logfp, "seed %d\n", seed);
-       srand(seed);
-       randready = true;
-    }
     return rand()/(1.0 + (double)RAND_MAX);
 }
 
@@ -884,12 +889,16 @@ void debugme(void)
            case FENSLV:  proutn("Enlavement      "); break;
            case FREPRO:  proutn("Klingon Build   "); break;
            }
-           if (is_scheduled(i))
+           if (is_scheduled(i)) {
                proutn("%.2f", scheduled(i)-game.state.date);
-           else
+               if (i == FENSLV || i == FREPRO) {
+                   ev = findevent(i);
+                   proutn(" in %d-%d", ev->quadrant.x,ev->quadrant.y);
+               }
+           } else
                proutn("never");
-           chew();
            proutn("? ");
+           chew();
            key = scan();
            if (key == 'n') {
                unschedule(i);
index 6ecd3d3a12a1aaee4b1a948be88d44e206acbd5c..e9a805f5aaaaab0a1709169131a72b02a9e44176 100644 (file)
--- a/src/sst.h
+++ b/src/sst.h
@@ -178,6 +178,7 @@ extern int is_scheduled(int);
 extern event *schedule(int, double);
 extern void postpone(int, double);
 extern double scheduled(int);
+#define findevent(evtype)      &game.future[evtype]
 
 #define SSTMAGIC       "SST2.0\n"
 
@@ -281,9 +282,8 @@ extern double perdate;
 extern double aaitem;
 extern char citem[10];
 extern int seed;
-extern bool randready;
 extern bool idebug;
-extern FILE *logfp;
+extern FILE *logfp, *replayfp;
 
 /* the Space Thingy's global state should *not* be saved! */
 extern coord thing;