Correct crediting of kills.
[super-star-trek.git] / sst.py
diff --git a/sst.py b/sst.py
index 2cc711bff8a37f570eec3fcefec01e5605ff8a2e..c254e2388f42aba7a05867e03d7917f45feb036a 100755 (executable)
--- a/sst.py
+++ b/sst.py
@@ -421,6 +421,9 @@ class Gamestate:
         # after killing the last klingon when score is shown -- perhaps also
         # if the only remaining klingon is SCOM.
         self.state.remtime = self.state.remres/(self.state.remkl + 4*len(self.state.kcmdr))
+    def unwon(self):
+        "Are there Klingons remaining?"
+        return self.state.remkl + len(self.state.kcmdr) + self.state.nscrem
 
 FWON = 0
 FDEPLETE = 1
@@ -1507,7 +1510,7 @@ def attack(torps_ok):
             dispersion = (randreal()+randreal())*0.5 - 0.5
             dispersion += 0.002*enemy.power*dispersion
             hit = torpedo(enemy.location, pcourse, dispersion, number=1, nburst=1)
-            if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) == 0:
+            if game.unwon() == 0:
                 finish(FWON) # Klingons did themselves in!
             if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova or game.alldone:
                 return # Supernova or finished
@@ -1604,16 +1607,16 @@ def deadkl(w, etype, mv):
         # Killed some type of Klingon
         game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons -= 1
         game.klhere -= 1
-        if type == 'C':
+        if etype == 'C':
             game.state.kcmdr.remove(game.quadrant)
             unschedule(FTBEAM)
             if game.state.kcmdr:
                 schedule(FTBEAM, expran(1.0*game.incom/len(game.state.kcmdr)))
             if is_scheduled(FCDBAS) and game.battle == game.quadrant:
                 unschedule(FCDBAS)
-        elif type ==  'K':
+        elif etype ==  'K':
             game.state.remkl -= 1
-        elif type ==  'S':
+        elif etype ==  'S':
             game.state.nscrem -= 1
             game.state.kscmdr.invalidate()
             game.isatb = 0
@@ -1622,7 +1625,7 @@ def deadkl(w, etype, mv):
             unschedule(FSCDBAS)
     # For each kind of enemy, finish message to player
     prout(_(" destroyed."))
-    if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) == 0:
+    if game.unwon() == 0:
         return
     game.recompute()
     # Remove enemy ship from arrays describing local conditions
@@ -1745,7 +1748,7 @@ def torps():
         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.state.remkl + len(game.state.kcmdr) + game.state.nscrem)<=0:
+    if game.unwon()<=0:
         finish(FWON)
 
 def overheat(rpow):
@@ -1798,6 +1801,9 @@ def hittem(hits):
     skip(1)
     kk = 0
     for wham in hits:
+        if not kk < len(game.enemies):
+            # Should never happen.
+            break
         if wham == 0:
             continue
         dustfac = randreal(0.9, 1.0)
@@ -1825,11 +1831,10 @@ def hittem(hits):
         skip(1)
         if kpow == 0:
             deadkl(w, ienm, w)
-            if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)==0:
+            if game.unwon()==0:
                 finish(FWON)
             if game.alldone:
                 return
-            kk -= 1        # don't do the increment
             continue
         else: # decide whether or not to emasculate klingon
             if kpow > 0 and withprob(0.9) and kpow <= randreal(0.4, 0.8)*kpini:
@@ -2127,28 +2132,30 @@ def capture():
     # intelligent design
     # x = 300 + 25*skill;
     x = game.energy / (weakest.power * len(klingons))
-    x *= 2.5;  # would originally have been equivalent of 1.4,
+    #prout(_("Stats: energy = %s, kpower = %s, klingons = %s")
+    #      % (game.energy, weakest.power, len(klingons))) 
+    x *= 2.5  # would originally have been equivalent of 1.4,
                # but we want command to work more often, more humanely */
-    #prout(_("Prob = %d (%.4f)\n", i, x))
+    #prout(_("Prob = %.4f" % x))
     #  x = 100; // For testing, of course!
-    if x > randreal(100):
+    if x < randreal(100):
         # guess what, he surrendered!!! */
         prout(_("Klingon captain at %s surrenders.") % weakest.location)
         i = randreal(200)
         if i > 0:
-            prout(_("%d Klingons commit suicide rather than be taken captive.") % 200 - i)
-        if i > brigfree:
-            prout(_("%d Klingons die because there is no room for them in the brig.") % i-brigfree)
-            i = brigfree
-        brigfree -= i
+            prout(_("%d Klingons commit suicide rather than be taken captive.") % (200 - i))
+        if i > game.brigfree:
+            prout(_("%d Klingons die because there is no room for them in the brig.") % (i-brigfree))
+            i = game.brigfree
+        game.brigfree -= i
         prout(_("%d captives taken") % i)
         deadkl(weakest.location, weakest.type, game.sector)
-        if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)<=0:
+        if game.unwon()<=0:
             finish(FWON)
         return
 
        # big surprise, he refuses to surrender */
-       prout(_("Fat chance, captain!"))
+    prout(_("Fat chance, captain!"))
 
 # Code from events.c begins here.
 
@@ -2867,7 +2874,7 @@ def supernova(w):
     if game.quadrant == nq or communicating():
         game.state.galaxy[nq.i][nq.j].supernova = True
     # If supernova destroys last Klingons give special message
-    if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)==0 and not nq == game.quadrant:
+    if game.unwon()==0 and not nq == game.quadrant:
         skip(2)
         if w is None:
             prout(_("Lucky you!"))
@@ -2941,7 +2948,7 @@ def killrate():
         return 0
     else:
         starting = (game.inkling + game.incom + game.inscom)
