X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=sst.py;h=8edb61b3022bc6dd1132cbba0d724d6718ebad2e;hb=1e017ab4b7503ad5d8c8b40161ede483cf1ec07c;hp=925643bd70fde02a8cdacbd161da3d9cf4901312;hpb=82b270a67b61f80465b757703411aec68422f461;p=super-star-trek.git diff --git a/sst.py b/sst.py index 925643b..8edb61b 100755 --- a/sst.py +++ b/sst.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python """ sst.py -- Super Star Trek 2K @@ -17,6 +17,7 @@ from __future__ import print_function, division import os, sys, math, curses, time, pickle, copy, gettext, getpass import getopt, socket, locale +import codecs # This import only works on Unixes. The intention is to enable # Ctrl-P, Ctrl-N, and friends in Cmd. @@ -31,7 +32,7 @@ try: except NameError: my_input = input -version = "2.4" +version = "2.5" docpath = (".", "doc/", "/usr/share/doc/sst/") @@ -44,7 +45,7 @@ def _(st): class randomizer: # LCG PRNG parameters tested against - # Knuth vol. 2. by the authors of ADVENT + # Knuth vol. 2. by the authors of ADVENT LCG_A = 1093 LCG_C = 221587 LCG_M = 1048576 @@ -53,7 +54,7 @@ class randomizer: def random(): old_x = game.lcg_x game.lcg_x = (randomizer.LCG_A * game.lcg_x + randomizer.LCG_C) % randomizer.LCG_M - return old_x / randomizer.LCG_M; + return old_x / randomizer.LCG_M @staticmethod def withprob(p): @@ -196,8 +197,8 @@ class Coord: return self.roundtogrid() % QUADSIZE def scatter(self): s = Coord() - s.i = self.i + rnd.range(-1, 2) - s.j = self.j + rnd.range(-1, 2) + s.i = self.i + rnd.integer(-1, 2) + s.j = self.j + rnd.integer(-1, 2) return s def __str__(self): if self.i is None or self.j is None: @@ -309,6 +310,7 @@ OPTION_CLOAK = 0x80004000 # Enable BSD-Trek capture (Almy, 2013). OPTION_PLAIN = 0x01000000 # user chose plain game OPTION_ALMY = 0x02000000 # user chose Almy variant OPTION_COLOR = 0x04000000 # enable color display (ESR, 2010) +OPTION_DOTFILL = 0x08000000 # fix dotfill glitch in chart (ESR, 2019) # Define devices DSRSENS = 0 @@ -803,7 +805,7 @@ def movescom(iq, avoid): if communicating(): announce() prout(_("Lt. Uhura- \"Captain, Starfleet Intelligence reports")) - proutn(_(" a planet in Quadrant %s has been destroyed") % game.state.kscmdr) + prout(_(" a planet in Quadrant %s has been destroyed") % game.state.kscmdr) prout(_(" by the Super-commander.\"")) break return True # looks good! @@ -836,7 +838,7 @@ def supercommander(): sc = game.state.kscmdr for (i, base) in enumerate(game.state.baseq): basetbl.append((i, (base - sc).distance())) - if game.state.baseq > 1: + if len(game.state.baseq) > 1: basetbl.sort(key=lambda x: x[1]) # look for nearest base without a commander, no Enterprise, and # without too many Klingons, and not already under attack. @@ -909,7 +911,7 @@ def supercommander(): prout(_("Lt. Uhura- \"Captain, the starbase in Quadrant %s") \ % game.state.kscmdr) prout(_(" reports that it is under attack from the Klingon Super-commander.")) - proutn(_(" It can survive until stardate %d.\"") \ + prout(_(" It can survive until stardate %d.\"") \ % int(scheduled(FSCDBAS))) if not game.resting: return @@ -927,7 +929,7 @@ def supercommander(): return announce() prout(_("Lt. Uhura- \"Captain, Starfleet Intelligence reports")) - proutn(_(" the Super-commander is in Quadrant %s,") % game.state.kscmdr) + prout(_(" the Super-commander is in Quadrant %s.") % game.state.kscmdr) return def movetholian(): @@ -2857,7 +2859,7 @@ def supernova(w): for nq.i in range(GALSIZE): for nq.j in range(GALSIZE): nstars += game.state.galaxy[nq.i][nq.j].stars - if stars == 0: + if nstars == 0: return # nothing to supernova exists num = rnd.integer(nstars) + 1 for nq.i in range(GALSIZE): @@ -3521,7 +3523,7 @@ def prouts(proutsline): def cgetline(): "Get a line of input." if game.options & OPTION_CURSES: - linein = curwnd.getstr() + "\n" + linein = codecs.decode(curwnd.getstr()) + "\n" curwnd.refresh() else: if replayfp and not replayfp.closed: @@ -5324,6 +5326,8 @@ def chart(): show = ".1." elif game.state.galaxy[i][j].charted: show = "%3d" % (game.state.chart[i][j].klingons*100 + game.state.chart[i][j].starbase * 10 + game.state.chart[i][j].stars) + if (game.options & OPTION_DOTFILL): + show = show.replace(" ", ".") else: show = "..." proutn(show) @@ -5353,6 +5357,8 @@ def sectscan(goodScan, i, j): 'C':LIGHTRED, 'R':LIGHTRED, 'T':LIGHTRED, + '@':LIGHTGREEN, + 'P':LIGHTGREEN, }.get(game.quad[i][j], DEFAULT)) proutn("%c " % game.quad[i][j]) textcolor(DEFAULT) @@ -5986,11 +5992,11 @@ def choose(): scanner.nexttok() if scanner.sees("plain"): # Approximates the UT FORTRAN version. - game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_THINGY | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK) + game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_THINGY | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_CAPTURE | OPTION_CLOAK | OPTION_DOTFILL) game.options |= OPTION_PLAIN elif scanner.sees("almy"): # Approximates Tom Almy's version. - game.options &=~ (OPTION_THINGY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR) + game.options &=~ (OPTION_THINGY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_DOTFILL) game.options |= OPTION_ALMY elif scanner.sees("fancy") or scanner.sees("\n"): pass @@ -6054,6 +6060,7 @@ def newqad(): game.iplnet = None game.neutz = game.inorbit = game.landed = False game.ientesc = game.iseenit = game.isviolreported = False + game.tholian = None # Create a blank quadrant game.quad = fill2d(QUADSIZE, lambda i, j: '.') if game.iscate: