Document an interface fix.
[super-star-trek.git] / sst.py
diff --git a/sst.py b/sst.py
index 12f1bad0900bffbfc751773126266268ac1a3351..242022296e03d3d7835693ebd498a0eebb75845f 100755 (executable)
--- a/sst.py
+++ b/sst.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python
 """
 sst.py -- Super Star Trek 2K
 
@@ -12,6 +12,8 @@ See the doc/HACKING file in the distribution for designers notes and advice
 on how to modify (and how not to modify!) this code.
 """
 from __future__ import print_function, division
+# Runs under Python 2 an Python 3. Preserve this property!
+# SPDX-License-Identifier: BSD-2-clause
 
 import os, sys, math, curses, time, pickle, copy, gettext, getpass
 import getopt, socket, locale
@@ -29,7 +31,7 @@ try:
 except NameError:
     my_input = input
 
-version = "2.4"
+version = "2.5"
 
 docpath        = (".", "doc/", "/usr/share/doc/sst/")
 
@@ -307,6 +309,7 @@ OPTION_CLOAK      = 0x80004000        # Enable BSD-Trek capture (Almy, 2013).
 OPTION_PLAIN      = 0x01000000        # user chose plain game
 OPTION_ALMY       = 0x02000000        # user chose Almy variant
 OPTION_COLOR      = 0x04000000        # enable color display (ESR, 2010)
+OPTION_DOTFILL    = 0x08000000        # fix dotfill glitch in chart (ESR, 2019)
 
 # Define devices
 DSRSENS         = 0
@@ -801,7 +804,7 @@ def movescom(iq, avoid):
             if communicating():
                 announce()
                 prout(_("Lt. Uhura-  \"Captain, Starfleet Intelligence reports"))
-                proutn(_("   a planet in Quadrant %s has been destroyed") % game.state.kscmdr)
+                prout(_("   a planet in Quadrant %s has been destroyed") % game.state.kscmdr)
                 prout(_("   by the Super-commander.\""))
             break
     return True # looks good!
@@ -834,7 +837,7 @@ def supercommander():
         sc = game.state.kscmdr
         for (i, base) in enumerate(game.state.baseq):
             basetbl.append((i, (base - sc).distance()))
-        if game.state.baseq > 1:
+        if len(game.state.baseq) > 1:
             basetbl.sort(key=lambda x: x[1])
         # look for nearest base without a commander, no Enterprise, and
         # without too many Klingons, and not already under attack.
@@ -907,7 +910,7 @@ def supercommander():
                 prout(_("Lt. Uhura-  \"Captain, the starbase in Quadrant %s") \
                       % game.state.kscmdr)
                 prout(_("   reports that it is under attack from the Klingon Super-commander."))
-                proutn(_("   It can survive until stardate %d.\"") \
+                prout(_("   It can survive until stardate %d.\"") \
                        % int(scheduled(FSCDBAS)))
                 if not game.resting:
                     return
@@ -925,7 +928,7 @@ def supercommander():
         return
     announce()
     prout(_("Lt. Uhura-  \"Captain, Starfleet Intelligence reports"))
-    proutn(_("   the Super-commander is in Quadrant %s,") % game.state.kscmdr)
+    prout(_("   the Super-commander is in Quadrant %s.") % game.state.kscmdr)
     return
 
 def movetholian():
@@ -950,7 +953,6 @@ def movetholian():
         game.tholian.move(None)
         prout("***Internal error: Tholian in a bad spot.")
         return
-    print("Tholian moving from %s to %s" % (game.tholian.location, tid))
     # do nothing if we are blocked
     if game.quad[tid.i][tid.j] not in ('.', '#'):
         return
@@ -2087,7 +2089,6 @@ def phasers():
                 scanner.chew()
                 key = "IHEOL"
                 hits[k] = 0 # prevent overflow -- thanks to Alexei Voitenko
-                k += 1
                 continue
             if key == "IHEOL":
                 scanner.chew()
@@ -2117,7 +2118,7 @@ def phasers():
                 # abort out
                 scanner.chew()
                 return
-            hits[k] = scanner.real
+            hits.append(scanner.real)
             rpow += scanner.real
             # If total requested is too much, inform and start over
             if rpow > avail:
@@ -2125,7 +2126,6 @@ def phasers():
                 scanner.chew()
                 return
             key = scanner.nexttok() # scan for next value
-            k += 1
         if rpow == 0.0:
             # zero energy -- abort
             scanner.chew()
@@ -3881,7 +3881,7 @@ def imove(icourse=None, noattack=False):
             newquadrant(noattack)
             break
         elif check_collision(w):
-            print("Collision detected")
+            prout(_("Collision detected"))
             break
         else:
             game.sector = w
@@ -5325,6 +5325,8 @@ def chart():
                 show = ".1."
             elif game.state.galaxy[i][j].charted:
                 show = "%3d" % (game.state.chart[i][j].klingons*100 + game.state.chart[i][j].starbase * 10 + game.state.chart[i][j].stars)
+                if (game.options & OPTION_DOTFILL):
+                    show = show.replace(" ", ".")
             else:
                 show = "..."
             proutn(show)
@@ -5987,11 +5989,11 @@ def choose():
         scanner.nexttok()
     if scanner.sees("plain"):
         # Approximates the UT FORTRAN version.
-        game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_THINGY | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK)
+        game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_THINGY | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK | OPTION_DOTFILL)
         game.options |= OPTION_PLAIN
     elif scanner.sees("almy"):
         # Approximates Tom Almy's version.
-        game.options &=~ (OPTION_THINGY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR)
+        game.options &=~ (OPTION_THINGY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_DOTFILL)
         game.options |= OPTION_ALMY
     elif scanner.sees("fancy") or scanner.sees("\n"):
         pass
@@ -6055,6 +6057,7 @@ def newqad():
     game.iplnet = None
     game.neutz = game.inorbit = game.landed = False
     game.ientesc = game.iseenit = game.isviolreported = False
+    game.tholian = None
     # Create a blank quadrant
     game.quad = fill2d(QUADSIZE, lambda i, j: '.')
     if game.iscate: