next -> nxttok in preparation for 2to3 translation.
[super-star-trek.git] / sst.py
diff --git a/sst.py b/sst.py
index 34a2236dd3955f28eec9cb14a3a86957cee6fa68..be11f15c853c298f27afbc93229ccf3bef7191ac 100755 (executable)
--- a/sst.py
+++ b/sst.py
@@ -141,7 +141,7 @@ class Planet:
         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.inhabited = False # is it inhabites?
+        self.inhabited = False # is it inhabited?
     def __str__(self):
         return self.name
 
@@ -159,8 +159,10 @@ class Quadrant:
 class Page:
     def __init__(self):
        self.stars = None
-       self.starbase = None
+       self.starbase = False
        self.klingons = None
+    def __repr__(self):
+        return "<%s,%s,%s>" % (self.klingons, self.starbase, self.stars)
 
 def fill2d(size, fillfun):
     "Fill an empty list in 2D."
@@ -899,7 +901,7 @@ def doshield(shraise):
     if shraise:
        action = "SHUP"
     else:
-       key = scanner.next()
+       key = scanner.nexttok()
        if key == "IHALPHA":
            if scanner.sees("transfer"):
                action = "NRG"
@@ -958,7 +960,7 @@ def doshield(shraise):
        game.ididit = True
        return
     elif action == "NRG":
-       while scanner.next() != "IHREAL":
+       while scanner.nexttok() != "IHREAL":
            scanner.chew()
            proutn(_("Energy to transfer to shields- "))
         nrg = scanner.real
@@ -1028,7 +1030,7 @@ def randdevice():
     return None        # we should never get here
 
 def collision(rammed, enemy):
-    "Collision handling fot rammong events."
+    "Collision handling for rammong events."
     prouts(_("***RED ALERT!  RED ALERT!"))
     skip(1)
     prout(_("***COLLISION IMMINENT."))
@@ -1084,7 +1086,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
     # Loop to move a single torpedo 
     setwnd(message_window)
     for step in range(1, QUADSIZE*2):
-        if not track.next():
+        if not track.nexttok():
             break
         w = track.sector()
        if not w.valid_sector():
@@ -1108,7 +1110,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
             # In the C/FORTRAN version, dispersion was 2.5 radians, which
             # is 143 degrees, which is almost exactly 4.8 clockface units
             displacement = course(track.bearing+randreal(-2.4, 2.4), distance=2**0.5)
-            displacement.next()
+            displacement.nexttok()
             bumpto = displacement.sector()
            if not bumpto.valid_sector():
                return hit
@@ -1150,7 +1152,7 @@ def torpedo(origin, bearing, dispersion, number, nburst):
                         return None
                     proutn(crmena(True, iquad, "sector", w))
                     displacement = course(track.bearing+randreal(-2.4, 2.4), distance=2**0.5)
-                    displacement.next()
+                    displacement.nexttok()
                     bumpto = displacement.sector()
                     if not bumpto.valid_sector():
                         prout(_(" damaged but not destroyed."))
@@ -1179,8 +1181,8 @@ def torpedo(origin, bearing, dispersion, number, nburst):
             game.state.baseq = filter(lambda x: x != game.quadrant, game.state.baseq)
            game.quad[w.i][w.j] = '.'
            game.base.invalidate()
-           game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase -= 1
-           game.state.chart[game.quadrant.i][game.quadrant.j].starbase -= 1
+           game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase = False
+           game.state.chart[game.quadrant.i][game.quadrant.j].starbase = False
            game.state.basekl += 1
            newcnd()
            return None
@@ -1549,7 +1551,7 @@ def torps():
        return
     # First, get torpedo count
     while True:
-        scanner.next()
+        scanner.nexttok()
        if scanner.token == "IHALPHA":
            huh()
            return
@@ -1574,7 +1576,7 @@ def torps():
     # Next, get targets
     target = []
     for i in range(n):
-       key = scanner.next()
+       key = scanner.nexttok()
        if i == 0 and key == "IHEOL":
            break       # no coordinate waiting, we will try prompting 
        if i == 1 and key == "IHEOL":
@@ -1761,7 +1763,7 @@ def phasers():
     # Original code so convoluted, I re-did it all
     # (That was Tom Almy talking about the C code, I think -- ESR)
     while automode == "NOTSET":
-       key = scanner.next()
+       key = scanner.nexttok()
        if key == "IHALPHA":
            if scanner.sees("manual"):
                if len(game.enemies)==0:
@@ -1771,7 +1773,7 @@ def phasers():
                    automode = "AUTOMATIC"
                else:
                    automode = "MANUAL"
-                   key = scanner.next()
+                   key = scanner.nexttok()
            elif scanner.sees("automatic"):
                if (not itarg) and len(game.enemies) != 0:
                    automode = "FORCEMAN"
@@ -1779,7 +1781,7 @@ def phasers():
                    if len(game.enemies)==0:
                        prout(_("Energy will be expended into space."))
                    automode = "AUTOMATIC"
-                   key = scanner.next()
+                   key = scanner.nexttok()
            elif scanner.sees("no"):
                no = True
            else:
@@ -1809,7 +1811,7 @@ def phasers():
     if automode == "AUTOMATIC":
        if key == "IHALPHA" and scanner.sees("no"):
            no = True
-           key = scanner.next()
+           key = scanner.nexttok()
        if key != "IHREAL" and len(game.enemies) != 0:
            prout(_("Phasers locked on target. Energy available: %.2f")%avail)
        irec = 0
@@ -1822,7 +1824,7 @@ def phasers():
            proutn(_("%d units required. ") % irec)
            scanner.chew()
            proutn(_("Units to fire= "))
-           key = scanner.next()
+           key = scanner.nexttok()
            if key != "IHREAL":
                return
            rpow = scanner.real
@@ -1836,7 +1838,7 @@ def phasers():
            # chicken out 
            scanner.chew()
            return
-        key = scanner.next()
+        key = scanner.nexttok()
        if key == "IHALPHA" and scanner.sees("no"):
            no = True
        if ifast:
@@ -1917,10 +1919,10 @@ def phasers():
                    proutn("??")
                proutn(")  ")
                proutn(_("units to fire at %s-  ") % crmena(False, ienm, "sector", aim))                
-               key = scanner.next()
+               key = scanner.nexttok()
            if key == "IHALPHA" and scanner.sees("no"):
                no = True
-               key = scanner.next()
+               key = scanner.nexttok()
                continue
            if key == "IHALPHA":
                huh()
@@ -1940,7 +1942,7 @@ def phasers():
                prout(_("Available energy exceeded -- try again."))
                scanner.chew()
                return
-           key = scanner.next() # scan for next value 
+           key = scanner.nexttok() # scan for next value 
            k += 1
        if rpow == 0.0:
            # zero energy -- abort 
@@ -2284,7 +2286,7 @@ def events():
                supercommander()
        elif evcode == FDSPROB: # Move deep space probe 
            schedule(FDSPROB, 0.01)
-            if not game.probe.next():
+            if not game.probe.nexttok():
                if not game.probe.quadrant().valid_quadrant() or \
                    game.state.galaxy[game.probe.quadrant().i][game.probe.quadrant().j].supernova:
                    # Left galaxy or ran into supernova
@@ -2302,18 +2304,18 @@ def events():
                    #announce()
                    skip(1)
                    prout(_("Lt. Uhura-  \"The deep space probe is now in Quadrant %s.\"") % game.probe.quadrant())
-           pdest = game.state.galaxy[game.probe.quadrant().i][game.probe.quadrant().j]
+            pquad = game.probe.quadrant()
+           pdest = game.state.galaxy[pquad.i][pquad.j]
            if communicating():
-               chp = game.state.chart[game.probe.quadrant().i][game.probe.quadrant().j]
-               chp.klingons = pdest.klingons
-               chp.starbase = pdest.starbase
-               chp.stars = pdest.stars
+               game.state.chart[pquad.i][pquad.j].klingons = pdest.klingons
+               game.state.chart[pquad.i][pquad.j].starbase = pdest.starbase
+               game.state.chart[pquad.i][pquad.j].stars = pdest.stars
                pdest.charted = True
            game.probe.moves -= 1 # One less to travel
            if game.probe.arrived() and game.isarmed and pdest.stars:
                supernova(game.probe)           # fire in the hole!
                unschedule(FDSPROB)
-               if game.state.galaxy[game.quadrant().i][game.quadrant().j].supernova: 
+               if game.state.galaxy[pquad.i][pquad.j].supernova: 
                    return
        elif evcode == FDISTR: # inhabited system issues distress call 
            unschedule(FDISTR)
@@ -2415,7 +2417,7 @@ def wait():
     "Wait on events."
     game.ididit = False
     while True:
-       key = scanner.next()
+       key = scanner.nexttok()
        if key  != "IHEOL":
            break
        proutn(_("How long? "))
@@ -2715,7 +2717,7 @@ def selfdestruct():
     skip(1)
     prout(_("SELF-DESTRUCT-SEQUENCE-WILL-BE-ABORTED"))
     skip(1)
-    scanner.next()
+    scanner.nexttok()
     if game.passwd != scanner.token:
        prouts(_("PASSWORD-REJECTED;"))
        skip(1)
@@ -3604,7 +3606,7 @@ def imove(icourse=None, noattack=False):
     # Move out
     game.quad[game.sector.i][game.sector.j] = '.'
     for m in range(icourse.moves):
-        icourse.next()
+        icourse.nexttok()
         w = icourse.sector()
         if icourse.origin.quadrant() != icourse.location.quadrant():
             newquadrant(noattack)
@@ -3691,7 +3693,7 @@ def getcourse(isprobe):
            navmode = "manual"
            key = "IHEOL"
            break
-        key = scanner.next()
+        key = scanner.nexttok()
        if key == "IHEOL":
            proutn(_("Manual or automatic- "))
            iprompt = True
@@ -3699,11 +3701,11 @@ def getcourse(isprobe):
        elif key == "IHALPHA":
             if scanner.sees("manual"):
                navmode = "manual"
-               key = scanner.next()
+               key = scanner.nexttok()
                break
             elif scanner.sees("automatic"):
                navmode = "automatic"
-               key = scanner.next()
+               key = scanner.nexttok()
                break
            else:
                huh()
@@ -3725,21 +3727,21 @@ def getcourse(isprobe):
                proutn(_("Destination sector or quadrant&sector- "))
            scanner.chew()
            iprompt = True
-           key = scanner.next()
+           key = scanner.nexttok()
        if key != "IHREAL":
            huh()
            raise TrekError
        xi = int(round(scanner.real))-1
-       key = scanner.next()
+       key = scanner.nexttok()
        if key != "IHREAL":
            huh()
            raise TrekError
        xj = int(round(scanner.real))-1
-       key = scanner.next()
+       key = scanner.nexttok()
        if key == "IHREAL":
            # both quadrant and sector specified 
            xk = int(round(scanner.real))-1
-           key = scanner.next()
+           key = scanner.nexttok()
            if key != "IHREAL":
                huh()
                raise TrekError
@@ -3778,13 +3780,13 @@ def getcourse(isprobe):
            proutn(_("X and Y displacements- "))
            scanner.chew()
            iprompt = True
-           key = scanner.next()
+           key = scanner.nexttok()
        itemp = "verbose"
        if key != "IHREAL":
            huh()
            raise TrekError
        delta.j = scanner.real
-       key = scanner.next()
+       key = scanner.nexttok()
        if key != "IHREAL":
            huh()
            raise TrekError
@@ -3827,7 +3829,7 @@ class course:
         self.step = 0
     def arrived(self):
         return self.location.roundtogrid() == self.final
-    def next(self):
+    def nexttok(self):
         "Next step on course."
         self.step += 1
         self.nextlocation = self.location + self.increment
@@ -3971,7 +3973,7 @@ def warp(wcourse, involuntary):
             look = wcourse.moves
             while look > 0:
                 look -= 1
-                wcourse.next()
+                wcourse.nexttok()
                 w = wcourse.sector()
                 if not w.valid_sector():
                     break
@@ -4001,7 +4003,7 @@ def warp(wcourse, involuntary):
 def setwarp():
     "Change the warp factor."
     while True:
-        key=scanner.next()
+        key=scanner.nexttok()
         if key != "IHEOL":
             break
        scanner.chew()
@@ -4187,7 +4189,7 @@ def probe():
        else:
            prout(_("Uhura- \"The previous probe is still reporting data, Sir.\""))
        return
-    key = scanner.next()
+    key = scanner.nexttok()
     if key == "IHEOL":
         if game.nprobes == 1:
             prout(_("1 probe left."))
@@ -4199,7 +4201,7 @@ def probe():
     game.isarmed = False
     if key == "IHALPHA" and scanner.token == "armed":
        game.isarmed = True
-       key = scanner.next()
+       key = scanner.nexttok()
     elif key == "IHEOL":
        proutn(_("Arm NOVAMAX warhead? "))
        game.isarmed = ja()
@@ -4551,7 +4553,7 @@ def beam():
     skip(1)
     prouts("WWHOOOIIIIIRRRRREEEE.E.E.  .  .  .  .   .    .")
     skip(2)
-    if withprob(0.98):
+    if not withprob(0.98):
        prouts("BOOOIIIOOOIIOOOOIIIOIING . . .")
        skip(2)
        prout(_("Scotty-  \"Oh my God!  I've lost them.\""))
@@ -5102,7 +5104,7 @@ def status(req=0):
 def request():
     "Request specified status data, a historical relic from slow TTYs."
     requests = ("da","co","po","ls","wa","en","to","sh","kl","sy", "ti")
-    while scanner.next() == "IHEOL":
+    while scanner.nexttok() == "IHEOL":
        proutn(_("Information desired? "))
     scanner.chew()
     if scanner.token in requests:
@@ -5146,21 +5148,21 @@ def eta():
        prout(_("COMPUTER DAMAGED, USE A POCKET CALCULATOR."))
        skip(1)
        return
-    if scanner.next() != "IHREAL":
+    if scanner.nexttok() != "IHREAL":
        prompt = True
        scanner.chew()
        proutn(_("Destination quadrant and/or sector? "))
-       if scanner.next()!="IHREAL":
+       if scanner.nexttok()!="IHREAL":
            huh()
            return
     w1.j = int(scanner.real-0.5)
-    if scanner.next() != "IHREAL":
+    if scanner.nexttok() != "IHREAL":
        huh()
        return
     w1.i = int(scanner.real-0.5)
-    if scanner.next() == "IHREAL":
+    if scanner.nexttok() == "IHREAL":
        w2.j = int(scanner.real-0.5)
-       if scanner.next() != "IHREAL":
+       if scanner.nexttok() != "IHREAL":
            huh()
            return
        w2.i = int(scanner.real-0.5)
@@ -5184,7 +5186,7 @@ def eta():
     while True:
        scanner.chew()
        proutn(_("Time or arrival date? "))
-       if scanner.next()=="IHREAL":
+       if scanner.nexttok()=="IHREAL":
            ttime = scanner.real
            if ttime > game.state.date:
                ttime -= game.state.date # Actually a star date
@@ -5198,7 +5200,7 @@ def eta():
            break
        scanner.chew()
        proutn(_("Warp factor? "))
-       if scanner.next()== "IHREAL":
+       if scanner.nexttok()== "IHREAL":
            wfl = True
            twarp = scanner.real
            if twarp<1.0 or twarp > 10.0:
@@ -5216,7 +5218,7 @@ def eta():
                if not wfl:
                    return
                proutn(_("New warp factor to try? "))
-               if scanner.next() == "IHREAL":
+               if scanner.nexttok() == "IHREAL":
                    wfl = True
                    twarp = scanner.real
                    if twarp<1.0 or twarp > 10.0:
@@ -5249,7 +5251,7 @@ def eta():
            (scheduled(FCDBAS)<ttime+game.state.date and game.battle == w1):
            prout(_("The starbase there will be destroyed by then."))
        proutn(_("New warp factor to try? "))
-       if scanner.next() == "IHREAL":
+       if scanner.nexttok() == "IHREAL":
            wfl = True
            twarp = scanner.real
            if twarp<1.0 or twarp > 10.0:
@@ -5275,10 +5277,10 @@ def freeze(boss):
     "Save game."
     if boss:
        scanner.push("emsave.trk")
-    key = scanner.next()
+    key = scanner.nexttok()
     if key == "IHEOL":
         proutn(_("File name: "))
-        key = scanner.next()
+        key = scanner.nexttok()
     if key != "IHALPHA":
         huh()
         return
@@ -5297,10 +5299,10 @@ def thaw():
     "Retrieve saved game."
     global game
     game.passwd = None
-    key = scanner.next()
+    key = scanner.nexttok()
     if key == "IHEOL":
        proutn(_("File name: "))
-       key = scanner.next()
+       key = scanner.nexttok()
     if key != "IHALPHA":
        huh()
        return True
@@ -5435,10 +5437,14 @@ def setup():
     game.instar = 0
     for i in range(GALSIZE):
        for j in range(GALSIZE):
-           k = randrange(1, QUADSIZE**2/10+1)
+            # Can't have more stars per quadrant than fit in one decimal digit,
+            # if we do the chart representation will break. 
+           k = randrange(1, min(10, QUADSIZE**2/10))
            game.instar += k
            game.state.galaxy[i][j].stars = k
     # Locate star bases in galaxy
+    if game.idebug:
+        prout("=== Allocating %d bases" % game.inbase)
     for i in range(game.inbase):
         while True:
             while True:
@@ -5461,6 +5467,8 @@ def setup():
                        prout("=== Saving base #%d, close to #%d" % (i, j))
             if not contflag:
                 break
+        if game.idebug:
+            prout("=== Placing base #%d in quadrant %s" % (i, w))
        game.state.baseq.append(w)
        game.state.galaxy[w.i][w.j].starbase = game.state.chart[w.i][w.j].starbase = True
     # Position ordinary Klingon Battle Cruisers
@@ -5603,9 +5611,9 @@ def choose():
        scanner.chew()
 #      if not scanner.inqueue: # Can start with command line options 
        proutn(_("Would you like a regular, tournament, or saved game? "))
