-#!/usr/bin/env python2
+#!/usr/bin/env python3
"""
sst.py -- Super Star Trek 2K
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!
+# 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
+
+# pylint: disable=multiple-imports
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.
try:
+ # pylint: disable=unused-import
import readline
except ImportError:
pass
except NameError:
my_input = input
-version = "2.4"
+version = "2.7"
docpath = (".", "doc/", "/usr/share/doc/sst/")
def _(st):
return gettext.gettext(st)
-# This is all encapsulated not just for logging but because someday
-# we'll probably want to replace it with something like an LCG that
-# can be forward-ported off Python
-
-import random
+# 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.
class randomizer:
+ # LCG PRNG parameters tested against
+ # Knuth vol. 2. by the authors of ADVENT
+ LCG_A = 1093
+ LCG_C = 221587
+ LCG_M = 1048576
+
+ @staticmethod
+ 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
+
@staticmethod
def withprob(p):
- b = random.random() < p
- if logfp:
- logfp.write("#withprob(%.2f) -> %s\n" % (p, b))
- return b
+ v = randomizer.random()
+ #if logfp:
+ # logfp.write("#withprob(%.2f) -> %s\n" % (p, v < p))
+ return v < p
@staticmethod
- def randrange(*args):
- s = random.randrange(*args)
- if logfp:
- logfp.write("#randrange%s -> %s\n" % (args, s))
- return s
+ def integer(*args):
+ v = randomizer.random()
+ if len(args) == 1:
+ v = int(v * args[0])
+ else:
+ v = args[0] + int(v * (args[1] - args[0]))
+ #if logfp:
+ # logfp.write("#integer%s -> %s\n" % (args, v))
+ return int(v)
@staticmethod
def real(*args):
- v = random.random()
+ v = randomizer.random()
if len(args) == 1:
v *= args[0] # from [0, args[0])
elif len(args) == 2:
v = args[0] + v*(args[1]-args[0]) # from [args[0], args[1])
- if logfp:
- logfp.write("#real%s -> %f\n" % (args, v))
+ #if logfp:
+ # logfp.write("#real%s -> %f\n" % (args, v))
return v
@staticmethod
def seed(n):
- if logfp:
- logfp.write("#seed(%d)\n" % n)
- random.seed(n)
+ #if logfp:
+ # logfp.write("#seed(%d)\n" % n)
+ game.lcg_x = n % randomizer.LCG_M
GALSIZE = 8 # Galaxy size in quadrants
NINHAB = (GALSIZE * GALSIZE // 2) # Number of inhabited worlds
class Coord:
def __init__(self, x=None, y=None):
- self.i = x
- self.j = y
+ self.i = x # Row
+ self.j = y # Column
def valid_quadrant(self):
- return self.i >= 0 and self.i < GALSIZE and self.j >= 0 and self.j < GALSIZE
+ return (self.i is not None) and (self.j is not None) and (self.i >= 0) and (self.i < GALSIZE) and (self.j >= 0) and (self.j < GALSIZE)
def valid_sector(self):
- return self.i >= 0 and self.i < QUADSIZE and self.j >= 0 and self.j < QUADSIZE
+ return (self.i is not None) and (self.j is not None) and (self.i >= 0) and (self.i < QUADSIZE) and (self.j >= 0) and (self.j < QUADSIZE)
def invalidate(self):
self.i = self.j = None
def __eq__(self, other):
s = Coord()
if self.i == 0:
s.i = 0
- elif s.i < 0:
- s.i =-1
+ elif self.i < 0:
+ s.i = -1
else:
s.i = 1
if self.j == 0:
s.j = 0
- elif s.j < 0:
+ elif self.j < 0:
s.j = -1
else:
s.j = 1
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:
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
FSCDBAS = 7 # Supercommander destroys base
FDSPROB = 8 # Move deep space probe
FDISTR = 9 # Emit distress call from an inhabited world
-FENSLV = 10 # Inhabited word is enslaved */
+FENSLV = 10 # Inhabited word is enslaved
FREPRO = 11 # Klingons build a ship in an enslaved system
NEVENTS = 12
self.iscloaked = False # Cloaking device on?
self.ncviol = 0 # Algreon treaty violations
self.isviolreported = False # We have been warned
+ self.lcg_x = 0 # LCG generator value
def remkl(self):
return sum([q.klingons for (_i, _j, q) in list(self.state.traverse())])
def recompute(self):
def tryexit(enemy, look, irun):
"A bad guy attempts to bug out."
iq = Coord()
- iq.i = game.quadrant.i+(look.i+(QUADSIZE-1))/QUADSIZE - 1
- iq.j = game.quadrant.j+(look.j+(QUADSIZE-1))/QUADSIZE - 1
+ iq.i = game.quadrant.i+(look.i+(QUADSIZE-1))//QUADSIZE - 1
+ iq.j = game.quadrant.j+(look.j+(QUADSIZE-1))//QUADSIZE - 1
if not welcoming(iq):
- return False
+ return []
if enemy.type == 'R':
- return False # Romulans cannot escape!
+ return [] # Romulans cannot escape!
if not irun:
# avoid intruding on another commander's territory
if enemy.type == 'C':
irun = False
# This should probably be just (game.quadrant in game.state.kcmdr) + (game.state.kscmdr==game.quadrant)
if game.skill >= SKILL_EXPERT:
- nbaddys = (((game.quadrant in game.state.kcmdr)*2 + (game.state.kscmdr==game.quadrant)*2+game.klhere*1.23+game.irhere*1.5)/2.0)
+ nbaddys = int(((game.quadrant in game.state.kcmdr)*2 + (game.state.kscmdr==game.quadrant)*2+game.klhere*1.23+game.irhere*1.5)/2.0)
else:
nbaddys = (game.quadrant in game.state.kcmdr) + (game.state.kscmdr==game.quadrant)
old_dist = enemy.kdist
nsteps = abs(int(motion))
if motion > 0 and nsteps > mdist:
nsteps = mdist # don't overshoot
- if nsteps > QUADSIZE:
- nsteps = QUADSIZE # This shouldn't be necessary
- if nsteps < 1:
- nsteps = 1 # This shouldn't be necessary
+ 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)
# Compute preferred values of delta X and Y
elif (game.options & OPTION_RAMMING) and game.quad[look.i][look.j] != '.':
# See if enemy should ram ship
if game.quad[look.i][look.j] == game.ship and \
- (enemy.type == 'C' or enemy.type == 'S'):
+ enemy.type in ('C', 'S'):
collision(rammed=True, enemy=enemy)
return []
if krawli != m.i and m.j != 0:
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!
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.
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
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():
10, # DCLOAK: the cloaking device 1.0
)
assert(sum(weights) == 1000)
- idx = rnd.randrange(1000)
+ idx = rnd.integer(1000)
wsum = 0
for (i, w) in enumerate(weights):
wsum += w
skip(1)
deadkl(enemy.location, enemy.type, game.sector)
proutn("***" + crmshp() + " heavily damaged.")
- icas = rnd.randrange(10, 30)
+ icas = rnd.integer(10, 30)
prout(_("***Sickbay reports %d casualties") % icas)
game.casual += icas
game.state.crew -= icas
# In the pre-SST2K version, all devices got equiprobably damaged,
# which was silly. Instead, pick up to half the devices at
# random according to our weighting table,
- ncrits = rnd.randrange(NDEVICES/2)
+ ncrits = rnd.integer(NDEVICES//2)
while ncrits > 0:
ncrits -= 1
dev = randdevice()
damagereport()
else:
finish(FWON)
- return
def torpedo(origin, bearing, dispersion, number, nburst):
"Let a photon torpedo fly"
for enemy in game.enemies:
if w == enemy.location:
kp = math.fabs(enemy.power)
- h1 = 700.0 + rnd.randrange(100) - \
+ h1 = 700.0 + rnd.integer(100) - \
1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-track.angle))
h1 = math.fabs(h1)
if kp < h1:
deadkl(w, iquad, w)
return None
proutn(crmena(True, iquad, "sector", w))
- displacement = course(track.bearing+rnd.real(-2.4, 2.4), distance=2**0.5)
+ displacement = course(track.bearing+rnd.real(-2.4, 2.4), distance=2**0.5, origin=w)
displacement.nexttok()
bumpto = displacement.sector()
if not bumpto.valid_sector():
prout(_(" damaged but not destroyed."))
- return
+ return None
if game.quad[bumpto.i][bumpto.j] == ' ':
prout(_(" buffeted into black hole."))
deadkl(w, iquad, bumpto)
prout(_("***Torpedo absorbed by Tholian web."))
return None
elif iquad == 'T': # Hit a Tholian
- h1 = 700.0 + rnd.randrange(100) - \
+ h1 = 700.0 + rnd.integer(100) - \
1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-track.angle))
h1 = math.fabs(h1)
if h1 >= 600:
propor = pfac * game.shield
if game.condition == "docked":
propor *= 2.1
- if propor < 0.1:
- propor = 0.1
+ propor = max(propor, 0.1)
hitsh = propor*chgfac*hit+1.0
absorb = 0.8*hitsh
if absorb > game.shield:
prout(_("%d%%, torpedoes left %d") % (percent, game.torps))
# Check if anyone was hurt
if hitmax >= 200 or hittot >= 500:
- icas = rnd.randrange(int(hittot * 0.015))
+ icas = rnd.integer(int(hittot * 0.015))
if icas >= 2:
skip(1)
prout(_("Mc Coy- \"Sickbay to bridge. We suffered %d casualties") % icas)
proutn(_("Number of torpedoes to fire- "))
continue # Go back around to get a number
else: # key == "IHREAL"
- n = scanner.int()
+ try:
+ n = scanner.int()
+ except TypeError:
+ huh()
+ return
if n <= 0: # abort command
scanner.chew()
return
prouts(_("Sulu- \"Captain! Shield malfunction! Phaser fire contained!\""))
skip(2)
prout(_("Lt. Uhura- \"Sir, all decks reporting damage.\""))
- icas = rnd.randrange(int(hit*0.012))
+ icas = rnd.integer(int(hit*0.012))
skip(1)
fry(0.8*hit)
if icas:
return
continue
else: # decide whether or not to emasculate klingon
+ # pylint: disable=chained-comparison
if kpow > 0 and rnd.withprob(0.9) and kpow <= rnd.real(0.4, 0.8)*kpini:
prout(_("***Mr. Spock- \"Captain, the vessel at Sector %s")%w)
prout(_(" has just lost its firepower.\""))
scanner.chew()
key = "IHEOL"
hits[k] = 0 # prevent overflow -- thanks to Alexei Voitenko
- k += 1
continue
if key == "IHEOL":
scanner.chew()
# abort out
scanner.chew()
return
- hits[k] = scanner.real
+ hits.append(scanner.real)
rpow += scanner.real
# If total requested is too much, inform and start over
if rpow > avail:
scanner.chew()
return
key = scanner.nexttok() # scan for next value
- k += 1
if rpow == 0.0:
# zero energy -- abort
scanner.chew()
game.ididit = False # Nothing if we fail
game.optime = 0.0
- # Make sure there is room in the brig */
+ # Make sure there is room in the brig
if game.brigfree == 0:
prout(_("Security reports the brig is already full."))
return
prout(_("Uhura- \"Getting no response, sir.\""))
return
- # if there is more than one Klingon, find out which one */
+ # if there is more than one Klingon, find out which one
# Cruddy, just takes one at random. Should ask the captain.
# Nah, just select the weakest one since it is most likely to
# surrender (Tom Almy mod)
x = game.energy / (weakest.power * len(klingons))
#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 */
+ x *= 2.5 # would originally have been equivalent of 1.4,
+ # but we want command to work more often, more humanely
#prout(_("Prob = %.4f" % x))
# x = 100; // For testing, of course!
if x < rnd.real(100):
- # guess what, he surrendered!!! */
+ # guess what, he surrendered!!!
prout(_("Klingon captain at %s surrenders.") % weakest.location)
i = rnd.real(200)
if i > 0:
finish(FWON)
return
- # big surprise, he refuses to surrender */
+ # big surprise, he refuses to surrender
prout(_("Fat chance, captain!"))
# Code from events.c begins here.
if not game.state.kcmdr:
unschedule(FTBEAM)
continue
- i = rnd.randrange(len(game.state.kcmdr))
+ i = rnd.integer(len(game.state.kcmdr))
yank = (game.state.kcmdr[i]-game.quadrant).distance()
if istract or game.condition == "docked" or game.iscloaked or yank == 0:
# Drats! Have to reschedule
elif evcode == FCDBAS: # Commander succeeds in destroying base
if evcode == FCDBAS:
unschedule(FCDBAS)
- if not game.state.baseq() \
+ if not game.state.baseq \
or not game.state.galaxy[game.battle.i][game.battle.j].starbase:
game.battle.invalidate()
continue
pdest.charted = True
game.probe.moves -= 1 # One less to travel
if game.probe.arrived() and game.isarmed and pdest.stars:
- supernova(game.probe) # fire in the hole!
+ supernova(game.probe.quadrant()) # fire in the hole!
unschedule(FDSPROB)
if game.state.galaxy[pquad.i][pquad.j].supernova:
return
finish(FNOVA)
return
# add in course nova contributes to kicking starship
- bump += (game.sector-hits[-1]).sgn()
+ if hits:
+ bump += (game.sector-hits[-1]).sgn()
elif iquad == 'K': # kill klingon
deadkl(neighbor, iquad, neighbor)
elif iquad in ('C','S','R'): # Damage/destroy big enemies
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.randrange(nstars) + 1
+ num = rnd.integer(nstars) + 1
for nq.i in range(GALSIZE):
for nq.j in range(GALSIZE):
num -= game.state.galaxy[nq.i][nq.j].stars
proutn("=== Super nova here?")
if ja():
nq = game.quadrant
- if not nq == game.quadrant or game.justin:
+ if nq != game.quadrant or game.justin:
# it isn't here, or we just entered (treat as enroute)
if communicating():
skip(1)
else:
ns = Coord()
# we are in the quadrant!
- num = rnd.randrange(game.state.galaxy[nq.i][nq.j].stars) + 1
+ num = rnd.integer(game.state.galaxy[nq.i][nq.j].stars) + 1
for ns.i in range(QUADSIZE):
for ns.j in range(QUADSIZE):
if game.quad[ns.i][ns.j]=='*':
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.unwon()==0 and not nq == game.quadrant:
+ if game.unwon()==0 and nq != game.quadrant:
skip(2)
if w is None:
prout(_("Lucky you!"))
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:
else:
skip(1)
proutn(_("Torpedo track- "))
- elif step==4 or step==9:
+ elif step in {4, 9}:
skip(1)
proutn("%s " % w)
else:
if i != 0 and step == 1:
drawmaps(2)
time.sleep(0.4)
- if (iquad=='.') or (iquad==' '):
+ if iquad in {'.', ' '}:
put_srscan_sym(w, '+')
#sound(step*10)
#time.sleep(0.1)
if game.iscloaked:
# We can't be tractor beamed if cloaked,
# so move the event into the future
- postpone(FTBEAM, game.optime + expran(1.5*game.intime/len(game.kcmdr)))
+ postpone(FTBEAM, game.optime + expran(1.5*game.intime/len(game.state.kcmdr)))
else:
trbeam = True
game.condition = "red"
newquadrant(noattack)
break
elif check_collision(w):
- print("Collision detected")
+ prout(_("Collision detected"))
break
else:
game.sector = w
newcnd()
drawmaps(0)
setwnd(message_window)
- return
def dock(verbose):
"Dock our ship at a starbase."
if game.inorbit:
prout(_("You must first leave standard orbit."))
return
- if game.base is None or abs(game.sector.i-game.base.i) > 1 or abs(game.sector.j-game.base.j) > 1:
+ if game.base is None or not game.base.valid_sector():
+ prout(_("No starbase available for docking in this quadrant."))
+ return
+ if (abs(game.sector.i-game.base.i) > 1) or (abs(game.sector.j-game.base.j) > 1):
prout(crmshp() + _(" not adjacent to base."))
return
if game.iscloaked:
break
prout(_("fails."))
textcolor(DEFAULT)
- curses.delay_output(500)
+ if game.options & OPTION_CURSES:
+ curses.delay_output(500)
if m > 3:
game.quad[game.sector.i][game.sector.j]='?'
game.alive = False
game.nprobes = 0 # No probes
prout(_("You are captured by Klingons and released to"))
prout(_("the Federation in a prisoner-of-war exchange."))
- nb = rnd.randrange(len(game.state.baseq))
+ nb = rnd.integer(len(game.state.baseq))
# Set up quadrant and position FQ adjacient to base
if not game.quadrant == game.state.baseq[nb]:
game.quadrant = game.state.baseq[nb]
def report():
# report on general game status
scanner.chew()
+ # pylint: disable=consider-using-ternary
s1 = (game.thawed and _("thawed ")) or ""
s2 = {1:"short", 2:"medium", 4:"long"}[game.length]
s3 = (None, _("novice"), _("fair"),
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)
'C':LIGHTRED,
'R':LIGHTRED,
'T':LIGHTRED,
+ '@':LIGHTGREEN,
+ 'P':LIGHTGREEN,
}.get(game.quad[i][j], DEFAULT))
proutn("%c " % game.quad[i][j])
textcolor(DEFAULT)
prout(_("We'll never make it, sir."))
scanner.chew()
return
- if twarp < 1.0:
- twarp = 1.0
+ twarp = max(twarp, 1.0)
break
scanner.chew()
proutn(_("Warp factor? "))
game.quadrant = randplace(GALSIZE)
game.sector = randplace(QUADSIZE)
game.torps = game.intorps = 10
- game.nprobes = rnd.randrange(2, 5)
+ game.nprobes = rnd.integer(2, 5)
game.warpfac = 5.0
for i in range(NDEVICES):
game.damage[i] = 0.0
for j in range(GALSIZE):
# Can't have more stars per quadrant than fit in one decimal digit,
# if we do the chart representation will break.
- k = rnd.randrange(1, min(10, QUADSIZE**2/10))
+ k = rnd.integer(1, min(10, QUADSIZE**2/10))
game.instar += k
game.state.galaxy[i][j].stars = k
# Locate star bases in galaxy
# Position ordinary Klingon Battle Cruisers
krem = game.inkling
klumper = 0.25*game.skill*(9.0-game.length)+1.0
- if klumper > MAXKLQUAD:
- klumper = MAXKLQUAD
+ klumper = min(klumper, MAXKLQUAD)
while True:
r = rnd.real()
klump = int((1.0 - r*r)*klumper)
- if klump > krem:
- klump = krem
+ klump = min(klump, krem)
krem -= klump
while True:
w = randplace(GALSIZE)
new.name = systnames[i]
new.inhabited = True
else:
- new.pclass = ("M", "N", "O")[rnd.randrange(0, 3)]
+ new.pclass = ("M", "N", "O")[rnd.integer(0, 3)]
if rnd.withprob(0.33):
new.crystals = "present"
new.known = "unknown"
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
prout("=== Debug mode enabled.")
# Use parameters to generate initial values of things
game.damfac = 0.5 * game.skill
- game.inbase = rnd.randrange(BASEMIN, BASEMAX+1)
+ game.inbase = rnd.integer(BASEMIN, BASEMAX+1)
game.inplan = 0
if game.options & OPTION_PLANETS:
- game.inplan += rnd.randrange(MAXUNINHAB/2, MAXUNINHAB+1)
+ game.inplan += rnd.integer(MAXUNINHAB/2, MAXUNINHAB+1)
if game.options & OPTION_WORLDS:
game.inplan += int(NINHAB)
- game.state.nromrem = game.inrom = rnd.randrange(2 * game.skill)
+ game.state.nromrem = game.inrom = rnd.integer(2 * game.skill)
game.state.nscrem = game.inscom = (game.skill > SKILL_FAIR)
game.state.remtime = 7.0 * game.length
game.intime = game.state.remtime
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:
if game.quad[w.i][w.j] == '.':
break
game.tholian = Enemy(etype='T', loc=w,
- power=rnd.randrange(100, 500) + 25.0*game.skill)
+ power=rnd.integer(100, 500) + 25.0*game.skill)
# Reserve unoccupied corners
if game.quad[0][0]=='.':
game.quad[0][0] = 'X'
break
else:
game.passwd = ""
- game.passwd += chr(ord('a')+rnd.randrange(26))
- game.passwd += chr(ord('a')+rnd.randrange(26))
- game.passwd += chr(ord('a')+rnd.randrange(26))
+ game.passwd += chr(ord('a')+rnd.integer(26))
+ game.passwd += chr(ord('a')+rnd.integer(26))
+ game.passwd += chr(ord('a')+rnd.integer(26))
# Code from sst.c begins here
def randplace(size):
"Choose a random location."
w = Coord()
- w.i = rnd.randrange(size)
- w.j = rnd.randrange(size)
+ w.i = rnd.integer(size)
+ w.j = rnd.integer(size)
return w
class sstscanner:
proutn(legends[i])
if is_scheduled(i):
proutn("%.2f" % (scheduled(i)-game.state.date))
- if i == FENSLV or i == FREPRO:
+ if i in {FENSLV, FREPRO}:
ev = findevent(i)
proutn(" in %s" % ev.quadrant)
else:
scanner.chew()
elif key == "IHREAL":
ev = schedule(i, scanner.real)
- if i == FENSLV or i == FREPRO:
+ if i in {FENSLV, FREPRO}:
scanner.chew()
proutn("In quadrant- ")
key = scanner.nexttok()
replay = False
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:]