"""
import os, sys, math, curses, time, readline, cPickle, random, copy, gettext, getpass
-version="2.0"
+version="2.1"
docpath = (".", "../doc", "/usr/share/doc/sst")
def welcoming(iq):
"Would this quadrant welcome another Klingon?"
- return iq.valid_Quadrant() and \
+ return iq.valid_quadrant() and \
not game.state.galaxy[iq.i][iq.j].supernova and \
game.state.galaxy[iq.i][iq.j].klingons < MAXKLQUAD
for enemy in game.enemies:
if enemy.type in ('K', 'R'):
movebaddy(enemy)
- game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+ sortenemies()
def movescom(iq, avoid):
"Commander movement helper."
game.klhere -= 1
if game.condition != "docked":
newcnd()
- game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+ sortenemies()
# check for a helpful planet
for i in range(game.inplan):
if game.state.planets[i].quadrant == game.state.kscmdr and \
action = "SHUP"
else:
scanner.chew()
- return
+ return
if action == "SHUP": # raise shields
if game.shldup:
prout(_("Shields already up."))
prout(_(" displaced by blast to Sector %s ") % bumpto)
for enemy in game.enemies:
enemy.kdist = enemy.kavgd = (game.sector-enemy.location).distance()
- game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+ sortenemies()
return None
elif iquad in ('C', 'S', 'R', 'K'): # Hit a regular enemy
# find the enemy
game.quad[bumpto.i][bumpto.j]=iquad
for enemy in game.enemies:
enemy.kdist = enemy.kavgd = (game.sector-enemy.location).distance()
- game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+ sortenemies()
return None
elif iquad == 'B': # Hit a base
skip(1)
# After attack, reset average distance to enemies
for enemy in game.enemies:
enemy.kavgd = enemy.kdist
- game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+ sortenemies()
return
def deadkl(w, type, mv):
prout(_("SELF-DESTRUCT-SEQUENCE-WILL-BE-ABORTED"))
skip(1)
scanner.next()
- scanner.chew()
if game.passwd != scanner.token:
prouts(_("PASSWORD-REJECTED;"))
skip(1)
skip(1)
if len(game.enemies) != 0:
whammo = 25.0 * game.energy
- l=1
- while l <= len(game.enemies):
+ for l in range(len(game.enemies)):
if game.enemies[l].power*game.enemies[l].kdist <= whammo:
deadkl(game.enemies[l].location, game.quad[game.enemies[l].location.i][game.enemies[l].location.j], game.enemies[l].location)
- l += 1
finish(FDILITHIUM)
def killrate():
"Skip i lines. Pause game if this would cause a scrolling event."
for dummy in range(i):
if game.options & OPTION_CURSES:
- (y, x) = curwnd.getyx()
- (my, mx) = curwnd.getmaxyx()
- if curwnd == message_window and y >= my - 2:
- pause_game()
- clrscr()
- else:
- try:
- curwnd.move(y+1, 0)
- except curses.error:
- pass
+ (y, x) = curwnd.getyx()
+ try:
+ curwnd.move(y+1, 0)
+ except curses.error:
+ pass
else:
global linecount
linecount += 1
def proutn(line):
"Utter a line with no following line feed."
if game.options & OPTION_CURSES:
+ (y, x) = curwnd.getyx()
+ (my, mx) = curwnd.getmaxyx()
+ if curwnd == message_window and y >= my - 2:
+ pause_game()
+ clrscr()
curwnd.addstr(line)
curwnd.refresh()
else:
finald = (w-enemy.location).distance()
enemy.kavgd = 0.5 * (finald + enemy.kdist)
enemy.kdist = finald
- game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+ sortenemies()
if not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova:
attack(torps_ok=False)
for enemy in game.enemies:
game.nkinks = game.nhelp = game.casual = game.abandoned = 0
game.iscate = game.resting = game.imine = game.icrystl = game.icraft = False
game.isatb = game.state.nplankl = 0
- game.state.starkl = game.state.basekl = 0
+ game.state.starkl = game.state.basekl = game.state.nworldkl = 0
game.iscraft = "onship"
game.landed = False
game.alive = True
+
+ # the galaxy
+ game.state.galaxy = fill2d(GALSIZE, lambda i_unused, j_unused: Quadrant())
+ # the starchart
+ game.state.chart = fill2d(GALSIZE, lambda i_unused, j_unused: Page())
+
+ game.state.planets = [] # Planet information
+ game.state.baseq = [] # Base quadrant coordinates
+ game.state.kcmdr = [] # Commander quadrant coordinates
+ game.statekscmdr = Coord() # Supercommander quadrant coordinates
+
# Starchart is functional but we've never seen it
game.lastchart = FOREVER
# Put stars in the galaxy
if game.state.nscrem:
prout(_(" YOU'LL NEED IT."))
waitfor()
+ clrscr()
+ setwnd(message_window)
newqad()
if len(game.enemies) - (thing == game.quadrant) - (game.tholian != None):
game.shldup = True
game.tourn = game.length = 0
game.thawed = False
game.skill = SKILL_NONE
- if not scanner.inqueue: # Can start with command line options
- proutn(_("Would you like a regular, tournament, or saved game? "))
+ scanner.chew()
+# if not scanner.inqueue: # Can start with command line options
+ proutn(_("Would you like a regular, tournament, or saved game? "))
scanner.next()
if scanner.sees("tournament"):
while scanner.next() == "IHEOL":
"Drop new Klingon into current quadrant."
return Enemy('K', loc=dropin(), power=randreal(300,450)+25.0*game.skill)
+def sortenemies():
+ "Sort enemies by distance so 'nearest' is meaningful."
+ game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+
def newqad():
"Set up a new state of quadrant, for when we enter or re-enter it."
game.justin = True
game.quad[QUADSIZE-1][0] = 'X'
if game.quad[QUADSIZE-1][QUADSIZE-1]=='.':
game.quad[QUADSIZE-1][QUADSIZE-1] = 'X'
- game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
+ sortenemies()
# And finally the stars
for i in range(q.stars):
dropin('*')
# Code from sst.c begins here
-commands = {
- "SRSCAN": OPTION_TTY,
- "STATUS": OPTION_TTY,
- "REQUEST": OPTION_TTY,
- "LRSCAN": OPTION_TTY,
- "PHASERS": 0,
- "TORPEDO": 0,
- "PHOTONS": 0,
- "MOVE": 0,
- "SHIELDS": 0,
- "DOCK": 0,
- "DAMAGES": 0,
- "CHART": 0,
- "IMPULSE": 0,
- "REST": 0,
- "WARP": 0,
- "SCORE": 0,
- "SENSORS": OPTION_PLANETS,
- "ORBIT": OPTION_PLANETS,
- "TRANSPORT": OPTION_PLANETS,
- "MINE": OPTION_PLANETS,
- "CRYSTALS": OPTION_PLANETS,
- "SHUTTLE": OPTION_PLANETS,
- "PLANETS": OPTION_PLANETS,
- "REPORT": 0,
- "COMPUTER": 0,
- "COMMANDS": 0,
- "EMEXIT": 0,
- "PROBE": OPTION_PROBE,
- "SAVE": 0,
- "FREEZE": 0, # Synonym for SAVE
- "ABANDON": 0,
- "DESTRUCT": 0,
- "DEATHRAY": 0,
- "DEBUG": 0,
- "MAYDAY": 0,
- "SOS": 0, # Synonym for MAYDAY
- "CALL": 0, # Synonym for MAYDAY
- "QUIT": 0,
- "HELP": 0,
-}
+commands = [
+ ("SRSCAN", OPTION_TTY),
+ ("STATUS", OPTION_TTY),
+ ("REQUEST", OPTION_TTY),
+ ("LRSCAN", OPTION_TTY),
+ ("PHASERS", 0),
+ ("TORPEDO", 0),
+ ("PHOTONS", 0),
+ ("MOVE", 0),
+ ("SHIELDS", 0),
+ ("DOCK", 0),
+ ("DAMAGES", 0),
+ ("CHART", 0),
+ ("IMPULSE", 0),
+ ("REST", 0),
+ ("WARP", 0),
+ ("SCORE", 0),
+ ("SENSORS", OPTION_PLANETS),
+ ("ORBIT", OPTION_PLANETS),
+ ("TRANSPORT", OPTION_PLANETS),
+ ("MINE", OPTION_PLANETS),
+ ("CRYSTALS", OPTION_PLANETS),
+ ("SHUTTLE", OPTION_PLANETS),
+ ("PLANETS", OPTION_PLANETS),
+ ("REPORT", 0),
+ ("COMPUTER", 0),
+ ("COMMANDS", 0),
+ ("EMEXIT", 0),
+ ("PROBE", OPTION_PROBE),
+ ("SAVE", 0),
+ ("FREEZE", 0), # Synonym for SAVE
+ ("ABANDON", 0),
+ ("DESTRUCT", 0),
+ ("DEATHRAY", 0),
+ ("DEBUG", 0),
+ ("MAYDAY", 0),
+ ("SOS", 0), # Synonym for MAYDAY
+ ("CALL", 0), # Synonym for MAYDAY
+ ("QUIT", 0),
+ ("HELP", 0),
+ ("", 0),
+]
def listCommands():
"Generate a list of legal commands."
prout(_("LEGAL COMMANDS ARE:"))
emitted = 0
- for key in commands:
- if not commands[key] or (commands[key] & game.options):
+ for (key, opt) in commands:
+ if not opt or (opt & game.options):
proutn("%-12s " % key)
emitted += 1
if emitted % 5 == 4:
setwnd(message_window)
if key == "IHEOL":
return
- if scanner.token.upper() in commands or scanner.token == "ABBREV":
+ cmds = map(lambda x: x[0], commands)
+ if scanner.token.upper() in cmds or scanner.token.upper() == "ABBREV":
break
skip(1)
listCommands()
def makemoves():
"Command-interpretation loop."
- clrscr()
- setwnd(message_window)
while True: # command loop
drawmaps(1)
while True: # get a command
clrscr()
setwnd(message_window)
clrscr()
- candidates = filter(lambda x: x.startswith(scanner.token.upper()),
- commands)
- if len(candidates) == 1:
- cmd = candidates[0]
- break
- elif candidates and not (game.options & OPTION_PLAIN):
- prout("Commands with prefix '%s': %s" % (scanner.token, " ".join(candidates)))
- else:
+ abandon_passed = False
+ for (cmd, opt) in commands:
+ # commands after ABANDON cannot be abbreviated
+ if cmd == "ABANDON":
+ abandon_passed = True
+ if cmd == scanner.token.upper() or (not abandon_passed \
+ and cmd.startswith(scanner.token.upper())):
+ break;
+ if cmd == "":
listCommands()
continue
+ else:
+ break;
if cmd == "SRSCAN": # srscan
srscan()
elif cmd == "STATUS": # status
if logfp:
logfp.close()
print ""
+
+# End.