X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fsst.py;h=103e49fa90c9a7d5a4c02bcb206bcd80f83b3010;hp=4c365259009ae0ca8dd4ba506188b3aeae1549a0;hb=9bb286f638aae37a21d25d3a2a4cb8f11deb22cc;hpb=7d2fa7a973f6e8a8927b36c87c172c91ec4b6ed5 diff --git a/src/sst.py b/src/sst.py index 4c36525..103e49f 100644 --- a/src/sst.py +++ b/src/sst.py @@ -2,10 +2,9 @@ """ sst.py =-- Super Star Trek in Python -This code is a Python translation of a C translation of a FORTRAN original. -The FORTRANness still shows in many ways, notably the use of a lot of -parallel arrays where a more modern language would use structures -or objects. (However, 1-origin array indexing was fixed.) +This code is a Python translation of a C translation of a FORTRAN +original dating back to 1973. Beautiful Python it is not. But it +works. Dave Matuszek says: @@ -46,11 +45,11 @@ however mine had some feature it didn't have. So I merged its features that I liked. I also took a peek at the DECUS version (a port, less sources, to the PDP-10), and some other variations. -1, Compared to the original UT version, I've changed the "help" command to -"call" and the "terminate" command to "quit" to better match -user expectations. The DECUS version apparently made those changes -as well as changing "freeze" to "save". However I like "freeze". -(Both "freeze" and "save" work in SST2K.) +1, Compared to the original UT version, I've changed the "help" +command to "call" and the "terminate" command to "quit" to better +match user expectations. The DECUS version apparently made those +changes as well as changing "freeze" to "save". However I like +"freeze". (Both "freeze" and "save" work in SST2K.) 2. The experimental deathray originally had only a 5% chance of success, but could be used repeatedly. I guess after a couple @@ -180,7 +179,7 @@ more: the LRSCAN command is no longer needed. (Controlled by OPTION_AUTOSCAN and turned off if game type is "plain" or "almy".) """ -import os,sys,math,curses,time,atexit,readline,cPickle,random,getopt,copy +import os, sys, math, curses, time, readline, cPickle, random, copy SSTDOC = "/usr/share/doc/sst/sst.doc" DOC_NAME = "sst.doc" @@ -256,7 +255,7 @@ class coord: return math.sqrt((self.i - other.i)**2 + (self.j - other.j)**2) def bearing(self, other=None): if not other: other = coord(0, 0) - return 1.90985*math.atan2(self.i-other.i, self.j-other.j) + return 1.90985*math.atan2(self.j-other.j, self.i-other.i) def sgn(self): s = coord() if self.i == 0: @@ -1057,11 +1056,11 @@ def movetholian(): for i in range(QUADSIZE): if game.quad[0][i]!=IHWEB and game.quad[0][i]!=IHT: return - if game.quad[QUADSIZE][i]!=IHWEB and game.quad[QUADSIZE][i]!=IHT: + if game.quad[QUADSIZE-1][i]!=IHWEB and game.quad[QUADSIZE-1][i]!=IHT: return if game.quad[i][0]!=IHWEB and game.quad[i][0]!=IHT: return - if game.quad[i][QUADSIZE]!=IHWEB and game.quad[i][QUADSIZE]!=IHT: + if game.quad[i][QUADSIZE-1]!=IHWEB and game.quad[i][QUADSIZE-1]!=IHT: return # All plugged up -- Tholian splits game.quad[game.tholian.kloc.i][game.tholian.kloc.j]=IHWEB @@ -1330,7 +1329,7 @@ def torpedo(origin, course, dispersion, number, nburst): shoved = True elif iquad in (IHC, IHS, IHR, IHK): # Hit a regular enemy # find the enemy - if withprob(0.05): + if iquad in (IHC, IHS) and withprob(0.05): prout(crmena(True, iquad, "sector", w) + _(" uses anti-photon device;")) prout(_(" torpedo neutralized.")) return None @@ -1725,7 +1724,7 @@ def targetcheck(w): prout(_(" the Captain's psychological profile.\"")) scanner.chew() return None - return 1.90985932*math.atan2(delta.j, delta.i) + return delta.bearing() def photon(): "Launch photon torpedo." @@ -2653,13 +2652,6 @@ def wait(): game.resting = False game.optime = 0 -# A nova occurs. It is the result of having a star hit with a -# photon torpedo, or possibly of a probe warhead going off. -# Stars that go nova cause stars which surround them to undergo -# the same probabilistic process. Klingons next to them are -# destroyed. And if the starship is next to it, it gets zapped. -# If the zap is too much, it gets destroyed. - def nova(nov): "Star goes nova." course = (0.0, 10.5, 12.0, 1.5, 9.0, 0.0, 3.0, 7.5, 6.0, 4.5) @@ -3323,27 +3315,8 @@ message_window = None prompt_window = None curwnd = None -def outro(): - "Wrap up, either normally or due to signal" - if game.options & OPTION_CURSES: - #clear() - #curs_set(1) - #refresh() - #resetterm() - #echo() - curses.endwin() - sys.stdout.write('\n') - if logfp: - logfp.close() - def iostart(): global stdscr, rows - #setlocale(LC_ALL, "") - #bindtextdomain(PACKAGE, LOCALEDIR) - #textdomain(PACKAGE) - if atexit.register(outro): - sys.stderr.write("Unable to register outro(), exiting...\n") - raise SysExit,1 if not (game.options & OPTION_CURSES): ln_env = os.getenv("LINES") if ln_env: @@ -3355,7 +3328,6 @@ def iostart(): stdscr.keypad(True) curses.nonl() curses.cbreak() - curses.start_color() global fullscreen_window, srscan_window, report_window, status_window global lrscan_window, message_window, prompt_window (rows, columns) = stdscr.getmaxyx() @@ -3368,20 +3340,19 @@ def iostart(): prompt_window = curses.newwin(1, 0, rows-2, 0) message_window.scrollok(True) setwnd(fullscreen_window) - textcolor(DEFAULT) - -def textcolor(color): - "Set text foreground color. Presently a stub." - pass # FIXME def ioend(): - "Wrap up I/O. Presently a stub." - pass + "Wrap up I/O." + if game.options & OPTION_CURSES: + stdscr.keypad(False) + curses.echo() + curses.nocbreak() + curses.endwin() def waitfor(): "Wait for user action -- OK to do nothing if on a TTY" if game.options & OPTION_CURSES: - stsdcr.getch() + stdscr.getch() def announce(): skip(1) @@ -3422,7 +3393,10 @@ def skip(i): pause_game() clrscr() else: - proutn("\n") + try: + curwnd.move(y+1, 0) + except curses.error: + pass else: global linecount linecount += 1 @@ -3451,7 +3425,7 @@ def prouts(line): time.sleep(0.03) proutn(c) if game.options & OPTION_CURSES: - wrefresh(curwnd) + curwnd.refresh() else: sys.stdout.flush() if not replayfp or replayfp.closed: @@ -3945,8 +3919,8 @@ def getcourse(isprobe, akey): prout(_("Ensign Chekov- \"Course laid in, Captain.\"")) # the actual deltas get computed here delta = coord() - delta.i = dquad.j-game.quadrant.j + 0.1*(dsect.j-game.sector.j) - delta.j = game.quadrant.i-dquad.i + 0.1*(game.sector.i-dsect.i) + delta.j = dquad.j-game.quadrant.j + 0.1*(dsect.j-game.sector.j) + delta.i = game.quadrant.i-dquad.i + 0.1*(game.sector.i-dsect.i) else: # manual while key == "IHEOL": proutn(_("X and Y displacements- ")) @@ -4371,23 +4345,6 @@ def probe(): game.ididit = True return -# Here's how the mayday code works: -# -# First, the closest starbase is selected. If there is a a starbase -# in your own quadrant, you are in good shape. This distance takes -# quadrant distances into account only. -# -# A magic number is computed based on the distance which acts as the -# probability that you will be rematerialized. You get three tries. -# -# When it is determined that you should be able to be rematerialized -# (i.e., when the probability thing mentioned above comes up -# positive), you are put into that quadrant (anywhere). Then, we try -# to see if there is a spot adjacent to the star- base. If not, you -# can't be rematerialized!!! Otherwise, it drops you there. It only -# tries five times to find a spot to drop you. After that, it's your -# problem. - def mayday(): "Yell for help from nearest starbase." # There's more than one way to move in this game! @@ -4442,13 +4399,13 @@ def mayday(): elif m == 3: proutn(_("3rd")) proutn(_(" attempt to re-materialize ") + crmshp()) game.quad[ix][iy]=(IHMATER0,IHMATER1,IHMATER2)[m-1] - textcolor("red") + #textcolor("red") warble() if randreal() > probf: break prout(_("fails.")) curses.delay_output(500) - textcolor(None) + #textcolor(None) if m > 3: game.quad[ix][iy]=IHQUEST game.alive = False @@ -4457,31 +4414,13 @@ def mayday(): finish(FMATERIALIZE) return game.quad[ix][iy]=game.ship - textcolor("green") + #textcolor("green") prout(_("succeeds.")) - textcolor(None) + #textcolor(None) dock(False) skip(1) prout(_("Lt. Uhura- \"Captain, we made it!\"")) -# Abandon Ship (the BSD-Trek description) -# -# The ship is abandoned. If your current ship is the Faire -# Queene, or if your shuttlecraft is dead, you're out of -# luck. You need the shuttlecraft in order for the captain -# (that's you!!) to escape. -# -# Your crew can beam to an inhabited starsystem in the -# quadrant, if there is one and if the transporter is working. -# If there is no inhabited starsystem, or if the transporter -# is out, they are left to die in outer space. -# -# If there are no starbases left, you are captured by the -# Klingons, who torture you mercilessly. However, if there -# is at least one starbase, you are returned to the -# Federation in a prisoner of war exchange. Of course, this -# can't happen unless you have taken some prisoners. - def abandon(): "Abandon ship." scanner.chew() @@ -5227,15 +5166,15 @@ 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): if (game.quad[i][j]==IHMATER0) or (game.quad[i][j]==IHMATER1) or (game.quad[i][j]==IHMATER2) or (game.quad[i][j]==IHE) or (game.quad[i][j]==IHF): - if game.condition == "red": textcolor("red") - elif game.condition == "green": textcolor("green") - elif game.condition == "yellow": textcolor("yellow") - elif game.condition == "docked": textcolor("cyan") - elif game.condition == "dead": textcolor("brown") + #if game.condition == "red": textcolor("red") + #elif game.condition == "green": textcolor("green") + #elif game.condition == "yellow": textcolor("yellow") + #elif game.condition == "docked": textcolor("cyan") + #elif game.condition == "dead": textcolor("brown") if game.quad[i][j] != game.ship: highvideo() proutn("%c " % game.quad[i][j]) - textcolor(None) + #textcolor(None) else: proutn("- ") @@ -5333,7 +5272,7 @@ def srscan(): for j in range(QUADSIZE): sectscan(goodScan, i, j) skip(1) - + def eta(): "Use computer to get estimated time of arrival for a warp jump." w1 = coord(); w2 = coord() @@ -6083,12 +6022,14 @@ commands = { def listCommands(): "Generate a list of legal commands." - proutn(_("LEGAL COMMANDS ARE:")) - for (k, key) in enumerate(commands): + prout(_("LEGAL COMMANDS ARE:")) + emitted = 0 + for key in commands: if not commands[key] or (commands[key] & game.options): - if k % 5 == 0: + proutn("%-12s " % key) + emitted += 1 + if emitted % 5 == 4: skip(1) - proutn("%-12s " % key) skip(1) def helpme(): @@ -6534,6 +6475,7 @@ def debugme(): atover(True) if __name__ == '__main__': + import getopt, socket try: global line, thing, game, idebug game = None @@ -6585,6 +6527,8 @@ if __name__ == '__main__': if logfp: logfp.write("# seed %s\n" % seed) logfp.write("# options %s\n" % " ".join(arguments)) + logfp.write("# recorded by %s@%s on %s\n" % \ + (os.getenv("LOGNAME"),socket.gethostname(),time.ctime())) random.seed(seed) scanner = sstscanner() map(scanner.append, arguments) @@ -6618,5 +6562,7 @@ if __name__ == '__main__': ioend() raise SystemExit, 0 except KeyboardInterrupt: + if logfp: + logfp.close() print "" pass