Game log opening stanzas have an end delimiter.
[super-star-trek.git] / sst
diff --git a/sst b/sst
index 450729232b10f10622bda649fe8ebb09547dc93c..21935f4ebee7b9c7faa103c9150c208222fe3303 100755 (executable)
--- a/sst
+++ b/sst
@@ -302,13 +302,14 @@ OPTION_PROBE      = 0x00000020        # deep-space probes (DECUS version, 1980)
 OPTION_SHOWME     = 0x00000040        # bracket Enterprise in chart (ESR, 2005)
 OPTION_RAMMING    = 0x00000080        # enemies may ram Enterprise (Almy, 1979)
 OPTION_MVBADDY    = 0x00000100        # more enemies can move (Almy, 1979?)
-OPTION_BLKHOLE    = 0x00000200        # black hole may timewarp you (Stas, 2005)
-OPTION_BASE       = 0x00000400        # bases have good shields (Stas, 2005)
-OPTION_WORLDS     = 0x00000800        # logic for inhabited worlds (ESR, 2006)
-OPTION_AUTOSCAN   = 0x00001000        # automatic LRSCAN before CHART (ESR, 2006)
-OPTION_CAPTURE    = 0x00002000        # Enable BSD-Trek capture (Almy, 2013).
-OPTION_CLOAK      = 0x80004000        # Enable BSD-Trek capture (Almy, 2013).
-OPTION_PLAIN      = 0x01000000        # user chose plain game
+OPTION_AUTOPASS   = 0x00000200        # Autogenerate password (Almy, 1997?)
+OPTION_BLKHOLE    = 0x00000400        # black hole may timewarp you (Stas, 2005)
+OPTION_BASE       = 0x00000800        # bases have good shields (Stas, 2005)
+OPTION_WORLDS     = 0x00001000        # logic for inhabited worlds (ESR, 2006)
+OPTION_AUTOSCAN   = 0x00002000        # automatic LRSCAN before CHART (ESR, 2006)
+OPTION_CAPTURE    = 0x00004000        # Enable BSD-Trek capture (Almy, 2013).
+OPTION_CLOAK      = 0x80008000        # Enable BSD-Trek capture (Almy, 2013).
+OPTION_ALMY       = 0x01000000        # Almy's death ray upgrade (1997?)
 OPTION_COLOR      = 0x04000000        # enable color display (ESR, 2010)
 OPTION_DOTFILL    = 0x08000000        # fix dotfill glitch in chart (ESR, 2019)
 OPTION_ALPHAMERIC = 0x10000000        # Alpha Y coordinates (ESR, 2023)
@@ -322,15 +323,17 @@ option_names = {
     "SHOWME": OPTION_SHOWME,
     "RAMMING": OPTION_RAMMING,
     "MVBADDY": OPTION_MVBADDY,
+    "AUTOPASS": OPTION_AUTOPASS,
     "BLKHOLE": OPTION_BLKHOLE,
     "BASE": OPTION_BASE,
     "WORLDS": OPTION_WORLDS,
     "AUTOSCAN": OPTION_AUTOSCAN,
     "CAPTURE": OPTION_CAPTURE,
     "CLOAK": OPTION_CLOAK,
-    "PLAIN": OPTION_PLAIN,
+    "ALMY": OPTION_ALMY,
     "COLOR": OPTION_COLOR,
     "DOTFILL": OPTION_DOTFILL,
+    "ALPHAMERIC": OPTION_ALPHAMERIC,
     }
 
 # Define devices
@@ -1279,7 +1282,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
     # Loop to move a single torpedo
     setwnd(message_window)
     for step in range(1, QUADSIZE*2):
-        if not track.nexttok():
+        if not track.nextstep():
             break
         w = track.sector()
         if not w.valid_sector():
@@ -1303,7 +1306,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
             # In the C/FORTRAN version, dispersion was 2.5 radians, which
             # is 143 degrees, which is almost exactly 4.8 clockface units
             displacement = course(track.bearing+rnd.real(-2.4, 2.4), distance=2**0.5)
-            displacement.nexttok()
+            displacement.nextstep()
             bumpto = displacement.sector()
             if not bumpto.valid_sector():
                 return hit
@@ -1345,7 +1348,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
                         return None
                     proutn(crmena(True, iquad, "sector", w))
                     displacement = course(track.bearing+rnd.real(-2.4, 2.4), distance=2**0.5, origin=w)
-                    displacement.nexttok()
+                    displacement.nextstep()
                     bumpto = displacement.sector()
                     if game.quad[bumpto.i][bumpto.j] == ' ':
                         prout(_(" buffeted into black hole."))
@@ -2547,7 +2550,7 @@ def events():
                 supercommander()
         elif evcode == FDSPROB: # Move deep space probe
             schedule(FDSPROB, 0.01)
-            if not game.probe.nexttok():
+            if not game.probe.nextstep():
                 if not game.probe.quadrant().valid_quadrant() or \
                     game.state.galaxy[game.probe.quadrant().i][game.probe.quadrant().j].supernova:
                     # Left galaxy or ran into supernova
@@ -3884,7 +3887,7 @@ def imove(icourse=None, noattack=False):
     # Move out
     game.quad[game.sector.i][game.sector.j] = '.'
     for _m in range(icourse.moves):
-        icourse.nexttok()
+        icourse.nextstep()
         w = icourse.sector()
         if icourse.origin.quadrant() != icourse.location.quadrant():
             newquadrant(noattack)
@@ -4115,7 +4118,7 @@ class course:
         self.step = 0
     def arrived(self):
         return self.location.roundtogrid() == self.final
-    def nexttok(self):
+    def nextstep(self):
         "Next step on course."
         self.step += 1
         self.nextlocation = self.location + self.increment
@@ -4264,7 +4267,7 @@ def warp(wcourse, involuntary):
             look = wcourse.moves
             while look > 0:
                 look -= 1
-                wcourse.nexttok()
+                wcourse.nextstep()
                 w = wcourse.sector()
                 if not w.valid_sector():
                     break
@@ -4810,7 +4813,7 @@ def beam():
         if not ja():
             scanner.chew()
             return
-    if not (game.options & OPTION_PLAIN):
+    if (game.options & OPTION_ALMY):
         nrgneed = 50 * game.skill + game.height / 100.0
         if nrgneed > game.energy:
             prout(_("Engineering to bridge--"))
@@ -5077,7 +5080,10 @@ def deathray():
     prouts(_("WHIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"))
     skip(1)
     dprob = 0.30
-    if game.options & OPTION_PLAIN:
+    # Ugh. This test (For Tom Almy's death-ray upgrade) was inverted for a long time.
+    # Furthermore, somebody (ESR or Stas?) changed Tom Almy's 0.7 upgraded chance of
+    # working to 0.5.
+    if game.options & OPTION_ALMY:
         dprob = 0.5
     r = rnd.real()
     if r > dprob:
@@ -5088,7 +5094,7 @@ def deathray():
         prout(_("Ensign Chekov-  \"Congratulations, Captain!\""))
         if game.unwon() == 0:
             finish(FWON)
-        if (game.options & OPTION_PLAIN) == 0:
+        if (game.options & OPTION_ALMY):
             prout(_("Spock-  \"Captain, I believe the `Experimental Death Ray'"))
             if rnd.withprob(0.05):
                 prout(_("   is still operational.\""))
@@ -6009,7 +6015,7 @@ def choose():
             return True
         if scanner.sees("regular"):
             break
-        proutn(_("What is \"%s\"? ") % scanner.token)
+        proutn(_("What game type is \"%s\"? ") % scanner.token)
         scanner.chew()
     while game.length==0 or game.skill==SKILL_NONE:
         if scanner.nexttok() == "IHALPHA":
@@ -6030,7 +6036,7 @@ def choose():
             elif scanner.sees("emeritus"):
                 game.skill = SKILL_EMERITUS
             else:
-                proutn(_("What is \""))
+                proutn(_("What skill level is is \""))
                 proutn(scanner.token)
                 prout("\"?")
         else:
@@ -6046,15 +6052,14 @@ def choose():
         scanner.nexttok()
     if scanner.sees("plain"):
         # Approximates the UT FORTRAN version.
-        game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK | OPTION_DOTFILL | OPTION_ALPHAMERIC)
-        game.options |= OPTION_PLAIN
+        game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK | OPTION_ALMY | OPTION_AUTOPASS | OPTION_DOTFILL | OPTION_ALPHAMERIC)
     elif scanner.sees("almy"):
         # Approximates Tom Almy's version.
         game.options &=~ (OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_DOTFILL | OPTION_ALPHAMERIC)
     elif scanner.sees("fancy") or scanner.sees("\n"):
         pass
     elif len(scanner.token):
-        proutn(_("What is \"%s\"?") % scanner.token)
+        proutn(_("What game style is \"%s\"?") % scanner.token)
     setpassword()
     if game.passwd == "debug":                # pragma: no cover
         game.idebug = True
@@ -6225,7 +6230,12 @@ def newqad():
 
 def setpassword():
     "Set the self-destruct password."
-    if game.options & OPTION_PLAIN:
+    if game.options & OPTION_AUTOPASS:
+        game.passwd = ""
+        game.passwd += chr(ord('a')+rnd.integer(26))
+        game.passwd += chr(ord('a')+rnd.integer(26))
+        game.passwd += chr(ord('a')+rnd.integer(26))
+    else:
         while True:
             scanner.chew()
             proutn(_("Please type in a secret password- "))
@@ -6234,11 +6244,6 @@ def setpassword():
             #game.passwd = getpass.getpass("Please type in a secret password- ")
             if game.passwd is not None:
                 break
-    else:
-        game.passwd = ""
-        game.passwd += chr(ord('a')+rnd.integer(26))
-        game.passwd += chr(ord('a')+rnd.integer(26))
-        game.passwd += chr(ord('a')+rnd.integer(26))
 
 # Code from sst.c begins here
 
@@ -6779,7 +6784,7 @@ if __name__ == '__main__':
         game = Gamestate()
         rnd = randomizer()
         logfp = None
-        game.options = OPTION_ALL &~ (OPTION_IOMODES | OPTION_PLAIN)
+        game.options = OPTION_ALL &~ OPTION_IOMODES
         if os.getenv("TERM"):
             game.options |= OPTION_CURSES      # pragma: no cover
         else:
@@ -6842,6 +6847,7 @@ if __name__ == '__main__':
             logfp.write("# SST2K version %s\n" % version)
             logfp.write("# recorded by %s@%s on %s\n" % \
                     (getpass.getuser(),socket.getfqdn(),time.ctime()))
+            logfp.write("#\n")
         rnd.seed(seed)
         scanner = sstscanner()
         for arg in arguments: