# logfp.write("#seed(%d)\n" % n)
game.lcg_x = n % randomizer.LCG_M
+ @staticmethod
+ def getrngstate():
+ return game.lcg_x
+
+ @staticmethod
+ def setrngstate(n):
+ game.lcg_x = n
+
GALSIZE = 8 # Galaxy size in quadrants
NINHAB = (GALSIZE * GALSIZE // 2) # Number of inhabited worlds
MAXUNINHAB = 10 # Maximum uninhabited worlds
return "%s - %s" % (self.i+1, self.j+1)
__repr__ = __str__
-class Thingy(Coord):
+class Thingy():
"Do not anger the Space Thingy!"
def __init__(self):
- Coord.__init__(self)
+ self.location = Coord()
self.angered = False
def angry(self):
self.angered = True
def at(self, q):
- return (q.i, q.j) == (self.i, self.j)
+ return (q.i, q.j) == (self.location.i, self.location.j)
class Planet:
def __init__(self):
if game.condition == "docked" and (game.options & OPTION_BASE): # protected by base -- back off !
motion -= game.skill*(2.0-rnd.real()**2)
if game.idebug:
- proutn("=== MOTION = %d, FORCES = %1.2f, " % (motion, forces))
+ proutn("=== MOTION = %d, FORCES = %1.2f, " % (motion, forces)) # pragma: no cover
# don't move if no motion
if motion == 0:
return []
nsteps = min(nsteps, QUADSIZE) # This shouldn't be necessary
nsteps = max(nsteps, 1) # This shouldn't be necessary
if game.idebug:
- proutn("NSTEPS = %d:" % nsteps)
+ proutn("NSTEPS = %d:" % nsteps) # pragma: no cover
# Compute preferred values of delta X and Y
m = game.sector - enemy.location
if 2.0 * abs(m.i) < abs(m.j):
# main move loop
for ll in range(nsteps):
if game.idebug:
- proutn(" %d" % (ll+1))
+ proutn(" %d" % (ll+1)) # pragma: no cover
# Check if preferred position available
look = goto + m
if m.i < 0:
if success:
goto = look
if game.idebug:
- proutn(repr(goto))
+ proutn(repr(goto)) # pragma: no cover
else:
break # done early
if game.idebug:
- skip(1)
+ skip(1) # pragma: no cover
# Enemy moved, but is still in sector
return [(False, enemy, old_dist, goto)]
idelta = Coord()
basetbl = []
if game.idebug:
- prout("== SUPERCOMMANDER")
+ prout("== SUPERCOMMANDER") # pragma: no cover
# Decide on being active or passive
avoid = ((game.incom - len(game.state.kcmdr) + game.inkling - game.remkl())/(game.state.date+0.01-game.indate) < 0.1*game.skill*(game.skill+1.0) or \
(game.state.date-game.indate) < 3.0)
break
else:
# can't seem to find one; ignore this call
- if game.idebug: # pragma: no cover
- prout("=== Couldn't find location for distress event.")
+ if game.idebug:
+ prout("=== Couldn't find location for distress event.") # pragma: no cover
continue
# got one!! Schedule its enslavement
ev = schedule(FENSLV, expran(game.intime))
while True:
linein = replayfp.readline()
proutn(linein)
- if linein == '':
+ if linein == '': # pragma: no cover
prout("*** Replay finished")
replayfp.close()
break
lrscan_window.move(0, 0)
lrscan(silent=False)
-def put_srscan_sym(w, sym):
+def put_srscan_sym(w, sym): # pragma: no cover
"Emit symbol for short-range scan."
srscan_window.move(w.i+1, w.j*2+2)
srscan_window.addch(sym)
def tracktorpedo(w, step, i, n, iquad):
"Torpedo-track animation."
- if not game.options & OPTION_CURSES: # pragma: no cover
+ if not game.options & OPTION_CURSES:
if step == 1:
if n != 1:
skip(1)
elif step in {4, 9}:
skip(1)
proutn("%s " % w)
- else:
+ else: # pragma: no cover
if not damaged(DSRSENS) or game.condition=="docked":
if i != 0 and step == 1:
drawmaps(2)
return True
# This should not happen
prout(_("Which way did he go?")) # pragma: no cover
- return False
+ return False # pragma: no cover
elif iquad == ' ':
skip(1)
prouts(_("***RED ALERT! RED ALERT!"))
# Decide if time warp will occur
if 0.5*wcourse.distance*math.pow(7.0,game.warpfac-10.0) > rnd.real():
twarp = True
- if game.idebug and game.warpfac==10 and not twarp:
+ if game.idebug and game.warpfac==10 and not twarp: # pragma: no cover
blooey = False
proutn("=== Force time warp? ")
if ja():
if goodScan or (abs(i-game.sector.i)<= 1 and abs(j-game.sector.j) <= 1):
if game.quad[i][j] in ('E', 'F'):
if game.iscloaked:
- highvideo()
+ highvideo() # pragma: no cover
textcolor({"green":GREEN,
"yellow":YELLOW,
"red":RED,
game.state.galaxy[i][j].stars = k
# Locate star bases in galaxy
if game.idebug:
- prout("=== Allocating %d bases" % game.inbase)
+ prout("=== Allocating %d bases" % game.inbase) # pragma: no cover
for i in range(game.inbase):
while True:
while True:
if distq < 6.0*(BASEMAX+1-game.inbase) and rnd.withprob(0.75):
contflag = True
if game.idebug:
- prout("=== Abandoning base #%d at %s" % (i, w))
+ prout("=== Abandoning base #%d at %s" % (i, w)) # pragma: no cover
break
elif distq < 6.0 * (BASEMAX+1-game.inbase):
if game.idebug:
- prout("=== Saving base #%d, close to #%d" % (i, j))
+ prout("=== Saving base #%d, close to #%d" % (i, j)) # pragma: no cover
if not contflag:
break
if game.idebug:
- prout("=== Placing base #%d in quadrant %s" % (i, w))
+ prout("=== Placing base #%d in quadrant %s" % (i, w)) # pragma: no cover
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
# Place thing (in tournament game, we don't want one!)
# New in SST2K: never place the Thing near a starbase.
# This makes sense and avoids a special case in the old code.
- global thing
if game.tourn is None:
+ # Avoid distrubing the RNG chain. This code
+ # was a late fix and we don't want to mess up
+ # all the regression tests.
+ state = randomizer.getrngstate()
while True:
- thing = randplace(GALSIZE)
- if thing not in game.state.baseq:
+ thing.location = randplace(GALSIZE)
+ # Put it somewhere a starbase is not
+ if thing.location not in game.state.baseq:
break
+ randomizer.setrngstate(state)
skip(2)
game.state.snap = False
if game.skill == SKILL_NOVICE:
clrscr()
setwnd(message_window)
newqad()
- if len(game.enemies) - (thing == game.quadrant) - (game.tholian is not None):
+ if len(game.enemies) - (thing.location == game.quadrant) - (game.tholian is not None):
game.shldup = True
if game.neutz: # bad luck to start in a Romulan Neutral Zone
attack(torps_ok=False)
def choose():
"Choose your game type."
while True:
- game.tourn = game.length = 0
+ game.tourn = None
+ game.length = 0
game.thawed = False
game.skill = SKILL_NONE
# Do not chew here, we want to use command-line tokens
proutn(_("Would you like a regular, tournament, or saved game? "))
scanner.nexttok()
if scanner.sees("tournament"):
+ game.tourn = 0
while scanner.nexttok() == "IHEOL":
proutn(_("Type in tournament number-"))
if scanner.real == 0:
prout(_("INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE."))
prout(_("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!"))
# Put in THING if needed
- if thing == game.quadrant:
+ if thing.location == game.quadrant:
Enemy(etype='?', loc=dropin(),
power=rnd.real(6000,6500.0)+250.0*game.skill)
if not damaged(DSRSENS):
if game.alldone:
break
if game.idebug:
- prout("=== Ending")
+ prout("=== Ending") # pragma: no cover
def cramen(ch):
"Emit the name of an enemy or feature."
proutn("Toggle debug flag? ")
if ja():
game.idebug = not game.idebug
- if game.idebug:
+ if game.idebug: # pragma: no cover
prout("Debug output ON")
else:
prout("Debug output OFF")
else:
game.options |= OPTION_TTY
seed = int(time.time())
- (options, arguments) = getopt.getopt(sys.argv[1:], "cr:s:txV")
- for (switch, val) in options:
- if switch == '-r':
- # pylint: disable=raise-missing-from
- try:
- replayfp = open(val, "r")
- except IOError:
- sys.stderr.write("sst: can't open replay file %s\n" % val)
- raise SystemExit(1)
- # pylint: disable=raise-missing-from
- try:
- line = replayfp.readline().strip()
- (leader, __, seed) = line.split()
- # pylint: disable=eval-used
- seed = eval(seed)
- line = replayfp.readline().strip()
- arguments += line.split()[2:]
- except ValueError: # pragma: no cover
- sys.stderr.write("sst: replay file %s is ill-formed\n"% val)
+ try:
+ (options, arguments) = getopt.getopt(sys.argv[1:], "cr:s:txV")
+ for (switch, val) in options:
+ if switch == '-r':
+ # pylint: disable=raise-missing-from
+ try:
+ replayfp = open(val, "r")
+ except IOError:
+ sys.stderr.write("sst: can't open replay file %s\n" % val)
+ raise SystemExit(1)
+ # pylint: disable=raise-missing-from
+ try:
+ line = replayfp.readline().strip()
+ (leader, __, seed) = line.split()
+ # pylint: disable=eval-used
+ seed = eval(seed)
+ line = replayfp.readline().strip()
+ arguments += line.split()[2:]
+ except ValueError: # pragma: no cover
+ sys.stderr.write("sst: replay file %s is ill-formed\n"% val)
+ raise SystemExit(1)
+ game.options |= OPTION_TTY
+ game.options &=~ OPTION_CURSES
+ elif switch == '-s': # pragma: no cover
+ seed = int(val)
+ elif switch == '-t': # pragma: no cover
+ game.options |= OPTION_TTY
+ game.options &=~ OPTION_CURSES
+ elif switch == '-x': # pragma: no cover
+ game.idebug = True
+ elif switch == '-c': # Enable curses debugging - undocumented
+ game.cdebug = True
+ elif switch == '-V': # pragma: no cover
+ print("SST2K", version)
+ raise SystemExit(0)
+ else: # pragma: no cover
+ sys.stderr.write("usage: sst [-t] [-x] [startcommand...].\n")
raise SystemExit(1)
- game.options |= OPTION_TTY
- game.options &=~ OPTION_CURSES
- elif switch == '-s': # pragma: no cover
- seed = int(val)
- elif switch == '-t': # pragma: no cover
- game.options |= OPTION_TTY
- game.options &=~ OPTION_CURSES
- elif switch == '-x': # pragma: no cover
- game.idebug = True
- elif switch == '-c': # Enable curses debugging - undocumented
- game.cdebug = True
- elif switch == '-V': # pragma: no cover
- print("SST2K", version)
- raise SystemExit(0)
- else: # pragma: no cover
- sys.stderr.write("usage: sst [-t] [-x] [startcommand...].\n")
- raise SystemExit(1)
+ except getopt.GetoptError as err:
+ print(err)
+ raise SystemExit(1) from err
# where to save the input in case of bugs
if "TMPDIR" in os.environ: # pragma: no cover
tmpdir = os.environ['TMPDIR']