fix password acceptance
[super-star-trek.git] / sst.py
diff --git a/sst.py b/sst.py
old mode 100644 (file)
new mode 100755 (executable)
index caf6b6e..89715b4
--- a/sst.py
+++ b/sst.py
@@ -13,6 +13,8 @@ on how to modify (and how not to modify!) this code.
 """
 import os, sys, math, curses, time, readline, cPickle, random, copy, gettext, getpass
 
 """
 import os, sys, math, curses, time, readline, cPickle, random, copy, gettext, getpass
 
+version="2.0"
+
 docpath        = (".", "../doc", "/usr/share/doc/sst")
 
 def _(str): return gettext.gettext(str)
 docpath        = (".", "../doc", "/usr/share/doc/sst")
 
 def _(str): return gettext.gettext(str)
@@ -50,10 +52,13 @@ LIGHTMAGENTA = 13
 YELLOW       = 14
 WHITE        = 15
 
 YELLOW       = 14
 WHITE        = 15
 
-class TrekError:
+class TrekError(Exception):
     pass
 
     pass
 
-class coord:
+class JumpOut(Exception):
+    pass 
+
+class Coord:
     def __init__(self, x=None, y=None):
         self.i = x
         self.j = y
     def __init__(self, x=None, y=None):
         self.i = x
         self.j = y
@@ -70,28 +75,28 @@ class coord:
     def __ne__(self, other):
         return other == None or self.i != other.i or self.j != other.j
     def __add__(self, other):
     def __ne__(self, other):
         return other == None or self.i != other.i or self.j != other.j
     def __add__(self, other):
-        return coord(self.i+other.i, self.j+other.j)
+        return Coord(self.i+other.i, self.j+other.j)
     def __sub__(self, other):
     def __sub__(self, other):
-        return coord(self.i-other.i, self.j-other.j)
+        return Coord(self.i-other.i, self.j-other.j)
     def __mul__(self, other):
     def __mul__(self, other):
-        return coord(self.i*other, self.j*other)
+        return Coord(self.i*other, self.j*other)
     def __rmul__(self, other):
     def __rmul__(self, other):
-        return coord(self.i*other, self.j*other)
+        return Coord(self.i*other, self.j*other)
     def __div__(self, other):
     def __div__(self, other):
-        return coord(self.i/other, self.j/other)
+        return Coord(self.i/other, self.j/other)
     def __mod__(self, other):
     def __mod__(self, other):
-        return coord(self.i % other, self.j % other)
+        return Coord(self.i % other, self.j % other)
     def __rdiv__(self, other):
     def __rdiv__(self, other):
-        return coord(self.i/other, self.j/other)
+        return Coord(self.i/other, self.j/other)
     def roundtogrid(self):
     def roundtogrid(self):
-        return coord(int(round(self.i)), int(round(self.j)))
+        return Coord(int(round(self.i)), int(round(self.j)))
     def distance(self, other=None):
     def distance(self, other=None):
-        if not other: other = coord(0, 0)
+        if not other: other = Coord(0, 0)
         return math.sqrt((self.i - other.i)**2 + (self.j - other.j)**2)
     def bearing(self):
         return 1.90985*math.atan2(self.j, self.i)
     def sgn(self):
         return math.sqrt((self.i - other.i)**2 + (self.j - other.j)**2)
     def bearing(self):
         return 1.90985*math.atan2(self.j, self.i)
     def sgn(self):
-        s = coord()
+        s = Coord()
         if self.i == 0:
             s.i = 0
         else:
         if self.i == 0:
             s.i = 0
         else:
@@ -107,7 +112,7 @@ class coord:
     def sector(self):
         return self.roundtogrid() % QUADSIZE
     def scatter(self):
     def sector(self):
         return self.roundtogrid() % QUADSIZE
     def scatter(self):
-        s = coord()
+        s = Coord()
         s.i = self.i + randrange(-1, 2)
         s.j = self.j + randrange(-1, 2)
         return s
         s.i = self.i + randrange(-1, 2)
         s.j = self.j + randrange(-1, 2)
         return s
@@ -117,10 +122,10 @@ class coord:
         return "%s - %s" % (self.i+1, self.j+1)
     __repr__ = __str__
 
         return "%s - %s" % (self.i+1, self.j+1)
     __repr__ = __str__
 
-class planet:
+class Planet:
     def __init__(self):
         self.name = None       # string-valued if inhabited
     def __init__(self):
         self.name = None       # string-valued if inhabited
-        self.quadrant = coord()        # quadrant located
+        self.quadrant = Coord()        # quadrant located
         self.pclass = None     # could be ""M", "N", "O", or "destroyed"
         self.crystals = "absent"# could be "mined", "present", "absent"
         self.known = "unknown" # could be "unknown", "known", "shuttle_down"
         self.pclass = None     # could be ""M", "N", "O", or "destroyed"
         self.crystals = "absent"# could be "mined", "present", "absent"
         self.known = "unknown" # could be "unknown", "known", "shuttle_down"
@@ -128,7 +133,7 @@ class planet:
     def __str__(self):
         return self.name
 
     def __str__(self):
         return self.name
 
-class quadrant:
+class Quadrant:
     def __init__(self):
         self.stars = 0
         self.planet = None
     def __init__(self):
         self.stars = 0
         self.planet = None
@@ -139,7 +144,7 @@ class quadrant:
        self.charted = False
         self.status = "secure" # Could be "secure", "distressed", "enslaved"
 
        self.charted = False
         self.status = "secure" # Could be "secure", "distressed", "enslaved"
 
-class page:
+class Page:
     def __init__(self):
        self.stars = None
        self.starbase = None
     def __init__(self):
        self.stars = None
        self.starbase = None
@@ -154,7 +159,7 @@ def fill2d(size, fillfun):
             lst[i].append(fillfun(i, j))
     return lst
 
             lst[i].append(fillfun(i, j))
     return lst
 
-class snapshot:
+class Snapshot:
     def __init__(self):
         self.snap = False      # snapshot taken
         self.crew = 0          # crew complement
     def __init__(self):
         self.snap = False      # snapshot taken
         self.crew = 0          # crew complement
@@ -171,13 +176,13 @@ class snapshot:
        self.remtime = 0        # remaining time
         self.baseq = []        # Base quadrant coordinates
         self.kcmdr = []        # Commander quadrant coordinates
        self.remtime = 0        # remaining time
         self.baseq = []        # Base quadrant coordinates
         self.kcmdr = []        # Commander quadrant coordinates
-       self.kscmdr = coord()   # Supercommander quadrant coordinates
+       self.kscmdr = Coord()   # Supercommander quadrant coordinates
         # the galaxy
         # the galaxy
-        self.galaxy = fill2d(GALSIZE, lambda i, j: quadrant())
+        self.galaxy = fill2d(GALSIZE, lambda i_unused, j_unused: Quadrant())
         # the starchart
         # the starchart
-       self.chart = fill2d(GALSIZE, lambda i, j: page())
+       self.chart = fill2d(GALSIZE, lambda i_unused, j_unused: Page())
 
 
-class event:
+class Event:
     def __init__(self):
         self.date = None       # A real number
         self.quadrant = None   # A coord structure
     def __init__(self):
         self.date = None       # A real number
         self.quadrant = None   # A coord structure
@@ -251,10 +256,10 @@ NEVENTS   = 12
 # when we implement stateful events 
 def findevent(evtype): return game.future[evtype]
 
 # when we implement stateful events 
 def findevent(evtype): return game.future[evtype]
 
-class enemy:
+class Enemy:
     def __init__(self, type=None, loc=None, power=None):
         self.type = type
     def __init__(self, type=None, loc=None, power=None):
         self.type = type
-        self.location = coord()
+        self.location = Coord()
         if loc:
             self.move(loc)
         self.power = power     # enemy energy level
         if loc:
             self.move(loc)
         self.power = power     # enemy energy level
@@ -272,23 +277,25 @@ class enemy:
             game.quad[self.location.i][self.location.j] = self.type
             self.kdist = self.kavgd = (game.sector - loc).distance()
         else:
             game.quad[self.location.i][self.location.j] = self.type
             self.kdist = self.kavgd = (game.sector - loc).distance()
         else:
-            self.location = coord()
+            self.location = Coord()
             self.kdist = self.kavgd = None
             game.enemies.remove(self)
         return motion
     def __repr__(self):
         return "<%s,%s.%f>" % (self.type, self.location, self.power)   # For debugging
 
             self.kdist = self.kavgd = None
             game.enemies.remove(self)
         return motion
     def __repr__(self):
         return "<%s,%s.%f>" % (self.type, self.location, self.power)   # For debugging
 
-class gamestate:
+class Gamestate:
     def __init__(self):
         self.options = None    # Game options
     def __init__(self):
         self.options = None    # Game options
-        self.state = snapshot()        # A snapshot structure
-        self.snapsht = snapshot()      # Last snapshot taken for time-travel purposes
+        self.state = Snapshot()        # A snapshot structure
+        self.snapsht = Snapshot()      # Last snapshot taken for time-travel purposes
         self.quad = None       # contents of our quadrant
         self.damage = [0.0] * NDEVICES # damage encountered
         self.quad = None       # contents of our quadrant
         self.damage = [0.0] * NDEVICES # damage encountered
-        self.future = []               # future events
-        for i in range(NEVENTS):
-            self.future.append(event())
+        self.future = []       # future events
+        i = NEVENTS
+        while i > 0:
+            i -= 1
+            self.future.append(Event())
         self.passwd  = None;           # Self Destruct password
         self.enemies = []
         self.quadrant = None   # where we are in the large
         self.passwd  = None;           # Self Destruct password
         self.enemies = []
         self.quadrant = None   # where we are in the large
@@ -356,6 +363,9 @@ class gamestate:
         self.cryprob = 0.0     # probability that crystal will work
         self.probe = None      # object holding probe course info
         self.height = 0.0      # height of orbit around planet
         self.cryprob = 0.0     # probability that crystal will work
         self.probe = None      # object holding probe course info
         self.height = 0.0      # height of orbit around planet
+        self.score = 0.0       # overall score
+        self.perdate = 0.0     # rate of kills
+        self.idebug = False    # Debugging instrumentation enabled?
     def recompute(self):
         # Stas thinks this should be (C expression): 
         # game.state.remkl + len(game.state.kcmdr) > 0 ?
     def recompute(self):
         # Stas thinks this should be (C expression): 
         # game.state.remkl + len(game.state.kcmdr) > 0 ?
@@ -412,7 +422,7 @@ def welcoming(iq):
 
 def tryexit(enemy, look, irun):
     "A bad guy attempts to bug out."
 
 def tryexit(enemy, look, irun):
     "A bad guy attempts to bug out."
-    iq = coord()
+    iq = Coord()
     iq.i = game.quadrant.i+(look.i+(QUADSIZE-1))/QUADSIZE - 1
     iq.j = game.quadrant.j+(look.j+(QUADSIZE-1))/QUADSIZE - 1
     if not welcoming(iq):
     iq.i = game.quadrant.i+(look.i+(QUADSIZE-1))/QUADSIZE - 1
     iq.j = game.quadrant.j+(look.j+(QUADSIZE-1))/QUADSIZE - 1
     if not welcoming(iq):
@@ -435,7 +445,7 @@ def tryexit(enemy, look, irun):
     if not damaged(DSRSENS) or not damaged(DLRSENS) or \
        game.condition == "docked":
        prout(crmena(True, enemy.type, "sector", enemy.location) + \
     if not damaged(DSRSENS) or not damaged(DLRSENS) or \
        game.condition == "docked":
        prout(crmena(True, enemy.type, "sector", enemy.location) + \
-              (_(" escapes to Quadrant %s (and regains strength).") % q))
+              (_(" escapes to Quadrant %s (and regains strength).") % iq))
     # handle local matters related to escape
     enemy.move(None)
     game.klhere -= 1
     # handle local matters related to escape
     enemy.move(None)
     game.klhere -= 1
@@ -454,7 +464,7 @@ def tryexit(enemy, look, irun):
     else:
        for cmdr in game.state.kcmdr:
            if cmdr == game.quadrant:
     else:
        for cmdr in game.state.kcmdr:
            if cmdr == game.quadrant:
-               game.state.kcmdr[n] = iq
+               game.state.kcmdr.append(iq)
                break
     return True; # success 
 
                break
     return True; # success 
 
@@ -498,7 +508,7 @@ def tryexit(enemy, look, irun):
 
 def movebaddy(enemy):
     "Tactical movement for the bad guys."
 
 def movebaddy(enemy):
     "Tactical movement for the bad guys."
