Handle incorrect command-line args gracefully.
[super-star-trek.git] / sst
diff --git a/sst b/sst
index 32299535f3ada075a1f758e73bfa3b195098a444..f3d7e31cd52e0cd827243f55ae29c730205bccc2 100755 (executable)
--- a/sst
+++ b/sst
@@ -88,6 +88,14 @@ class randomizer:
         #    logfp.write("#seed(%d)\n" % n)
         game.lcg_x = n % randomizer.LCG_M
 
+    @staticmethod
+    def getrngstate():
+        return game.lcg_x
+
+    @staticmethod
+    def setrngstate(n):
+        game.lcg_x = n
+
 GALSIZE        = 8             # Galaxy size in quadrants
 NINHAB         = (GALSIZE * GALSIZE // 2)      # Number of inhabited worlds
 MAXUNINHAB     = 10            # Maximum uninhabited worlds
@@ -3838,7 +3846,7 @@ def imove(icourse=None, noattack=False):
                         return True
                 # This should not happen
                 prout(_("Which way did he go?")) # pragma: no cover
-                return False
+                return False # pragma: no cover
             elif iquad == ' ':
                 skip(1)
                 prouts(_("***RED ALERT!  RED ALERT!"))
@@ -5930,13 +5938,17 @@ def setup():
     # Place thing (in tournament game, we don't want one!)
     # New in SST2K: never place the Thing near a starbase.
     # This makes sense and avoids a special case in the old code.
-    #global thing
-    #if game.tourn is None:
-    #    while True:
-    #        thing.location = randplace(GALSIZE)
-    #        # Put it somewhere a starbase is not
-    #        if thing.location not in game.state.baseq:
-    #            break
+    if game.tourn is None:
+        # Avoid distrubing the RNG chain.  This code
+        # was a late fix and we don't want to mess up
+        # all the regression tests.
+        state = randomizer.getrngstate()
+        while True:
+            thing.location = randplace(GALSIZE)
+            # Put it somewhere a starbase is not
+            if thing.location not in game.state.baseq:
+                break
+        randomizer.setrngstate(state)
     skip(2)
     game.state.snap = False
     if game.skill == SKILL_NOVICE:
@@ -6790,43 +6802,47 @@ if __name__ == '__main__':
         else:
             game.options |= OPTION_TTY
         seed = int(time.time())
-        (options, arguments) = getopt.getopt(sys.argv[1:], "cr:s:txV")
-        for (switch, val) in options:
-            if switch == '-r':
-                # pylint: disable=raise-missing-from
-                try:
-                    replayfp = open(val, "r")
-                except IOError:
-                    sys.stderr.write("sst: can't open replay file %s\n" % val)
-                    raise SystemExit(1)
-                # pylint: disable=raise-missing-from
-                try:
-                    line = replayfp.readline().strip()
-                    (leader, __, seed) = line.split()
-                    # pylint: disable=eval-used
-                    seed = eval(seed)
-                    line = replayfp.readline().strip()
-                    arguments += line.split()[2:]
-                except ValueError:                # pragma: no cover
-                    sys.stderr.write("sst: replay file %s is ill-formed\n"% val)
+        try:
+            (options, arguments) = getopt.getopt(sys.argv[1:], "cr:s:txV")
+            for (switch, val) in options:
+                if switch == '-r':
+                    # pylint: disable=raise-missing-from
+                    try:
+                        replayfp = open(val, "r")
+                    except IOError:
+                        sys.stderr.write("sst: can't open replay file %s\n" % val)
+                        raise SystemExit(1)
+                    # pylint: disable=raise-missing-from
+                    try:
+                        line = replayfp.readline().strip()
+                        (leader, __, seed) = line.split()
+                        # pylint: disable=eval-used
+                        seed = eval(seed)
+                        line = replayfp.readline().strip()
+                        arguments += line.split()[2:]
+                    except ValueError:                # pragma: no cover
+                        sys.stderr.write("sst: replay file %s is ill-formed\n"% val)
+                        raise SystemExit(1)
+                    game.options |= OPTION_TTY
+                    game.options &=~ OPTION_CURSES
+                elif switch == '-s':                # pragma: no cover
+                    seed = int(val)
+                elif switch == '-t':   # pragma: no cover
+                    game.options |= OPTION_TTY
+                    game.options &=~ OPTION_CURSES
+                elif switch == '-x':                # pragma: no cover
+                    game.idebug = True
+                elif switch == '-c':   # Enable curses debugging - undocumented
+                    game.cdebug = True
+                elif switch == '-V':                # pragma: no cover
+                    print("SST2K", version)
+                    raise SystemExit(0)
+                else:                # pragma: no cover
+                    sys.stderr.write("usage: sst [-t] [-x] [startcommand...].\n")
                     raise SystemExit(1)
-                game.options |= OPTION_TTY
-                game.options &=~ OPTION_CURSES
-            elif switch == '-s':                # pragma: no cover
-                seed = int(val)
-            elif switch == '-t':       # pragma: no cover
-                game.options |= OPTION_TTY
-                game.options &=~ OPTION_CURSES
-            elif switch == '-x':                # pragma: no cover
-                game.idebug = True
-            elif switch == '-c':       # Enable curses debugging - undocumented
-                game.cdebug = True
-            elif switch == '-V':                # pragma: no cover
-                print("SST2K", version)
-                raise SystemExit(0)
-            else:                # pragma: no cover
-                sys.stderr.write("usage: sst [-t] [-x] [startcommand...].\n")
-                raise SystemExit(1)
+        except getopt.GetoptError as e:
+            print(e)
+            raise SystemExit(1)
         # where to save the input in case of bugs
         if "TMPDIR" in os.environ:                # pragma: no cover
             tmpdir = os.environ['TMPDIR']