X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fsst.py;h=dff69d5235b98837f1d9530aaf557042992c6db9;hp=037a7f2e18660c42cca7bafbde164d7f6b11819d;hb=e216123ea61430150dab0ed9623b5cbf53071479;hpb=f557a41bec64690d88eb63329d529207b7be9b2c diff --git a/src/sst.py b/src/sst.py index 037a7f2..dff69d5 100644 --- a/src/sst.py +++ b/src/sst.py @@ -248,7 +248,7 @@ class coord: def __add__(self, other): return coord(self.x+self.x, self.y+self.y) def __sub__(self, other): - return coord(self.x-self.x, self.y-self.y) + return coord(self.x-other.x, self.y-other.y) def distance(self, other): return math.sqrt((self.x - other.x)**2 + (self.y - other.y)**2) def sgn(self): @@ -427,13 +427,17 @@ class enemy: def move(self, loc): motion = (loc != self.kloc) if self.kloc.x is not None and self.kloc.y is not None: - game.quad[self.kloc.x][self.kloc.y] = IHDOT + if motion: + if self.type == IHT: + game.quad[self.kloc.x][self.kloc.y] = IHWEB + else: + game.quad[self.kloc.x][self.kloc.y] = IHDOT if loc: - self.kloc = loc + self.kloc = copy.copy(loc) game.quad[self.kloc.x][self.kloc.y] = self.type self.kdist = self.kavgd = distance(game.sector, loc) else: - self.kloc = coord() # enemy sector location + self.kloc = coord() self.kdist = self.kavgd = None game.enemies.remove(self) return motion @@ -445,7 +449,7 @@ class gamestate: self.options = None # Game options self.state = snapshot() # A snapshot structure self.snapsht = snapshot() # Last snapshot taken for time-travel purposes - self.quad = fill2d(QUADSIZE, lambda i, j: IHDOT) # contents of our quadrant + self.quad = None # contents of our quadrant self.damage = [0.0] * NDEVICES # damage encountered self.future = [] # future events for i in range(NEVENTS): @@ -581,25 +585,6 @@ FTRIBBLE = 19 FHOLE = 20 FCREW = 21 -# From enumerated type 'COLORS' -DEFAULT = 0 -BLACK = 1 -BLUE = 2 -GREEN = 3 -CYAN = 4 -RED = 5 -MAGENTA = 6 -BROWN = 7 -LIGHTGRAY = 8 -DARKGRAY = 9 -LIGHTBLUE = 10 -LIGHTGREEN = 11 -LIGHTCYAN = 12 -LIGHTRED = 13 -LIGHTMAGENTA = 14 -YELLOW = 15 -WHITE = 16 - # Log the results of pulling random numbers so we can check determinism. import traceback @@ -1062,41 +1047,40 @@ def supercommander(): return def movetholian(): - # move the Tholian + # move the Tholian if not game.tholian or game.justin: return + id = coord() if game.tholian.kloc.x == 0 and game.tholian.kloc.y == 0: - idx = 0; idy = QUADSIZE-1 + id.x = 0; id.y = QUADSIZE-1 elif game.tholian.kloc.x == 0 and game.tholian.kloc.y == QUADSIZE-1: - idx = QUADSIZE-1; idy = QUADSIZE-1 + id.x = QUADSIZE-1; id.y = QUADSIZE-1 elif game.tholian.kloc.x == QUADSIZE-1 and game.tholian.kloc.y == QUADSIZE-1: - idx = QUADSIZE-1; idy = 0 + id.x = QUADSIZE-1; id.y = 0 elif game.tholian.kloc.x == QUADSIZE-1 and game.tholian.kloc.y == 0: - idx = 0; idy = 0 + id.x = 0; id.y = 0 else: # something is wrong! - game.tholian = None + game.tholian.move(None) + prout("***Internal error: Tholian in a bad spot.") return # do nothing if we are blocked - if game.quad[idx][idy]!= IHDOT and game.quad[idx][idy]!= IHWEB: + if game.quad[id.x][id.y] not in (IHDOT, IHWEB): return - game.quad[game.tholian.kloc.x][game.tholian.kloc.y] = IHWEB - if game.tholian.kloc.x != idx: - # move in x axis - im = math.fabs(idx - game.tholian.kloc.x)*1.0/(idx - game.tholian.kloc.x) - while game.tholian.kloc.x != idx: - game.tholian.kloc.x += im - if game.quad[game.tholian.kloc.x][game.tholian.kloc.y]==IHDOT: - game.quad[game.tholian.kloc.x][game.tholian.kloc.y] = IHWEB - elif game.tholian.kloc.y != idy: - # move in y axis - im = math.fabs(idy - game.tholian.kloc.y)*1.0/(idy - game.tholian.kloc.y) - while game.tholian.kloc.y != idy: - game.tholian.kloc.y += im - if game.quad[game.tholian.kloc.x][game.tholian.kloc.y]==IHDOT: - game.quad[game.tholian.kloc.x][game.tholian.kloc.y] = IHWEB - game.quad[game.tholian.kloc.x][game.tholian.kloc.y] = IHT - #game.enemies[-1].kloc = game.tholian #FIXME + here = copy.copy(game.tholian.kloc) + delta = (id - game.tholian.kloc).sgn() + # move in x axis + while here.x != id.x: + #print "Moving in X", delta + here.x += delta.x + if game.quad[here.kloc.x][here.y]==IHDOT: + game.tholian.move(here) + # move in y axis + while here.y != id.y: + #print "Moving in Y", delta + here.y += delta.y + if game.quad[here.x][here.y]==IHDOT: + game.tholian.move(here) # check to see if all holes plugged for i in range(QUADSIZE): if game.quad[0][i]!=IHWEB and game.quad[0][i]!=IHT: @@ -1113,6 +1097,7 @@ def movetholian(): crmena(True, IHT, "sector", game.tholian) prout(_(" completes web.")) game.tholian.move(None) + print "Tholian movement ends" return # Code from battle.c begins here @@ -1721,7 +1706,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 = randrange(hittot * 0.015) + icas = randrange(int(hittot * 0.015)) if icas >= 2: skip(1) prout(_("Mc Coy- \"Sickbay to bridge. We suffered %d casualties") % icas) @@ -1807,7 +1792,8 @@ def targetcheck(w): return 1.90985932*math.atan2(deltx, delty) def photon(): - # launch photon torpedo + # launch photon torpedo + course = [0.0] * MAXBURST game.ididit = False if damaged(DPHOTON): prout(_("Photon tubes damaged.")) @@ -1824,10 +1810,11 @@ def photon(): return elif key == IHEOL: prout(_("%d torpedoes left.") % game.torps) + chew() proutn(_("Number of torpedoes to fire- ")) key = scan() else: # key == IHREAL { - n = aaitem + 0.5 + n = int(round(aaitem + 0.5)) if n <= 0: # abort command chew() return @@ -1942,7 +1929,7 @@ def checkshctrl(rpow): prouts(_("Sulu- \"Captain! Shield malfunction! Phaser fire contained!\"")) skip(2) prout(_("Lt. Uhura- \"Sir, all decks reporting damage.\"")) - icas = randrange(hit*0.012) + icas = randrange(int(hit*0.012)) skip(1) fry(0.8*hit) if icas: @@ -1959,7 +1946,7 @@ def checkshctrl(rpow): def hittem(hits): # register a phaser hit on Klingons and Romulans - nenhr2 = game.nenhere; kk=0 + nenhr2 = len(game.enemies); kk=0 w = coord() skip(1) for (k, wham) in enumerate(hits): @@ -2012,7 +1999,7 @@ def phasers(): automode = "NOTSET" key=0 skip(1) - # SR sensors and Computer are needed fopr automode + # SR sensors and Computer are needed for automode if damaged(DSRSENS) or damaged(DCOMPTR): itarg = False if game.condition == "docked": @@ -2040,7 +2027,7 @@ def phasers(): key=scan() if key == IHALPHA: if isit("manual"): - if game.nenhere==0: + if len(game.enemies)==0: prout(_("There is no enemy present to select.")) chew() key = IHEOL @@ -2049,10 +2036,10 @@ def phasers(): automode = "MANUAL" key = scan() elif isit("automatic"): - if (not itarg) and game.nenhere != 0: + if (not itarg) and len(game.enemies) != 0: automode = "FORCEMAN" else: - if game.nenhere==0: + if len(game.enemies)==0: prout(_("Energy will be expended into space.")) automode = "AUTOMATIC" key = scan() @@ -2062,7 +2049,7 @@ def phasers(): huh() return elif key == IHREAL: - if game.nenhere==0: + if len(game.enemies)==0: prout(_("Energy will be expended into space.")) automode = "AUTOMATIC" elif not itarg: @@ -2071,7 +2058,7 @@ def phasers(): automode = "AUTOMATIC" else: # IHEOL - if game.nenhere==0: + if len(game.enemies)==0: prout(_("Energy will be expended into space.")) automode = "AUTOMATIC" elif not itarg: @@ -2086,13 +2073,13 @@ def phasers(): if key == IHALPHA and isit("no"): no = True key = scan() - if key != IHREAL and game.nenhere != 0: + if key != IHREAL and len(game.enemies) != 0: prout(_("Phasers locked on target. Energy available: %.2f")%avail) irec=0 while True: chew() if not kz: - for i in range(game.nenhere): + for i in range(len(game.enemies)): irec += math.fabs(game.enemies[i].kpower)/(PHASEFAC*math.pow(0.90,game.enemies[i].kdist))*randreal(1.01, 1.06) + 1.0 kz=1 proutn(_("%d units required. ") % irec) @@ -2122,10 +2109,10 @@ def phasers(): chew() game.energy -= rpow extra = rpow - if game.nenhere: + if len(game.enemies): extra = 0.0 powrem = rpow - for i in range(game.nenhere): + for i in range(len(game.enemies)): hits.append(0.0) if powrem <= 0: continue @@ -2145,7 +2132,7 @@ def phasers(): if extra > 0 and not game.alldone: if game.tholian: proutn(_("*** Tholian web absorbs ")) - if game.nenhere>0: + if len(game.enemies)>0: proutn(_("excess ")) prout(_("phaser energy.")) else: @@ -2165,7 +2152,7 @@ def phasers(): skip(1) elif automode == "MANUAL": rpow = 0.0 - for k in range(game.nenhere): + for k in range(len(game.enemies)): aim = game.enemies[k].kloc ienm = game.quad[aim.x][aim.y] if msgflag: @@ -2173,8 +2160,8 @@ def phasers(): skip(1) msgflag = False rpow = 0.0 - if damaged(DSRSENS) and not (abs(game.sector.x-aim.x) < 2 and abs(game.sector.y-aim.y) < 2) and \ - (ienm == IHC or ienm == IHS): + if damaged(DSRSENS) and \ + not game.sector.distance(aim)<2**0.5 and ienm in (IHC, IHS): cramen(ienm) prout(_(" can't be located without short range scan.")) chew() @@ -2719,7 +2706,7 @@ def wait(): origTime = delay = aaitem if delay <= 0.0: return - if delay >= game.state.remtime or game.nenhere != 0: + if delay >= game.state.remtime or len(game.enemies) != 0: proutn(_("Are you sure? ")) if ja() == False: return @@ -2732,7 +2719,7 @@ def wait(): prout(_("%d stardates left.") % int(game.state.remtime)) return temp = game.optime = delay - if game.nenhere: + if len(game.enemies): rtime = randreal(1.0, 2.0) if rtime < temp: temp = rtime @@ -2856,7 +2843,7 @@ def nova(nov): elif iquad == IHK: # kill klingon deadkl(neighbor, iquad, neighbor) elif iquad in (IHC,IHS,IHR): # Damage/destroy big enemies - for ll in range(game.nenhere): + for ll in range(len(game.enemies)): if game.enemies[ll].kloc == neighbor: break game.enemies[ll].kpower -= 800.0 # If firepower is lost, die @@ -3068,10 +3055,10 @@ def kaboom(): skip(1) stars() skip(1) - if game.nenhere != 0: + if len(game.enemies) != 0: whammo = 25.0 * game.energy l=1 - while l <= game.nenhere: + while l <= len(game.enemies): if game.enemies[l].kpower*game.enemies[l].kdist <= whammo: deadkl(game.enemies[l].kloc, game.quad[game.enemies[l].kloc.x][game.enemies[l].kloc.y], game.enemies[l].kloc) l += 1 @@ -3511,6 +3498,7 @@ def iostart(): #noecho() global fullscreen_window, srscan_window, report_window, status_window global lrscan_window, message_window, prompt_window + (rows, columns) = stdscr.getmaxyx() fullscreen_window = stdscr srscan_window = curses.newwin(12, 25, 0, 0) report_window = curses.newwin(11, 0, 1, 25) @@ -3522,8 +3510,16 @@ def iostart(): 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 + def waitfor(): - "wait for user action -- OK to do nothing if on a TTY" + "Wait for user action -- OK to do nothing if on a TTY" if game.options & OPTION_CURSES: stsdcr.getch() @@ -3647,45 +3643,7 @@ def clrscr(): curwnd.move(0, 0) curwnd.refresh() linecount = 0 - -def textcolor(color): - "Set the current text color" - if game.options & OPTION_CURSES: - 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(): "Set highlight video, if this is reasonable." if game.options & OPTION_CURSES: @@ -3817,15 +3775,15 @@ def imove(novapush): def no_quad_change(): # No quadrant change -- compute new average enemy distances game.quad[game.sector.x][game.sector.y] = game.ship - if game.nenhere: - for m in range(game.nenhere): + if len(game.enemies): + for m in range(len(game.enemies)): finald = distance(w, game.enemies[m].kloc) game.enemies[m].kavgd = 0.5 * (finald+game.enemies[m].kdist) game.enemies[m].kdist = finald game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist)) if not game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: attack(torps_ok=False) - for m in range(game.nenhere): + for m in range(len(game.enemies)): game.enemies[m].kavgd = game.enemies[m].kdist newcnd() drawmaps(0) @@ -3863,9 +3821,9 @@ def imove(novapush): if not VALID_SECTOR(w.x, w.y): # Leaving quadrant -- allow final enemy attack # Don't do it if being pushed by Nova - if game.nenhere != 0 and not novapush: + if len(game.enemies) != 0 and not novapush: newcnd() - for m in range(game.nenhere): + for m in range(len(game.enemies)): finald = distance(w, game.enemies[m].kloc) game.enemies[m].kavgd = 0.5 * (finald + game.enemies[m].kdist) # @@ -4642,13 +4600,13 @@ def mayday(): 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(DEFAULT) + textcolor(None) if m > 3: game.quad[ix][iy]=IHQUEST game.alive = False @@ -4657,9 +4615,9 @@ def mayday(): finish(FMATERIALIZE) return game.quad[ix][iy]=game.ship - textcolor(GREEN) + textcolor("green") prout(_("succeeds.")) - textcolor(DEFAULT) + textcolor(None) dock(False) skip(1) prout(_("Lt. Uhura- \"Captain, we made it!\"")) @@ -5147,7 +5105,7 @@ def deathray(): if game.ship != IHE: prout(_("Ye Faerie Queene has no death ray.")) return - if game.nenhere==0: + if len(game.enemies)==0: prout(_("Sulu- \"But Sir, there are no enemies in this quadrant.\"")) return if damaged(DDRAY): @@ -5179,7 +5137,7 @@ def deathray(): if r > dprob: prouts(_("Sulu- \"Captain! It's working!\"")) skip(2) - while game.nenhere > 0: + while len(game.enemies) > 0: deadkl(game.enemies[1].kloc, game.quad[game.enemies[1].kloc.x][game.enemies[1].kloc.y],game.enemies[1].kloc) prout(_("Ensign Chekov- \"Congratulations, Captain!\"")) if (game.state.remkl + game.state.remcom + game.state.nscrem) == 0: @@ -5433,15 +5391,15 @@ def sectscan(goodScan, i, j): # light up an individual dot in a sector if goodScan or (abs(i-game.sector.x)<= 1 and abs(j-game.sector.y) <= 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(DEFAULT) + textcolor(None) else: proutn("- ") @@ -5540,7 +5498,6 @@ def srscan(): sectscan(goodScan, i, j) skip(1) - def eta(): # use computer to get estimated time of arrival for a warp jump w1 = coord(); w2 = coord() @@ -5991,7 +5948,7 @@ def setup(needprompt): prout(_(" YOU'LL NEED IT.")) waitfor() newqad(False) - if game.nenhere - (thing == game.quadrant) - (game.tholian != None): + if len(game.enemies) - (thing == game.quadrant) - (game.tholian != None): game.shldup = True if game.neutz: # bad luck to start in a Romulan Neutral Zone attack(torps_ok=False) @@ -6006,7 +5963,7 @@ def choose(needprompt): game.length = 0 if needprompt: # Can start with command line options proutn(_("Would you like a regular, tournament, or saved game? ")) - scan() + print "About to call scan()" if len(citem)==0: # Try again continue if isit("tournament"): @@ -6143,12 +6100,13 @@ def newqad(shutup): game.ishere = False game.irhere = 0 game.iplnet = 0 - game.nenhere = 0 game.neutz = False game.inorbit = False game.landed = False game.ientesc = False game.iseenit = False + # Create a blank quadrant + game.quad = fill2d(QUADSIZE, lambda i, j: IHDOT) if game.iscate: # Attempt to escape Super-commander, so tbeam back! game.iscate = False @@ -6159,7 +6117,6 @@ def newqad(shutup): return game.klhere = q.klingons game.irhere = q.romulans - game.nenhere = game.klhere + game.irhere # Position Starship game.quad[game.sector.x][game.sector.y] = game.ship game.enemies = [] @@ -6183,7 +6140,7 @@ def newqad(shutup): game.iscate = (game.state.remkl > 1) game.ishere = True # Put in Romulans if needed - for i in range(game.klhere, game.nenhere): + for i in range(game.klhere, len(game.enemies)): enemy(IHR, loc=dropin(), power=randreal(400.0,850.0)+50.0*game.skill) # If quadrant needs a starbase, put it in if q.starbase: @@ -6210,7 +6167,7 @@ def newqad(shutup): if shutup==0: # Put in THING if needed if thing == game.quadrant: - enemy(symbol=IHQUEST, loc=dropin(), + enemy(type=IHQUEST, loc=dropin(), power=randreal(6000,6500.0)+250.0*game.skill) if not damaged(DSRSENS): skip(1) @@ -6227,7 +6184,7 @@ def newqad(shutup): w.y = withprob(0.5) * (QUADSIZE-1) if game.quad[w.x][w.y] == IHDOT: break - game.tholian = enemy(symbol=IHT, loc=w, + game.tholian = enemy(type=IHT, loc=w, power=randrange(100, 500) + 25.0*game.skill) # Reserve unoccupied corners if game.quad[0][0]==IHDOT: @@ -6456,7 +6413,7 @@ def makemoves(): elif cmd == "IMPULSE": # impulse impulse() elif cmd == "REST": # rest - os.wait() + wait() if game.ididit: hitme = True elif cmd == "WARP": # warp @@ -6810,35 +6767,38 @@ if __name__ == '__main__': logfp.write("# seed %s\n" % seed) logfp.write("# options %s\n" % " ".join(arguments)) random.seed(seed) - iostart() if arguments: inqueue = arguments else: inqueue = None - while True: # Play a game - setwnd(fullscreen_window) - clrscr() - prelim() - setup(needprompt=not inqueue) - if game.alldone: - score() - game.alldone = False - else: - makemoves() - skip(1) - stars() + try: + iostart() + while True: # Play a game + setwnd(fullscreen_window) + clrscr() + prelim() + setup(needprompt=not inqueue) + if game.alldone: + score() + game.alldone = False + else: + makemoves() + skip(1) + stars() + skip(1) + if game.tourn and game.alldone: + proutn(_("Do you want your score recorded?")) + if ja() == True: + chew2() + freeze(False) + chew() + proutn(_("Do you want to play again? ")) + if not ja(): + break skip(1) - if game.tourn and game.alldone: - proutn(_("Do you want your score recorded?")) - if ja() == True: - chew2() - freeze(False) - chew() - proutn(_("Do you want to play again? ")) - if not ja(): - break - skip(1) - prout(_("May the Great Bird of the Galaxy roost upon your home planet.")) + prout(_("May the Great Bird of the Galaxy roost upon your home planet.")) + finally: + ioend() raise SystemExit, 0 except KeyboardInterrupt: print""