Planet pointer mess cleaned up. planets now works.
[super-star-trek.git] / src / sst.py
index 5655c7e09c96f494b34e202c7767794863603e7a..0c47c96064bc3f6f0a8fe2195fe0a6160f679e9f 100644 (file)
@@ -262,7 +262,6 @@ class planet:
     def __str__(self):
         return self.name
 
-NOPLANET = None
 class quadrant:
     def __init__(self):
         self.stars = None
@@ -454,7 +453,7 @@ class gamestate:
         self.casual = 0                # causalties
         self.nhelp = 0         # calls for help
         self.nkinks = 0                # count of energy-barrier crossings
-        self.iplnet = 0                # planet # in quadrant
+        self.iplnet = None     # planet # in quadrant
         self.inplan = 0                # initial planets
         self.nenhere = 0       # number of enemies in quadrant
         self.irhere = 0                # Romulans in quadrant
@@ -888,7 +887,7 @@ def movescom(iq, avoid):
            game.state.planets[i].crystals == "present":
            # destroy the planet 
            game.state.planets[i].pclass = "destroyed"
-           game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].planet = NOPLANET
+           game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].planet = None
            if communicating():
                announce()
                prout(_("Lt. Uhura-  \"Captain, Starfleet Intelligence reports"))
@@ -1420,9 +1419,9 @@ def torpedo(course, r, incoming, i, n):
            crmena(True, iquad, sector, w)
            prout(_(" destroyed."))
            game.state.nplankl += 1
-           game.state.galaxy[game.quadrant.x][game.quadrant.y].planet = NOPLANET
-           game.state.planets[game.iplnet].pclass = destroyed
-           game.iplnet = 0
+           game.state.galaxy[game.quadrant.x][game.quadrant.y].planet = None
+           game.iplnet.pclass = "destroyed"
+           game.iplnet = None
            invalidate(game.plnet)
            game.quad[w.x][w.y] = IHDOT
            if game.landed:
@@ -1433,9 +1432,9 @@ def torpedo(course, r, incoming, i, n):
            crmena(True, iquad, sector, w)
            prout(_(" destroyed."))
            game.state.nworldkl += 1
-           game.state.galaxy[game.quadrant.x][game.quadrant.y].planet = NOPLANET
-           game.state.planets[game.iplnet].pclass = destroyed
-           game.iplnet = 0
+           game.state.galaxy[game.quadrant.x][game.quadrant.y].planet = None
+           game.iplnet.pclass = "destroyed"
+           game.iplnet = None
            invalidate(game.plnet)
            game.quad[w.x][w.y] = IHDOT
            if game.landed:
@@ -1587,7 +1586,7 @@ def attack(torps_ok):
        moveklings()
 
     # if no enemies remain after movement, we're done 
-    if game.nenhere==0 or (game.nenhere==1 and iqhere and not iqengry):
+    if game.nenhere==0 or (game.nenhere==1 and thing == game.quadrant and not iqengry):
        return
 
     # set up partial hits if attack happens during shield status change 
@@ -1737,8 +1736,8 @@ def deadkl(w, type, mv):
        game.ithere = False
     elif type == IHQUEST:
        # Killed a Thingy
-        global iqhere, iqengry
-       iqhere = iqengry = False
+        global iqengry
+       iqengry = False
        invalidate(thing)
     else:
        # Some type of a Klingon 
@@ -2627,8 +2626,8 @@ def events():
                # supernova'ed, and which has some Klingons in it
                w = randplace(GALSIZE)
                q = game.state.galaxy[w.x][w.y]