-        remaining = (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)
+        remaining = game.unwon()
         return (starting - remaining)/elapsed
 
 def badpoints():
@@ -3035,7 +3042,7 @@ def finish(ifin):
         prout(_("conquered.  Your starship is now Klingon property,"))
         prout(_("and you are put on trial as a war criminal.  On the"))
         proutn(_("basis of your record, you are "))
-        if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)*3.0 > (game.inkling + game.incom + game.inscom):
+        if game.unwon()*3.0 > (game.inkling + game.incom + game.inscom):
             prout(_("acquitted."))
             skip(1)
             prout(_("LIVE LONG AND PROSPER."))
@@ -3142,7 +3149,7 @@ def finish(ifin):
     elif game.ship == 'E':
         game.ship = 'F'
     game.alive = False
-    if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) != 0:
+    if game.unwon() != 0:
         goodies = game.state.remres/game.inresor
         baddies = (game.state.remkl + 2.0*len(game.state.kcmdr))/(game.inkling+2.0*game.incom)
         if goodies/baddies >= randreal(1.0, 1.5):
@@ -3168,7 +3175,7 @@ def finish(ifin):
 def score():
     "Compute player's score."
     timused = game.state.date - game.indate
-    if (timused == 0 or (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) != 0) and timused < 5.0:
+    if (timused == 0 or game.unwon() != 0) and timused < 5.0:
         timused = 5.0
     game.perdate = killrate()
     ithperd = 500*game.perdate + 0.5
@@ -3483,7 +3490,11 @@ def cgetline():
                 elif linein[0] != "#":
                     break
         else:
-            linein = my_input() + "\n"
+            try:
+                linein = my_input() + "\n"
+            except EOFError:
+                prout("")
+                sys.exit(0)
     if logfp:
         logfp.write(linein)
     return linein
@@ -3534,7 +3545,7 @@ def clrscr():
     linecount = 0
 
 def textcolor(color=DEFAULT):
-    if game.options & OPTION_COLOR:
+    if (game.options & OPTION_COLOR) and (game.options & OPTION_CURSES):
         if color == DEFAULT:
             curwnd.attrset(0)
         elif color ==  BLACK:
@@ -3571,7 +3582,7 @@ def textcolor(color=DEFAULT):
             curwnd.attron(curses.color_pair(curses.COLOR_WHITE) | curses.A_BOLD)
 
 def highvideo():
-    if game.options & OPTION_COLOR:
+    if (game.options & OPTION_COLOR) and (game.options & OPTION_CURSES):
         curwnd.attron(curses.A_REVERSE)
 
 #
@@ -3608,7 +3619,7 @@ def put_srscan_sym(w, sym):
 def boom(w):
     "Enemy fall down, go boom."
     if game.options & OPTION_CURSES:
-        drawmaps(2)
+        drawmaps(0)
         setwnd(srscan_window)
         srscan_window.attron(curses.A_REVERSE)
         put_srscan_sym(w, game.quad[w.i][w.j])
@@ -4005,15 +4016,16 @@ def getcourse(isprobe):
             iprompt = True
             key = scanner.nexttok()
         itemp = "verbose"
-        if key != "IHREAL":
+        if key == "IHREAL":
+            delta.j = scanner.real
+        else:
             huh()
             raise TrekError
-        delta.j = scanner.real
         key = scanner.nexttok()
-        if key != "IHREAL":
-            huh()
-            raise TrekError
-        delta.i = scanner.real
+        if key == "IHREAL":
+            delta.i = scanner.real
+        else:
+            delta.i = 0
     # Check for zero movement
     if delta.i == 0 and delta.j == 0:
         scanner.chew()
@@ -4338,7 +4350,7 @@ def atover(igrab):
         # Repeat if another snova
         if not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova:
             break
-    if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)==0:
+    if game.unwon()==0:
         finish(FWON) # Snova killed remaining enemy.
 
 def timwrp():
@@ -5020,7 +5032,7 @@ def deathray():
         while len(game.enemies) > 0:
             deadkl(game.enemies[1].location, game.quad[game.enemies[1].location.i][game.enemies[1].location.j],game.enemies[1].location)
         prout(_("Ensign Chekov-  \"Congratulations, Captain!\""))
-        if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) == 0:
+        if game.unwon() == 0:
             finish(FWON)
         if (game.options & OPTION_PLAIN) == 0:
             prout(_("Spock-  \"Captain, I believe the `Experimental Death Ray'"))
@@ -5112,7 +5124,7 @@ def report():
     if game.tourn:
         prout(_("This is tournament game %d.") % game.tourn)
     prout(_("Your secret password is \"%s\"") % game.passwd)
-    proutn(_("%d of %d Klingons have been killed") % (((game.inkling + game.incom + game.inscom) - (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)),
+    proutn(_("%d of %d Klingons have been killed") % (((game.inkling + game.incom + game.inscom) - game.unwon()),
                                                       (game.inkling + game.incom + game.inscom)))
     if game.incom - len(game.state.kcmdr):
         prout(_(", including %d Commander%s.") % (game.incom - len(game.state.kcmdr), (_("s"), "")[(game.incom - len(game.state.kcmdr))==1]))
@@ -5344,8 +5356,7 @@ def status(req=0):
                % (int((100.0*game.shield)/game.inshld + 0.5), game.shield)
         prstat(_("Shields"), s+data)
     if not req or req == 9:
-        prstat(_("Klingons Left"), "%d" \
-               % (game.state.remkl+len(game.state.kcmdr)+game.state.nscrem))
+        prstat(_("Klingons Left"), "%d" % game.unwon())
     if not req or req == 10:
         if game.options & OPTION_WORLDS:
             plnet = game.state.galaxy[game.quadrant.i][game.quadrant.j].planet