See the doc/HACKING file in the distribution for designers notes and advice
on how to modify (and how not to modify!) this code.
"""
-import os, sys, math, curses, time, readline, cPickle, random, copy, gettext, getpass
+import os, sys, math, curses, time, readline, pickle, random, copy, gettext, getpass
version = "2.1"
if shraise:
action = "SHUP"
else:
- key = scanner.next()
+ key = scanner.nexttok()
if key == "IHALPHA":
if scanner.sees("transfer"):
action = "NRG"
game.ididit = True
return
elif action == "NRG":
- while scanner.next() != "IHREAL":
+ while scanner.nexttok() != "IHREAL":
scanner.chew()
proutn(_("Energy to transfer to shields- "))
nrg = scanner.real
# Loop to move a single torpedo
setwnd(message_window)
for step in range(1, QUADSIZE*2):
- if not track.next():
+ if not track.nexttok():
break
w = track.sector()
if not w.valid_sector():
# In the C/FORTRAN version, dispersion was 2.5 radians, which
# is 143 degrees, which is almost exactly 4.8 clockface units
displacement = course(track.bearing+randreal(-2.4, 2.4), distance=2**0.5)
- displacement.next()
+ displacement.nexttok()
bumpto = displacement.sector()
if not bumpto.valid_sector():
return hit
return None
proutn(crmena(True, iquad, "sector", w))
displacement = course(track.bearing+randreal(-2.4, 2.4), distance=2**0.5)
- displacement.next()
+ displacement.nexttok()
bumpto = displacement.sector()
if not bumpto.valid_sector():
prout(_(" damaged but not destroyed."))
break
else:
prout("Internal error, no enemy where expected!")
- raise SystemExit, 1
+ raise SystemExit(1)
return None
elif iquad == 'B': # Hit a base
skip(1)
prout(_("***STARBASE DESTROYED.."))
- game.state.baseq = filter(lambda x: x != game.quadrant, game.state.baseq)
+ game.state.baseq = [x for x in game.state.baseq if x != game.quadrant]
game.quad[w.i][w.j] = '.'
game.base.invalidate()
game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase = False
return
# First, get torpedo count
while True:
- scanner.next()
+ scanner.nexttok()
if scanner.token == "IHALPHA":
huh()
return
# Next, get targets
target = []
for i in range(n):
- key = scanner.next()
+ key = scanner.nexttok()
if i == 0 and key == "IHEOL":
break # no coordinate waiting, we will try prompting
if i == 1 and key == "IHEOL":
# Original code so convoluted, I re-did it all
# (That was Tom Almy talking about the C code, I think -- ESR)
while automode == "NOTSET":
- key = scanner.next()
+ key = scanner.nexttok()
if key == "IHALPHA":
if scanner.sees("manual"):
if len(game.enemies)==0:
automode = "AUTOMATIC"
else:
automode = "MANUAL"
- key = scanner.next()
+ key = scanner.nexttok()
elif scanner.sees("automatic"):
if (not itarg) and len(game.enemies) != 0:
automode = "FORCEMAN"
if len(game.enemies)==0:
prout(_("Energy will be expended into space."))
automode = "AUTOMATIC"
- key = scanner.next()
+ key = scanner.nexttok()
elif scanner.sees("no"):
no = True
else:
if automode == "AUTOMATIC":
if key == "IHALPHA" and scanner.sees("no"):
no = True
- key = scanner.next()
+ key = scanner.nexttok()
if key != "IHREAL" and len(game.enemies) != 0:
prout(_("Phasers locked on target. Energy available: %.2f")%avail)
irec = 0
proutn(_("%d units required. ") % irec)
scanner.chew()
proutn(_("Units to fire= "))
- key = scanner.next()
+ key = scanner.nexttok()
if key != "IHREAL":
return
rpow = scanner.real
# chicken out
scanner.chew()
return
- key = scanner.next()
+ key = scanner.nexttok()
if key == "IHALPHA" and scanner.sees("no"):
no = True
if ifast:
proutn("??")
proutn(") ")
proutn(_("units to fire at %s- ") % crmena(False, ienm, "sector", aim))
- key = scanner.next()
+ key = scanner.nexttok()
if key == "IHALPHA" and scanner.sees("no"):
no = True
- key = scanner.next()
+ key = scanner.nexttok()
continue
if key == "IHALPHA":
huh()
prout(_("Available energy exceeded -- try again."))
scanner.chew()
return
- key = scanner.next() # scan for next value
+ key = scanner.nexttok() # scan for next value
k += 1
if rpow == 0.0:
# zero energy -- abort
game.state.chart[game.battle.i][game.battle.j].starbase = False
# Remove Starbase from galaxy
game.state.galaxy[game.battle.i][game.battle.j].starbase = False
- game.state.baseq = filter(lambda x: x != game.battle, game.state.baseq)
+ game.state.baseq = [x for x in game.state.baseq if x != game.battle]
if game.isatb == 2:
# reinstate a commander's base attack
game.battle = hold
supercommander()
elif evcode == FDSPROB: # Move deep space probe
schedule(FDSPROB, 0.01)
- if not game.probe.next():
+ if not game.probe.nexttok():
if not game.probe.quadrant().valid_quadrant() or \
game.state.galaxy[game.probe.quadrant().i][game.probe.quadrant().j].supernova:
# Left galaxy or ran into supernova
#announce()
skip(1)
prout(_("Lt. Uhura- \"The deep space probe is now in Quadrant %s.\"") % game.probe.quadrant())
- pdest = game.state.galaxy[game.probe.quadrant().i][game.probe.quadrant().j]
+ pquad = game.probe.quadrant()
+ pdest = game.state.galaxy[pquad.i][pquad.j]
if communicating():
- chp = game.state.chart[game.probe.quadrant().i][game.probe.quadrant().j]
- chp.klingons = pdest.klingons
- chp.starbase = pdest.starbase
- chp.stars = pdest.stars
+ game.state.chart[pquad.i][pquad.j].klingons = pdest.klingons
+ game.state.chart[pquad.i][pquad.j].starbase = pdest.starbase
+ game.state.chart[pquad.i][pquad.j].stars = pdest.stars
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!
unschedule(FDSPROB)
- if game.state.galaxy[game.quadrant().i][game.quadrant().j].supernova:
+ if game.state.galaxy[pquad.i][pquad.j].supernova:
return
elif evcode == FDISTR: # inhabited system issues distress call
unschedule(FDISTR)
"Wait on events."
game.ididit = False
while True:
- key = scanner.next()
+ key = scanner.nexttok()
if key != "IHEOL":
break
proutn(_("How long? "))
game.quad[neighbor.i][neighbor.j] = '.'
elif iquad == 'B': # Destroy base
game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase = False
- game.state.baseq = filter(lambda x: x!= game.quadrant, game.state.baseq)
+ game.state.baseq = [x for x in game.state.baseq if x!= game.quadrant]
game.base.invalidate()
game.state.basekl += 1
newcnd()
game.state.planets[loop].pclass = "destroyed"
npdead += 1
# Destroy any base in supernovaed quadrant
- game.state.baseq = filter(lambda x: x != nq, game.state.baseq)
+ game.state.baseq = [x for x in game.state.baseq if x != nq]
# If starship caused supernova, tally up destruction
if w != None:
game.state.starkl += game.state.galaxy[nq.i][nq.j].stars
skip(1)
prout(_("SELF-DESTRUCT-SEQUENCE-WILL-BE-ABORTED"))
skip(1)
- scanner.next()
+ scanner.nexttok()
if game.passwd != scanner.token:
prouts(_("PASSWORD-REJECTED;"))
skip(1)
sys.stdout.write('\n')
proutn(prompt)
if not replayfp:
- raw_input()
+ input()
sys.stdout.write('\n' * rows)
linecount = 0
elif line[0] != "#":
break
else:
- line = raw_input() + "\n"
+ line = eval(input()) + "\n"
if logfp:
logfp.write(line)
return line
# Move out
game.quad[game.sector.i][game.sector.j] = '.'
for m in range(icourse.moves):
- icourse.next()
+ icourse.nexttok()
w = icourse.sector()
if icourse.origin.quadrant() != icourse.location.quadrant():
newquadrant(noattack)
break
elif check_collision(w):
- print "Collision detected"
+ print("Collision detected")
break
else:
game.sector = w
navmode = "manual"
key = "IHEOL"
break
- key = scanner.next()
+ key = scanner.nexttok()
if key == "IHEOL":
proutn(_("Manual or automatic- "))
iprompt = True
elif key == "IHALPHA":
if scanner.sees("manual"):
navmode = "manual"
- key = scanner.next()
+ key = scanner.nexttok()
break
elif scanner.sees("automatic"):
navmode = "automatic"
- key = scanner.next()
+ key = scanner.nexttok()
break
else:
huh()
proutn(_("Destination sector or quadrant§or- "))
scanner.chew()
iprompt = True
- key = scanner.next()
+ key = scanner.nexttok()
if key != "IHREAL":
huh()
raise TrekError
xi = int(round(scanner.real))-1
- key = scanner.next()
+ key = scanner.nexttok()
if key != "IHREAL":
huh()
raise TrekError
xj = int(round(scanner.real))-1
- key = scanner.next()
+ key = scanner.nexttok()
if key == "IHREAL":
# both quadrant and sector specified
xk = int(round(scanner.real))-1
- key = scanner.next()
+ key = scanner.nexttok()
if key != "IHREAL":
huh()
raise TrekError
proutn(_("X and Y displacements- "))
scanner.chew()
iprompt = True
- key = scanner.next()
+ key = scanner.nexttok()
itemp = "verbose"
if key != "IHREAL":
huh()
raise TrekError
delta.j = scanner.real
- key = scanner.next()
+ key = scanner.nexttok()
if key != "IHREAL":
huh()
raise TrekError
self.step = 0
def arrived(self):
return self.location.roundtogrid() == self.final
- def next(self):
+ def nexttok(self):
"Next step on course."
self.step += 1
self.nextlocation = self.location + self.increment
look = wcourse.moves
while look > 0:
look -= 1
- wcourse.next()
+ wcourse.nexttok()
w = wcourse.sector()
if not w.valid_sector():
break
def setwarp():
"Change the warp factor."
while True:
- key=scanner.next()
+ key=scanner.nexttok()
if key != "IHEOL":
break
scanner.chew()
else:
prout(_("Uhura- \"The previous probe is still reporting data, Sir.\""))
return
- key = scanner.next()
+ key = scanner.nexttok()
if key == "IHEOL":
if game.nprobes == 1:
prout(_("1 probe left."))
game.isarmed = False
if key == "IHALPHA" and scanner.token == "armed":
game.isarmed = True
- key = scanner.next()
+ key = scanner.nexttok()
elif key == "IHEOL":
proutn(_("Arm NOVAMAX warhead? "))
game.isarmed = ja()
skip(1)
prouts("WWHOOOIIIIIRRRRREEEE.E.E. . . . . . .")
skip(2)
- if withprob(0.98):
+ if not withprob(0.98):
prouts("BOOOIIIOOOIIOOOOIIIOIING . . .")
skip(2)
prout(_("Scotty- \"Oh my God! I've lost them.\""))
if game.condition != "docked":
newcnd()
prstat(_("Condition"), _("%s, %i DAMAGES") % \
- (game.condition.upper(), sum(map(lambda x: x > 0, game.damage))))
+ (game.condition.upper(), sum([x > 0 for x in game.damage])))
if not req or req == 3:
prstat(_("Position"), "%s , %s" % (game.quadrant, game.sector))
if not req or req == 4:
def request():
"Request specified status data, a historical relic from slow TTYs."
requests = ("da","co","po","ls","wa","en","to","sh","kl","sy", "ti")
- while scanner.next() == "IHEOL":
+ while scanner.nexttok() == "IHEOL":
proutn(_("Information desired? "))
scanner.chew()
if scanner.token in requests:
prout(_("COMPUTER DAMAGED, USE A POCKET CALCULATOR."))
skip(1)
return
- if scanner.next() != "IHREAL":
+ if scanner.nexttok() != "IHREAL":
prompt = True
scanner.chew()
proutn(_("Destination quadrant and/or sector? "))
- if scanner.next()!="IHREAL":
+ if scanner.nexttok()!="IHREAL":
huh()
return
w1.j = int(scanner.real-0.5)
- if scanner.next() != "IHREAL":
+ if scanner.nexttok() != "IHREAL":
huh()
return
w1.i = int(scanner.real-0.5)
- if scanner.next() == "IHREAL":
+ if scanner.nexttok() == "IHREAL":
w2.j = int(scanner.real-0.5)
- if scanner.next() != "IHREAL":
+ if scanner.nexttok() != "IHREAL":
huh()
return
w2.i = int(scanner.real-0.5)
while True:
scanner.chew()
proutn(_("Time or arrival date? "))
- if scanner.next()=="IHREAL":
+ if scanner.nexttok()=="IHREAL":
ttime = scanner.real
if ttime > game.state.date:
ttime -= game.state.date # Actually a star date
break
scanner.chew()
proutn(_("Warp factor? "))
- if scanner.next()== "IHREAL":
+ if scanner.nexttok()== "IHREAL":
wfl = True
twarp = scanner.real
if twarp<1.0 or twarp > 10.0:
if not wfl:
return
proutn(_("New warp factor to try? "))
- if scanner.next() == "IHREAL":
+ if scanner.nexttok() == "IHREAL":
wfl = True
twarp = scanner.real
if twarp<1.0 or twarp > 10.0:
(scheduled(FCDBAS)<ttime+game.state.date and game.battle == w1):
prout(_("The starbase there will be destroyed by then."))
proutn(_("New warp factor to try? "))
- if scanner.next() == "IHREAL":
+ if scanner.nexttok() == "IHREAL":
wfl = True
twarp = scanner.real
if twarp<1.0 or twarp > 10.0:
"Save game."
if boss:
scanner.push("emsave.trk")
- key = scanner.next()
+ key = scanner.nexttok()
if key == "IHEOL":
proutn(_("File name: "))
- key = scanner.next()
+ key = scanner.nexttok()
if key != "IHALPHA":
huh()
return
except IOError:
prout(_("Can't freeze game as file %s") % scanner.token)
return
- cPickle.dump(game, fp)
+ pickle.dump(game, fp)
fp.close()
scanner.chew()
"Retrieve saved game."
global game
game.passwd = None
- key = scanner.next()
+ key = scanner.nexttok()
if key == "IHEOL":
proutn(_("File name: "))
- key = scanner.next()
+ key = scanner.nexttok()
if key != "IHALPHA":
huh()
return True
except IOError:
prout(_("Can't thaw game in %s") % scanner.token)
return
- game = cPickle.load(fp)
+ game = pickle.load(fp)
fp.close()
scanner.chew()
return False
game.instar = 0
for i in range(GALSIZE):
for j in range(GALSIZE):
- k = randrange(1, QUADSIZE**2/10)
+ # Can't have more stars per quadrant than fit in one decimal digit,
+ # if we do the chart representation will break.
+ k = randrange(1, min(10, QUADSIZE**2/10))
game.instar += k
game.state.galaxy[i][j].stars = k
# Locate star bases in galaxy
prout(_("%d stardates.") % int(game.intime))
proutn(_("%d starbases in ") % game.inbase)
for i in range(game.inbase):
- proutn(`game.state.baseq[i]`)
+ proutn(repr(game.state.baseq[i]))
proutn(" ")
skip(2)
proutn(_("The Enterprise is currently in Quadrant %s") % game.quadrant)
scanner.chew()
# if not scanner.inqueue: # Can start with command line options
proutn(_("Would you like a regular, tournament, or saved game? "))
- scanner.next()
+ scanner.nexttok()
if scanner.sees("tournament"):
- while scanner.next() == "IHEOL":
+ while scanner.nexttok() == "IHEOL":
proutn(_("Type in tournament number-"))
if scanner.real == 0:
scanner.chew()
proutn(_("What is \"%s\"? ") % scanner.token)
scanner.chew()
while game.length==0 or game.skill==SKILL_NONE:
- if scanner.next() == "IHALPHA":
+ if scanner.nexttok() == "IHALPHA":
if scanner.sees("short"):
game.length = 1
elif scanner.sees("medium"):
elif game.skill == SKILL_NONE:
proutn(_("Are you a Novice, Fair, Good, Expert, or Emeritus player? "))
# Choose game options -- added by ESR for SST2K
- if scanner.next() != "IHALPHA":
+ if scanner.nexttok() != "IHALPHA":
scanner.chew()
proutn(_("Choose your game style (plain, almy, fancy or just press enter): "))
- scanner.next()
+ 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)
while True:
scanner.chew()
proutn(_("Please type in a secret password- "))
- scanner.next()
+ scanner.nexttok()
game.passwd = scanner.token
if game.passwd != None:
break
def helpme():
"Browse on-line help."
- key = scanner.next()
+ key = scanner.nexttok()
while True:
if key == "IHEOL":
setwnd(prompt_window)
proutn(_("Help on what command? "))
- key = scanner.next()
+ key = scanner.nexttok()
setwnd(message_window)
if key == "IHEOL":
return
- cmds = map(lambda x: x[0], commands)
+ cmds = [x[0] for x in commands]
if scanner.token.upper() in cmds or scanner.token.upper() == "ABBREV":
break
skip(1)
setwnd(prompt_window)
clrscr()
proutn("COMMAND> ")
- if scanner.next() == "IHEOL":
+ if scanner.nexttok() == "IHEOL":
if game.options & OPTION_CURSES:
makechart()
continue
elif cmd == "EMEXIT": # Emergency exit
clrscr() # Hide screen
freeze(True) # forced save
- raise SystemExit,1 # And quick exit
+ raise SystemExit(1) # And quick exit
elif cmd == "PROBE":
probe() # Launch probe
if game.ididit:
buf += _("Quadrant ")
elif loctype == "sector":
buf += _("Sector ")
- return buf + `w`
+ return buf + repr(w)
def crmshp():
"Emit our ship name."
self.token = None
self.real = 0.0
self.inqueue = []
- def next(self):
+ def nexttok(self):
# Get a token from the user
self.real = 0.0
self.token = ''
return int(round(scanner.real))
def getcoord(self):
s = Coord()
- scanner.next()
+ scanner.nexttok()
if scanner.type != "IHREAL":
huh()
return None
s.i = scanner.int()-1
- scanner.next()
+ scanner.nexttok()
if scanner.type != "IHREAL":
huh()
return None
"Yes-or-no confirmation."
scanner.chew()
while True:
- scanner.next()
+ scanner.nexttok()
if scanner.token == 'y':
return True
if scanner.token == 'n':
for i in range(NDEVICES):
proutn("Kill %s?" % device[i])
scanner.chew()
- key = scanner.next()
+ key = scanner.nexttok()
if key == "IHALPHA" and scanner.sees("y"):
game.damage[i] = 10.0
proutn("Examine/change events? ")
proutn("never")
proutn("? ")
scanner.chew()
- key = scanner.next()
+ key = scanner.nexttok()
if key == 'n':
unschedule(i)
scanner.chew()
if i == FENSLV or i == FREPRO:
scanner.chew()
proutn("In quadrant- ")
- key = scanner.next()
+ key = scanner.nexttok()
# "IHEOL" says to leave coordinates as they are
if key != "IHEOL":
if key != "IHREAL":
unschedule(i)
continue
w.i = int(round(scanner.real))
- key = scanner.next()
+ key = scanner.nexttok()
if key != "IHREAL":
prout("Event %d canceled, no y coordinate." % (i))
unschedule(i)
replayfp = open(val, "r")
except IOError:
sys.stderr.write("sst: can't open replay file %s\n" % val)
- raise SystemExit, 1
+ raise SystemExit(1)
try:
line = replayfp.readline().strip()
(leader, __, seed) = line.split()
elif switch == '-x':
game.idebug = True
elif switch == '-V':
- print "SST2K", version
- raise SystemExit, 0
+ print("SST2K", version)
+ raise SystemExit(0)
else:
sys.stderr.write("usage: sst [-t] [-x] [startcommand...].\n")
- raise SystemExit, 1
+ raise SystemExit(1)
# where to save the input in case of bugs
if "TMPDIR" in os.environ:
tmpdir = os.environ['TMPDIR']
(getpass.getuser(),socket.gethostname(),time.ctime()))
random.seed(seed)
scanner = sstscanner()
- map(scanner.append, arguments)
+ for arg in arguments:
+ scanner.append(arg)
try:
iostart()
while True: # Play a game
prout(_("May the Great Bird of the Galaxy roost upon your home planet."))
finally:
ioend()
- raise SystemExit, 0
+ raise SystemExit(0)
except KeyboardInterrupt:
if logfp:
logfp.close()
- print ""
+ print("")
# End.