-                if not (game.quadrant == w or q.planet == NOPLANET or \
-                     not game.state.planets[q.planet].inhabited or \
+                if not (game.quadrant == w or q.planet == None or \
+                     not q.planet.inhabited or \
                      q.supernova or q.status!=secure or q.klingons<=0):
                     break
             else:
@@ -2711,7 +2710,7 @@ def events():
                    prout(_("launched a warship from %s.") % q.planet)
                else:
                    prout(_("Uhura- Starfleet reports increased Klingon activity"))
-                   if q.planet != NOPLANET:
+                   if q.planet != None:
                        proutn(_("near %s") % q.planet)
                    prout(_("in Quadrant %s.") % w)
                                
@@ -2826,12 +2825,12 @@ def nova(nov):
                        prout(_(" novas."))
                        game.quad[scratch.x][scratch.y] = IHDOT
                    elif iquad == IHP: # Destroy planet 
-                       game.state.galaxy[game.quadrant.x][game.quadrant.y].planet = NOPLANET
+                       game.state.galaxy[game.quadrant.x][game.quadrant.y].planet = None
                        game.state.nplankl += 1
                        crmena(True, IHP, sector, scratch)
                        prout(_(" destroyed."))
-                       game.state.planets[game.iplnet].pclass = destroyed
-                       game.iplnet = 0
+                       game.iplnet.pclass = "destroyed"
+                       game.iplnet = None
                        invalidate(game.plnet)
                        if game.landed:
                            finish(FPNOVA)
@@ -3017,7 +3016,7 @@ def supernova(induced, w=None):
     # Destroy planets 
     for loop in range(game.inplan):
        if game.state.planets[loop].w == nq:
-           game.state.planets[loop].pclass = destroyed
+           game.state.planets[loop].pclass = "destroyed"
            npdead += 1
     # Destroy any base in supernovaed quadrant 
     if game.state.rembase:
@@ -3712,9 +3711,6 @@ def highvideo():
     if game.options & OPTION_CURSES:
        curwnd.attron(curses.A_REVERSE)
  
-def commandhook(cmd, before):
-    pass
-
 #
 # Things past this point have policy implications.
 # 
@@ -3734,7 +3730,7 @@ def drawmaps(mode):
            setwnd(report_window)
            report_window.clear()
            report_window.move(0, 0)
-           status(0)
+           status()
            setwnd(lrscan_window)
            lrscan_window.clear()
            lrscan_window.move(0, 0)
@@ -3825,8 +3821,8 @@ def prstat(txt, data):
        skip(1)
        setwnd(status_window)
     else:
-        proutn(" " * NSYM - len(tx))
-    vproutn(data)
+        proutn(" " * (NSYM - len(txt)))
+    proutn(data)
     skip(1)
     if game.options & OPTION_CURSES:
        setwnd(report_window)
@@ -4771,7 +4767,7 @@ def abandon():
        if not (game.options & OPTION_WORLDS) and not damaged(DTRANSP):
            prout(_("Remainder of ship's complement beam down"))
            prout(_("to nearest habitable planet."))
-       elif q.planet != NOPLANET and not damaged(DTRANSP):
+       elif q.planet != None and not damaged(DTRANSP):
            prout(_("Remainder of ship's complement beam down to %s.") %
                    q.planet)
        else:
@@ -4848,7 +4844,7 @@ def survey():
     prout(_("Spock-  \"Planet report follows, Captain.\""))
     skip(1)
     for i in range(game.inplan):
-       if game.state.planets[i].pclass == destroyed:
+       if game.state.planets[i].pclass == "destroyed":
            continue
        if (game.state.planets[i].known != "unknown" \
             and not game.state.planets[i].inhabited) \
@@ -4899,23 +4895,25 @@ def sensor():
        if game.options & OPTION_TTY:
            prout(_("Short range sensors damaged."))
        return
-    if not is_valid(game.plnet):
+    if game.iplnet == None:
        if game.options & OPTION_TTY:
            prout(_("Spock- \"No planet in this quadrant, Captain.\""))
        return
-    if game.state.planets[game.iplnet].known == "unknown":
+    if game.iplnet.known == "unknown":
        prout(_("Spock-  \"Sensor scan for Quadrant %s-") % game.quadrant)
        skip(1)
        prout(_("         Planet at Sector %s is of class %s.") %
-             (sector,game.plnet, game.state.planets[game.iplnet]))
-       if game.state.planets[game.iplnet].known=="shuttle_down": 
+             (game.plnet, game.iplnet.pclass))
+       if game.iplnet.known=="shuttle_down": 
            prout(_("         Sensors show Galileo still on surface."))
        proutn(_("         Readings indicate"))
-       if game.state.planets[game.iplnet].crystals != present:
+       if game.iplnet.crystals != present:
            proutn(_(" no"))
        prout(_(" dilithium crystals present.\""))
-       if game.state.planets[game.iplnet].known == "unknown":
-           game.state.planets[game.iplnet].known = "known"
+       if game.iplnet.known == "unknown":
+           game.iplnet.known = "known"
+    elif game.iplnet.inhabited:
+        prout(_("Spock-  \"The inhabited planet %s is located at Sector %s, Captain.\"") % (game.iplnet.name, game.plnet))
 
 def beam():
     # use the transporter 
@@ -4924,7 +4922,7 @@ def beam():
     skip(1)
     if damaged(DTRANSP):
        prout(_("Transporter damaged."))
-       if not damaged(DSHUTTL) and (game.state.planets[game.iplnet].known=="shuttle_down" or game.iscraft == "onship"):
+       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:
@@ -4937,12 +4935,12 @@ def beam():
     if game.shldup:
        prout(_("Impossible to transport through shields."))
        return
-    if game.state.planets[game.iplnet].known=="unknown":
+    if game.iplnet.known=="unknown":
        prout(_("Spock-  \"Captain, we have no information on this planet"))
        prout(_("  and Starfleet Regulations clearly state that in this situation"))
        prout(_("  you may not go down.\""))
        return
-    if not game.landed and game.state.planets[game.iplnet].crystals==absent:
+    if not game.landed and game.iplnet.crystals=="absent":
        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?\" "))
@@ -4959,7 +4957,7 @@ def beam():
            prout(_("Engineering to bridge--"))
            prout(_("  Captain, we have enough energy only to transport you down to"))
            prout(_("  the planet, but there wouldn't be an energy for the trip back."))
-           if game.state.planets[game.iplnet].known == "shuttle_down":
+           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:
@@ -4967,7 +4965,7 @@ def beam():
                return
     if game.landed:
        # Coming from planet 
-       if game.state.planets[game.iplnet].known=="shuttle_down":
+       if game.iplnet.known=="shuttle_down":
            proutn(_("Spock-  \"Wouldn't you rather take the Galileo?\" "))
            if ja() == True:
                chew()
@@ -5001,7 +4999,7 @@ def beam():
     game.energy -= nrgneed
     skip(2)
     prout(_("Transport complete."))
-    if game.landed and game.state.planets[game.iplnet].known=="shuttle_down":
+    if game.landed and game.iplnet.known=="shuttle_down":
        prout(_("The shuttle craft Galileo is here!"))
     if not game.landed and game.imine:
        game.icrystl = True
@@ -5016,10 +5014,10 @@ def mine():
     if not game.landed:
        prout(_("Mining party not on planet."))
        return
-    if game.state.planets[game.iplnet].crystals == mined:
+    if game.iplnet.crystals == "mined":
        prout(_("This planet has already been strip-mined for dilithium."))
        return
-    elif game.state.planets[game.iplnet].crystals == absent:
+    elif game.iplnet.crystals == "absent":
        prout(_("No dilithium crystals on this planet."))
        return
     if game.imine:
@@ -5031,11 +5029,11 @@ def mine():
        skip(1)
        prout(_("there's no reason to mine more at this time."))
        return
-    game.optime = (0.1+0.2*random.random())*game.state.planets[game.iplnet].pclass
+    game.optime = (0.1+0.2*random.random())*game.iplnet.pclass
     if consumeTime():
        return
     prout(_("Mining operation complete."))
-    game.state.planets[game.iplnet].crystals = mined
+    game.iplnet.crystals = "mined"
     game.imine = game.ididit = True
 
 def usecrystals():
@@ -5090,7 +5088,7 @@ def shuttle():
     skip(1)
     if damaged(DSHUTTL):
        if game.damage[DSHUTTL] == -1.0:
-           if game.inorbit and game.state.planets[game.iplnet].known == "shuttle_down":
+           if game.inorbit and game.iplnet.known == "shuttle_down":
                prout(_("Ye Faerie Queene has no shuttle craft bay to dock it at."))
            else:
                prout(_("Ye Faerie Queene had no shuttle craft."))
@@ -5103,16 +5101,16 @@ def shuttle():
        crmshp()
        prout(_(" not in standard orbit."))
        return
-    if (game.state.planets[game.iplnet].known != "shuttle_down") and game.iscraft != "onship":
+    if (game.iplnet.known != "shuttle_down") and game.iscraft != "onship":
        prout(_("Shuttle craft not currently available."))
        return
-    if not game.landed and game.state.planets[game.iplnet].known=="shuttle_down":
+    if not game.landed and game.iplnet.known=="shuttle_down":
        prout(_("You will have to beam down to retrieve the shuttle craft."))
        return
     if game.shldup or game.condition == "docked":
        prout(_("Shuttle craft cannot pass through shields."))
        return
-    if game.state.planets[game.iplnet].known=="unknown":
+    if game.iplnet.known=="unknown":
        prout(_("Spock-  \"Captain, we have no information on this planet"))
        prout(_("  and Starfleet Regulations clearly state that in this situation"))
        prout(_("  you may not fly down.\""))
@@ -5144,7 +5142,7 @@ def shuttle():
            skip(1)
            if consumeTime():
                return
-           game.state.planets[game.iplnet].known="shuttle_down"
+           game.iplnet.known="shuttle_down"
            prout(_("Trip complete."))
            return
        else:
@@ -5154,7 +5152,7 @@ def shuttle():
            skip(1)
            prouts(_("The short hop begins . . ."))
            skip(1)
-           game.state.planets[game.iplnet].known="known"
+           game.iplnet.known="known"
            game.icraft = True
            skip(1)
            game.landed = False
@@ -5180,7 +5178,7 @@ def shuttle():
        game.iscraft = "offship"
        if consumeTime():
            return
-       game.state.planets[game.iplnet].known = "shuttle_down"
+       game.iplnet.known = "shuttle_down"
        game.landed = True
        game.icraft = False
        prout(_("Trip complete."))
@@ -5455,14 +5453,14 @@ def chart():
            else:
                proutn(" ")
            if game.state.galaxy[i][j].supernova:
-               strcpy(buf, "***")
+               show = "***"
            elif not game.state.galaxy[i][j].charted and game.state.galaxy[i][j].starbase:
-               strcpy(buf, ".1.")
+               show = ".1."
            elif game.state.galaxy[i][j].charted:
-               sprintf(buf, "%3d" % (game.state.chart[i][j].klingons*100 + game.state.chart[i][j].starbase * 10 + game.state.chart[i][j].stars))
+               show = "%3d" % (game.state.chart[i][j].klingons*100 + game.state.chart[i][j].starbase * 10 + game.state.chart[i][j].stars)
            else:
-               strcpy(buf, "...")
-           proutn(buf)
+               show = "..."
+           proutn(show)
            if (game.options & OPTION_SHOWME) and i == game.quadrant.x and j == game.quadrant.y:
                proutn(">")
            else:
@@ -5487,13 +5485,13 @@ def sectscan(goodScan, i, j):
     else:
        proutn("- ")
 
-def status(req):
+def status(req=0):
     # print status report lines 
 
     if not req or req == 1:
        prstat(_("Stardate"), _("%.1f, Time Left %.2f") \
                % (game.state.date, game.state.remtime))
-    elif not req or req == 2:
+    if not req or req == 2:
        if game.condition != "docked":
            newcnd()
         dam = 0
