"""
import os, sys, math, curses, time, readline, cPickle, random, copy, gettext, getpass
-SSTDOC = "/usr/share/doc/sst/sst.doc"
-DOC_NAME = "sst.doc"
+docpath = (".", "../doc", "/usr/share/doc/sst")
def _(str): return gettext.gettext(str)
DOCKFAC = 0.25 # Repair faster when docked
PHASEFAC = 2.0 # Unclear what this is, it was in the C version
+DEFAULT = -1
+BLACK = 0
+BLUE = 1
+GREEN = 2
+CYAN = 3
+RED = 4
+MAGENTA = 5
+BROWN = 6
+LIGHTGRAY = 7
+DARKGRAY = 8
+LIGHTBLUE = 9
+LIGHTGREEN = 10
+LIGHTCYAN = 11
+LIGHTRED = 12
+LIGHTMAGENTA = 13
+YELLOW = 14
+WHITE = 15
+
class TrekError:
pass
OPTION_AUTOSCAN = 0x00001000 # automatic LRSCAN before CHART (ESR, 2006)
OPTION_PLAIN = 0x01000000 # user chose plain game
OPTION_ALMY = 0x02000000 # user chose Almy variant
+OPTION_COLOR = 0x04000000 # enable color display (experimental, ESR, 2010)
# Define devices
DSRSENS = 0
self.iplnet = None # planet # in quadrant
self.inplan = 0 # initial planets
self.irhere = 0 # Romulans in quadrant
- self.isatb = 0 # =1 if super commander is attacking base
+ self.isatb = 0 # =2 if super commander is attacking base
self.tourn = None # tournament number
self.nprobes = 0 # number of probes available
self.inresor = 0.0 # initial resources
game.state.kscmdr = iq
game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].klingons += 1
if game.state.kscmdr==game.quadrant:
- # SC has scooted, Remove him from current quadrant
+ # SC has scooted, remove him from current quadrant
game.iscate=False
game.isatb=0
game.ientesc = False
15, # DCOMPTR: computer 1.5%
20, # NAVCOMP: navigation system 2.0%
75, # DTRANSP: transporter 7.5%
- 20, # DSHCTRL: high-speed shield controller 2.0%
+ 20, # DSHCTRL: high-speed shield controller 2.0%
10, # DDRAY: death ray 1.0%
30, # DDSP: deep-space probes 3.0%
)
- idx = randrange(1000) # weights must sum to 1000
+ assert(sum(weights) == 1000)
+ idx = randrange(1000)
sum = 0
for (i, w) in enumerate(weights):
sum += w
return None
return delta.bearing()
-def photon():
- "Launch photon torpedo."
+def torps():
+ "Launch photon torpedo salvo."
course = []
game.ididit = False
if damaged(DPHOTON):
def iostart():
global stdscr, rows
+ "for some recent versions of python2, the following enables UTF8"
+ "for the older ones we probably need to set C locale, and the python3"
+ "has no problems at all"
+ if sys.version_info.major < 3:
+ import locale
+ locale.setlocale(locale.LC_ALL, "")
gettext.bindtextdomain("sst", "/usr/local/share/locale")
gettext.textdomain("sst")
if not (game.options & OPTION_CURSES):
stdscr.keypad(True)
curses.nonl()
curses.cbreak()
+ if game.options & OPTION_COLOR:
+ curses.start_color();
+ curses.use_default_colors()
+ curses.init_pair(curses.COLOR_BLACK, curses.COLOR_BLACK, -1);
+ curses.init_pair(curses.COLOR_GREEN, curses.COLOR_GREEN, -1);
+ curses.init_pair(curses.COLOR_RED, curses.COLOR_RED, -1);
+ curses.init_pair(curses.COLOR_CYAN, curses.COLOR_CYAN, -1);
+ curses.init_pair(curses.COLOR_WHITE, curses.COLOR_WHITE, -1);
+ curses.init_pair(curses.COLOR_MAGENTA, curses.COLOR_MAGENTA, -1);
+ curses.init_pair(curses.COLOR_BLUE, curses.COLOR_BLUE, -1);
+ curses.init_pair(curses.COLOR_YELLOW, curses.COLOR_YELLOW, -1);
global fullscreen_window, srscan_window, report_window, status_window
global lrscan_window, message_window, prompt_window
(rows, columns) = stdscr.getmaxyx()
curwnd.move(0, 0)
curwnd.refresh()
linecount = 0
-
+
+def textcolor(color=DEFAULT):
+ if game.options & OPTION_COLOR:
+ if color == DEFAULT:
+ curwnd.attrset(0);
+ elif color == BLACK:
+ curwnd.attron(curses.color_pair(curses.COLOR_BLACK));
+ elif color == BLUE:
+ curwnd.attron(curses.color_pair(curses.COLOR_BLUE));
+ elif color == GREEN:
+ curwnd.attron(curses.color_pair(curses.COLOR_GREEN));
+ elif color == CYAN:
+ curwnd.attron(curses.color_pair(curses.COLOR_CYAN));
+ elif color == RED:
+ curwnd.attron(curses.color_pair(curses.COLOR_RED));
+ elif color == MAGENTA:
+ curwnd.attron(curses.color_pair(curses.COLOR_MAGENTA));
+ elif color == BROWN:
+ curwnd.attron(curses.color_pair(curses.COLOR_YELLOW));
+ elif color == LIGHTGRAY:
+ curwnd.attron(curses.color_pair(curses.COLOR_WHITE));
+ elif color == DARKGRAY:
+ curwnd.attron(curses.color_pair(curses.COLOR_BLACK) | curses.A_BOLD);
+ elif color == LIGHTBLUE:
+ curwnd.attron(curses.color_pair(curses.COLOR_BLUE) | curses.A_BOLD);
+ elif color == LIGHTGREEN:
+ curwnd.attron(curses.color_pair(curses.COLOR_GREEN) | curses.A_BOLD);
+ elif color == LIGHTCYAN:
+ curwnd.attron(curses.color_pair(curses.COLOR_CYAN) | curses.A_BOLD);
+ elif color == LIGHTRED:
+ curwnd.attron(curses.color_pair(curses.COLOR_RED) | curses.A_BOLD);
+ elif color == LIGHTMAGENTA:
+ curwnd.attron(curses.color_pair(curses.COLOR_MAGENTA) | curses.A_BOLD);
+ elif color == YELLOW:
+ curwnd.attron(curses.color_pair(curses.COLOR_YELLOW) | curses.A_BOLD);
+ elif color == WHITE:
+ curwnd.attron(curses.color_pair(curses.COLOR_WHITE) | curses.A_BOLD);
+
+def highvideo():
+ if game.options & OPTION_COLOR:
+ curwnd.attron(curses.A_REVERSE)
+
#
# Things past this point have policy implications.
#
elif m == 3: proutn(_("3rd"))
proutn(_(" attempt to re-materialize ") + crmshp())
game.quad[ix][iy]=('-','o','O')[m-1]
+ textcolor(RED)
warble()
if randreal() > probf:
break
prout(_("fails."))
+ textcolor(DEFAULT)
curses.delay_output(500)
if m > 3:
game.quad[ix][iy]='?'
finish(FMATERIALIZE)
return
game.quad[ix][iy]=game.ship
+ textcolor(GREEN);
prout(_("succeeds."))
+ textcolor(DEFAULT);
dock(False)
skip(1)
prout(_("Lt. Uhura- \"Captain, we made it!\""))
skip(1)
prouts(_("Scotty- \"Keep your fingers crossed, Sir!\""))
skip(1)
- if with(game.cryprob):
+ if withprob(game.cryprob):
prouts(_(" \"Activating now! - - No good! It's***"))
skip(2)
prouts(_("***RED ALERT! RED A*L********************************"))
def sectscan(goodScan, i, j):
"Light up an individual dot in a sector."
if goodScan or (abs(i-game.sector.i)<= 1 and abs(j-game.sector.j) <= 1):
+ textcolor({"green":GREEN,
+ "yellow":YELLOW,
+ "red":RED,
+ "docked":CYAN,
+ "dead":BROWN}[game.condition])
+ if game.quad[i][j] != game.ship:
+ highvideo();
proutn("%c " % game.quad[i][j])
+ textcolor(DEFAULT)
else:
proutn("- ")
pass
elif len(scanner.token):
proutn(_("What is \"%s\"?") % scanner.token)
+ game.options &=~ OPTION_COLOR
setpassword()
if game.passwd == "debug":
idebug = True
setwnd(message_window)
if key == "IHEOL":
return
- if scanner.token in commands or scanner.token == "ABBREV":
+ if scanner.token.upper() in commands or scanner.token == "ABBREV":
break
skip(1)
listCommands()
scanner.chew()
skip(1)
cmd = scanner.token.upper()
- try:
- fp = open(SSTDOC, "r")
- except IOError:
+ for directory in docpath:
try:
- fp = open(DOC_NAME, "r")
+ fp = open(os.path.join(directory, "sst.doc"), "r")
+ break
except IOError:
- prout(_("Spock- \"Captain, that information is missing from the"))
- proutn(_(" computer. You need to find "))
- proutn(DOC_NAME)
- prout(_(" and put it in the"))
- proutn(_(" current directory or to "))
- proutn(SSTDOC)
- prout(".\"")
- # This used to continue: "You need to find SST.DOC and put
- # it in the current directory."
- return
+ pass
+ else:
+ prout(_("Spock- \"Captain, that information is missing from the"))
+ prout(_(" computer. You need to find sst.doc and put it somewhere"))
+ proutn(_(" in these directories: %s") % ":".join(docpath))
+ prout(".\"")
+ # This used to continue: "You need to find SST.DOC and put
+ # it in the current directory."
+ return
while True:
linebuf = fp.readline()
if linebuf == '':
return
if linebuf[0] == '%' and linebuf[1] == '%' and linebuf[2] == ' ':
linebuf = linebuf[3:].strip()
- if cmd == linebuf:
+ if cmd.upper() == linebuf:
break
skip(1)
prout(_("Spock- \"Captain, I've found the following information:\""))
skip(1)
- while linebuf in fp:
+ while True:
+ linebuf = fp.readline()
if "******" in linebuf:
break
proutn(linebuf)
phasers()
if game.ididit:
hitme = True
- elif cmd == "TORPEDO": # photon torpedos
- photon()
+ elif cmd in ("TORPEDO", "PHOTONS"): # photon torpedos
+ torps()
if game.ididit:
hitme = True
elif cmd == "MOVE": # move under warp
sys.stderr.write("usage: sst [-t] [-x] [startcommand...].\n")
raise SystemExit, 1
# where to save the input in case of bugs
+ if "TMPDIR" in os.environ:
+ tmpdir = os.environ['TMPDIR']
+ else:
+ tmpdir = "/tmp"
try:
- logfp = open("/tmp/sst-input.log", "w")
+ logfp = open(os.path.join(tmpdir, "sst-input.log"), "w")
except IOError:
sys.stderr.write("sst: warning, can't open logfile\n")
sys.exit(1)