X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=sst.py;h=e3959641877d691bc70a221b06d04a0783537c3d;hp=d99ba7aac8acf6e3898de16013c3663284648d1d;hb=708a55633712f9981231e80360ac5e3fe81b1d3b;hpb=4bbf54024be351c3a6e546cc62cabc47f703a4bf diff --git a/sst.py b/sst.py index d99ba7a..e395964 100755 --- a/sst.py +++ b/sst.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 """ sst.py -- Super Star Trek 2K @@ -12,13 +12,20 @@ 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! +# 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 + +# 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 @@ -29,50 +36,64 @@ try: 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 @@ -118,8 +139,8 @@ class JumpOut(Exception): 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 def valid_sector(self): @@ -162,13 +183,13 @@ class Coord: 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 @@ -180,8 +201,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: @@ -293,6 +314,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 @@ -338,7 +360,7 @@ FSCMOVE = 6 # Supercommander moves (might attack base) 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 @@ -469,6 +491,7 @@ class Gamestate: 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): @@ -518,8 +541,8 @@ def welcoming(iq): 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 if enemy.type == 'R': @@ -604,7 +627,7 @@ def movebaddy(enemy): 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 @@ -786,7 +809,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! @@ -819,7 +842,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. @@ -892,7 +915,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 @@ -910,7 +933,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(): @@ -1177,7 +1200,7 @@ def randdevice(): 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 @@ -1204,14 +1227,14 @@ def collision(rammed, enemy): 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() @@ -1227,7 +1250,6 @@ def collision(rammed, enemy): damagereport() else: finish(FWON) - return def torpedo(origin, bearing, dispersion, number, nburst): "Let a photon torpedo fly" @@ -1294,7 +1316,7 @@ def torpedo(origin, bearing, dispersion, number, nburst): 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: @@ -1312,7 +1334,7 @@ def torpedo(origin, bearing, dispersion, number, nburst): 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) @@ -1399,7 +1421,7 @@ def torpedo(origin, bearing, dispersion, number, nburst): 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: @@ -1618,7 +1640,7 @@ def attack(torps_ok): 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) @@ -1722,7 +1744,11 @@ def torps(): 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 @@ -1825,7 +1851,7 @@ def checkshctrl(rpow): 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: @@ -1879,6 +1905,7 @@ def hittem(hits): 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.\"")) @@ -2067,7 +2094,6 @@ def phasers(): scanner.chew() key = "IHEOL" hits[k] = 0 # prevent overflow -- thanks to Alexei Voitenko - k += 1 continue if key == "IHEOL": scanner.chew() @@ -2097,7 +2123,7 @@ def phasers(): # 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: @@ -2105,7 +2131,6 @@ def phasers(): scanner.chew() return key = scanner.nexttok() # scan for next value - k += 1 if rpow == 0.0: # zero energy -- abort scanner.chew() @@ -2142,7 +2167,7 @@ def capture(): 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 @@ -2160,7 +2185,7 @@ def capture(): 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) @@ -2176,12 +2201,12 @@ def capture(): 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: @@ -2196,7 +2221,7 @@ def capture(): 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. @@ -2437,7 +2462,7 @@ def events(): 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 @@ -2775,7 +2800,8 @@ def nova(nov): 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 @@ -2837,9 +2863,9 @@ 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.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 @@ -2851,7 +2877,7 @@ def supernova(w): 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) @@ -2860,7 +2886,7 @@ def supernova(w): 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]=='*': @@ -2914,7 +2940,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.unwon()==0 and not nq == game.quadrant: + if game.unwon()==0 and nq != game.quadrant: skip(2) if w is None: prout(_("Lucky you!")) @@ -3501,7 +3527,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: @@ -3677,7 +3703,7 @@ def tracktorpedo(w, step, i, n, iquad): else: skip(1) proutn(_("Torpedo track- ")) - elif step==4 or step==9: + elif step in {4, 9}: skip(1) proutn("%s " % w) else: @@ -3685,7 +3711,7 @@ def tracktorpedo(w, step, i, n, iquad): 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) @@ -3860,7 +3886,7 @@ def imove(icourse=None, noattack=False): newquadrant(noattack) break elif check_collision(w): - print("Collision detected") + prout(_("Collision detected")) break else: game.sector = w @@ -3879,7 +3905,6 @@ def imove(icourse=None, noattack=False): newcnd() drawmaps(0) setwnd(message_window) - return def dock(verbose): "Dock our ship at a starbase." @@ -4614,7 +4639,7 @@ def abandon(): 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] @@ -5139,6 +5164,7 @@ def attackreport(curt): 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"), @@ -5304,6 +5330,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) @@ -5333,6 +5361,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) @@ -5699,7 +5729,7 @@ def setup(): 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 @@ -5732,7 +5762,7 @@ def setup(): 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 @@ -5809,7 +5839,7 @@ def setup(): 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" @@ -5966,11 +5996,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 @@ -5982,13 +6012,13 @@ def choose(): 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 @@ -6034,6 +6064,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: @@ -6111,7 +6142,7 @@ def newqad(): 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' @@ -6155,9 +6186,9 @@ def setpassword(): 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 @@ -6495,8 +6526,8 @@ def expran(avrage): 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: @@ -6638,7 +6669,7 @@ def debugme(): 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: @@ -6651,7 +6682,7 @@ def debugme(): 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() @@ -6693,14 +6724,17 @@ if __name__ == '__main__': 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:]