-    next = coord(); look = coord()
+    goto = Coord(); look = Coord()
     irun = False
     # This should probably be just (game.quadrant in game.state.kcmdr) + (game.state.kscmdr==game.quadrant) 
     if game.skill >= SKILL_EXPERT:
     irun = False
     # This should probably be just (game.quadrant in game.state.kcmdr) + (game.state.kscmdr==game.quadrant) 
     if game.skill >= SKILL_EXPERT:
@@ -537,7 +547,7 @@ def movebaddy(enemy):
                motion = (1.0 - randreal())**2 * dist1 + 1.0
            if game.condition=="docked" and (game.options & OPTION_BASE): # protected by base -- back off ! 
                motion -= game.skill*(2.0-randreal()**2)
                motion = (1.0 - randreal())**2 * dist1 + 1.0
            if game.condition=="docked" and (game.options & OPTION_BASE): # protected by base -- back off ! 
                motion -= game.skill*(2.0-randreal()**2)
-       if idebug:
+       if game.idebug:
            proutn("=== MOTION = %d, FORCES = %1.2f, " % (motion, forces))
        # don't move if no motion 
        if motion==0:
            proutn("=== MOTION = %d, FORCES = %1.2f, " % (motion, forces))
        # don't move if no motion 
        if motion==0:
@@ -556,7 +566,7 @@ def movebaddy(enemy):
        nsteps = QUADSIZE; # This shouldn't be necessary 
     if nsteps < 1:
        nsteps = 1; # This shouldn't be necessary 
        nsteps = QUADSIZE; # This shouldn't be necessary 
     if nsteps < 1:
        nsteps = 1; # This shouldn't be necessary 
-    if idebug:
+    if game.idebug:
        proutn("NSTEPS = %d:" % nsteps)
     # Compute preferred values of delta X and Y 
     m = game.sector - enemy.location
        proutn("NSTEPS = %d:" % nsteps)
     # Compute preferred values of delta X and Y 
     m = game.sector - enemy.location
@@ -565,13 +575,13 @@ def movebaddy(enemy):
     if 2.0 * abs(m.j) < abs(game.sector.i-enemy.location.i):
        m.j = 0
     m = (motion * m).sgn()
     if 2.0 * abs(m.j) < abs(game.sector.i-enemy.location.i):
        m.j = 0
     m = (motion * m).sgn()
-    next = enemy.location
+    goto = enemy.location
     # main move loop 
     for ll in range(nsteps):
     # main move loop 
     for ll in range(nsteps):
-       if idebug:
+       if game.idebug:
            proutn(" %d" % (ll+1))
        # Check if preferred position available 
            proutn(" %d" % (ll+1))
        # Check if preferred position available 
-       look = next + m
+       look = goto + m
         if m.i < 0:
             krawli = 1
         else:
         if m.i < 0:
             krawli = 1
         else:
@@ -589,14 +599,14 @@ def movebaddy(enemy):
                    return
                if krawli == m.i or m.j == 0:
                    break
                    return
                if krawli == m.i or m.j == 0:
                    break
-               look.i = next.i + krawli
+               look.i = goto.i + krawli
                krawli = -krawli
            elif look.j < 0 or look.j >= QUADSIZE:
                if motion < 0 and tryexit(enemy, look, irun):
                    return
                if krawlj == m.j or m.i == 0:
                    break
                krawli = -krawli
            elif look.j < 0 or look.j >= QUADSIZE:
                if motion < 0 and tryexit(enemy, look, irun):
                    return
                if krawlj == m.j or m.i == 0:
                    break
-               look.j = next.j + krawlj
+               look.j = goto.j + krawlj
                krawlj = -krawlj
            elif (game.options & OPTION_RAMMING) and game.quad[look.i][look.j] != '.':
                # See if enemy should ram ship 
                krawlj = -krawlj
            elif (game.options & OPTION_RAMMING) and game.quad[look.i][look.j] != '.':
                # See if enemy should ram ship 
@@ -605,35 +615,35 @@ def movebaddy(enemy):
                    collision(rammed=True, enemy=enemy)
                    return
                if krawli != m.i and m.j != 0:
                    collision(rammed=True, enemy=enemy)
                    return
                if krawli != m.i and m.j != 0:
-                   look.i = next.i + krawli
+                   look.i = goto.i + krawli
                    krawli = -krawli
                elif krawlj != m.j and m.i != 0:
                    krawli = -krawli
                elif krawlj != m.j and m.i != 0:
-                   look.j = next.j + krawlj
+                   look.j = goto.j + krawlj
                    krawlj = -krawlj
                else:
                    break; # we have failed 
            else:
                success = True
        if success:
                    krawlj = -krawlj
                else:
                    break; # we have failed 
            else:
                success = True
        if success:
-           next = look
-           if idebug:
-               proutn(`next`)
+           goto = look
+           if game.idebug:
+               proutn(`goto`)
        else:
            break; # done early 
        else:
            break; # done early 
-    if idebug:
+    if game.idebug:
        skip(1)
        skip(1)
-    if enemy.move(next):
+    if enemy.move(goto):
        if not damaged(DSRSENS) or game.condition == "docked":
            proutn(_("*** %s from Sector %s") % (cramen(enemy.type), enemy.location))
            if enemy.kdist < dist1:
                proutn(_(" advances to "))
            else:
                proutn(_(" retreats to "))
        if not damaged(DSRSENS) or game.condition == "docked":
            proutn(_("*** %s from Sector %s") % (cramen(enemy.type), enemy.location))
            if enemy.kdist < dist1:
                proutn(_(" advances to "))
            else:
                proutn(_(" retreats to "))
-           prout("Sector %s." % next)
+           prout("Sector %s." % goto)
 
 def moveklings():
     "Sequence Klingon tactical movement."
 
 def moveklings():
     "Sequence Klingon tactical movement."
-    if idebug:
+    if game.idebug:
        prout("== MOVCOM")
     # Figure out which Klingon is the commander (or Supercommander)
     # and do move
        prout("== MOVCOM")
     # Figure out which Klingon is the commander (or Supercommander)
     # and do move
@@ -653,7 +663,7 @@ def moveklings():
         for enemy in game.enemies:
             if enemy.type in ('K', 'R'):
                movebaddy(enemy)
         for enemy in game.enemies:
             if enemy.type in ('K', 'R'):
                movebaddy(enemy)
-    game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+    sortenemies()
 
 def movescom(iq, avoid):
     "Commander movement helper." 
 
 def movescom(iq, avoid):
     "Commander movement helper." 
@@ -679,7 +689,7 @@ def movescom(iq, avoid):
        game.klhere -= 1
        if game.condition != "docked":
            newcnd()
        game.klhere -= 1
        if game.condition != "docked":
            newcnd()
-        game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+        sortenemies()
     # check for a helpful planet 
     for i in range(game.inplan):
        if game.state.planets[i].quadrant == game.state.kscmdr and \
     # check for a helpful planet 
     for i in range(game.inplan):
        if game.state.planets[i].quadrant == game.state.kscmdr and \
@@ -697,9 +707,9 @@ def movescom(iq, avoid):
                        
 def supercommander():
     "Move the Super Commander." 
                        
 def supercommander():
     "Move the Super Commander." 
-    iq = coord(); sc = coord(); ibq = coord(); idelta = coord()
+    iq = Coord(); sc = Coord(); ibq = Coord(); idelta = Coord()
     basetbl = []
     basetbl = []
-    if idebug:
+    if game.idebug:
        prout("== SUPERCOMMANDER")
     # Decide on being active or passive 
     avoid = ((game.incom - len(game.state.kcmdr) + game.inkling - game.state.remkl)/(game.state.date+0.01-game.indate) < 0.1*game.skill*(game.skill+1.0) or \
        prout("== SUPERCOMMANDER")
     # Decide on being active or passive 
     avoid = ((game.incom - len(game.state.kcmdr) + game.inkling - game.state.remkl)/(game.state.date+0.01-game.indate) < 0.1*game.skill*(game.skill+1.0) or \
@@ -718,10 +728,10 @@ def supercommander():
            unschedule(FSCMOVE)
            return
        sc = game.state.kscmdr
            unschedule(FSCMOVE)
            return
        sc = game.state.kscmdr
-        for base in game.state.baseq:
+        for (i, base) in enumerate(game.state.baseq):
            basetbl.append((i, (base - sc).distance()))
        if game.state.baseq > 1:
            basetbl.append((i, (base - sc).distance()))
        if game.state.baseq > 1:
-            basetbl.sort(lambda x, y: cmp(x[1]. y[1]))
+            basetbl.sort(lambda x, y: cmp(x[1], y[1]))
        # look for nearest base without a commander, no Enterprise, and
         # without too many Klingons, and not already under attack. 
        ifindit = iwhichb = 0
        # look for nearest base without a commander, no Enterprise, and
         # without too many Klingons, and not already under attack. 
        ifindit = iwhichb = 0
@@ -798,13 +808,13 @@ def supercommander():
                if not game.resting:
                    return
                prout(_("Mr. Spock-  \"Captain, shall we cancel the rest period?\""))
                if not game.resting:
                    return
                prout(_("Mr. Spock-  \"Captain, shall we cancel the rest period?\""))
-               if ja() == False:
+               if not ja():
                    return
                game.resting = False
                game.optime = 0.0; # actually finished 
                return
     # Check for intelligence report 
                    return
                game.resting = False
                game.optime = 0.0; # actually finished 
                return
     # Check for intelligence report 
-    if not idebug and \
+    if not game.idebug and \
        (withprob(0.8) or \
         (not communicating()) or \
         not game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].charted):
        (withprob(0.8) or \
         (not communicating()) or \
         not game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].charted):
@@ -818,32 +828,32 @@ def movetholian():
     "Move the Tholian."
     if not game.tholian or game.justin:
        return
     "Move the Tholian."
     if not game.tholian or game.justin:
        return
-    id = coord()
+    tid = Coord()
     if game.tholian.location.i == 0 and game.tholian.location.j == 0:
     if game.tholian.location.i == 0 and game.tholian.location.j == 0:
-       id.i = 0; id.j = QUADSIZE-1
+       tid.i = 0; tid.j = QUADSIZE-1
     elif game.tholian.location.i == 0 and game.tholian.location.j == QUADSIZE-1:
     elif game.tholian.location.i == 0 and game.tholian.location.j == QUADSIZE-1:
-       id.i = QUADSIZE-1; id.j = QUADSIZE-1
+       tid.i = QUADSIZE-1; tid.j = QUADSIZE-1
     elif game.tholian.location.i == QUADSIZE-1 and game.tholian.location.j == QUADSIZE-1:
     elif game.tholian.location.i == QUADSIZE-1 and game.tholian.location.j == QUADSIZE-1:
-       id.i = QUADSIZE-1; id.j = 0
+       tid.i = QUADSIZE-1; tid.j = 0
     elif game.tholian.location.i == QUADSIZE-1 and game.tholian.location.j == 0:
     elif game.tholian.location.i == QUADSIZE-1 and game.tholian.location.j == 0:
-       id.i = 0; id.j = 0
+       tid.i = 0; tid.j = 0
     else:
        # something is wrong! 
        game.tholian.move(None)
         prout("***Internal error: Tholian in a bad spot.")
        return
     # do nothing if we are blocked 
     else:
        # something is wrong! 
        game.tholian.move(None)
         prout("***Internal error: Tholian in a bad spot.")
        return
     # do nothing if we are blocked 
-    if game.quad[id.i][id.j] not in ('.', '#'):
+    if game.quad[tid.i][tid.j] not in ('.', '#'):
        return
     here = copy.copy(game.tholian.location)
        return
     here = copy.copy(game.tholian.location)
-    delta = (id - game.tholian.location).sgn()
+    delta = (tid - game.tholian.location).sgn()
     # move in x axis 
     # move in x axis 
-    while here.i != id.i:
+    while here.i != tid.i:
         here.i += delta.i
         if game.quad[here.i][here.j]=='.':
             game.tholian.move(here)
     # move in y axis 
         here.i += delta.i
         if game.quad[here.i][here.j]=='.':
             game.tholian.move(here)
     # move in y axis 
-    while here.j != id.j:
+    while here.j != tid.j:
         here.j += delta.j
         if game.quad[here.i][here.j]=='.':
             game.tholian.move(here)
         here.j += delta.j
         if game.quad[here.i][here.j]=='.':
             game.tholian.move(here)