@@ -5501,43 +5499,43 @@ def status(req):
            if game.damage[t]>0: 
                dam += 1
        prstat(_("Condition"), _("%s, %i DAMAGES") % (game.condition.upper(), dam))
-    elif not req or req == 3:
+    if not req or req == 3:
        prstat(_("Position"), "%s , %s" % (game.quadrant, game.sector))
-    elif not req or req == 4:
+    if not req or req == 4:
        if damaged(DLIFSUP):
            if game.condition == "docked":
-               sprintf(s, _("DAMAGED, Base provides"))
+               s = _("DAMAGED, Base provides")
            else:
-               sprintf(s, _("DAMAGED, reserves=%4.2f") % game.lsupres)
+               s = _("DAMAGED, reserves=%4.2f") % game.lsupres
        else:
-           sprintf(s, _("ACTIVE"))
+           s = _("ACTIVE")
        prstat(_("Life Support"), s)
-    elif not req or req == 5:
-       prstat(_("Warp Factor"), "%.1f" % (game.warpfac))
-    elif not req or req == 6:
+    if not req or req == 5:
+       prstat(_("Warp Factor"), "%.1f" % game.warpfac)
+    if not req or req == 6:
         extra = ""
         if game.icrystl and (game.options & OPTION_SHOWME):
             extra = _(" (have crystals)")
-       prstat(_("Energy"), "%.2f%s" % game.energy, extra)
-    elif not req or req == 7:
+       prstat(_("Energy"), "%.2f%s" % (game.energy, extra))
+    if not req or req == 7:
        prstat(_("Torpedoes"), "%d" % (game.torps))
-    elif not req or req == 8:
+    if not req or req == 8:
        if damaged(DSHIELD):
-           strcpy(s, _("DAMAGED,"))
+           s = _("DAMAGED,")
        elif game.shldup:
-           strcpy(s, _("UP,"))
+           s = _("UP,")
        else:
-           strcpy(s, _("DOWN,"))
+           s = _("DOWN,")
        data = _(" %d%% %.1f units") \
                % (int((100.0*game.shield)/game.inshld + 0.5), game.shield)
-       prstat(_("Shields"), s)
-    elif not req or req == 9:
+       prstat(_("Shields"), s+data)
+    if not req or req == 9:
         prstat(_("Klingons Left"), "%d" \
                % (game.state.remkl + game.state.remcom + game.state.nscrem))
-    elif not req or req == 10:
+    if not req or req == 10:
        if game.options & OPTION_WORLDS:
            plnet = game.state.galaxy[game.quadrant.x][game.quadrant.y].planet
-           if plnet != NOPLANET and game.state.planets[plnet].inhabited:
+           if plnet and plnet.inhabited:
                prstat(_("Major system"), plnet.name)
            else:
                prout(_("Sector is uninhabited"))
@@ -5942,7 +5940,7 @@ def setup(needprompt):
        for j in range(GALSIZE):
            quad = game.state.galaxy[i][j]
            quad.charted = 0
-           quad.planet = NOPLANET
+           quad.planet = None
            quad.romulans = 0
            quad.klingons = 0
            quad.starbase = False
@@ -6017,7 +6015,7 @@ def setup(needprompt):
             if not game.state.galaxy[w.x][w.y].supernova and \
                game.state.galaxy[w.x][w.y].klingons + klump <= MAXKLQUAD:
                 break
-       game.state.galaxy[w.x][w.y].klingons += klump
+       game.state.galaxy[w.x][w.y].klingons += int(klump)
         if krem <= 0:
             break
     # Position Klingon Commander Ships
@@ -6035,7 +6033,7 @@ def setup(needprompt):
     for i in range(game.inplan):
         while True:
             w = randplace(GALSIZE) 
-            if game.state.galaxy[w.x][w.y].planet == NOPLANET:
+            if game.state.galaxy[w.x][w.y].planet == None:
                 break
         new = planet()
        new.w = w
@@ -6103,7 +6101,7 @@ def setup(needprompt):
        prout(_("  YOU'LL NEED IT."))
     waitfor()
     newqad(False)
-    if game.nenhere - iqhere-game.ithere:
+    if game.nenhere - (thing == game.quadrant) - game.ithere:
        game.shldup = True
     if game.neutz:     # bad luck to start in a Romulan Neutral Zone
        attack(False)
@@ -6262,8 +6260,7 @@ def newqad(shutup):
     game.landed = False
     game.ientesc = False
     game.ithere = False
-    global iqhere, iqengry
-    iqhere = False
+    global iqengry
     iqengry = False
     game.iseenit = False
     if game.iscate:
@@ -6313,7 +6310,7 @@ def newqad(shutup):
        game.base = dropin(IHB)
        
     # If quadrant needs a planet, put it in
-    if q.planet != NOPLANET:
+    if q.planet:
        game.iplnet = q.planet
        if not q.planet.inhabited:
            game.plnet = dropin(IHP)
@@ -6343,8 +6340,6 @@ def newqad(shutup):
            w = dropin(IHQUEST)
            thing = randplace(GALSIZE)
            game.nenhere += 1
-            global iqhere
-           iqhere = True
            game.ks[game.nenhere] = w
            game.kdist[game.nenhere] = game.kavgd[game.nenhere] = \
                distance(game.sector, w)
@@ -6401,7 +6396,7 @@ def newqad(shutup):
 def sortklings():
     # sort Klingons by distance from us 
     # The author liked bubble sort. So we will use it. :-(
-    if game.nenhere-iqhere-game.ithere < 2:
+    if game.nenhere-(thing==game.quadrant)-game.ithere < 2:
        return
     while True:
        sw = False
@@ -6494,7 +6489,7 @@ def listCommands():
     k = 0
     proutn(_("LEGAL COMMANDS ARE:"))
     for key in commands:
-       if ACCEPT(cmd):
+       if ACCEPT(key):
             if k % 5 == 0:
                 skip(1)
             proutn("%-12s " % key) 
@@ -6569,7 +6564,6 @@ def makemoves():
            hitme = False
            game.justin = False
            game.optime = 0.0
-           i = -1
            chew()
            setwnd(prompt_window)
            clrscr()
@@ -6582,15 +6576,20 @@ def makemoves():
            clrscr()
            setwnd(message_window)
            clrscr()
-            cmd = citem.upper()
-            if cmd not in commands:
+            candidates = filter(lambda x: x.startswith(citem.upper()),
+                                commands)
+            if len(candidates) == 1:
+                cmd = candidates[0]
+                break
+            elif candidates and not (game.options & OPTION_PLAIN):
+                prout("Commands with that prefix: " + " ".join(candidates))
+            else:
                 listCommands()
                 continue
-       commandhook(commands[i].name, True)
        if cmd == "SRSCAN":             # srscan
            srscan()
        elif cmd == "STATUS":           # status
-           status(0)
+           status()
        elif cmd == "REQUEST":          # status request 
            request()
        elif cmd == "LRSCAN":           # long range scan
@@ -6695,7 +6694,6 @@ def makemoves():
 #      elif cmd == "VISUAL":
 #          visual()                    # perform visual scan
 #endif
-       commandhook(commands[i].name, False)
        while True:
            if game.alldone:
                break           # Game has ended
@@ -6936,11 +6934,11 @@ def debugme():
        atover(True)
 
 if __name__ == '__main__':
-    global line, thing, game, idebug, iqhere, iqengry
+    global line, thing, game, idebug, iqengry
     game = citem = aaitem = inqueue = None
     line = ''
     thing = coord()
-    iqhere = iqengry = False
+    iqengry = False
     game = gamestate()
     idebug = 0
 
@@ -6997,7 +6995,7 @@ if __name__ == '__main__':
        setwnd(fullscreen_window)
        clrscr()
        prelim()
-       setup(needprompt=not line)
+       setup(needprompt=not inqueue)
        if game.alldone:
            score()
            game.alldone = False