-        scanner.next()
+        scanner.nexttok()
         if scanner.sees("tournament"):
-           while scanner.next() == "IHEOL":
+           while scanner.nexttok() == "IHEOL":
                proutn(_("Type in tournament number-"))
            if scanner.real == 0:
                scanner.chew()
@@ -5631,7 +5639,7 @@ def choose():
        proutn(_("What is \"%s\"? ") % scanner.token)
        scanner.chew()
     while game.length==0 or game.skill==SKILL_NONE:
-       if scanner.next() == "IHALPHA":
+       if scanner.nexttok() == "IHALPHA":
             if scanner.sees("short"):
                game.length = 1
            elif scanner.sees("medium"):
@@ -5659,10 +5667,10 @@ def choose():
            elif game.skill == SKILL_NONE:
                proutn(_("Are you a Novice, Fair, Good, Expert, or Emeritus player? "))
     # Choose game options -- added by ESR for SST2K
-    if scanner.next() != "IHALPHA":
+    if scanner.nexttok() != "IHALPHA":
        scanner.chew()
        proutn(_("Choose your game style (plain, almy, fancy or just press enter): "))
-       scanner.next()
+       scanner.nexttok()
     if scanner.sees("plain"):
        # Approximates the UT FORTRAN version.
        game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_THINGY | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS)
@@ -5846,7 +5854,7 @@ def setpassword():
        while True:
            scanner.chew()
            proutn(_("Please type in a secret password- "))
-           scanner.next()
+           scanner.nexttok()
            game.passwd = scanner.token
            if game.passwd != None:
                break
@@ -5915,12 +5923,12 @@ def listCommands():
 
 def helpme():
     "Browse on-line help."
-    key = scanner.next()
+    key = scanner.nexttok()
     while True:
        if key == "IHEOL":
            setwnd(prompt_window)
            proutn(_("Help on what command? "))
-           key = scanner.next()
+           key = scanner.nexttok()
        setwnd(message_window)
        if key == "IHEOL":
            return
@@ -5978,7 +5986,7 @@ def makemoves():
            setwnd(prompt_window)
            clrscr()
            proutn("COMMAND> ")
-           if scanner.next() == "IHEOL":
+           if scanner.nexttok() == "IHEOL":
                if game.options & OPTION_CURSES:
                    makechart()
                continue
@@ -6179,7 +6187,7 @@ class sstscanner:
         self.token = None
         self.real = 0.0
         self.inqueue = []
-    def next(self):
+    def nexttok(self):
         # Get a token from the user
         self.real = 0.0
         self.token = ''
@@ -6230,12 +6238,12 @@ class sstscanner:
         return int(round(scanner.real))
     def getcoord(self):
         s = Coord()
-        scanner.next()
+        scanner.nexttok()
        if scanner.type != "IHREAL":
            huh()
            return None
        s.i = scanner.int()-1
-        scanner.next()
+        scanner.nexttok()
        if scanner.type != "IHREAL":
            huh()
            return None
@@ -6248,7 +6256,7 @@ def ja():
     "Yes-or-no confirmation."
     scanner.chew()
     while True:
-       scanner.next()
+       scanner.nexttok()
        if scanner.token == 'y':
            return True
        if scanner.token == 'n':
@@ -6288,7 +6296,7 @@ def debugme():
        for i in range(NDEVICES):
            proutn("Kill %s?" % device[i])
            scanner.chew()
-           key = scanner.next()
+           key = scanner.nexttok()
             if key == "IHALPHA" and scanner.sees("y"):
                game.damage[i] = 10.0
     proutn("Examine/change events? ")
@@ -6319,7 +6327,7 @@ def debugme():
                proutn("never")
            proutn("? ")
            scanner.chew()
-           key = scanner.next()
+           key = scanner.nexttok()
            if key == 'n':
                unschedule(i)
                scanner.chew()
@@ -6328,7 +6336,7 @@ def debugme():
                if i == FENSLV or i == FREPRO:
                    scanner.chew()
                    proutn("In quadrant- ")
-                   key = scanner.next()
+                   key = scanner.nexttok()
                    # "IHEOL" says to leave coordinates as they are 
                    if key != "IHEOL":
                        if key != "IHREAL":
@@ -6336,7 +6344,7 @@ def debugme():
                            unschedule(i)
                            continue
                        w.i = int(round(scanner.real))
-                       key = scanner.next()
+                       key = scanner.nexttok()
                        if key != "IHREAL":
                            prout("Event %d canceled, no y coordinate." % (i))
                            unschedule(i)