@@ -887,25 +897,25 @@ def doshield(shraise):
                    action = "SHDN"
        if action=="NONE":
            proutn(_("Do you wish to change shield energy? "))
                    action = "SHDN"
        if action=="NONE":
            proutn(_("Do you wish to change shield energy? "))
-           if ja() == True:
+           if ja():
                action = "NRG"
            elif damaged(DSHIELD):
                prout(_("Shields damaged and down."))
                return
            elif game.shldup:
                proutn(_("Shields are up. Do you want them down? "))
                action = "NRG"
            elif damaged(DSHIELD):
                prout(_("Shields damaged and down."))
                return
            elif game.shldup:
                proutn(_("Shields are up. Do you want them down? "))
-               if ja() == True:
+               if ja():
                    action = "SHDN"
                else:
                    scanner.chew()
                    return
            else:
                proutn(_("Shields are down. Do you want them up? "))
                    action = "SHDN"
                else:
                    scanner.chew()
                    return
            else:
                proutn(_("Shields are down. Do you want them up? "))
-               if ja() == True:
+               if ja():
                    action = "SHUP"
                else:
                    scanner.chew()
                    action = "SHUP"
                else:
                    scanner.chew()
-                   return    
+                   return
     if action == "SHUP": # raise shields 
        if game.shldup:
            prout(_("Shields already up."))
     if action == "SHUP": # raise shields 
        if game.shldup:
            prout(_("Shields already up."))
@@ -994,10 +1004,10 @@ def randdevice():
     )
     assert(sum(weights) == 1000)
     idx = randrange(1000)
     )
     assert(sum(weights) == 1000)
     idx = randrange(1000)
-    sum = 0
+    wsum = 0
     for (i, w) in enumerate(weights):
     for (i, w) in enumerate(weights):
-       sum += w
-       if idx < sum:
+       wsum += w
+       if idx < wsum:
            return i
     return None;       # we should never get here
 
            return i
     return None;       # we should never get here
 
@@ -1019,16 +1029,17 @@ def collision(rammed, enemy):
        proutn(_(" (original position)"))
     skip(1)
     deadkl(enemy.location, enemy.type, game.sector)
        proutn(_(" (original position)"))
     skip(1)
     deadkl(enemy.location, enemy.type, game.sector)
-    proutn("***" + crmship() + " heavily damaged.")
+    proutn("***" + crmshp() + " heavily damaged.")
     icas = randrange(10, 30)
     icas = randrange(10, 30)
-    prout(_("***Sickbay reports %d casualties"), icas)
+    prout(_("***Sickbay reports %d casualties") % icas)
     game.casual += icas
     game.state.crew -= icas
     # In the pre-SST2K version, all devices got equiprobably damaged,
     # which was silly.  Instead, pick up to half the devices at
     # random according to our weighting table,
     ncrits = randrange(NDEVICES/2)
     game.casual += icas
     game.state.crew -= icas
     # In the pre-SST2K version, all devices got equiprobably damaged,
     # which was silly.  Instead, pick up to half the devices at
     # random according to our weighting table,
     ncrits = randrange(NDEVICES/2)
-    for m in range(ncrits):
+    while ncrits > 0:
+        ncrits -= 1
        dev = randdevice()
        if game.damage[dev] < 0:
            continue
        dev = randdevice()
        if game.damage[dev] < 0:
            continue
@@ -1053,7 +1064,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
     ac = bearing + 0.25*dispersion     # dispersion is a random variable
     bullseye = (15.0 - bearing)*0.5235988
     track = course(bearing=ac, distance=QUADSIZE, origin=cartesian(origin)) 
     ac = bearing + 0.25*dispersion     # dispersion is a random variable
     bullseye = (15.0 - bearing)*0.5235988
     track = course(bearing=ac, distance=QUADSIZE, origin=cartesian(origin)) 
-    bumpto = coord(0, 0)
+    bumpto = Coord(0, 0)
     # Loop to move a single torpedo 
     setwnd(message_window)
     for step in range(1, QUADSIZE*2):
     # Loop to move a single torpedo 
     setwnd(message_window)
     for step in range(1, QUADSIZE*2):
@@ -1062,7 +1073,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
        if not w.valid_sector():
            break
        iquad=game.quad[w.i][w.j]
        if not w.valid_sector():
            break
        iquad=game.quad[w.i][w.j]
-       tracktorpedo(origin, w, step, number, nburst, iquad)
+       tracktorpedo(w, step, number, nburst, iquad)
        if iquad=='.':
            continue
        # hit something 
        if iquad=='.':
            continue
        # hit something 
@@ -1096,7 +1107,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
             prout(_(" displaced by blast to Sector %s ") % bumpto)
             for enemy in game.enemies:
                 enemy.kdist = enemy.kavgd = (game.sector-enemy.location).distance()
             prout(_(" displaced by blast to Sector %s ") % bumpto)
             for enemy in game.enemies:
                 enemy.kdist = enemy.kavgd = (game.sector-enemy.location).distance()
-            game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+            sortenemies()
             return None
        elif iquad in ('C', 'S', 'R', 'K'): # Hit a regular enemy 
            # find the enemy 
             return None
        elif iquad in ('C', 'S', 'R', 'K'): # Hit a regular enemy 
            # find the enemy 
@@ -1139,7 +1150,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
                 game.quad[bumpto.i][bumpto.j]=iquad
                 for enemy in game.enemies:
                     enemy.kdist = enemy.kavgd = (game.sector-enemy.location).distance()
                 game.quad[bumpto.i][bumpto.j]=iquad
                 for enemy in game.enemies:
                     enemy.kdist = enemy.kavgd = (game.sector-enemy.location).distance()
-                game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+                sortenemies()
             return None
        elif iquad == 'B': # Hit a base 
            skip(1)
             return None
        elif iquad == 'B': # Hit a base 
            skip(1)
@@ -1199,7 +1210,6 @@ def torpedo(origin, bearing, dispersion, number, nburst):
                # you can shove the Thingy and piss it off.
                # It then becomes an enemy and may fire at you.
                thing.angry = True
                # you can shove the Thingy and piss it off.
                # It then becomes an enemy and may fire at you.
                thing.angry = True
-               shoved = True
            return None
        elif iquad == ' ': # Black hole 
            skip(1)
            return None
        elif iquad == ' ': # Black hole 
            skip(1)
@@ -1211,7 +1221,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
            return None
        elif iquad == 'T':  # Hit a Tholian 
            h1 = 700.0 + randrange(100) - \
            return None
        elif iquad == 'T':  # Hit a Tholian 
            h1 = 700.0 + randrange(100) - \
-               1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-angle))
+               1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-track.angle))
            h1 = math.fabs(h1)
            if h1 >= 600:
                game.quad[w.i][w.j] = '.'
            h1 = math.fabs(h1)
            if h1 >= 600:
                game.quad[w.i][w.j] = '.'
@@ -1247,7 +1257,8 @@ def fry(hit):
     proutn(_("***CRITICAL HIT--"))
     # Select devices and cause damage
     cdam = []
     proutn(_("***CRITICAL HIT--"))
     # Select devices and cause damage
     cdam = []
-    for loop1 in range(ncrit):
+    while ncrit > 0:
+        ncrit -= 1
         while True:
            j = randdevice()
            # Cheat to prevent shuttle damage unless on ship 
         while True:
            j = randdevice()
            # Cheat to prevent shuttle damage unless on ship 
@@ -1278,7 +1289,7 @@ def attack(torps_ok):
     attempt = False; ihurt = False;
     hitmax=0.0; hittot=0.0; chgfac=1.0
     where = "neither"
     attempt = False; ihurt = False;
     hitmax=0.0; hittot=0.0; chgfac=1.0
     where = "neither"
-    if idebug:
+    if game.idebug:
        prout("=== ATTACK!")
     # Tholian gets to move before attacking 
     if game.tholian:
        prout("=== ATTACK!")
     # Tholian gets to move before attacking 
     if game.tholian:
@@ -1329,7 +1340,7 @@ def attack(torps_ok):
            enemy.power *= 0.75
        else: # Enemy uses photon torpedo 
            # We should be able to make the bearing() method work here
            enemy.power *= 0.75
        else: # Enemy uses photon torpedo 
            # We should be able to make the bearing() method work here
-           course = 1.90985*math.atan2(game.sector.j-enemy.location.j, enemy.location.i-game.sector.i)
+           pcourse = 1.90985*math.atan2(game.sector.j-enemy.location.j, enemy.location.i-game.sector.i)
            hit = 0
            proutn(_("***TORPEDO INCOMING"))
            if not damaged(DSRSENS):
            hit = 0
            proutn(_("***TORPEDO INCOMING"))
            if not damaged(DSRSENS):
@@ -1338,7 +1349,7 @@ def attack(torps_ok):
            prout("  ")
            dispersion = (randreal()+randreal())*0.5 - 0.5
            dispersion += 0.002*enemy.power*dispersion
            prout("  ")
            dispersion = (randreal()+randreal())*0.5 - 0.5
            dispersion += 0.002*enemy.power*dispersion
-           hit = torpedo(enemy.location, course, dispersion, number=1, nburst=1)
+           hit = torpedo(enemy.location, pcourse, dispersion, number=1, nburst=1)
            if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)==0:
                finish(FWON); # Klingons did themselves in! 
            if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova or game.alldone:
            if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)==0:
                finish(FWON); # Klingons did themselves in! 
            if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova or game.alldone:
@@ -1350,7 +1361,7 @@ def attack(torps_ok):
            # shields will take hits 
            propor = pfac * game.shield
             if game.condition =="docked":
            # shields will take hits 
            propor = pfac * game.shield
             if game.condition =="docked":
-                propr *= 2.1
+                propor *= 2.1
            if propor < 0.1:
                propor = 0.1
            hitsh = propor*chgfac*hit+1.0
            if propor < 0.1:
                propor = 0.1
            hitsh = propor*chgfac*hit+1.0
@@ -1412,7 +1423,7 @@ def attack(torps_ok):
     # After attack, reset average distance to enemies 
     for enemy in game.enemies:
        enemy.kavgd = enemy.kdist
     # After attack, reset average distance to enemies 
     for enemy in game.enemies:
        enemy.kavgd = enemy.kdist
-    game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+    sortenemies()
     return
                
 def deadkl(w, type, mv):
     return
                
 def deadkl(w, type, mv):
@@ -1469,11 +1480,11 @@ def targetcheck(w):
     if not w.valid_sector():
        huh()
        return None
     if not w.valid_sector():
        huh()
        return None
-    delta = coord()
+    delta = Coord()
     # FIXME: C code this was translated from is wacky -- why the sign reversal?
     delta.j = (w.j - game.sector.j);
     delta.i = (game.sector.i - w.i);
     # FIXME: C code this was translated from is wacky -- why the sign reversal?
     delta.j = (w.j - game.sector.j);
     delta.i = (game.sector.i - w.i);
-    if delta == coord(0, 0):
+    if delta == Coord(0, 0):
        skip(1)
        prout(_("Spock-  \"Bridge to sickbay.  Dr. McCoy,"))
        prout(_("  I recommend an immediate review of"))
        skip(1)
        prout(_("Spock-  \"Bridge to sickbay.  Dr. McCoy,"))
        prout(_("  I recommend an immediate review of"))
@@ -1484,7 +1495,7 @@ def targetcheck(w):
 
 def torps():
     "Launch photon torpedo salvo."
 
 def torps():
     "Launch photon torpedo salvo."
-    course = []
+    tcourse = []
     game.ididit = False
     if damaged(DPHOTON):
        prout(_("Photon tubes damaged."))
     game.ididit = False
     if damaged(DPHOTON):
        prout(_("Photon tubes damaged."))
@@ -1528,15 +1539,15 @@ def torps():
            # direct all torpedoes at one target 
            while i < n:
                target.append(target[0])
            # direct all torpedoes at one target 
            while i < n:
                target.append(target[0])
-               course.append(course[0])
+               tcourse.append(tcourse[0])
                i += 1
            break
         scanner.push(scanner.token)
         target.append(scanner.getcoord())
         if target[-1] == None:
             return
                i += 1
            break
         scanner.push(scanner.token)
         target.append(scanner.getcoord())
         if target[-1] == None:
             return
-        course.append(targetcheck(target[-1]))
-        if course[-1] == None:
+        tcourse.append(targetcheck(target[-1]))
+        if tcourse[-1] == None:
            return
     scanner.chew()
     if len(target) == 0:
            return
     scanner.chew()
     if len(target) == 0:
