See the doc/HACKING file in the distribution for designers notes and advice
on how to modify (and how not to modify!) this code.
"""
-from __future__ import print_function, division
-# Runs under Python 2 an Python 3. Preserve this property!
+# Copyright by Eric S. Raymond
# SPDX-License-Identifier: BSD-2-clause
# pylint: disable=line-too-long,superfluous-parens,too-many-lines,invalid-name,missing-function-docstring,missing-class-docstring,multiple-statements,too-many-branches,too-many-statements,too-many-locals,too-many-nested-blocks,too-many-return-statements,too-many-instance-attributes,global-statement,no-else-break,no-else-return,no-else-continue,too-few-public-methods,too-many-boolean-expressions,consider-using-f-string,consider-using-enumerate,consider-using-with,unspecified-encoding
except ImportError:
pass
-# Prevent lossage under Python 3
-try:
- my_input = raw_input
-except NameError:
- my_input = input
-
version = "2.7"
docpath = (".", "doc/", "/usr/share/doc/sst/")
return gettext.gettext(st)
# Rolling our own LCG because Python changed its incompatibly in 3.2.
-# Thus, we need to have our own to be 2/3 polyglot, which will also
-# be helpful when we forwrard-port.
+# Thus, we needed to have our own to be 2/3 polyglot; it will be
+# helpful when and if we ever forward-port to another language.
class randomizer:
# LCG PRNG parameters tested against
class JumpOut(Exception):
pass
+def letterize(n):
+ return chr(ord('a') + n - 1)
+
class Coord:
def __init__(self, x=None, y=None):
self.i = x # Row
def __str__(self):
if self.i is None or self.j is None:
return "Nowhere"
+ if (game.options & OPTION_ALPHAMERIC):
+ return letterize(self.i + 1) + str(self.j + 1)
return "%s - %s" % (self.i+1, self.j+1)
__repr__ = __str__
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)
+OPTION_ALPHAMERIC = 0x10000000 # Alpha Y coordinates (ESR, 2023)
option_names = {
"ALL": OPTION_ALL,
sys.stdout.write('\n')
proutn(prompt)
if not replayfp:
- my_input()
+ input()
sys.stdout.write('\n' * rows)
linecount = 0
break
else:
try:
- linein = my_input() + "\n"
+ linein = input() + "\n"
except EOFError:
prout("")
sys.exit(0)
prout(_("(Last surveillance update %d stardates ago).") % ((int)(game.state.date-game.lastchart)))
prout(" 1 2 3 4 5 6 7 8")
for i in range(GALSIZE):
- proutn("%d |" % (i+1))
+ if (game.options & OPTION_ALPHAMERIC):
+ proutn("%c |" % letterize(i+1))
+ else:
+ proutn("%d |" % (i+1))
for j in range(GALSIZE):
if (game.options & OPTION_SHOWME) and i == game.quadrant.i and j == game.quadrant.j:
proutn("<")
if game.condition != "docked":
newcnd()
for i in range(QUADSIZE):
- proutn("%2d " % (i+1))
+ if (game.options & OPTION_ALPHAMERIC):
+ proutn("%c " % letterize(i+1))
+ else:
+ proutn("%2d " % (i+1))
for j in range(QUADSIZE):
sectscan(goodScan, i, j)
skip(1)
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 | OPTION_DOTFILL)
+ 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 | OPTION_ALPHAMERIC)
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 | OPTION_DOTFILL)
+ game.options &=~ (OPTION_THINGY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS | OPTION_COLOR | OPTION_DOTFILL | OPTION_ALPHAMERIC)
game.options |= OPTION_ALMY
elif scanner.sees("fancy") or scanner.sees("\n"):
pass
def getcoord(self):
s = Coord()
self.nexttok()
+ if (game.options & OPTION_ALPHAMERIC):
+ if (self.type == "IHALPHA") and (self.token[0] in "abcdefghij") and (self.token[1] in "0123456789"):
+ s.i = ord(self.token[0]) - ord("a")
+ try:
+ s.j = int(self.token[-1:])-1
+ except TypeError:
+ huh()
+ return None
+ return s
if self.type != "IHREAL":
huh()
return None
game.options |= OPTION_TTY
seed = int(time.time())
(options, arguments) = getopt.getopt(sys.argv[1:], "cr:s:txV")
- replay = False
for (switch, val) in options:
if switch == '-r':
# pylint: disable=raise-missing-from
seed = eval(seed)
line = replayfp.readline().strip()
arguments += line.split()[2:]
- replay = True
except ValueError:
sys.stderr.write("sst: replay file %s is ill-formed\n"% val)
raise SystemExit(1)
sys.exit(1)
if logfp:
logfp.write("# seed %s\n" % seed)
- logfp.write("# options %s\n" % " ".join(arguments))
+ logfp.write("# arguments %s\n" % " ".join(arguments))
logfp.write("# SST2K version %s\n" % version)
logfp.write("# recorded by %s@%s on %s\n" % \
(getpass.getuser(),socket.getfqdn(),time.ctime()))
game.alldone = False
else:
makemoves()
- if replay:
+ if replayfp:
break
skip(1)
- stars()
+ if (game.options & OPTION_TTY):
+ stars()
skip(1)
if game.tourn and game.alldone:
proutn(_("Do you want your score recorded?"))
scanner.push("\n")
freeze(False)
scanner.chew()
- proutn(_("Do you want to play again? "))
- if not ja():
+ if (game.options & OPTION_TTY):
+ proutn(_("Do you want to play again? "))
+ if not ja():
+ break
+ else:
break
skip(1)
prout(_("May the Great Bird of the Galaxy roost upon your home planet."))