@@ -1547,8 +1558,8 @@ def torps():
             target.append(scanner.getcoord())
             if target[-1] == None:
                 return
             target.append(scanner.getcoord())
             if target[-1] == None:
                 return
-            course.append(targetcheck(target[-1]))
-            if course[-1] == None:
+            tcourse.append(targetcheck(target[-1]))
+            if tcourse[-1] == None:
                 return
     game.ididit = True
     # Loop for moving <n> torpedoes 
                 return
     game.ididit = True
     # Loop for moving <n> torpedoes 
@@ -1572,10 +1583,10 @@ def torps():
            break
        if game.shldup or game.condition == "docked":
            dispersion *= 1.0 + 0.0001*game.shield
            break
        if game.shldup or game.condition == "docked":
            dispersion *= 1.0 + 0.0001*game.shield
-       torpedo(game.sector, course[i], dispersion, number=i, nburst=n)
+       torpedo(game.sector, tcourse[i], dispersion, number=i, nburst=n)
        if game.alldone or game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova:
            return
        if game.alldone or game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova:
            return
-    if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)==0:
+    if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)<=0:
        finish(FWON);
 
 def overheat(rpow):
        finish(FWON);
 
 def overheat(rpow):
@@ -1624,8 +1635,8 @@ def checkshctrl(rpow):
 
 def hittem(hits):
     "Register a phaser hit on Klingons and Romulans."
 
 def hittem(hits):
     "Register a phaser hit on Klingons and Romulans."
-    nenhr2 = len(game.enemies); kk=0
-    w = coord()
+    kk = 0
+    w = Coord()
     skip(1)
     for (k, wham) in enumerate(hits):
        if wham==0:
     skip(1)
     for (k, wham) in enumerate(hits):
        if wham==0:
@@ -1948,7 +1959,7 @@ def cancelrest():
     if game.resting:
        skip(1)
        proutn(_("Mr. Spock-  \"Captain, shall we cancel the rest period?\""))
     if game.resting:
        skip(1)
        proutn(_("Mr. Spock-  \"Captain, shall we cancel the rest period?\""))
-       if ja() == True:
+       if ja():
            game.resting = False
            game.optime = 0.0
            return True
            game.resting = False
            game.optime = 0.0
            return True
@@ -1959,8 +1970,8 @@ def events():
     i=0
     fintim = game.state.date + game.optime; yank=0
     ictbeam = False; istract = False
     i=0
     fintim = game.state.date + game.optime; yank=0
     ictbeam = False; istract = False
-    w = coord(); hold = coord()
-    ev = event(); ev2 = event()
+    w = Coord(); hold = Coord()
+    ev = Event(); ev2 = Event()
 
     def tractorbeam(yank):
         "Tractor-beaming cases merge here." 
 
     def tractorbeam(yank):
         "Tractor-beaming cases merge here." 
@@ -2041,7 +2052,7 @@ def events():
             game.isatb = 0
         else:
             game.battle.invalidate()
             game.isatb = 0
         else:
             game.battle.invalidate()
-    if idebug:
+    if game.idebug:
        prout("=== EVENTS from %.2f to %.2f:" % (game.state.date, fintim))
        for i in range(1, NEVENTS):
            if   i == FSNOVA:  proutn("=== Supernova       ")
        prout("=== EVENTS from %.2f to %.2f:" % (game.state.date, fintim))
        for i in range(1, NEVENTS):
            if   i == FSNOVA:  proutn("=== Supernova       ")
@@ -2070,7 +2081,7 @@ def events():
        for l in range(1, NEVENTS):
            if game.future[l].date < datemin:
                evcode = l
        for l in range(1, NEVENTS):
            if game.future[l].date < datemin:
                evcode = l
-               if idebug:
+               if game.idebug:
                    prout("== Event %d fires" % evcode)
                datemin = game.future[l].date
        xtime = datemin-game.state.date
                    prout("== Event %d fires" % evcode)
                datemin = game.future[l].date
        xtime = datemin-game.state.date
@@ -2166,13 +2177,13 @@ def events():
                 for ibq in game.state.baseq:
                    for cmdr in game.state.kcmdr: 
                        if ibq == cmdr and ibq != game.quadrant and ibq != game.state.kscmdr:
                 for ibq in game.state.baseq:
                    for cmdr in game.state.kcmdr: 
                        if ibq == cmdr and ibq != game.quadrant and ibq != game.state.kscmdr:
-                           raise ibq
+                           raise JumpOut
                 else:
                     # no match found -- try later 
                     schedule(FBATTAK, expran(0.3*game.intime))
                     unschedule(FCDBAS)
                     continue
                 else:
                     # no match found -- try later 
                     schedule(FBATTAK, expran(0.3*game.intime))
                     unschedule(FCDBAS)
                     continue
-            except coord:
+            except JumpOut:
                 pass
            # commander + starbase combination found -- launch attack 
            game.battle = ibq
                 pass
            # commander + starbase combination found -- launch attack 
            game.battle = ibq
@@ -2268,7 +2279,7 @@ def events():
                     break
             else:
                # can't seem to find one; ignore this call 
                     break
             else:
                # can't seem to find one; ignore this call 
-               if idebug:
+               if game.idebug:
                    prout("=== Couldn't find location for distress event.")
                continue
            # got one!!  Schedule its enslavement 
                    prout("=== Couldn't find location for distress event.")
                continue
            # got one!!  Schedule its enslavement 
@@ -2313,7 +2324,7 @@ def events():
                continue                # full right now 
            # reproduce one Klingon 
            w = ev.quadrant
                continue                # full right now 
            # reproduce one Klingon 
            w = ev.quadrant
-            m = coord()
+            m = Coord()
            if game.klhere >= MAXKLQUAD:
                 try:
                     # this quadrant not ok, pick an adjacent one 
            if game.klhere >= MAXKLQUAD:
                 try:
                     # this quadrant not ok, pick an adjacent one 
@@ -2325,10 +2336,10 @@ def events():
                             # check for this quad ok (not full & no snova) 
                             if q.klingons >= MAXKLQUAD or q.supernova:
                                 continue
                             # check for this quad ok (not full & no snova) 
                             if q.klingons >= MAXKLQUAD or q.supernova:
                                 continue
-                            raise "FOUNDIT"
+                            raise JumpOut
                     else:
                         continue       # search for eligible quadrant failed
                     else:
                         continue       # search for eligible quadrant failed
-                except "FOUNDIT":
+                except JumpOut:
                     w = m
            # deliver the child 
            game.state.remkl += 1
                     w = m
            # deliver the child 
            game.state.remkl += 1
@@ -2365,7 +2376,7 @@ def wait():
        return
     if delay >= game.state.remtime or len(game.enemies) != 0:
        proutn(_("Are you sure? "))
        return
     if delay >= game.state.remtime or len(game.enemies) != 0:
        proutn(_("Are you sure? "))
-       if ja() == False:
+       if not ja():
            return
     # Alternate resting periods (events) with attacks 
     game.resting = True
            return
     # Alternate resting periods (events) with attacks 
     game.resting = True
@@ -2401,8 +2412,8 @@ def wait():
 
 def nova(nov):
     "Star goes nova." 
 
 def nova(nov):
     "Star goes nova." 
-    course = (0.0, 10.5, 12.0, 1.5, 9.0, 0.0, 3.0, 7.5, 6.0, 4.5)
-    newc = coord(); neighbor = coord(); bump = coord(0, 0)
+    ncourse = (0.0, 10.5, 12.0, 1.5, 9.0, 0.0, 3.0, 7.5, 6.0, 4.5)
+    newc = Coord(); neighbor = Coord(); bump = Coord(0, 0)
     if withprob(0.05):
        # Wow! We've supernova'ed 
        supernova(game.quadrant)
     if withprob(0.05):
        # Wow! We've supernova'ed 
        supernova(game.quadrant)
@@ -2416,7 +2427,7 @@ def nova(nov):
     hits = [nov]
     kount = 0
     while hits:
     hits = [nov]
     kount = 0
     while hits:
-        offset = coord()
+        offset = Coord()
         start = hits.pop()
         for offset.i in range(-1, 1+1):
             for offset.j in range(-1, 1+1):
         start = hits.pop()
         for offset.i in range(-1, 1+1):
             for offset.j in range(-1, 1+1):
@@ -2482,7 +2493,7 @@ def nova(nov):
                         finish(FNOVA)
                         return
                     # add in course nova contributes to kicking starship
                         finish(FNOVA)
                         return
                     # add in course nova contributes to kicking starship
-                    bump += (game.sector-hits[mm]).sgn()
+                    bump += (game.sector-hits[-1]).sgn()
                 elif iquad == 'K': # kill klingon 
                     deadkl(neighbor, iquad, neighbor)
                 elif iquad in ('C','S','R'): # Damage/destroy big enemies 
                 elif iquad == 'K': # kill klingon 
                     deadkl(neighbor, iquad, neighbor)
                 elif iquad in ('C','S','R'): # Damage/destroy big enemies 
@@ -2493,7 +2504,7 @@ def nova(nov):
                     if game.enemies[ll].power <= 0.0:
                         deadkl(neighbor, iquad, neighbor)
                         break
                     if game.enemies[ll].power <= 0.0:
                         deadkl(neighbor, iquad, neighbor)
                         break
-                    newc = neighbor + neighbor - hits[mm]
+                    newc = neighbor + neighbor - hits[-1]
                     proutn(crmena(True, iquad, "sector", neighbor) + _(" damaged"))
                     if not newc.valid_sector():
                         # can't leave quadrant 
                     proutn(crmena(True, iquad, "sector", neighbor) + _(" damaged"))
                     if not newc.valid_sector():
                         # can't leave quadrant 
@@ -2515,17 +2526,17 @@ def nova(nov):
                     game.enemies[ll].move(newc)
     # Starship affected by nova -- kick it away. 
     dist = kount*0.1
                     game.enemies[ll].move(newc)
     # Starship affected by nova -- kick it away. 
     dist = kount*0.1
-    direc = course[3*(bump.i+1)+bump.j+2]
+    direc = ncourse[3*(bump.i+1)+bump.j+2]
     if direc == 0.0:
        dist = 0.0
     if dist == 0.0:
        return
     if direc == 0.0:
        dist = 0.0
     if dist == 0.0:
        return
-    course = course(bearing=direc, distance=dist)
-    game.optime = course.time(warp=4)
+    scourse = course(bearing=direc, distance=dist)
+    game.optime = scourse.time(warp=4)
     skip(1)
     prout(_("Force of nova displaces starship."))
     skip(1)
     prout(_("Force of nova displaces starship."))
-    imove(course, noattack=True)
-    game.optime = course.time(warp=4)
+    imove(scourse, noattack=True)
+    game.optime = scourse.time(warp=4)
     return
        
 def supernova(w):
     return
        
 def supernova(w):
@@ -2536,7 +2547,7 @@ def supernova(w):
     else:
        # Scheduled supernova -- select star at random. 
        stars = 0
     else:
        # Scheduled supernova -- select star at random. 
        stars = 0
-        nq = coord()
+        nq = Coord()
        for nq.i in range(GALSIZE):
            for nq.j in range(GALSIZE):
                stars += game.state.galaxy[nq.i][nq.j].stars
        for nq.i in range(GALSIZE):
            for nq.j in range(GALSIZE):
                stars += game.state.galaxy[nq.i][nq.j].stars
@@ -2550,9 +2561,9 @@ def supernova(w):
                    break
            if num <=0:
                break
                    break
            if num <=0:
                break
-       if idebug:
+       if game.idebug:
            proutn("=== Super nova here?")
            proutn("=== Super nova here?")
-           if ja() == True:
+           if ja():
                nq = game.quadrant
     if not nq == game.quadrant or game.justin:
        # it isn't here, or we just entered (treat as enroute) 
                nq = game.quadrant
     if not nq == game.quadrant or game.justin:
        # it isn't here, or we just entered (treat as enroute) 
@@ -2561,7 +2572,7 @@ def supernova(w):
            prout(_("Message from Starfleet Command       Stardate %.2f") % game.state.date)
            prout(_("     Supernova in Quadrant %s; caution advised.") % nq)
     else:
            prout(_("Message from Starfleet Command       Stardate %.2f") % game.state.date)
            prout(_("     Supernova in Quadrant %s; caution advised.") % nq)
     else:
-       ns = coord()
+       ns = Coord()
        # we are in the quadrant! 
        num = randrange(game.state.galaxy[nq.i][nq.j].stars) + 1
        for ns.i in range(QUADSIZE):
        # we are in the quadrant! 
        num = randrange(game.state.galaxy[nq.i][nq.j].stars) + 1
        for ns.i in range(QUADSIZE):
@@ -2653,7 +2664,6 @@ def selfdestruct():
     prout(_("SELF-DESTRUCT-SEQUENCE-WILL-BE-ABORTED"))
     skip(1)
     scanner.next()
     prout(_("SELF-DESTRUCT-SEQUENCE-WILL-BE-ABORTED"))
     skip(1)
     scanner.next()
-    scanner.chew()
     if game.passwd != scanner.token:
        prouts(_("PASSWORD-REJECTED;"))
        skip(1)
     if game.passwd != scanner.token:
        prouts(_("PASSWORD-REJECTED;"))
        skip(1)
@@ -2681,11 +2691,9 @@ def kaboom():
     skip(1)
     if len(game.enemies) != 0:
        whammo = 25.0 * game.energy
     skip(1)
     if len(game.enemies) != 0:
        whammo = 25.0 * game.energy
-       l=1
-       while l <= len(game.enemies):
+       for l in range(len(game.enemies)):
            if game.enemies[l].power*game.enemies[l].kdist <= whammo: 
                deadkl(game.enemies[l].location, game.quad[game.enemies[l].location.i][game.enemies[l].location.j], game.enemies[l].location)
            if game.enemies[l].power*game.enemies[l].kdist <= whammo: 
                deadkl(game.enemies[l].location, game.quad[game.enemies[l].location.i][game.enemies[l].location.j], game.enemies[l].location)
-           l += 1
     finish(FDILITHIUM)
                                
 def killrate():
     finish(FDILITHIUM)
                                
 def killrate():
@@ -2766,12 +2774,12 @@ def finish(ifin):
                    prout(_("Now you can retire and write your own Star Trek game!"))
                    skip(1)
                elif game.skill >= SKILL_EXPERT:
                    prout(_("Now you can retire and write your own Star Trek game!"))
                    skip(1)
                elif game.skill >= SKILL_EXPERT:
-                   if game.thawed and not idebug:
+                   if game.thawed and not game.idebug:
                        prout(_("You cannot get a citation, so..."))
                    else:
                        proutn(_("Do you want your Commodore Emeritus Citation printed? "))
                        scanner.chew()
                        prout(_("You cannot get a citation, so..."))
                    else:
                        proutn(_("Do you want your Commodore Emeritus Citation printed? "))
                        scanner.chew()
-                       if ja() == True:
+                       if ja():
                            igotit = True
            # Only grant long life if alive (original didn't!)
            skip(1)
                            igotit = True
            # Only grant long life if alive (original didn't!)
            skip(1)
@@ -2909,11 +2917,10 @@ def finish(ifin):
 def score():
     "Compute player's score."
     timused = game.state.date - game.indate
 def score():
     "Compute player's score."
     timused = game.state.date - game.indate
-    iskill = game.skill
     if (timused == 0 or (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) != 0) and timused < 5.0:
        timused = 5.0
     if (timused == 0 or (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) != 0) and timused < 5.0:
        timused = 5.0
-    perdate = killrate()
-    ithperd = 500*perdate + 0.5
+    game.perdate = killrate()
+    ithperd = 500*game.perdate + 0.5
     iwon = 0
     if game.gamewon:
        iwon = 100*game.skill
     iwon = 0
     if game.gamewon:
        iwon = 100*game.skill
@@ -2923,7 +2930,7 @@ def score():
        klship = 1
     else:
        klship = 2
        klship = 1
     else:
        klship = 2
-    iscore = 10*(game.inkling - game.state.remkl) \
+    game.score = 10*(game.inkling - game.state.remkl) \
              + 50*(game.incom - len(game.state.kcmdr)) \
              + ithperd + iwon \
              + 20*(game.inrom - game.state.nromrem) \
              + 50*(game.incom - len(game.state.kcmdr)) \
              + ithperd + iwon \
              + 20*(game.inrom - game.state.nromrem) \
@@ -2931,7 +2938,7 @@ def score():
             - game.state.nromrem \
              - badpoints()
     if not game.alive:
             - game.state.nromrem \
              - badpoints()
     if not game.alive:
-       iscore -= 200
+       game.score -= 200
     skip(2)
     prout(_("Your score --"))
     if game.inrom - game.state.nromrem:
     skip(2)
     prout(_("Your score --"))
     if game.inrom - game.state.nromrem:
@@ -2951,7 +2958,7 @@ def score():
              (game.inscom - game.state.nscrem, 200*(game.inscom - game.state.nscrem)))
     if ithperd:
        prout(_("%6.2f Klingons per stardate              %5d") %
              (game.inscom - game.state.nscrem, 200*(game.inscom - game.state.nscrem)))
     if ithperd:
        prout(_("%6.2f Klingons per stardate              %5d") %
-             (perdate, ithperd))
+             (game.perdate, ithperd))
     if game.state.starkl:
        prout(_("%6d stars destroyed by your action     %5d") %
              (game.state.starkl, -5*game.state.starkl))
     if game.state.starkl:
        prout(_("%6d stars destroyed by your action     %5d") %
              (game.state.starkl, -5*game.state.starkl))
@@ -2987,7 +2994,7 @@ def score():
        elif game.skill ==  SKILL_EMERITUS:     proutn(_("Emeritus game"))
        prout("           %5d" % iwon)
     skip(1)
        elif game.skill ==  SKILL_EMERITUS:     proutn(_("Emeritus game"))
        prout("           %5d" % iwon)
     skip(1)
-    prout(_("TOTAL SCORE                               %5d") % iscore)
+    prout(_("TOTAL SCORE                               %5d") % game.score)
 
 def plaque():
     "Emit winner's commemmorative plaque." 
 
 def plaque():
     "Emit winner's commemmorative plaque." 
@@ -3043,8 +3050,8 @@ def plaque():
     timestring = time.ctime()
     fp.write(_("                                                 This day of %.6s %.4s, %.8s\n\n") %
                     (timestring+4, timestring+20, timestring+11))
     timestring = time.ctime()
     fp.write(_("                                                 This day of %.6s %.4s, %.8s\n\n") %
                     (timestring+4, timestring+20, timestring+11))
-    fp.write(_("                                                        Your score:  %d\n\n") % iscore)
-    fp.write(_("                                                    Klingons per stardate:  %.2f\n") % perdate)
+    fp.write(_("                                                        Your score:  %d\n\n") % game.score)
+    fp.write(_("                                                    Klingons per stardate:  %.2f\n") % game.perdate)
     fp.close()
 
 # Code from io.c begins here
     fp.close()
 
 # Code from io.c begins here
@@ -3066,7 +3073,7 @@ def iostart():
     "for some recent versions of python2, the following enables UTF8"
     "for the older ones we probably need to set C locale, and the python3"
     "has no problems at all"
     "for some recent versions of python2, the following enables UTF8"
     "for the older ones we probably need to set C locale, and the python3"
     "has no problems at all"
-    if sys.version_info.major < 3:
+    if sys.version_info[0] < 3:
        import locale
        locale.setlocale(locale.LC_ALL, "")
     gettext.bindtextdomain("sst", "/usr/local/share/locale")
        import locale
        locale.setlocale(locale.LC_ALL, "")
     gettext.bindtextdomain("sst", "/usr/local/share/locale")
@@ -3144,24 +3151,18 @@ def pause_game():
         sys.stdout.write('\n')
         proutn(prompt)
         raw_input()
         sys.stdout.write('\n')
         proutn(prompt)
         raw_input()
-        for j in range(rows):
-            sys.stdout.write('\n')
+        sys.stdout.write('\n' * rows)
         linecount = 0
 
 def skip(i):
     "Skip i lines.  Pause game if this would cause a scrolling event."
     for dummy in range(i):
        if game.options & OPTION_CURSES:
         linecount = 0
 
 def skip(i):
     "Skip i lines.  Pause game if this would cause a scrolling event."
     for dummy in range(i):
        if game.options & OPTION_CURSES:
-            (y, x) = curwnd.getyx()
-            (my, mx) = curwnd.getmaxyx()
-           if curwnd == message_window and y >= my - 2:
-               pause_game()
-               clrscr()
-           else:
-                try:
-                    curwnd.move(y+1, 0)
-                except curses.error:
-                    pass
+           (y, x) = curwnd.getyx()
+           try:
+               curwnd.move(y+1, 0)
+           except curses.error:
+               pass
        else:
             global linecount
            linecount += 1
        else:
             global linecount
            linecount += 1
@@ -3173,6 +3174,11 @@ def skip(i):
 def proutn(line):
     "Utter a line with no following line feed."
     if game.options & OPTION_CURSES:
 def proutn(line):
     "Utter a line with no following line feed."
     if game.options & OPTION_CURSES:
+       (y, x) = curwnd.getyx()
+       (my, mx) = curwnd.getmaxyx()
+       if curwnd == message_window and y >= my - 2:
+           pause_game()
+           clrscr()
        curwnd.addstr(line)
        curwnd.refresh()
     else:
        curwnd.addstr(line)
        curwnd.refresh()
     else:
@@ -3339,7 +3345,7 @@ def warble():
        #nosound()
         pass
 
        #nosound()
         pass
 
-def tracktorpedo(origin, w, step, i, n, iquad):
+def tracktorpedo(w, step, i, n, iquad):
     "Torpedo-track animation." 
     if not game.options & OPTION_CURSES:
        if step == 1:
     "Torpedo-track animation." 
     if not game.options & OPTION_CURSES:
        if step == 1:
@@ -3399,9 +3405,9 @@ def prstat(txt, data):
 
 # Code from moving.c begins here
 
 
 # Code from moving.c begins here
 
-def imove(course=None, noattack=False):
+def imove(icourse=None, noattack=False):
     "Movement execution for warp, impulse, supernova, and tractor-beam events."
     "Movement execution for warp, impulse, supernova, and tractor-beam events."
-    w = coord()
+    w = Coord()
 
     def newquadrant(noattack):
         # Leaving quadrant -- allow final enemy attack 
 
     def newquadrant(noattack):
         # Leaving quadrant -- allow final enemy attack 
@@ -3422,17 +3428,17 @@ def imove(course=None, noattack=False):
         kinks = 0
         while True:
             kink = False
         kinks = 0
         while True:
             kink = False
-            if course.final.i < 0:
-                course.final.i = -course.final.i
+            if icourse.final.i < 0:
+                icourse.final.i = -icourse.final.i
                 kink = True
                 kink = True
-            if course.final.j < 0:
-                course.final.j = -course.final.j
+            if icourse.final.j < 0:
+                icourse.final.j = -icourse.final.j
                 kink = True
                 kink = True
-            if course.final.i >= GALSIZE*QUADSIZE:
-                course.final.i = (GALSIZE*QUADSIZE*2) - course.final.i
+            if icourse.final.i >= GALSIZE*QUADSIZE:
+                icourse.final.i = (GALSIZE*QUADSIZE*2) - icourse.final.i
                 kink = True
                 kink = True
-            if course.final.j >= GALSIZE*QUADSIZE:
-                course.final.j = (GALSIZE*QUADSIZE*2) - course.final.j
+            if icourse.final.j >= GALSIZE*QUADSIZE:
+                icourse.final.j = (GALSIZE*QUADSIZE*2) - icourse.final.j
                 kink = True
             if kink:
                 kinks += 1
                 kink = True
             if kink:
                 kinks += 1
@@ -3451,8 +3457,8 @@ def imove(course=None, noattack=False):
         # Compute final position in new quadrant 
         if trbeam: # Don't bother if we are to be beamed 
             return
         # Compute final position in new quadrant 
         if trbeam: # Don't bother if we are to be beamed 
             return
-        game.quadrant = course.final.quadrant()
-        game.sector = course.final.sector()
+        game.quadrant = icourse.final.quadrant()
+        game.sector = icourse.final.sector()
         skip(1)
         prout(_("Entering Quadrant %s.") % game.quadrant)
         game.quad[game.sector.i][game.sector.j] = game.ship
         skip(1)
         prout(_("Entering Quadrant %s.") % game.quadrant)
         game.quad[game.sector.i][game.sector.j] = game.ship
@@ -3464,7 +3470,7 @@ def imove(course=None, noattack=False):
         iquad = game.quad[h.i][h.j]
         if iquad != '.':
             # object encountered in flight path 
         iquad = game.quad[h.i][h.j]
         if iquad != '.':
             # object encountered in flight path 
-            stopegy = 50.0*course.distance/game.optime
+            stopegy = 50.0*icourse.distance/game.optime
             if iquad in ('T', 'K', 'C', 'S', 'R', '?'):
                 for enemy in game.enemies:
                     if enemy.location == game.sector:
             if iquad in ('T', 'K', 'C', 'S', 'R', '?'):
                 for enemy in game.enemies:
                     if enemy.location == game.sector:
@@ -3514,17 +3520,17 @@ def imove(course=None, noattack=False):
     if game.state.date+game.optime >= scheduled(FTBEAM):
        trbeam = True
        game.condition = "red"
     if game.state.date+game.optime >= scheduled(FTBEAM):
        trbeam = True
        game.condition = "red"
-       course.distance = course.distance*(scheduled(FTBEAM)-game.state.date)/game.optime + 0.1
+       icourse.distance = icourse.distance*(scheduled(FTBEAM)-game.state.date)/game.optime + 0.1
        game.optime = scheduled(FTBEAM) - game.state.date + 1e-5
     # Move out
     game.quad[game.sector.i][game.sector.j] = '.'
        game.optime = scheduled(FTBEAM) - game.state.date + 1e-5
     # Move out
     game.quad[game.sector.i][game.sector.j] = '.'
-    for m in range(course.moves):
-        course.next()
-        w = course.sector()
-        if course.origin.quadrant() != course.location.quadrant():
+    for m in range(icourse.moves):
+        icourse.next()
+        w = icourse.sector()
+        if icourse.origin.quadrant() != icourse.location.quadrant():
             newquadrant(noattack)
             break
             newquadrant(noattack)
             break
-        elif check_collision(w):
+        elif check_collision(icourse, w):
             print "Collision detected"
             break
         else:
             print "Collision detected"
             break
         else:
@@ -3536,7 +3542,7 @@ def imove(course=None, noattack=False):
             finald = (w-enemy.location).distance()
             enemy.kavgd = 0.5 * (finald + enemy.kdist)
             enemy.kdist = finald
             finald = (w-enemy.location).distance()
             enemy.kavgd = 0.5 * (finald + enemy.kdist)
             enemy.kdist = finald
-        game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+        sortenemies()
         if not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova:
             attack(torps_ok=False)
         for enemy in game.enemies:
         if not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova:
             attack(torps_ok=False)
         for enemy in game.enemies:
@@ -3589,7 +3595,7 @@ def getcourse(isprobe):
     dquad = copy.copy(game.quadrant)
     navmode = "unspecified"
     itemp = "curt"
     dquad = copy.copy(game.quadrant)
     navmode = "unspecified"
     itemp = "curt"
-    dsect = coord()
+    dsect = Coord()
     iprompt = False
     if game.landed and not isprobe:
        prout(_("Dummy! You can't leave standard orbit until you"))
     iprompt = False
     if game.landed and not isprobe:
        prout(_("Dummy! You can't leave standard orbit until you"))
@@ -3631,7 +3637,7 @@ def getcourse(isprobe):
                prout(_("(Manual movement assumed.)"))
            navmode = "manual"
            break
                prout(_("(Manual movement assumed.)"))
            navmode = "manual"
            break
-    delta = coord()
+    delta = Coord()
     if navmode == "automatic":
        while key == "IHEOL":
            if isprobe:
     if navmode == "automatic":
        while key == "IHEOL":
            if isprobe:
@@ -3731,7 +3737,7 @@ class course:
             self.origin = cartesian(game.quadrant, game.sector)
         else:
             self.origin = cartesian(game.quadrant, origin)
             self.origin = cartesian(game.quadrant, game.sector)
         else:
             self.origin = cartesian(game.quadrant, origin)
-        self.increment = coord(-math.sin(self.angle), math.cos(self.angle))
+        self.increment = Coord(-math.sin(self.angle), math.cos(self.angle))
         bigger = max(abs(self.increment.i), abs(self.increment.j))
         self.increment /= bigger
         self.moves = int(round(10*self.distance*bigger))
         bigger = max(abs(self.increment.i), abs(self.increment.j))
         self.increment /= bigger
         self.moves = int(round(10*self.distance*bigger))
@@ -3793,7 +3799,7 @@ def impulse():
        prout(_("First Officer Spock- \"Captain, our speed under impulse"))
        prout(_("power is only 0.95 sectors per stardate. Are you sure"))
        proutn(_("we dare spend the time?\" "))
        prout(_("First Officer Spock- \"Captain, our speed under impulse"))
        prout(_("power is only 0.95 sectors per stardate. Are you sure"))
        proutn(_("we dare spend the time?\" "))
-       if ja() == False:
+       if not ja():
            return
     # Activate impulse engines and pay the cost 
     imove(course, noattack=False)
            return
     # Activate impulse engines and pay the cost 
     imove(course, noattack=False)
@@ -3807,7 +3813,7 @@ def impulse():
        finish(FNRG)
     return
 
        finish(FNRG)
     return
 
-def warp(course, involuntary):
+def warp(wcourse, involuntary):
     "ove under warp drive."
     blooey = False; twarp = False
     if not involuntary: # Not WARPX entry 
     "ove under warp drive."
     blooey = False; twarp = False
     if not involuntary: # Not WARPX entry 
@@ -3824,21 +3830,21 @@ def warp(course, involuntary):
            prout(_("  is repaired, I can only give you warp 4.\""))
            return
                # Read in course and distance
            prout(_("  is repaired, I can only give you warp 4.\""))
            return
                # Read in course and distance
-        if course==None:
+        if wcourse==None:
             try:
             try:
-                course = getcourse(isprobe=False)
+                wcourse = getcourse(isprobe=False)
             except TrekError:
                 return
        # Make sure starship has enough energy for the trip
         # Note: this formula is slightly different from the C version,
         # and lets you skate a bit closer to the edge.
             except TrekError:
                 return
        # Make sure starship has enough energy for the trip
         # Note: this formula is slightly different from the C version,
         # and lets you skate a bit closer to the edge.
-       if course.power(game.warpfac) >= game.energy:
+       if wcourse.power(game.warpfac) >= game.energy:
            # Insufficient power for trip 
            game.ididit = False
            skip(1)
            prout(_("Engineering to bridge--"))
            # Insufficient power for trip 
            game.ididit = False
            skip(1)
            prout(_("Engineering to bridge--"))
-           if not game.shldup or 0.5*power > game.energy:
-               iwarp = (game.energy/(course.dist+0.05)) ** 0.333333333
+           if not game.shldup or 0.5*wcourse.power(game.warpfac) > game.energy:
+               iwarp = (game.energy/(wcourse.dist+0.05)) ** 0.333333333
                if iwarp <= 0:
                    prout(_("We can't do it, Captain. We don't have enough energy."))
                else:
                if iwarp <= 0:
                    prout(_("We can't do it, Captain. We don't have enough energy."))
                else:
@@ -3852,7 +3858,7 @@ def warp(course, involuntary):
                prout(_("We haven't the energy to go that far with the shields up."))
            return                              
        # Make sure enough time is left for the trip 
                prout(_("We haven't the energy to go that far with the shields up."))
            return                              
        # Make sure enough time is left for the trip 
-       game.optime = course.time(game.warpfac)
+       game.optime = wcourse.time(game.warpfac)
        if game.optime >= 0.8*game.state.remtime:
            skip(1)
            prout(_("First Officer Spock- \"Captain, I compute that such"))
        if game.optime >= 0.8*game.state.remtime:
            skip(1)
            prout(_("First Officer Spock- \"Captain, I compute that such"))
@@ -3860,7 +3866,7 @@ def warp(course, involuntary):
                   (100.0*game.optime/game.state.remtime))
            prout(_(" percent of our"))
            proutn(_("  remaining time.  Are you sure this is wise?\" "))
                   (100.0*game.optime/game.state.remtime))
            prout(_(" percent of our"))
            proutn(_("  remaining time.  Are you sure this is wise?\" "))
-           if ja() == False:
+           if not ja():
                game.ididit = False
                game.optime=0 
                return
                game.ididit = False
                game.optime=0 
                return
@@ -3868,38 +3874,40 @@ def warp(course, involuntary):
     if game.warpfac > 6.0:
        # Decide if engine damage will occur
         # ESR: Seems wrong. Probability of damage goes *down* with distance? 
     if game.warpfac > 6.0:
        # Decide if engine damage will occur
         # ESR: Seems wrong. Probability of damage goes *down* with distance? 
-       prob = course.distance*(6.0-game.warpfac)**2/66.666666666
+       prob = wcourse.distance*(6.0-game.warpfac)**2/66.666666666
        if prob > randreal():
            blooey = True
        if prob > randreal():
            blooey = True
-           course.distance = randreal(course.distance)
+           wcourse.distance = randreal(wcourse.distance)
        # Decide if time warp will occur 
        # Decide if time warp will occur 
-       if 0.5*course.distance*math.pow(7.0,game.warpfac-10.0) > randreal():
+       if 0.5*wcourse.distance*math.pow(7.0,game.warpfac-10.0) > randreal():
            twarp = True
            twarp = True
-       if idebug and game.warpfac==10 and not twarp:
+       if game.idebug and game.warpfac==10 and not twarp:
            blooey = False
            proutn("=== Force time warp? ")
            blooey = False
            proutn("=== Force time warp? ")
-           if ja() == True:
+           if ja():
                twarp = True
        if blooey or twarp:
            # If time warp or engine damage, check path 
                twarp = True
        if blooey or twarp:
            # If time warp or engine damage, check path 
-           # If it is obstructed, don't do warp or damage 
-            for m in range(course.moves):
-                course.next()
-                w = course.sector()
+           # If it is obstructed, don't do warp or damage
+            look = wcourse.moves
+            while look > 0:
+                look -= 1
+                wcourse.next()
+                w = wcourse.sector()
                 if not w.valid_sector():
                     break
                if game.quad[w.i][w.j] != '.':
                    blooey = False
                    twarp = False
                 if not w.valid_sector():
                     break
                if game.quad[w.i][w.j] != '.':
                    blooey = False
                    twarp = False
-            course.reset()
+            wcourse.reset()
     # Activate Warp Engines and pay the cost 
     imove(course, noattack=False)
     if game.alldone:
        return
     # Activate Warp Engines and pay the cost 
     imove(course, noattack=False)
     if game.alldone:
        return
-    game.energy -= course.power(game.warpfac)
+    game.energy -= wcourse.power(game.warpfac)
     if game.energy <= 0:
        finish(FNRG)
     if game.energy <= 0:
        finish(FNRG)
-    game.optime = course.time(game.warpfac)
+    game.optime = wcourse.time(game.warpfac)
     if twarp:
        timwrp()
     if blooey:
     if twarp:
        timwrp()
     if blooey:
@@ -4107,7 +4115,7 @@ def probe():
         else:
             prout(_("%d probes left") % game.nprobes)
        proutn(_("Are you sure you want to fire a probe? "))
         else:
             prout(_("%d probes left") % game.nprobes)
        proutn(_("Are you sure you want to fire a probe? "))
-       if ja() == False:
+       if not ja():
            return
     game.isarmed = False
     if key == "IHALPHA" and scanner.token == "armed":
            return
     game.isarmed = False
     if key == "IHALPHA" and scanner.token == "armed":
@@ -4181,7 +4189,7 @@ def mayday():
        elif m == 2: proutn(_("2nd"))
        elif m == 3: proutn(_("3rd"))
        proutn(_(" attempt to re-materialize ") + crmshp())
        elif m == 2: proutn(_("2nd"))
        elif m == 3: proutn(_("3rd"))
        proutn(_(" attempt to re-materialize ") + crmshp())
-       game.quad[ix][iy]=('-','o','O')[m-1]
+       game.quad[game.sector.i][game.sector.j]=('-','o','O')[m-1]
         textcolor(RED)
        warble()
        if randreal() > probf:
         textcolor(RED)
        warble()
        if randreal() > probf:
@@ -4190,13 +4198,13 @@ def mayday():
         textcolor(DEFAULT)
        curses.delay_output(500)
     if m > 3:
         textcolor(DEFAULT)
        curses.delay_output(500)
     if m > 3:
-       game.quad[ix][iy]='?'
+       game.quad[game.sector.i][game.sector.j]='?'
        game.alive = False
        drawmaps(1)
        setwnd(message_window)
        finish(FMATERIALIZE)
        return
        game.alive = False
        drawmaps(1)
        setwnd(message_window)
        finish(FMATERIALIZE)
        return
-    game.quad[ix][iy]=game.ship
+    game.quad[game.sector.i][game.sector.j]=game.ship
     textcolor(GREEN);
     prout(_("succeeds."))
     textcolor(DEFAULT);
     textcolor(GREEN);
     prout(_("succeeds."))
     textcolor(DEFAULT);
@@ -4322,15 +4330,15 @@ def survey():
            continue
        if (game.state.planets[i].known != "unknown" \
             and not game.state.planets[i].inhabited) \
            continue
        if (game.state.planets[i].known != "unknown" \
             and not game.state.planets[i].inhabited) \
-            or idebug:
+            or game.idebug:
            iknow = True
            iknow = True
-           if idebug and game.state.planets[i].known=="unknown":
+           if game.idebug and game.state.planets[i].known=="unknown":
                proutn("(Unknown) ")
            proutn(_("Quadrant %s") % game.state.planets[i].quadrant)
            proutn(_("   class "))
            proutn(game.state.planets[i].pclass)
            proutn("   ")
                proutn("(Unknown) ")
            proutn(_("Quadrant %s") % game.state.planets[i].quadrant)
            proutn(_("   class "))
            proutn(game.state.planets[i].pclass)
            proutn("   ")
-           if game.state.planets[i].crystals != present:
+           if game.state.planets[i].crystals != "present":
                proutn(_("no "))
            prout(_("dilithium crystals present."))
            if game.state.planets[i].known=="shuttle_down": 
                proutn(_("no "))
            prout(_("dilithium crystals present."))
            if game.state.planets[i].known=="shuttle_down": 
@@ -4402,7 +4410,7 @@ def beam():
        if not damaged(DSHUTTL) and (game.iplnet.known=="shuttle_down" or game.iscraft == "onship"):
            skip(1)
            proutn(_("Spock-  \"May I suggest the shuttle craft, Sir?\" "))
        if not damaged(DSHUTTL) and (game.iplnet.known=="shuttle_down" or game.iscraft == "onship"):
            skip(1)
            proutn(_("Spock-  \"May I suggest the shuttle craft, Sir?\" "))
-           if ja() == True:
+            if ja():
                shuttle()
        return
     if not game.inorbit:
                shuttle()
        return
     if not game.inorbit:
@@ -4420,7 +4428,7 @@ def beam():
        prout(_("Spock-  \"Captain, I fail to see the logic in"))
        prout(_("  exploring a planet with no dilithium crystals."))
        proutn(_("  Are you sure this is wise?\" "))
        prout(_("Spock-  \"Captain, I fail to see the logic in"))
        prout(_("  exploring a planet with no dilithium crystals."))
        proutn(_("  Are you sure this is wise?\" "))
-       if ja() == False:
+       if not ja():
            scanner.chew()
            return
     if not (game.options & OPTION_PLAIN):
            scanner.chew()
            return
     if not (game.options & OPTION_PLAIN):
@@ -4436,14 +4444,14 @@ def beam():
            if game.iplnet.known == "shuttle_down":
                prout(_("  Although the Galileo shuttle craft may still be on a surface."))
            proutn(_("  Are you sure this is wise?\" "))
            if game.iplnet.known == "shuttle_down":
                prout(_("  Although the Galileo shuttle craft may still be on a surface."))
            proutn(_("  Are you sure this is wise?\" "))
-           if ja() == False:
+           if not ja():
                scanner.chew()
                return
     if game.landed:
        # Coming from planet 
        if game.iplnet.known=="shuttle_down":
            proutn(_("Spock-  \"Wouldn't you rather take the Galileo?\" "))
                scanner.chew()
                return
     if game.landed:
        # Coming from planet 
        if game.iplnet.known=="shuttle_down":
            proutn(_("Spock-  \"Wouldn't you rather take the Galileo?\" "))
-           if ja() == True:
+           if ja():
                scanner.chew()
                return
            prout(_("Your crew hides the Galileo to prevent capture by aliens."))
                scanner.chew()
                return
            prout(_("Your crew hides the Galileo to prevent capture by aliens."))
@@ -4526,7 +4534,7 @@ def usecrystals():
     prout(_("  raw dilithium crystals into the ship's power"))
     prout(_("  system may risk a severe explosion."))
     proutn(_("  Are you sure this is wise?\" "))
     prout(_("  raw dilithium crystals into the ship's power"))
     prout(_("  system may risk a severe explosion."))
     proutn(_("  Are you sure this is wise?\" "))
-    if ja() == False:
+    if not ja():
        scanner.chew()
        return
     skip(1)
        scanner.chew()
        return
     skip(1)
@@ -4595,7 +4603,7 @@ def shuttle():
               int(100*game.optime/game.state.remtime))
        prout(_("remaining time."))
        proutn(_("Are you sure this is wise?\" "))
               int(100*game.optime/game.state.remtime))
        prout(_("remaining time."))
        proutn(_("Are you sure this is wise?\" "))
-       if ja() == False:
+       if not ja():
            game.optime = 0.0
            return
     if game.landed:
            game.optime = 0.0
            return
     if game.landed:
@@ -4604,7 +4612,7 @@ def shuttle():
            # Galileo on ship! 
            if not damaged(DTRANSP):
                proutn(_("Spock-  \"Would you rather use the transporter?\" "))
            # Galileo on ship! 
            if not damaged(DTRANSP):
                proutn(_("Spock-  \"Would you rather use the transporter?\" "))
-               if ja() == True:
+               if ja():
                    beam()
                    return
                proutn(_("Shuttle crew"))
                    beam()
                    return
                proutn(_("Shuttle crew"))
@@ -4673,7 +4681,7 @@ def deathray():
     prout(_("Spock-  \"Captain, the 'Experimental Death Ray'"))
     prout(_("  is highly unpredictible.  Considering the alternatives,"))
     proutn(_("  are you sure this is wise?\" "))
     prout(_("Spock-  \"Captain, the 'Experimental Death Ray'"))
     prout(_("  is highly unpredictible.  Considering the alternatives,"))
     proutn(_("  are you sure this is wise?\" "))
-    if ja() == False:
+    if not ja():
        return
     prout(_("Spock-  \"Acknowledged.\""))
     skip(1)
        return
     prout(_("Spock-  \"Acknowledged.\""))
     skip(1)
@@ -4737,7 +4745,6 @@ def deathray():
        finish(FDRAY)
        return
     if r <= 0.75:
        finish(FDRAY)
        return
     if r <= 0.75:
-       intj
        prouts(_("Sulu- \"Captain!  It's   --WHAT?!?!\""))
        skip(2)
        proutn(_("Spock-  \"I believe the word is"))
        prouts(_("Sulu- \"Captain!  It's   --WHAT?!?!\""))
        skip(2)
        proutn(_("Spock-  \"I believe the word is"))
@@ -4782,7 +4789,7 @@ def attackreport(curt):
 def report():
     # report on general game status 
     scanner.chew()
 def report():
     # report on general game status 
     scanner.chew()
-    s1 = "" and game.thawed and _("thawed ")
+    s1 = (game.thawed and _("thawed ")) or ""
     s2 = {1:"short", 2:"medium", 4:"long"}[game.length]
     s3 = (None, _("novice"), _("fair"),
           _("good"), _("expert"), _("emeritus"))[game.skill]
     s2 = {1:"short", 2:"medium", 4:"long"}[game.length]
     s3 = (None, _("novice"), _("fair"),
           _("good"), _("expert"), _("emeritus"))[game.skill]
@@ -4865,7 +4872,7 @@ def lrscan(silent):
         if not silent:
             proutn(" ")
         for y in range(game.quadrant.j-1, game.quadrant.j+2):
         if not silent:
             proutn(" ")
         for y in range(game.quadrant.j-1, game.quadrant.j+2):
-           if not coord(x, y).valid_quadrant():
+           if not Coord(x, y).valid_quadrant():
                 if not silent:
                     proutn("  -1")
            else:
                 if not silent:
                     proutn("  -1")
            else:
@@ -5054,7 +5061,7 @@ def srscan():
                
 def eta():
     "Use computer to get estimated time of arrival for a warp jump."
                
 def eta():
     "Use computer to get estimated time of arrival for a warp jump."
-    w1 = coord(); w2 = coord()
+    w1 = Coord(); w2 = Coord()
     prompt = False
     if damaged(DCOMPTR):
        prout(_("COMPUTER DAMAGED, USE A POCKET CALCULATOR."))
     prompt = False
     if damaged(DCOMPTR):
        prout(_("COMPUTER DAMAGED, USE A POCKET CALCULATOR."))
@@ -5208,7 +5215,8 @@ def freeze(boss):
     fp.close()
 
 def thaw():
     fp.close()
 
 def thaw():
-    "Retrieve saved game." 
+    "Retrieve saved game."
+    global game
     game.passwd[0] = '\0'
     key = scanner.next()
     if key == "IHEOL":
     game.passwd[0] = '\0'
     key = scanner.next()
     if key == "IHEOL":
@@ -5230,7 +5238,7 @@ def thaw():
     return False
 
 # I used <http://www.memory-alpha.org> to find planets
     return False
 
 # I used <http://www.memory-alpha.org> to find planets
-# with references in ST:TOS.  Eath and the Alpha Centauri
+# with references in ST:TOS.  Earth and the Alpha Centauri
 # Colony have been omitted.
 # 
 # Some planets marked Class G and P here will be displayed as class M
 # Colony have been omitted.
 # 
 # Some planets marked Class G and P here will be displayed as class M
@@ -5302,7 +5310,7 @@ device = (
 
 def setup():
     "Prepare to play, set up cosmos."
 
 def setup():
     "Prepare to play, set up cosmos."
-    w = coord()
+    w = Coord()
     #  Decide how many of everything
     if choose():
        return # frozen game
     #  Decide how many of everything
     if choose():
        return # frozen game
@@ -5322,7 +5330,7 @@ def setup():
     for i in range(NDEVICES): 
        game.damage[i] = 0.0
     # Set up assorted game parameters
     for i in range(NDEVICES): 
        game.damage[i] = 0.0
     # Set up assorted game parameters
-    game.battle = coord()
+    game.battle = Coord()
     game.state.date = game.indate = 100.0 * randreal(20, 51)
     game.nkinks = game.nhelp = game.casual = game.abandoned = 0
     game.iscate = game.resting = game.imine = game.icrystl = game.icraft = False
     game.state.date = game.indate = 100.0 * randreal(20, 51)
     game.nkinks = game.nhelp = game.casual = game.abandoned = 0
     game.iscate = game.resting = game.imine = game.icrystl = game.icraft = False
@@ -5355,11 +5363,11 @@ def setup():
                distq = (w - game.state.baseq[j]).distance()
                if distq < 6.0*(BASEMAX+1-game.inbase) and withprob(0.75):
                    contflag = True
                distq = (w - game.state.baseq[j]).distance()
                if distq < 6.0*(BASEMAX+1-game.inbase) and withprob(0.75):
                    contflag = True
-                   if idebug:
+                   if game.idebug:
                        prout("=== Abandoning base #%d at %s" % (i, w))
                    break
                elif distq < 6.0 * (BASEMAX+1-game.inbase):
                        prout("=== Abandoning base #%d at %s" % (i, w))
                    break
                elif distq < 6.0 * (BASEMAX+1-game.inbase):
-                   if idebug:
+                   if game.idebug:
                        prout("=== Saving base #%d, close to #%d" % (i, j))
             if not contflag:
                 break
                        prout("=== Saving base #%d, close to #%d" % (i, j))
             if not contflag:
                 break
@@ -5400,7 +5408,7 @@ def setup():
             w = randplace(GALSIZE) 
             if game.state.galaxy[w.i][w.j].planet == None:
                 break
             w = randplace(GALSIZE) 
             if game.state.galaxy[w.i][w.j].planet == None:
                 break
-        new = planet()
+        new = Planet()
        new.quadrant = w
         new.crystals = "absent"
        if (game.options & OPTION_WORLDS) and i < NINHAB:
        new.quadrant = w
         new.crystals = "absent"
        if (game.options & OPTION_WORLDS) and i < NINHAB:
@@ -5577,7 +5585,7 @@ def choose():
     game.options &=~ OPTION_COLOR
     setpassword()
     if game.passwd == "debug":
     game.options &=~ OPTION_COLOR
     setpassword()
     if game.passwd == "debug":
-       idebug = True
+       game.idebug = True
        prout("=== Debug mode enabled.")
     # Use parameters to generate initial values of things
     game.damfac = 0.5 * game.skill
        prout("=== Debug mode enabled.")
     # Use parameters to generate initial values of things
     game.damfac = 0.5 * game.skill
@@ -5621,7 +5629,11 @@ def newcnd():
 
 def newkling():
     "Drop new Klingon into current quadrant."
 
 def newkling():
     "Drop new Klingon into current quadrant."
-    return enemy('K', loc=dropin(), power=randreal(300,450)+25.0*game.skill)
+    return Enemy('K', loc=dropin(), power=randreal(300,450)+25.0*game.skill)
+
+def sortenemies():
+    "Sort enemies by distance so 'nearest' is meaningful."
+    game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
 
 def newqad():
     "Set up a new state of quadrant, for when we enter or re-enter it."
 
 def newqad():
     "Set up a new state of quadrant, for when we enter or re-enter it."
@@ -5663,7 +5675,7 @@ def newqad():
            game.iscate = (game.state.remkl > 1)
     # Put in Romulans if needed
     for i in range(q.romulans):
            game.iscate = (game.state.remkl > 1)
     # Put in Romulans if needed
     for i in range(q.romulans):
-        enemy('R', loc=dropin(), power=randreal(400.0,850.0)+50.0*game.skill)
+        Enemy('R', loc=dropin(), power=randreal(400.0,850.0)+50.0*game.skill)
     # If quadrant needs a starbase, put it in
     if q.starbase:
        game.base = dropin('B')
     # If quadrant needs a starbase, put it in
     if q.starbase:
        game.base = dropin('B')
@@ -5688,7 +5700,7 @@ def newqad():
            prout(_("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!"))
     # Put in THING if needed
     if thing == game.quadrant:
            prout(_("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!"))
     # Put in THING if needed
     if thing == game.quadrant:
-        enemy(type='?', loc=dropin(),
+        Enemy(type='?', loc=dropin(),
                   power=randreal(6000,6500.0)+250.0*game.skill)
         if not damaged(DSRSENS):
             skip(1)
                   power=randreal(6000,6500.0)+250.0*game.skill)
         if not damaged(DSRSENS):
             skip(1)
@@ -5699,13 +5711,13 @@ def newqad():
        if (game.skill < SKILL_GOOD and withprob(0.02)) or \
            (game.skill == SKILL_GOOD and withprob(0.05)) or \
             (game.skill > SKILL_GOOD and withprob(0.08)):
        if (game.skill < SKILL_GOOD and withprob(0.02)) or \
            (game.skill == SKILL_GOOD and withprob(0.05)) or \
             (game.skill > SKILL_GOOD and withprob(0.08)):
-            w = coord()
+            w = Coord()
             while True:
                w.i = withprob(0.5) * (QUADSIZE-1)
                w.j = withprob(0.5) * (QUADSIZE-1)
                 if game.quad[w.i][w.j] == '.':
                     break
             while True:
                w.i = withprob(0.5) * (QUADSIZE-1)
                w.j = withprob(0.5) * (QUADSIZE-1)
                 if game.quad[w.i][w.j] == '.':
                     break
-            game.tholian = enemy(type='T', loc=w,
+            game.tholian = Enemy(type='T', loc=w,
                                  power=randrange(100, 500) + 25.0*game.skill)
            # Reserve unoccupied corners 
            if game.quad[0][0]=='.':
                                  power=randrange(100, 500) + 25.0*game.skill)
            # Reserve unoccupied corners 
            if game.quad[0][0]=='.':
@@ -5716,7 +5728,7 @@ def newqad():
                game.quad[QUADSIZE-1][0] = 'X'
            if game.quad[QUADSIZE-1][QUADSIZE-1]=='.':
                game.quad[QUADSIZE-1][QUADSIZE-1] = 'X'
                game.quad[QUADSIZE-1][0] = 'X'
            if game.quad[QUADSIZE-1][QUADSIZE-1]=='.':
                game.quad[QUADSIZE-1][QUADSIZE-1] = 'X'
-    game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+    sortenemies()
     # And finally the stars
     for i in range(q.stars):
        dropin('*')
     # And finally the stars
     for i in range(q.stars):
        dropin('*')
@@ -5747,8 +5759,9 @@ def setpassword():
                break
     else:
         game.passwd = ""
                break
     else:
         game.passwd = ""
-        for i in range(3):
-           game.passwd += chr(ord('a')+randrange(26))
+        game.passwd += chr(ord('a')+randrange(26))
+        game.passwd += chr(ord('a')+randrange(26))
+        game.passwd += chr(ord('a')+randrange(26))
 
 # Code from sst.c begins here
 
 
 # Code from sst.c begins here
 
@@ -5909,7 +5922,7 @@ def makemoves():
            if game.ididit:
                hitme = True
        elif cmd == "MOVE":             # move under warp
            if game.ididit:
                hitme = True
        elif cmd == "MOVE":             # move under warp
-           warp(course=None, involuntary=False)
+           warp(wcourse=None, involuntary=False)
        elif cmd == "SHIELDS":          # shields
            doshield(shraise=False)
            if game.ididit:
        elif cmd == "SHIELDS":          # shields
            doshield(shraise=False)
            if game.ididit:
@@ -5964,7 +5977,7 @@ def makemoves():
        elif cmd == "EMEXIT":           # Emergency exit
            clrscr()                    # Hide screen
            freeze(True)                # forced save
        elif cmd == "EMEXIT":           # Emergency exit
            clrscr()                    # Hide screen
            freeze(True)                # forced save
-           raise SysExit,1                     # And quick exit
+           raise SystemExit,1          # And quick exit
        elif cmd == "PROBE":
            probe()                     # Launch probe
            if game.ididit:
        elif cmd == "PROBE":
            probe()                     # Launch probe
            if game.ididit:
@@ -6013,7 +6026,7 @@ def makemoves():
            break
        if game.alldone:
            break
            break
        if game.alldone:
            break
-    if idebug:
+    if game.idebug:
        prout("=== Ending")
 
 def cramen(type):
        prout("=== Ending")
 
 def cramen(type):
@@ -6059,7 +6072,7 @@ def expran(avrage):
 
 def randplace(size):
     "Choose a random location."
 
 def randplace(size):
     "Choose a random location."
-    w = coord()
+    w = Coord()
     w.i = randrange(size) 
     w.j = randrange(size)
     return w
     w.i = randrange(size) 
     w.j = randrange(size)
     return w
@@ -6120,7 +6133,7 @@ class sstscanner:
         # Round token value to nearest integer
         return int(round(scanner.real))
     def getcoord(self):
         # Round token value to nearest integer
         return int(round(scanner.real))
     def getcoord(self):
-        s = coord()
+        s = Coord()
         scanner.next()
        if scanner.type != "IHREAL":
            huh()
         scanner.next()
        if scanner.type != "IHREAL":
            huh()
@@ -6132,7 +6145,7 @@ class sstscanner:
            return None
        s.j = scanner.int()-1
         return s
            return None
        s.j = scanner.int()-1
         return s
-    def __repr__(str):
+    def __repr__(self):
         return "<sstcanner: token=%s, type=%s, queue=%s>" % (scanner.token, scanner.type, scanner.inqueue)
 
 def ja():
         return "<sstcanner: token=%s, type=%s, queue=%s>" % (scanner.token, scanner.type, scanner.inqueue)
 
 def ja():
@@ -6156,26 +6169,26 @@ def huh():
 def debugme():
     "Access to the internals for debugging."
     proutn("Reset levels? ")
 def debugme():
     "Access to the internals for debugging."
     proutn("Reset levels? ")
-    if ja() == True:
+    if ja():
        if game.energy < game.inenrg:
            game.energy = game.inenrg
        game.shield = game.inshld
        game.torps = game.intorps
        game.lsupres = game.inlsr
     proutn("Reset damage? ")
        if game.energy < game.inenrg:
            game.energy = game.inenrg
        game.shield = game.inshld
        game.torps = game.intorps
        game.lsupres = game.inlsr
     proutn("Reset damage? ")
-    if ja() == True:
+    if ja():
        for i in range(NDEVICES): 
            if game.damage[i] > 0.0: 
                game.damage[i] = 0.0
     proutn("Toggle debug flag? ")
        for i in range(NDEVICES): 
            if game.damage[i] > 0.0: 
                game.damage[i] = 0.0
     proutn("Toggle debug flag? ")
-    if ja() == True:
-       idebug = not idebug
-       if idebug:
+    if ja():
+       game.idebug = not game.idebug
+       if game.idebug:
            prout("Debug output ON")        
        else:
            prout("Debug output OFF")
     proutn("Cause selective damage? ")
            prout("Debug output ON")        
        else:
            prout("Debug output OFF")
     proutn("Cause selective damage? ")
-    if ja() == True:
+    if ja():
        for i in range(NDEVICES):
            proutn("Kill %s?" % device[i])
            scanner.chew()
        for i in range(NDEVICES):
            proutn("Kill %s?" % device[i])
            scanner.chew()
@@ -6183,9 +6196,9 @@ def debugme():
             if key == "IHALPHA" and scanner.sees("y"):
                game.damage[i] = 10.0
     proutn("Examine/change events? ")
             if key == "IHALPHA" and scanner.sees("y"):
                game.damage[i] = 10.0
     proutn("Examine/change events? ")
-    if ja() == True:
-       ev = event()
-       w = coord()
+    if ja():
+       ev = Event()
+       w = Coord()
         legends = {
             FSNOVA:  "Supernova       ",
             FTBEAM:  "T Beam          ",
         legends = {
             FSNOVA:  "Supernova       ",
             FTBEAM:  "T Beam          ",
@@ -6236,26 +6249,25 @@ def debugme():
                        ev.quadrant = w
        scanner.chew()
     proutn("Induce supernova here? ")
                        ev.quadrant = w
        scanner.chew()
     proutn("Induce supernova here? ")
-    if ja() == True:
+    if ja():
        game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova = True
        atover(True)
 
 if __name__ == '__main__':
     import getopt, socket
     try:
        game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova = True
        atover(True)
 
 if __name__ == '__main__':
     import getopt, socket
     try:
-        global line, thing, game, idebug
+        global line, thing, game
         game = None
         game = None
-        thing = coord()
+        thing = Coord()
         thing.angry = False
         thing.angry = False
-        game = gamestate()
-        idebug = 0
+        game = Gamestate()
         game.options = OPTION_ALL &~ (OPTION_IOMODES | OPTION_PLAIN | OPTION_ALMY)
         if os.getenv("TERM"):
             game.options |= OPTION_CURSES
         else:
             game.options |= OPTION_TTY
         seed = int(time.time())
         game.options = OPTION_ALL &~ (OPTION_IOMODES | OPTION_PLAIN | OPTION_ALMY)
         if os.getenv("TERM"):
             game.options |= OPTION_CURSES
         else:
             game.options |= OPTION_TTY
         seed = int(time.time())
-        (options, arguments) = getopt.getopt(sys.argv[1:], "r:s:tx")
+        (options, arguments) = getopt.getopt(sys.argv[1:], "r:s:txV")
         for (switch, val) in options:
             if switch == '-r':
                 try:
         for (switch, val) in options:
             if switch == '-r':
                 try:
@@ -6281,7 +6293,10 @@ if __name__ == '__main__':
                 game.options |= OPTION_TTY
                 game.options &=~ OPTION_CURSES
             elif switch == '-x':
                 game.options |= OPTION_TTY
                 game.options &=~ OPTION_CURSES
             elif switch == '-x':
-                idebug = True
+                game.idebug = True
+            elif switch == '-V':
+                print "SST2K", version
+                raise SystemExit, 0 
             else:
                 sys.stderr.write("usage: sst [-t] [-x] [startcommand...].\n")
                 raise SystemExit, 1
             else:
                 sys.stderr.write("usage: sst [-t] [-x] [startcommand...].\n")
                 raise SystemExit, 1
@@ -6320,7 +6335,7 @@ if __name__ == '__main__':
                 skip(1)
                 if game.tourn and game.alldone:
                     proutn(_("Do you want your score recorded?"))
                 skip(1)
                 if game.tourn and game.alldone:
                     proutn(_("Do you want your score recorded?"))
-                    if ja() == True:
+                    if ja():
                         scanner.chew()
                         scanner.push("\n")
                         freeze(False)
                         scanner.chew()
                         scanner.push("\n")
                         freeze(False)