X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fsst.py;h=74dcbaa3aee8ab27ce8b09f73e4e642330a0c2ca;hp=020e91fefd5c16dad704cbb4fb39daeb5369b431;hb=29d86fb395ca01e4a4f65f02d67f5823a4ebba11;hpb=b33abcf3adfa7e3e8065dd545d770ddf1450172f diff --git a/src/sst.py b/src/sst.py index 020e91f..74dcbaa 100644 --- a/src/sst.py +++ b/src/sst.py @@ -180,7 +180,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" @@ -227,56 +227,58 @@ IHMATER0 = '-', IHMATER1 = 'o', IHMATER2 = '0' -IHEOL = '\n' -IHREAL = 0.0 -IHALPHA = " " - class coord: def __init__(self, x=None, y=None): - self.x = x - self.y = y + self.i = x + self.j = y def invalidate(self): - self.x = self.y = None + self.i = self.j = None def is_valid(self): - return self.x != None and self.y != None + return self.i != None and self.j != None def __eq__(self, other): - return other != None and self.x == other.y and self.x == other.y + return other != None and self.i == other.i and self.j == other.j def __add__(self, other): - return coord(self.x+self.x, self.y+self.y) + return coord(self.i+other.i, self.j+other.j) def __sub__(self, other): - return coord(self.x-other.x, self.y-other.y) + return coord(self.i-other.i, self.j-other.j) def __mul__(self, other): - return coord(self.x*other, self.y*other) + return coord(self.i*other, self.j*other) def __rmul__(self, other): - return coord(self.x*other, self.y*other) + return coord(self.i*other, self.j*other) + def __div__(self, other): + return coord(self.i/other, self.j/other) + def __rdiv__(self, other): + return coord(self.i/other, self.j/other) + def snaptogrid(self): + return coord(int(round(self.i)), int(round(self.j))) def distance(self, other=None): if not other: other = coord(0, 0) - return math.sqrt((self.x - other.x)**2 + (self.y - other.y)**2) + 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.x-other.x, self.y-other.y) + return 1.90985*math.atan2(self.j-other.j, self.i-other.i) def sgn(self): s = coord() - if self.x == 0: - s.x = 0 + if self.i == 0: + s.i = 0 else: - s.x = self.x / abs(self.x) - if self.y == 0: - s.y = 0 + s.i = self.i / abs(self.i) + if self.j == 0: + s.j = 0 else: - s.y = self.y / abs(self.y) + s.j = self.j / abs(self.j) return s def scatter(self): s = coord() - s.x = self.x + randrange(-1, 2) - s.y = self.y + randrange(-1, 2) + s.i = self.i + randrange(-1, 2) + s.j = self.j + randrange(-1, 2) return s def __hash__(self): return hash((x, y)) def __str__(self): - if self.x == None or self.y == None: + if self.i == None or self.j == None: return "Nowhere" - return "%s - %s" % (self.x+1, self.y+1) + return "%s - %s" % (self.i+1, self.j+1) __repr__ = __str__ class planet: @@ -424,15 +426,15 @@ class enemy: game.enemies.append(self) def move(self, loc): motion = (loc != self.kloc) - if self.kloc.x is not None and self.kloc.y is not None: + if self.kloc.i is not None and self.kloc.j is not None: if motion: if self.type == IHT: - game.quad[self.kloc.x][self.kloc.y] = IHWEB + game.quad[self.kloc.i][self.kloc.j] = IHWEB else: - game.quad[self.kloc.x][self.kloc.y] = IHDOT + game.quad[self.kloc.i][self.kloc.j] = IHDOT if loc: self.kloc = copy.copy(loc) - game.quad[self.kloc.x][self.kloc.y] = self.type + game.quad[self.kloc.i][self.kloc.j] = self.type self.kdist = self.kavgd = (game.sector - loc).distance() else: self.kloc = coord() @@ -607,17 +609,16 @@ def randreal(*args): # Code from ai.c begins here def welcoming(iq): - # Would this quadrant welcome another Klingon? - return VALID_QUADRANT(iq.x,iq.y) and \ - not game.state.galaxy[iq.x][iq.y].supernova or \ - game.state.galaxy[iq.x][iq.y].klingons < MAXKLQUAD - + "Would this quadrant welcome another Klingon?" + return VALID_QUADRANT(iq.i,iq.j) and \ + not game.state.galaxy[iq.i][iq.j].supernova and \ + game.state.galaxy[iq.i][iq.j].klingons < MAXKLQUAD def tryexit(enemy, look, irun): - # a bad guy attempts to bug out + "A bad guy attempts to bug out." iq = coord() - iq.x = game.quadrant.x+(look.x+(QUADSIZE-1))/QUADSIZE - 1 - iq.y = game.quadrant.y+(look.y+(QUADSIZE-1))/QUADSIZE - 1 + iq.i = game.quadrant.i+(look.i+(QUADSIZE-1))/QUADSIZE - 1 + iq.j = game.quadrant.j+(look.j+(QUADSIZE-1))/QUADSIZE - 1 if not welcoming(iq): return False; if enemy.type == IHR: @@ -633,20 +634,20 @@ def tryexit(enemy, look, irun): # don't leave if over 1000 units of energy if enemy.kpower > 1000.0: return False - # print escape message and move out of quadrant. + # emit escape message and move out of quadrant. # we know this if either short or long range sensors are working if not damaged(DSRSENS) or not damaged(DLRSENS) or \ game.condition == "docked": - crmena(True, enemy.type, "sector", enemy.kloc) - prout(_(" escapes to Quadrant %s (and regains strength).") % q) + prout(crmena(True, enemy.type, "sector", enemy.kloc) + \ + (_(" escapes to Quadrant %s (and regains strength).") % q)) # handle local matters related to escape enemy.move(None) game.klhere -= 1 if game.condition != "docked": newcnd() # Handle global matters related to escape - game.state.galaxy[game.quadrant.x][game.quadrant.y].klingons -= 1 - game.state.galaxy[iq.x][iq.y].klingons += 1 + game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons -= 1 + game.state.galaxy[iq.i][iq.j].klingons += 1 if enemy.type==IHS: game.iscate = False game.ientesc = False @@ -702,7 +703,7 @@ def tryexit(enemy, look, irun): # def movebaddy(enemy): - # tactical movement for the bad guys + "Tactical movement for the bad guys." next = coord(); look = coord() irun = False # This should probably be just (game.quadrant in game.state.kcmdr) + (game.state.kscmdr==game.quadrant) @@ -754,10 +755,7 @@ def movebaddy(enemy): else: motion = game.skill # calculate preferred number of steps - if motion < 0: - nsteps = -motion - else: - nsteps = motion + nsteps = abs(int(motion)) if motion > 0 and nsteps > mdist: nsteps = mdist; # don't overshoot if nsteps > QUADSIZE: @@ -768,20 +766,11 @@ def movebaddy(enemy): proutn("NSTEPS = %d:" % nsteps) # Compute preferred values of delta X and Y m = game.sector - enemy.kloc - if 2.0 * abs(m.x) < abs(m.y): - m.x = 0 - if 2.0 * abs(m.y) < abs(game.sector.x-enemy.kloc.x): - m.y = 0 - if m.x != 0: - if m.x*motion < 0: - m.x = -1 - else: - m.x = 1 - if m.y != 0: - if m.y*motion < 0: - m.y = -1 - else: - m.y = 1 + if 2.0 * abs(m.i) < abs(m.j): + m.i = 0 + if 2.0 * abs(m.j) < abs(game.sector.i-enemy.kloc.i): + m.j = 0 + m = (motion * m).sgn() next = enemy.kloc # main move loop for ll in range(nsteps): @@ -789,44 +778,44 @@ def movebaddy(enemy): proutn(" %d" % (ll+1)) # Check if preferred position available look = next + m - if m.x < 0: - krawlx = 1 + if m.i < 0: + krawli = 1 else: - krawlx = -1 - if m.y < 0: - krawly = 1 + krawli = -1 + if m.j < 0: + krawlj = 1 else: - krawly = -1 + krawlj = -1 success = False attempts = 0; # Settle mysterious hang problem while attempts < 20 and not success: attempts += 1 - if look.x < 0 or look.x >= QUADSIZE: + if look.i < 0 or look.i >= QUADSIZE: if motion < 0 and tryexit(enemy, look, irun): return - if krawlx == m.x or m.y == 0: + if krawli == m.i or m.j == 0: break - look.x = next.x + krawlx - krawlx = -krawlx - elif look.y < 0 or look.y >= QUADSIZE: + look.i = next.i + krawli + krawli = -krawli + elif look.j < 0 or look.j >= QUADSIZE: if motion < 0 and tryexit(enemy, look, irun): return - if krawly == m.y or m.x == 0: + if krawlj == m.j or m.i == 0: break - look.y = next.y + krawly - krawly = -krawly - elif (game.options & OPTION_RAMMING) and game.quad[look.x][look.y] != IHDOT: + look.j = next.j + krawlj + krawlj = -krawlj + elif (game.options & OPTION_RAMMING) and game.quad[look.i][look.j] != IHDOT: # See if enemy should ram ship - if game.quad[look.x][look.y] == game.ship and \ + if game.quad[look.i][look.j] == game.ship and \ (enemy.type == IHC or enemy.type == IHS): collision(rammed=True, enemy=enemy) return - if krawlx != m.x and m.y != 0: - look.x = next.x + krawlx - krawlx = -krawlx - elif krawly != m.y and m.x != 0: - look.y = next.y + krawly - krawly = -krawly + if krawli != m.i and m.j != 0: + look.i = next.i + krawli + krawli = -krawli + elif krawlj != m.j and m.i != 0: + look.j = next.j + krawlj + krawlj = -krawlj else: break; # we have failed else: @@ -841,9 +830,7 @@ def movebaddy(enemy): skip(1) if enemy.move(next): if not damaged(DSRSENS) or game.condition == "docked": - proutn("***") - cramen(enemy.type) - proutn(_(" from Sector %s") % enemy.kloc) + proutn(_("*** %s from Sector %s") % (cramen(enemy.type), enemy.kloc)) if enemy.kdist < dist1: proutn(_(" advances to ")) else: @@ -851,7 +838,7 @@ def movebaddy(enemy): prout("Sector %s." % next) def moveklings(): - # Klingon tactical movement + "Sequence Klingon tactical movement." if idebug: prout("== MOVCOM") # Figure out which Klingon is the commander (or Supercommander) @@ -875,16 +862,16 @@ def moveklings(): game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist)) def movescom(iq, avoid): - # commander movement helper + "Commander movement helper." # Avoid quadrants with bases if we want to avoid Enterprise if not welcoming(iq) or (avoid and iq in game.state.baseq): return True if game.justin and not game.iscate: return True # do the move - game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].klingons -= 1 + game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].klingons -= 1 game.state.kscmdr = iq - game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].klingons += 1 + 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 game.iscate=False @@ -905,7 +892,7 @@ def movescom(iq, avoid): game.state.planets[i].crystals == "present": # destroy the planet game.state.planets[i].pclass = "destroyed" - game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].planet = None + game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].planet = None if communicating(): announce() prout(_("Lt. Uhura- \"Captain, Starfleet Intelligence reports")) @@ -915,7 +902,7 @@ def movescom(iq, avoid): return False; # looks good! def supercommander(): - # move the Super Commander + "Move the Super Commander." iq = coord(); sc = coord(); ibq = coord(); idelta = coord() basetbl = [] if idebug: @@ -926,10 +913,10 @@ def supercommander(): if not game.iscate and avoid: # compute move away from Enterprise idelta = game.state.kscmdr-game.quadrant - if math.sqrt(idelta.x*idelta.x+idelta.y*idelta.y) > 2.0: + if math.sqrt(idelta.i*idelta.i+idelta.j*idelta.j) > 2.0: # circulate in space - idelta.x = game.state.kscmdr.y-game.quadrant.y - idelta.y = game.quadrant.x-game.state.kscmdr.x + idelta.i = game.state.kscmdr.j-game.quadrant.j + idelta.j = game.quadrant.i-game.state.kscmdr.i else: # compute distances to starbases if not game.state.baseq: @@ -972,24 +959,24 @@ def supercommander(): iq = game.state.kscmdr + idelta if movescom(iq, avoid): # failed -- try some other maneuvers - if idelta.x==0 or idelta.y==0: + if idelta.i==0 or idelta.j==0: # attempt angle move - if idelta.x != 0: - iq.y = game.state.kscmdr.y + 1 + if idelta.i != 0: + iq.j = game.state.kscmdr.j + 1 if movescom(iq, avoid): - iq.y = game.state.kscmdr.y - 1 + iq.j = game.state.kscmdr.j - 1 movescom(iq, avoid) else: - iq.x = game.state.kscmdr.x + 1 + iq.i = game.state.kscmdr.i + 1 if movescom(iq, avoid): - iq.x = game.state.kscmdr.x - 1 + iq.i = game.state.kscmdr.i - 1 movescom(iq, avoid) else: # try moving just in x or y - iq.y = game.state.kscmdr.y + iq.j = game.state.kscmdr.j if movescom(iq, avoid): - iq.y = game.state.kscmdr.y + idelta.y - iq.x = game.state.kscmdr.x + iq.j = game.state.kscmdr.j + idelta.j + iq.i = game.state.kscmdr.i movescom(iq, avoid) # check for a base if len(game.state.baseq) == 0: @@ -1026,7 +1013,7 @@ def supercommander(): if not idebug and \ (withprob(0.8) or \ (not communicating()) or \ - not game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].charted): + not game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].charted): return announce() prout(_("Lt. Uhura- \"Captain, Starfleet Intelligence reports")) @@ -1034,70 +1021,66 @@ 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: - id.x = 0; id.y = QUADSIZE-1 - elif game.tholian.kloc.x == 0 and game.tholian.kloc.y == QUADSIZE-1: - id.x = QUADSIZE-1; id.y = QUADSIZE-1 - elif game.tholian.kloc.x == QUADSIZE-1 and game.tholian.kloc.y == QUADSIZE-1: - id.x = QUADSIZE-1; id.y = 0 - elif game.tholian.kloc.x == QUADSIZE-1 and game.tholian.kloc.y == 0: - id.x = 0; id.y = 0 + if game.tholian.kloc.i == 0 and game.tholian.kloc.j == 0: + id.i = 0; id.j = QUADSIZE-1 + elif game.tholian.kloc.i == 0 and game.tholian.kloc.j == QUADSIZE-1: + id.i = QUADSIZE-1; id.j = QUADSIZE-1 + elif game.tholian.kloc.i == QUADSIZE-1 and game.tholian.kloc.j == QUADSIZE-1: + id.i = QUADSIZE-1; id.j = 0 + elif game.tholian.kloc.i == QUADSIZE-1 and game.tholian.kloc.j == 0: + id.i = 0; id.j = 0 else: # something is wrong! game.tholian.move(None) prout("***Internal error: Tholian in a bad spot.") return # do nothing if we are blocked - if game.quad[id.x][id.y] not in (IHDOT, IHWEB): + if game.quad[id.i][id.j] not in (IHDOT, IHWEB): return 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.x][here.y]==IHDOT: + while here.i != id.i: + here.i += delta.i + if game.quad[here.i][here.j]==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: + while here.j != id.j: + here.j += delta.j + if game.quad[here.i][here.j]==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: 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.x][game.tholian.kloc.y]=IHWEB + game.quad[game.tholian.kloc.i][game.tholian.kloc.j]=IHWEB dropin(IHBLANK) - crmena(True, IHT, "sector", game.tholian) - prout(_(" completes web.")) + prout(crmena(True, IHT, "sector", game.tholian) + _(" completes web.")) game.tholian.move(None) - print "Tholian movement ends" return # Code from battle.c begins here def doshield(shraise): - # change shield status + "Change shield status." action = "NONE" game.ididit = False if shraise: action = "SHUP" else: key = scanner.next() - if key == IHALPHA: + if key == "IHALPHA": if scanner.sees("transfer"): action = "NRG" else: @@ -1156,7 +1139,7 @@ def doshield(shraise): game.ididit = True return elif action == "NRG": - while scanner.next() != IHREAL: + while scanner.next() != "IHREAL": scanner.chew() proutn(_("Energy to transfer to shields- ")) scanner.chew() @@ -1196,8 +1179,7 @@ def doshield(shraise): return def randdevice(): - # choose a device to damage, at random. - # + "Choose a device to damage, at random." # Quoth Eric Allman in the code of BSD-Trek: # "Under certain conditions you can get a critical hit. This # sort of hit damages devices. The probability that a given @@ -1220,7 +1202,6 @@ def randdevice(): # We don't have a cloaking device. The shuttle got the allocation # for the cloaking device, then we shaved a half-percent off # everything to have some weight to give DSHCTRL/DDRAY/DDSP. - # weights = ( 105, # DSRSENS: short range scanners 10.5% 105, # DLRSENS: long range scanners 10.5% @@ -1248,35 +1229,31 @@ def randdevice(): return None; # we should never get here def collision(rammed, enemy): - # collision handling + "Collision handling fot rammong events." prouts(_("***RED ALERT! RED ALERT!")) skip(1) prout(_("***COLLISION IMMINENT.")) skip(2) proutn("***") - crmshp() + proutn(crmshp()) hardness = {IHR:1.5, IHC:2.0, IHS:2.5, IHT:0.5, IHQUEST:4.0}.get(enemy.type, 1.0) if rammed: proutn(_(" rammed by ")) else: proutn(_(" rams ")) - crmena(False, enemy.type, "sector", enemy.kloc) + proutn(crmena(False, enemy.type, "sector", enemy.kloc)) if rammed: proutn(_(" (original position)")) skip(1) deadkl(enemy.kloc, enemy.type, game.sector) - proutn("***") - crmshp() - prout(_(" heavily damaged.")) + proutn("***" + crmship() + " heavily damaged.") icas = randrange(10, 30) prout(_("***Sickbay reports %d casualties"), icas) game.casual += icas game.state.crew -= icas - # # In the pre-SST2K version, all devices got equiprobably damaged, # which was silly. Instead, pick up to half the devices at # random according to our weighting table, - # ncrits = randrange(NDEVICES/2) for m in range(ncrits): dev = randdevice() @@ -1294,34 +1271,28 @@ def collision(rammed, enemy): finish(FWON) return -def torpedo(course, dispersion, origin, number, nburst): - # let a photon torpedo fly - iquad = 0 - shoved = False - ac = course + 0.25*dispersion - angle = (15.0-ac)*0.5235988 - bullseye = (15.0 - course)*0.5235988 - deltax = -math.sin(angle); - deltay = math.cos(angle); - x = origin.x; y = origin.y - w = coord(); jw = coord() - w.x = w.y = jw.x = jw.y = 0 - bigger = max(math.fabs(deltax), math.fabs(deltay)) - deltax /= bigger - deltay /= bigger +def torpedo(origin, course, dispersion, number, nburst): + "Let a photon torpedo fly" if not damaged(DSRSENS) or game.condition=="docked": setwnd(srscan_window) else: setwnd(message_window) + shoved = False + ac = course + 0.25*dispersion + angle = (15.0-ac)*0.5235988 + bullseye = (15.0 - course)*0.5235988 + delta = coord(-math.sin(angle), math.cos(angle)) + bigger = max(abs(delta.i), abs(delta.j)) + delta /= bigger + w = coord(0, 0); jw = coord(0, 0) + ungridded = copy.copy(origin) # Loop to move a single torpedo - for step in range(1, 15+1): - x += deltax - w.x = int(x + 0.5) - y += deltay - w.y = int(y + 0.5) - if not VALID_SECTOR(w.x, w.y): + for step in range(1, QUADSIZE*2): + ungridded += delta + w = ungridded.snaptogrid() + if not VALID_SECTOR(w.i, w.j): break - iquad=game.quad[w.x][w.y] + iquad=game.quad[w.i][w.j] tracktorpedo(origin, w, step, number, nburst, iquad) if iquad==IHDOT: continue @@ -1331,9 +1302,7 @@ def torpedo(course, dispersion, origin, number, nburst): skip(1); # start new line after text track if iquad in (IHE, IHF): # Hit our ship skip(1) - proutn(_("Torpedo hits ")) - crmshp() - prout(".") + prout(_("Torpedo hits %s.") % crmshp()) hit = 700.0 + randreal(100) - \ 1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-angle)) newcnd(); # we're blown out of dock @@ -1346,31 +1315,29 @@ def torpedo(course, dispersion, origin, number, nburst): temp = math.fabs(math.cos(ang)) xx = -math.sin(ang)/temp yy = math.cos(ang)/temp - jw.x = int(w.x+xx+0.5) - jw.y = int(w.y+yy+0.5) - if not VALID_SECTOR(jw.x, jw.y): + jw.i = int(w.i+xx+0.5) + jw.j = int(w.j+yy+0.5) + if not VALID_SECTOR(jw.i, jw.j): return hit - if game.quad[jw.x][jw.y]==IHBLANK: + if game.quad[jw.i][jw.j]==IHBLANK: finish(FHOLE) return hit - if game.quad[jw.x][jw.y]!=IHDOT: + if game.quad[jw.i][jw.j]!=IHDOT: # can't move into object return hit game.sector = jw - crmshp() + proutn(crmshp()) shoved = True - elif iquad in (IHC, IHS): # Hit a commander - if withprob(0.05): - crmena(True, iquad, "sector", w) - prout(_(" uses anti-photon device;")) + elif iquad in (IHC, IHS, IHR, IHK): # Hit a regular enemy + # find the enemy + if iquad in (IHC, IHS) and withprob(0.05): + prout(crmena(True, iquad, "sector", w) + _(" uses anti-photon device;")) prout(_(" torpedo neutralized.")) return None - elif iquad in (IHR, IHK): # Hit a regular enemy - # find the enemy for enemy in game.enemies: - if w == game.enemies[ll].kloc: + if w == enemy.kloc: break - kp = math.fabs(e.kpower) + kp = math.fabs(enemy.kpower) h1 = 700.0 + randrange(100) - \ 1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-angle)) h1 = math.fabs(h1) @@ -1383,7 +1350,7 @@ def torpedo(course, dispersion, origin, number, nburst): if enemy.kpower == 0: deadkl(w, iquad, w) return None - crmena(True, iquad, "sector", w) + proutn(crmena(True, iquad, "sector", w)) # If enemy damaged but not destroyed, try to displace ang = angle + 2.5*(randreal()-0.5) temp = math.fabs(math.sin(ang)) @@ -1391,16 +1358,16 @@ def torpedo(course, dispersion, origin, number, nburst): temp = math.fabs(math.cos(ang)) xx = -math.sin(ang)/temp yy = math.cos(ang)/temp - jw.x = int(w.x+xx+0.5) - jw.y = int(w.y+yy+0.5) - if not VALID_SECTOR(jw.x, jw.y): + jw.i = int(w.i+xx+0.5) + jw.j = int(w.j+yy+0.5) + if not VALID_SECTOR(jw.i, jw.j): prout(_(" damaged but not destroyed.")) return - if game.quad[jw.x][jw.y]==IHBLANK: + if game.quad[jw.i][jw.j]==IHBLANK: prout(_(" buffeted into black hole.")) deadkl(w, iquad, jw) return None - if game.quad[jw.x][jw.y]!=IHDOT: + if game.quad[jw.i][jw.j]!=IHDOT: # can't move into object prout(_(" damaged but not destroyed.")) return None @@ -1412,35 +1379,33 @@ def torpedo(course, dispersion, origin, number, nburst): skip(1) prout(_("***STARBASE DESTROYED..")) game.state.baseq = filter(lambda x: x != game.quadrant, game.state.baseq) - game.quad[w.x][w.y]=IHDOT + game.quad[w.i][w.j]=IHDOT game.base.invalidate() - game.state.galaxy[game.quadrant.x][game.quadrant.y].starbase -= 1 - game.state.chart[game.quadrant.x][game.quadrant.y].starbase -= 1 + game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase -= 1 + game.state.chart[game.quadrant.i][game.quadrant.j].starbase -= 1 game.state.basekl += 1 newcnd() return None elif iquad == IHP: # Hit a planet - crmena(True, iquad, "sector", w) - prout(_(" destroyed.")) + prout(crmena(True, iquad, "sector", w) + _(" destroyed.")) game.state.nplankl += 1 - game.state.galaxy[game.quadrant.x][game.quadrant.y].planet = None + game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None game.iplnet.pclass = "destroyed" game.iplnet = None game.plnet.invalidate() - game.quad[w.x][w.y] = IHDOT + game.quad[w.i][w.j] = IHDOT if game.landed: # captain perishes on planet finish(FDPLANET) return None elif iquad == IHW: # Hit an inhabited world -- very bad! - crmena(True, iquad, "sector", w) - prout(_(" destroyed.")) + prout(crmena(True, iquad, "sector", w) + _(" destroyed.")) game.state.nworldkl += 1 - game.state.galaxy[game.quadrant.x][game.quadrant.y].planet = None + game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None game.iplnet.pclass = "destroyed" game.iplnet = None game.plnet.invalidate() - game.quad[w.x][w.y] = IHDOT + game.quad[w.i][w.j] = IHDOT if game.landed: # captain perishes on planet finish(FDPLANET) @@ -1451,8 +1416,7 @@ def torpedo(course, dispersion, origin, number, nburst): if withprob(0.9): nova(w) else: - crmena(True, IHSTAR, "sector", w) - prout(_(" unaffected by photon blast.")) + prout(crmena(True, IHSTAR, "sector", w) + _(" unaffected by photon blast.")) return None elif iquad == IHQUEST: # Hit a thingy if not (game.options & OPTION_THINGY) or withprob(0.3): @@ -1466,18 +1430,15 @@ def torpedo(course, dispersion, origin, number, nburst): skip(1) deadkl(w, iquad, w) else: - # # Stas Sergeev added the possibility that # you can shove the Thingy and piss it off. # It then becomes an enemy and may fire at you. - # thing.angry = True shoved = True return None elif iquad == IHBLANK: # Black hole skip(1) - crmena(True, IHBLANK, "sector", w) - prout(_(" swallows torpedo.")) + prout(crmena(True, IHBLANK, "sector", w) + _(" swallows torpedo.")) return None elif iquad == IHWEB: # hit the web skip(1) @@ -1488,32 +1449,32 @@ def torpedo(course, dispersion, origin, number, nburst): 1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-angle)) h1 = math.fabs(h1) if h1 >= 600: - game.quad[w.x][w.y] = IHDOT + game.quad[w.i][w.j] = IHDOT deadkl(w, iquad, w) game.tholian = None return None skip(1) - crmena(True, IHT, "sector", w) + proutn(crmena(True, IHT, "sector", w)) if withprob(0.05): prout(_(" survives photon blast.")) return None prout(_(" disappears.")) game.tholian.move(None) - game.quad[w.x][w.y] = IHWEB + game.quad[w.i][w.j] = IHWEB dropin(IHBLANK) return None else: # Problem! skip(1) proutn("Don't know how to handle torpedo collision with ") - crmena(True, iquad, "sector", w) + proutn(crmena(True, iquad, "sector", w)) skip(1) return None break if curwnd!=message_window: setwnd(message_window) if shoved: - game.quad[w.x][w.y]=IHDOT - game.quad[jw.x][jw.y]=iquad + game.quad[w.i][w.j]=IHDOT + game.quad[jw.i][jw.j]=iquad prout(_(" displaced by blast to Sector %s ") % jw) for ll in range(len(game.enemies)): game.enemies[ll].kdist = game.enemies[ll].kavgd = (game.sector-game.enemies[ll].kloc).distance() @@ -1524,7 +1485,7 @@ def torpedo(course, dispersion, origin, number, nburst): return None; def fry(hit): - # critical-hit resolution + "Critical-hit resolution." if hit < (275.0-25.0*game.skill)*randreal(1.0, 1.5): return ncrit = int(1.0 + hit/(500.0+randreal(100))) @@ -1556,12 +1517,12 @@ def fry(hit): def attack(torps_ok): # bad guy attacks us # torps_ok == False forces use of phasers in an attack + # game could be over at this point, check + if game.alldone: + return attempt = False; ihurt = False; hitmax=0.0; hittot=0.0; chgfac=1.0 where = "neither" - # game could be over at this point, check - if game.alldone: - return if idebug: prout("=== ATTACK!") # Tholian gets to move before attacking @@ -1612,21 +1573,20 @@ def attack(torps_ok): hit = enemy.kpower*math.pow(dustfac,enemy.kavgd) enemy.kpower *= 0.75 else: # Enemy uses photon torpedo - #course2 = (enemy.kloc-game.sector).bearing() - course = 1.90985*math.atan2(game.sector.y-enemy.kloc.y, enemy.kloc.x-game.sector.x) + # We should be able to make the bearing() method work here + course = 1.90985*math.atan2(game.sector.j-enemy.kloc.j, enemy.kloc.i-game.sector.i) hit = 0 proutn(_("***TORPEDO INCOMING")) if not damaged(DSRSENS): - proutn(_(" From ")) - crmena(False, enemy.type, where, enemy.kloc) + proutn(_(" From ") + crmena(False, enemy.type, where, enemy.kloc)) attempt = True prout(" ") dispersion = (randreal()+randreal())*0.5 - 0.5 dispersion += 0.002*enemy.kpower*dispersion - hit = torpedo(course, dispersion, origin=enemy.kloc, number=1, nburst=1) + hit = torpedo(enemy.kloc, course, dispersion, number=1, nburst=1) if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)==0: finish(FWON); # Klingons did themselves in! - if game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova or game.alldone: + if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova or game.alldone: return # Supernova or finished if hit == None: continue @@ -1654,11 +1614,9 @@ def attack(torps_ok): ihurt = True proutn(_("%d unit hit") % int(hit)) if (damaged(DSRSENS) and usephasers) or game.skill<=SKILL_FAIR: - proutn(_(" on the ")) - crmshp() + proutn(_(" on the ") + crmshp()) if not damaged(DSRSENS) and usephasers: - proutn(_(" from ")) - crmena(False, enemy.type, where, enemy.kloc) + prout(_(" from ") + crmena(False, enemy.type, where, enemy.kloc)) skip(1) # Decide if hit is critical if hit > hitmax: @@ -1677,7 +1635,7 @@ def attack(torps_ok): # Shields fully protect ship proutn(_("Enemy attack reduces shield strength to ")) else: - # Print message if starship suffered hit(s) + # Emit message if starship suffered hit(s) skip(1) proutn(_("Energy left %2d shields ") % int(game.energy)) if game.shldup: @@ -1703,13 +1661,13 @@ def attack(torps_ok): return def deadkl(w, type, mv): - # kill a Klingon, Tholian, Romulan, or Thingy + "Kill a Klingon, Tholian, Romulan, or Thingy." # Added mv to allow enemy to "move" before dying - crmena(True, type, "sector", mv) + proutn(crmena(True, type, "sector", mv)) # Decide what kind of enemy it is and update appropriately if type == IHR: # chalk up a Romulan - game.state.galaxy[game.quadrant.x][game.quadrant.y].romulans -= 1 + game.state.galaxy[game.quadrant.i][game.quadrant.j].romulans -= 1 game.irhere -= 1 game.state.nromrem -= 1 elif type == IHT: @@ -1721,7 +1679,7 @@ def deadkl(w, type, mv): thing = None else: # Some type of a Klingon - game.state.galaxy[game.quadrant.x][game.quadrant.y].klingons -= 1 + game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons -= 1 game.klhere -= 1 if type == IHC: game.state.kcmdr.remove(game.quadrant) @@ -1752,12 +1710,15 @@ def deadkl(w, type, mv): return def targetcheck(w): - # Return None if target is invalid, otherwise return a course angle - if not VALID_SECTOR(w.x, w.y): + "Return None if target is invalid, otherwise return a course angle." + if not VALID_SECTOR(w.i, w.j): huh() return None - delta = 0.1*(w - game.sector) - if delta.x==0 and delta.y== 0: + delta = coord() + # FIXME: C code this was translated from is wacky -- why the sign reversal? + delta.j = (w.j - game.sector.j); + delta.i = (game.sector.i - w.i); + if delta == coord(0, 0): skip(1) prout(_("Spock- \"Bridge to sickbay. Dr. McCoy,")) prout(_(" I recommend an immediate review of")) @@ -1767,8 +1728,8 @@ def targetcheck(w): return delta.bearing() def photon(): - # launch photon torpedo - course = [0.0] * MAXBURST + "Launch photon torpedo." + course = [] game.ididit = False if damaged(DPHOTON): prout(_("Photon tubes damaged.")) @@ -1778,17 +1739,18 @@ def photon(): prout(_("No torpedoes left.")) scanner.chew() return - key = scanner.next() + # First, get torpedo count while True: - if key == IHALPHA: + scanner.next() + if scanner.token == "IHALPHA": huh() return - elif key == IHEOL: + elif scanner.token == "IHEOL" or not scanner.waiting(): prout(_("%d torpedoes left.") % game.torps) scanner.chew() proutn(_("Number of torpedoes to fire- ")) - key = scanner.next() - else: # key == IHREAL + continue # Go back around to get a number + else: # key == "IHREAL" n = scanner.int() if n <= 0: # abort command scanner.chew() @@ -1796,56 +1758,42 @@ def photon(): if n > MAXBURST: scanner.chew() prout(_("Maximum of %d torpedoes per burst.") % MAXBURST) - key = IHEOL return - if n <= game.torps: - break - scanner.chew() - key = IHEOL - targ = [] - for i in range(MAXBURST): - targ.append(coord()) + if n > game.torps: + scanner.chew() # User requested more torps than available + continue # Go back around + break # All is good, go to next stage + # Next, get targets + target = [] for i in range(n): key = scanner.next() - if i==0 and key == IHEOL: - break; # we will try prompting - if i==1 and key == IHEOL: + if i==0 and key == "IHEOL": + break; # no coordinate waiting, we will try prompting + if i==1 and key == "IHEOL": # direct all torpedoes at one target - while i <= n: - targ[i] = targ[0] - course[i] = course[0] + while i < n: + target.append(target[0]) + course.append(course[0]) i += 1 break - if key != IHREAL: - huh() - return - targ[i].x = scanner.int() - key = scanner.next() - if key != IHREAL: - huh() - return - targ[i].y = scanner.int() - course[i] = targetcheck(targ[i]) - if course[i] == None: + scanner.push(scanner.token) + target.append(scanner.getcoord()) + if target[-1] == None: + return + course.append(targetcheck(target[-1])) + if course[-1] == None: return scanner.chew() - if i == 0 and key == IHEOL: + if len(target) == 0: # prompt for each one for i in range(n): proutn(_("Target sector for torpedo number %d- ") % (i+1)) - key = scanner.next() - if key != IHREAL: - huh() - return - targ[i].x = scanner.int() - key = scanner.next() - if key != IHREAL: - huh() - return - targ[i].y = scanner.int() scanner.chew() - course[i] = targetcheck(targ[i]) - if course[i] == None: + target.append(scanner.getcoord()) + if target[-1] == None: + return + course.append(targetcheck(target[-1])) + if course[-1] == None: return game.ididit = True # Loop for moving torpedoes @@ -1869,14 +1817,14 @@ def photon(): break if game.shldup or game.condition == "docked": dispersion *= 1.0 + 0.0001*game.shield - torpedo(course[i], dispersion, origin=game.sector, number=i, nburst=n) - if game.alldone or game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: + torpedo(game.sector, course[i], dispersion, number=i, nburst=n) + if game.alldone or game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: return if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)==0: finish(FWON); def overheat(rpow): - # check for phasers overheating + "Check for phasers overheating." if rpow > 1500: checkburn = (rpow-1500.0)*0.00038 if withprob(checkburn): @@ -1884,7 +1832,7 @@ def overheat(rpow): game.damage[DPHASER] = game.damfac* randreal(1.0, 2.0) * (1.0+checkburn) def checkshctrl(rpow): - # check shield control + "Check shield control." skip(1) if withprob(0.998): prout(_("Shields lowered.")) @@ -1920,11 +1868,10 @@ def checkshctrl(rpow): return True; def hittem(hits): - # register a phaser hit on Klingons and Romulans + "Register a phaser hit on Klingons and Romulans." nenhr2 = len(game.enemies); kk=0 w = coord() skip(1) - print "Hits are:", hits for (k, wham) in enumerate(hits): if wham==0: continue @@ -1946,10 +1893,10 @@ def hittem(hits): proutn(_("%d unit hit on ") % int(hit)) else: proutn(_("Very small hit on ")) - ienm = game.quad[w.x][w.y] + ienm = game.quad[w.i][w.j] if ienm==IHQUEST: thing.angry = True - crmena(False, ienm, "sector", w) + proutn(crmena(False, ienm, "sector", w)) skip(1) if kpow == 0: deadkl(w, ienm, w) @@ -1968,7 +1915,7 @@ def hittem(hits): return def phasers(): - # fire phasers + "Fire phasers at bad guys." hits = [] kz = 0; k = 1; irec=0 # Cheating inhibitor ifast = False; no = False; itarg = True; msgflag = True; rpow=0 @@ -2001,12 +1948,12 @@ def phasers(): # (That was Tom Almy talking about the C code, I think -- ESR) while automode=="NOTSET": key=scanner.next() - if key == IHALPHA: + if key == "IHALPHA": if scanner.sees("manual"): if len(game.enemies)==0: prout(_("There is no enemy present to select.")) scanner.chew() - key = IHEOL + key = "IHEOL" automode="AUTOMATIC" else: automode = "MANUAL" @@ -2024,7 +1971,7 @@ def phasers(): else: huh() return - elif key == IHREAL: + elif key == "IHREAL": if len(game.enemies)==0: prout(_("Energy will be expended into space.")) automode = "AUTOMATIC" @@ -2033,7 +1980,7 @@ def phasers(): else: automode = "AUTOMATIC" else: - # IHEOL + # "IHEOL" if len(game.enemies)==0: prout(_("Energy will be expended into space.")) automode = "AUTOMATIC" @@ -2046,10 +1993,10 @@ def phasers(): if ifast: avail -= 200.0 if automode == "AUTOMATIC": - if key == IHALPHA and scanner.sees("no"): + if key == "IHALPHA" and scanner.sees("no"): no = True key = scanner.next() - if key != IHREAL and len(game.enemies) != 0: + if key != "IHREAL" and len(game.enemies) != 0: prout(_("Phasers locked on target. Energy available: %.2f")%avail) irec=0 while True: @@ -2062,13 +2009,13 @@ def phasers(): scanner.chew() proutn(_("Units to fire= ")) key = scanner.next() - if key!=IHREAL: + if key!="IHREAL": return rpow = scanner.real if rpow > avail: proutn(_("Energy available= %.2f") % avail) skip(1) - key = IHEOL + key = "IHEOL" if not rpow > avail: break if rpow<=0: @@ -2076,7 +2023,7 @@ def phasers(): scanner.chew() return key=scanner.next() - if key == IHALPHA and scanner.sees("no"): + if key == "IHALPHA" and scanner.sees("no"): no = True if ifast: game.energy -= 200; # Go and do it! @@ -2115,7 +2062,7 @@ def phasers(): prout(_("%d expended on empty space.") % int(extra)) elif automode == "FORCEMAN": scanner.chew() - key = IHEOL + key = "IHEOL" if damaged(DCOMPTR): prout(_("Battle computer damaged, manual fire only.")) else: @@ -2130,7 +2077,7 @@ def phasers(): rpow = 0.0 for k in range(len(game.enemies)): aim = game.enemies[k].kloc - ienm = game.quad[aim.x][aim.y] + ienm = game.quad[aim.i][aim.j] if msgflag: proutn(_("Energy available= %.2f") % (avail-0.006)) skip(1) @@ -2138,14 +2085,13 @@ def phasers(): rpow = 0.0 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.")) + prout(cramen(ienm) + _(" can't be located without short range scan.")) scanner.chew() - key = IHEOL + key = "IHEOL" hits[k] = 0; # prevent overflow -- thanks to Alexei Voitenko k += 1 continue - if key == IHEOL: + if key == "IHEOL": scanner.chew() if itarg and k > kz: irec=(abs(game.enemies[k].kpower)/(PHASEFAC*math.pow(0.9,game.enemies[k].kdist))) * randreal(1.01, 1.06) + 1.0 @@ -2156,18 +2102,16 @@ def phasers(): else: proutn("??") proutn(") ") - proutn(_("units to fire at ")) - crmena(False, ienm, "sector", aim) - proutn("- ") + proutn(_("units to fire at %s- ") % crmena(False, ienm, "sector", aim)) key = scanner.next() - if key == IHALPHA and scanner.sees("no"): + if key == "IHALPHA" and scanner.sees("no"): no = True key = scanner.next() continue - if key == IHALPHA: + if key == "IHALPHA": huh() return - if key == IHEOL: + if key == "IHEOL": if k==1: # Let me say I'm baffled by this msgflag = True continue @@ -2188,7 +2132,7 @@ def phasers(): # zero energy -- abort scanner.chew() return - if key == IHALPHA and scanner.sees("no"): + if key == "IHALPHA" and scanner.sees("no"): no = True game.energy -= rpow scanner.chew() @@ -2223,29 +2167,29 @@ def phasers(): # BSD Trek, from which we swiped the idea, can have up to 5. def unschedule(evtype): - # remove an event from the schedule + "Remove an event from the schedule." game.future[evtype].date = FOREVER return game.future[evtype] def is_scheduled(evtype): - # is an event of specified type scheduled + "Is an event of specified type scheduled." return game.future[evtype].date != FOREVER def scheduled(evtype): - # when will this event happen? + "When will this event happen?" return game.future[evtype].date def schedule(evtype, offset): - # schedule an event of specified type + "Schedule an event of specified type." game.future[evtype].date = game.state.date + offset return game.future[evtype] def postpone(evtype, offset): - # postpone a scheduled event + "Postpone a scheduled event." game.future[evtype].date += offset def cancelrest(): - # rest period is interrupted by event + "Rest period is interrupted by event." if game.resting: skip(1) proutn(_("Mr. Spock- \"Captain, shall we cancel the rest period?\"")) @@ -2256,7 +2200,7 @@ def cancelrest(): return False def events(): - # run through the event queue looking for things to do + "Run through the event queue looking for things to do." i=0 fintim = game.state.date + game.optime; yank=0 ictbeam = False; istract = False @@ -2264,13 +2208,11 @@ def events(): ev = event(); ev2 = event() def tractorbeam(yank): - # tractor beaming cases merge here + "Tractor-beaming cases merge here." announce() game.optime = (10.0/(7.5*7.5))*yank # 7.5 is yank rate (warp 7.5) skip(1) - proutn("***") - crmshp() - prout(_(" caught in long range tractor beam--")) + prout("***" + crmshp() + _(" caught in long range tractor beam--")) # If Kirk & Co. screwing around on planet, handle atover(True) # atover(true) is Grab if game.alldone: @@ -2293,8 +2235,7 @@ def events(): else: game.quadrant = game.state.kcmdr[i] game.sector = randplace(QUADSIZE) - crmshp() - prout(_(" is pulled to Quadrant %s, Sector %s") \ + prout(crmshp() + _(" is pulled to Quadrant %s, Sector %s") \ % (game.quadrant, game.sector)) if game.resting: prout(_("(Remainder of rest/repair period cancelled.)")) @@ -2305,7 +2246,7 @@ def events(): game.shldchg = False else: prout(_("(Shields not currently useable.)")) - newqad(False) + newqad() # Adjust finish time to time of tractor beaming fintim = game.state.date+game.optime attack(torps_ok=False) @@ -2315,12 +2256,12 @@ def events(): schedule(FTBEAM, game.optime+expran(1.5*game.intime/len(game.state.kcmdr))) def destroybase(): - # Code merges here for any commander destroying base + "Code merges here for any commander destroying a starbase." # Not perfect, but will have to do # Handle case where base is in same quadrant as starship if game.battle == game.quadrant: - game.state.chart[game.battle.x][game.battle.y].starbase = False - game.quad[game.base.x][game.base.y] = IHDOT + game.state.chart[game.battle.i][game.battle.j].starbase = False + game.quad[game.base.i][game.base.j] = IHDOT game.base.invalidate() newcnd() skip(1) @@ -2335,9 +2276,9 @@ def events(): prout(_("the Klingon Super-Commander")) else: prout(_("a Klingon Commander")) - game.state.chart[game.battle.x][game.battle.y].starbase = False + game.state.chart[game.battle.i][game.battle.j].starbase = False # Remove Starbase from galaxy - game.state.galaxy[game.battle.x][game.battle.y].starbase = False + game.state.galaxy[game.battle.i][game.battle.j].starbase = False game.state.baseq = filter(lambda x: x != game.battle, game.state.baseq) if game.isatb == 2: # reinstate a commander's base attack @@ -2345,7 +2286,6 @@ def events(): game.isatb = 0 else: game.battle.invalidate() - if idebug: prout("=== EVENTS from %.2f to %.2f:" % (game.state.date, fintim)) for i in range(1, NEVENTS): @@ -2365,7 +2305,7 @@ def events(): else: prout("never") radio_was_broken = damaged(DRADIO) - hold.x = hold.y = 0 + hold.i = hold.j = 0 while True: # Select earliest extraneous event, evcode==0 if no events evcode = FSPY @@ -2424,9 +2364,9 @@ def events(): game.optime -= xtime if evcode == FSNOVA: # Supernova announce() - supernova(False) + supernova(None) schedule(FSNOVA, expran(0.5*game.intime)) - if game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: + if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: return elif evcode == FSPY: # Check with spy to see if SC should tractor beam if game.state.nscrem == 0 or \ @@ -2471,14 +2411,16 @@ def events(): for ibq in game.state.baseq: for cmdr in game.state.kcmdr: if ibq == cmdr and ibq != game.quadrant and ibq != game.state.kscmdr: - raise "foundit" - except "foundit": - # no match found -- try later - schedule(FBATTAK, expran(0.3*game.intime)) - unschedule(FCDBAS) - continue + raise ibq + else: + # no match found -- try later + schedule(FBATTAK, expran(0.3*game.intime)) + unschedule(FCDBAS) + continue + except coord: + pass # commander + starbase combination found -- launch attack - game.battle = game.state.baseq[j] + game.battle = ibq schedule(FCDBAS, randreal(1.0, 4.0)) if game.isatb: # extra time if SC already attacking postpone(FCDBAS, scheduled(FSCDBAS)-game.state.date) @@ -2497,7 +2439,7 @@ def events(): elif evcode == FSCDBAS: # Supercommander destroys base unschedule(FSCDBAS) game.isatb = 2 - if not game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].starbase: + if not game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].starbase: continue # WAS RETURN! hold = game.battle game.battle = game.state.kscmdr @@ -2506,7 +2448,7 @@ def events(): if evcode==FCDBAS: unschedule(FCDBAS) if not game.state.baseq() \ - or not game.state.galaxy[game.battle.x][game.battle.y].starbase: + or not game.state.galaxy[game.battle.i][game.battle.j].starbase: game.battle.invalidate() continue # find the lucky pair @@ -2528,11 +2470,11 @@ def events(): game.probey += game.probeiny i = (int)(game.probex/QUADSIZE +0.05) j = (int)(game.probey/QUADSIZE + 0.05) - if game.probec.x != i or game.probec.y != j: - game.probec.x = i - game.probec.y = j + if game.probec.i != i or game.probec.j != j: + game.probec.i = i + game.probec.j = j if not VALID_QUADRANT(i, j) or \ - game.state.galaxy[game.probec.x][game.probec.y].supernova: + game.state.galaxy[game.probec.i][game.probec.j].supernova: # Left galaxy or ran into supernova if comunicating(): announce() @@ -2549,10 +2491,10 @@ def events(): announce() skip(1) proutn(_("Lt. Uhura- \"The deep space probe is now in Quadrant %s.\"") % game.probec) - pdest = game.state.galaxy[game.probec.x][game.probec.y] + pdest = game.state.galaxy[game.probec.i][game.probec.j] # Update star chart if Radio is working or have access to radio if communicating(): - chp = game.state.chart[game.probec.x][game.probec.y] + chp = game.state.chart[game.probec.i][game.probec.j] chp.klingons = pdest.klingons chp.starbase = pdest.starbase chp.stars = pdest.stars @@ -2560,9 +2502,9 @@ def events(): game.proben -= 1 # One less to travel if game.proben == 0 and game.isarmed and pdest.stars: # lets blow the sucker! - supernova(True, game.probec) + supernova(game.probec) unschedule(FDSPROB) - if game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: + if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: return elif evcode == FDISTR: # inhabited system issues distress call unschedule(FDISTR) @@ -2573,7 +2515,7 @@ def events(): # not already under attack, which is not # supernova'ed, and which has some Klingons in it w = randplace(GALSIZE) - q = game.state.galaxy[w.x][w.y] + q = game.state.galaxy[w.i][w.j] if not (game.quadrant == w or q.planet == None or \ not q.planet.inhabited or \ q.supernova or q.status!="secure" or q.klingons<=0): @@ -2586,8 +2528,7 @@ def events(): # got one!! Schedule its enslavement ev = schedule(FENSLV, expran(game.intime)) ev.quadrant = w - q.status = distressed - + q.status = "distressed" # tell the captain about it if we can if communicating(): prout(_("Uhura- Captain, %s in Quadrant %s reports it is under attack") \ @@ -2598,7 +2539,7 @@ def events(): elif evcode == FENSLV: # starsystem is enslaved ev = unschedule(FENSLV) # see if current distress call still active - q = game.state.galaxy[ev.quadrant.x][ev.quadrant.y] + q = game.state.galaxy[ev.quadrant.i][ev.quadrant.j] if q.klingons <= 0: q.status = "secure" continue @@ -2618,7 +2559,7 @@ def events(): # explicitly retrieve and restore the x and y. ev = schedule(FREPRO, expran(1.0 * game.intime)) # see if current distress call still active - q = game.state.galaxy[ev.quadrant.x][ev.quadrant.y] + q = game.state.galaxy[ev.quadrant.i][ev.quadrant.j] if q.klingons <= 0: q.status = "secure" continue @@ -2629,11 +2570,11 @@ def events(): if game.klhere >= MAXKLQUAD: try: # this quadrant not ok, pick an adjacent one - for i in range(w.x - 1, w.x + 2): - for j in range(w.y - 1, w.y + 2): + for i in range(w.i - 1, w.i + 2): + for j in range(w.j - 1, w.j + 2): if not VALID_QUADRANT(i, j): continue - q = game.state.galaxy[w.x][w.y] + q = game.state.galaxy[w.i][w.j] # check for this quad ok (not full & no snova) if q.klingons >= MAXKLQUAD or q.supernova: continue @@ -2641,8 +2582,7 @@ def events(): else: continue # search for eligible quadrant failed except "FOUNDIT": - w.x = i - w.y = j + w.i = i; w.j = j # deliver the child game.state.remkl += 1 q.klingons += 1 @@ -2663,15 +2603,15 @@ def events(): prout(_("in Quadrant %s.") % w) def wait(): - # wait on events + "Wait on events." game.ididit = False while True: key = scanner.next() - if key != IHEOL: + if key != "IHEOL": break proutn(_("How long? ")) scanner.chew() - if key != IHREAL: + if key != "IHREAL": huh() return origTime = delay = scanner.real @@ -2708,7 +2648,7 @@ def wait(): if origTime-delay >= 9.99 and game.condition == "docked": game.damage[DDRAY] = 0.0 # leave if quadrant supernovas - if game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: + if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: break game.resting = False game.optime = 0 @@ -2721,18 +2661,17 @@ def wait(): # If the zap is too much, it gets destroyed. def nova(nov): - # star goes nova + "Star goes nova." course = (0.0, 10.5, 12.0, 1.5, 9.0, 0.0, 3.0, 7.5, 6.0, 4.5) newc = coord(); neighbor = coord(); bump = coord(0, 0) if withprob(0.05): # Wow! We've supernova'ed - supernova(False, nov) + supernova(game.quadrant) return # handle initial nova - game.quad[nov.x][nov.y] = IHDOT - crmena(False, IHSTAR, "sector", nov) - prout(_(" novas.")) - game.state.galaxy[game.quadrant.x][game.quadrant.y].stars -= 1 + game.quad[nov.i][nov.j] = IHDOT + prout(crmena(False, IHSTAR, "sector", nov) + _(" novas.")) + game.state.galaxy[game.quadrant.i][game.quadrant.j].stars -= 1 game.state.starkl += 1 # Set up queue to recursively trigger adjacent stars hits = [nov] @@ -2740,54 +2679,52 @@ def nova(nov): while hits: offset = coord() start = hits.pop() - for offset.x in range(-1, 1+1): - for offset.y in range(-1, 1+1): - if offset.y==0 and offset.x==0: + for offset.i in range(-1, 1+1): + for offset.j in range(-1, 1+1): + if offset.j==0 and offset.i==0: continue neighbor = start + offset - if not VALID_SECTOR(neighbor.y, neighbor.x): + if not VALID_SECTOR(neighbor.j, neighbor.i): continue - iquad = game.quad[neighbor.x][neighbor.y] + iquad = game.quad[neighbor.i][neighbor.j] # Empty space ends reaction if iquad in (IHDOT, IHQUEST, IHBLANK, IHT, IHWEB): pass elif iquad == IHSTAR: # Affect another star if withprob(0.05): # This star supernovas - supernova(False) + supernova(game.quadrant) return else: hits.append(neighbor) - game.state.galaxy[game.quadrant.x][game.quadrant.y].stars -= 1 + game.state.galaxy[game.quadrant.i][game.quadrant.j].stars -= 1 game.state.starkl += 1 - crmena(True, IHSTAR, "sector", neighbor) + proutn(crmena(True, IHSTAR, "sector", neighbor)) prout(_(" novas.")) - game.quad[neighbor.x][neighbor.y] = IHDOT + game.quad[neighbor.i][neighbor.j] = IHDOT kount += 1 elif iquad in (IHP, IHW): # Destroy planet - game.state.galaxy[game.quadrant.x][game.quadrant.y].planet = None + game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None if iquad == IHP: game.state.nplankl += 1 else: game.state.worldkl += 1 - crmena(True, iquad, "sector", neighbor) - prout(_(" destroyed.")) + prout(crmena(True, IHB, "sector", neighbor) + _(" destroyed.")) game.iplnet.pclass = "destroyed" game.iplnet = None game.plnet.invalidate() if game.landed: finish(FPNOVA) return - game.quad[neighbor.x][neighbor.y] = IHDOT + game.quad[neighbor.i][neighbor.j] = IHDOT elif iquad == IHB: # Destroy base - game.state.galaxy[game.quadrant.x][game.quadrant.y].starbase = False + game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase = False game.state.baseq = filter(lambda x: x!= game.quadrant, game.state.baseq) game.base.invalidate() game.state.basekl += 1 newcnd() - crmena(True, IHB, "sector", neighbor) - prout(_(" destroyed.")) - game.quad[neighbor.x][neighbor.y] = IHDOT + prout(crmena(True, IHB, "sector", neighbor) + _(" destroyed.")) + game.quad[neighbor.i][neighbor.j] = IHDOT elif iquad in (IHE, IHF): # Buffet ship prout(_("***Starship buffeted by nova.")) if game.shldup: @@ -2818,16 +2755,14 @@ def nova(nov): deadkl(neighbor, iquad, neighbor) break newc = neighbor + neighbor - hits[mm] - crmena(True, iquad, "sector", neighbor) - proutn(_(" damaged")) - if not VALID_SECTOR(newc.x, newc.y): + proutn(crmena(True, iquad, "sector", neighbor) + _(" damaged")) + if not VALID_SECTOR(newc.i, newc.j): # can't leave quadrant skip(1) break - iquad1 = game.quad[newc.x][newc.y] + iquad1 = game.quad[newc.i][newc.j] if iquad1 == IHBLANK: - proutn(_(", blasted into ")) - crmena(False, IHBLANK, "sector", newc) + proutn(_(", blasted into ") + crmena(False, IHBLANK, "sector", newc)) skip(1) deadkl(neighbor, iquad, newc) break @@ -2836,12 +2771,12 @@ def nova(nov): skip(1) break proutn(_(", buffeted to Sector %s") % newc) - game.quad[neighbor.x][neighbor.y] = IHDOT - game.quad[newc.x][newc.y] = iquad + game.quad[neighbor.i][neighbor.j] = IHDOT + game.quad[newc.i][newc.j] = iquad game.enemies[ll].move(newc) # Starship affected by nova -- kick it away. game.dist = kount*0.1 - game.direc = course[3*(bump.x+1)+bump.y+2] + game.direc = course[3*(bump.i+1)+bump.j+2] if game.direc == 0.0: game.dist = 0.0 if game.dist == 0.0: @@ -2853,26 +2788,24 @@ def nova(nov): game.optime = 10.0*game.dist/16.0 return -def supernova(induced, w=None): - # star goes supernova +def supernova(w): + "Star goes supernova." num = 0; npdead = 0 - nq = coord() if w != None: - nq = w + nq = copy.copy(w) else: + # Scheduled supernova -- select star at random. stars = 0 - # Scheduled supernova -- select star - # logic changed here so that we won't favor quadrants in top - # left of universe - for nq.x in range(GALSIZE): - for nq.y in range(GALSIZE): - stars += game.state.galaxy[nq.x][nq.y].stars + nq = coord() + for nq.i in range(GALSIZE): + for nq.j in range(GALSIZE): + stars += game.state.galaxy[nq.i][nq.j].stars if stars == 0: return # nothing to supernova exists num = randrange(stars) + 1 - for nq.x in range(GALSIZE): - for nq.y in range(GALSIZE): - num -= game.state.galaxy[nq.x][nq.y].stars + for nq.i in range(GALSIZE): + for nq.j in range(GALSIZE): + num -= game.state.galaxy[nq.i][nq.j].stars if num <= 0: break if num <=0: @@ -2890,10 +2823,10 @@ def supernova(induced, w=None): else: ns = coord() # we are in the quadrant! - num = randrange(game.state.galaxy[nq.x][nq.y].stars) + 1 - for ns.x in range(QUADSIZE): - for ns.y in range(QUADSIZE): - if game.quad[ns.x][ns.y]==IHSTAR: + num = randrange(game.state.galaxy[nq.i][nq.j].stars) + 1 + for ns.i in range(QUADSIZE): + for ns.j in range(QUADSIZE): + if game.quad[ns.i][ns.j]==IHSTAR: num -= 1 if num==0: break @@ -2903,18 +2836,18 @@ def supernova(induced, w=None): prouts(_("***RED ALERT! RED ALERT!")) skip(1) prout(_("***Incipient supernova detected at Sector %s") % ns) - if (ns.x-game.sector.x)**2 + (ns.y-game.sector.y)**2 <= 2.1: + if (ns.i-game.sector.i)**2 + (ns.j-game.sector.j)**2 <= 2.1: proutn(_("Emergency override attempts t")) prouts("***************") skip(1) stars() game.alldone = True - # destroy any Klingons in supernovaed quadrant - kldead = game.state.galaxy[nq.x][nq.y].klingons - game.state.galaxy[nq.x][nq.y].klingons = 0 + # destroy any Klingons in supernovaed quadrant + kldead = game.state.galaxy[nq.i][nq.j].klingons + game.state.galaxy[nq.i][nq.j].klingons = 0 if nq == game.state.kscmdr: # did in the Supercommander! - game.state.nscrem = game.state.kscmdr.x = game.state.kscmdr.y = game.isatb = 0 + game.state.nscrem = game.state.kscmdr.i = game.state.kscmdr.j = game.isatb = 0 game.iscate = False unschedule(FSCMOVE) unschedule(FSCDBAS) @@ -2926,8 +2859,8 @@ def supernova(induced, w=None): unschedule(FTBEAM) game.state.remkl -= kldead # destroy Romulans and planets in supernovaed quadrant - nrmdead = game.state.galaxy[nq.x][nq.y].romulans - game.state.galaxy[nq.x][nq.y].romulans = 0 + nrmdead = game.state.galaxy[nq.i][nq.j].romulans + game.state.galaxy[nq.i][nq.j].romulans = 0 game.state.nromrem -= nrmdead # Destroy planets for loop in range(game.inplan): @@ -2937,17 +2870,17 @@ def supernova(induced, w=None): # Destroy any base in supernovaed quadrant game.state.baseq = filter(lambda x: x != nq, game.state.baseq) # If starship caused supernova, tally up destruction - if induced: - game.state.starkl += game.state.galaxy[nq.x][nq.y].stars - game.state.basekl += game.state.galaxy[nq.x][nq.y].starbase + if w != None: + game.state.starkl += game.state.galaxy[nq.i][nq.j].stars + game.state.basekl += game.state.galaxy[nq.i][nq.j].starbase game.state.nplankl += npdead # mark supernova in galaxy and in star chart if game.quadrant == nq or communicating(): - game.state.galaxy[nq.x][nq.y].supernova = True + game.state.galaxy[nq.i][nq.j].supernova = True # If supernova destroys last Klingons give special message if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)==0 and not nq == game.quadrant: skip(2) - if not induced: + if w == None: prout(_("Lucky you!")) proutn(_("A supernova in %s has just destroyed the last Klingons.") % nq) finish(FWON) @@ -2960,8 +2893,7 @@ def supernova(induced, w=None): # Code from finish.c ends here. def selfdestruct(): - # self-destruct maneuver - # Finish with a BANG! + "Self-destruct maneuver. Finish with a BANG!" scanner.chew() if damaged(DCOMPTR): prout(_("Computer damaged; cannot execute destruct sequence.")) @@ -3003,9 +2935,7 @@ def kaboom(): stars() if game.ship==IHE: prouts("***") - prouts(_("********* Entropy of ")) - crmshp() - prouts(_(" maximized *********")) + prouts(_("********* Entropy of %s maximized *********") % crmshp()) skip(1) stars() skip(1) @@ -3014,7 +2944,7 @@ def kaboom(): l=1 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) + deadkl(game.enemies[l].kloc, game.quad[game.enemies[l].kloc.i][game.enemies[l].kloc.j], game.enemies[l].kloc) l += 1 finish(FDILITHIUM) @@ -3134,9 +3064,7 @@ def finish(ifin): skip(1) prout(_("Your starship is a derelict in space.")) elif ifin == FBATTLE: - proutn(_("The ")) - crmshp() - prout(_(" has been destroyed in battle.")) + prout(_("The %s has been destroyed in battle.") % crmshp()) skip(1) prout(_("Dulce et decorum est pro patria mori.")) elif ifin == FNEG3: @@ -3150,9 +3078,7 @@ def finish(ifin): prout(_("That was a great shot.")) skip(1) elif ifin == FSNOVAED: - proutn(_("The ")) - crmshp() - prout(_(" has been fried by a supernova.")) + prout(_("The %s has been fried by a supernova.") % crmshp()) prout(_("...Not even cinders remain...")) elif ifin == FABANDN: prout(_("You have been captured by the Klingons. If you still")) @@ -3165,9 +3091,7 @@ def finish(ifin): prout(_("Starbase was unable to re-materialize your starship.")) prout(_("Sic transit gloria mundi")) elif ifin == FPHASER: - proutn(_("The ")) - crmshp() - prout(_(" has been cremated by its own phasers.")) + prout(_("The %s has been cremated by its own phasers.") % crmshp()) elif ifin == FLOST: prout(_("You and your landing party have been")) prout(_("converted to energy, disipating through space.")) @@ -3177,9 +3101,7 @@ def finish(ifin): skip(1) prout(_("They are very fond of \"Captain Kirk\" soup.")) skip(1) - proutn(_("Without your leadership, the ")) - crmshp() - prout(_(" is destroyed.")) + prout(_("Without your leadership, the %s is destroyed.") % crmshp()) elif ifin == FDPLANET: prout(_("You and your mining party perish.")) skip(1) @@ -3189,25 +3111,19 @@ def finish(ifin): prout(_("The Galileo is instantly annihilated by the supernova.")) prout(_("You and your mining party are atomized.")) skip(1) - proutn(_("Mr. Spock takes command of the ")) - crmshp() - prout(_(" and")) - prout(_("joins the Romulans, reigning terror on the Federation.")) + prout(_("Mr. Spock takes command of the %s and") % crmshp()) + prout(_("joins the Romulans, wreaking terror on the Federation.")) elif ifin == FPNOVA: prout(_("You and your mining party are atomized.")) skip(1) - proutn(_("Mr. Spock takes command of the ")) - crmshp() - prout(_(" and")) - prout(_("joins the Romulans, reigning terror on the Federation.")) + prout(_("Mr. Spock takes command of the %s and") % crmshp()) + prout(_("joins the Romulans, wreaking terror on the Federation.")) elif ifin == FSTRACTOR: prout(_("The shuttle craft Galileo is also caught,")) prout(_("and breaks up under the strain.")) skip(1) prout(_("Your debris is scattered for millions of miles.")) - proutn(_("Without your leadership, the ")) - crmshp() - prout(_(" is destroyed.")) + prout(_("Without your leadership, the %s is destroyed.") % crmshp()) elif ifin == FDRAY: prout(_("The mutants attack and kill Spock.")) prout(_("Your ship is captured by Klingons, and")) @@ -3251,7 +3167,7 @@ def finish(ifin): score() def score(): - # compute player's score + "Compute player's score." timused = game.state.date - game.indate iskill = game.skill if (timused == 0 or (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) != 0) and timused < 5.0: @@ -3336,7 +3252,7 @@ def score(): prout(_("TOTAL SCORE %5d") % iscore) def plaque(): - # emit winner's commemmorative plaque + "Emit winner's commemmorative plaque." skip(2) while True: proutn(_("File or device name for your plaque: ")) @@ -3407,27 +3323,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: @@ -3437,19 +3334,8 @@ def iostart(): else: stdscr = curses.initscr() stdscr.keypad(True) - #saveterm() curses.nonl() curses.cbreak() - curses.start_color() - curses.init_pair(curses.COLOR_BLACK, curses.COLOR_BLACK, curses.COLOR_BLACK) - curses.init_pair(curses.COLOR_GREEN, curses.COLOR_GREEN, curses.COLOR_BLACK) - curses.init_pair(curses.COLOR_RED, curses.COLOR_RED, curses.COLOR_BLACK) - curses.init_pair(curses.COLOR_CYAN, curses.COLOR_CYAN, curses.COLOR_BLACK) - curses.init_pair(curses.COLOR_WHITE, curses.COLOR_WHITE, curses.COLOR_BLACK) - curses.init_pair(curses.COLOR_MAGENTA, curses.COLOR_MAGENTA, curses.COLOR_BLACK) - curses.init_pair(curses.COLOR_BLUE, curses.COLOR_BLUE, curses.COLOR_BLACK) - curses.init_pair(curses.COLOR_YELLOW, curses.COLOR_YELLOW, curses.COLOR_BLACK) - #noecho() global fullscreen_window, srscan_window, report_window, status_window global lrscan_window, message_window, prompt_window (rows, columns) = stdscr.getmaxyx() @@ -3462,27 +3348,22 @@ 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 + 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) - if game.skill > SKILL_FAIR: - prouts(_("[ANOUNCEMENT ARRIVING...]")) - else: - prouts(_("[IMPORTANT ANNOUNCEMENT ARRIVING -- PRESS ENTER TO CONTINUE]")) + prouts(_("[ANOUNCEMENT ARRIVING...]")) skip(1) def pause_game(): @@ -3519,7 +3400,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 @@ -3542,13 +3426,13 @@ def prout(line): skip(1) def prouts(line): - "print slowly!" + "Emit slowly!" for c in line: if not replayfp or replayfp.closed: # Don't slow down replays 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: @@ -3630,7 +3514,7 @@ def drawmaps(mode): def put_srscan_sym(w, sym): "Emit symbol for short-range scan." - srscan_window.move(w.x+1, w.y*2+2) + srscan_window.move(w.i+1, w.j*2+2) srscan_window.addch(sym) srscan_window.refresh() @@ -3640,12 +3524,12 @@ def boom(w): drawmaps(2) setwnd(srscan_window) srscan_window.attron(curses.A_REVERSE) - put_srscan_sym(w, game.quad[w.x][w.y]) + put_srscan_sym(w, game.quad[w.i][w.j]) #sound(500) #time.sleep(1.0) #nosound() srscan_window.attroff(curses.A_REVERSE) - put_srscan_sym(w, game.quad[w.x][w.y]) + put_srscan_sym(w, game.quad[w.i][w.j]) curses.delay_output(500) setwnd(message_window) @@ -3667,7 +3551,7 @@ def tracktorpedo(origin, w, step, i, n, iquad): if step == 1: if n != 1: skip(1) - proutn(_("Track for %s torpedo number %d- ") % (game.quad[origin.x][origin.y],i+1)) + proutn(_("Track for %s torpedo number %d- ") % (game.quad[origin.i][origin.j],i+1)) else: skip(1) proutn(_("Torpedo track- ")) @@ -3722,27 +3606,27 @@ def prstat(txt, data): # Code from moving.c begins here def imove(novapush): - # movement execution for warp, impulse, supernova, and tractor-beam events + "Movement execution for warp, impulse, supernova, and tractor-beam events." w = coord(); final = coord() trbeam = False def no_quad_change(): # No quadrant change -- compute new average enemy distances - game.quad[game.sector.x][game.sector.y] = game.ship + game.quad[game.sector.i][game.sector.j] = game.ship if game.enemies: for enemy in game.enemies: finald = (w-enemy.kloc).distance() enemy.kavgd = 0.5 * (finald + enemy.kdist) enemy.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: + if not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: attack(torps_ok=False) for enemy in game.enemies: enemy.kavgd = enemy.kdist newcnd() drawmaps(0) setwnd(message_window) - w.x = w.y = 0 + w.i = w.j = 0 if game.inorbit: prout(_("Helmsman Sulu- \"Leaving standard orbit.\"")) game.inorbit = False @@ -3762,17 +3646,17 @@ def imove(novapush): game.dist = game.dist*(scheduled(FTBEAM)-game.state.date)/game.optime + 0.1 game.optime = scheduled(FTBEAM) - game.state.date + 1e-5 # Move within the quadrant - game.quad[game.sector.x][game.sector.y] = IHDOT - x = game.sector.x - y = game.sector.y + game.quad[game.sector.i][game.sector.j] = IHDOT + x = game.sector.i + y = game.sector.j n = int(10.0*game.dist*bigger+0.5) if n > 0: for m in range(1, n+1): x += deltax y += deltay - w.x = int(round(x)) - w.y = int(round(y)) - if not VALID_SECTOR(w.x, w.y): + w.i = int(round(x)) + w.j = int(round(y)) + if not VALID_SECTOR(w.i, w.j): # Leaving quadrant -- allow final enemy attack # Don't do it if being pushed by Nova if len(game.enemies) != 0 and not novapush: @@ -3785,30 +3669,30 @@ def imove(novapush): # that attacks only happen if Klingons # are present and your skill is good. # - if game.skill > SKILL_GOOD and game.klhere > 0 and not game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: + if game.skill > SKILL_GOOD and game.klhere > 0 and not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: attack(torps_ok=False) if game.alldone: return # compute final position -- new quadrant and sector - x = (QUADSIZE*game.quadrant.x)+game.sector.x - y = (QUADSIZE*game.quadrant.y)+game.sector.y - w.x = int(round(x+10.0*game.dist*bigger*deltax)) - w.y = int(round(y+10.0*game.dist*bigger*deltay)) + x = (QUADSIZE*game.quadrant.i)+game.sector.i + y = (QUADSIZE*game.quadrant.j)+game.sector.j + w.i = int(round(x+10.0*game.dist*bigger*deltax)) + w.j = int(round(y+10.0*game.dist*bigger*deltay)) # check for edge of galaxy kinks = 0 while True: kink = False - if w.x < 0: - w.x = -w.x + if w.i < 0: + w.i = -w.i kink = True - if w.y < 0: - w.y = -w.y + if w.j < 0: + w.j = -w.j kink = True - if w.x >= GALSIZE*QUADSIZE: - w.x = (GALSIZE*QUADSIZE*2) - w.x + if w.i >= GALSIZE*QUADSIZE: + w.i = (GALSIZE*QUADSIZE*2) - w.i kink = True - if w.y >= GALSIZE*QUADSIZE: - w.y = (GALSIZE*QUADSIZE*2) - w.y + if w.j >= GALSIZE*QUADSIZE: + w.j = (GALSIZE*QUADSIZE*2) - w.j kink = True if kink: kinks += 1 @@ -3827,18 +3711,18 @@ def imove(novapush): # Compute final position in new quadrant if trbeam: # Don't bother if we are to be beamed return - game.quadrant.x = w.x/QUADSIZE - game.quadrant.y = w.y/QUADSIZE - game.sector.x = w.x - (QUADSIZE*game.quadrant.x) - game.sector.y = w.y - (QUADSIZE*game.quadrant.y) + game.quadrant.i = w.i/QUADSIZE + game.quadrant.j = w.j/QUADSIZE + game.sector.i = w.i - (QUADSIZE*game.quadrant.i) + game.sector.j = w.j - (QUADSIZE*game.quadrant.j) skip(1) prout(_("Entering Quadrant %s.") % game.quadrant) - game.quad[game.sector.x][game.sector.y] = game.ship - newqad(False) + game.quad[game.sector.i][game.sector.j] = game.ship + newqad() if game.skill>SKILL_NOVICE: attack(torps_ok=False) return - iquad = game.quad[w.x][w.y] + iquad = game.quad[w.i][w.j] if iquad != IHDOT: # object encountered in flight path stopegy = 50.0*game.dist/game.optime @@ -3854,8 +3738,7 @@ def imove(novapush): skip(1) prouts(_("***RED ALERT! RED ALERT!")) skip(1) - proutn("***") - crmshp() + proutn("***" + crmshp()) proutn(_(" pulled into black hole at Sector %s") % w) # # Getting pulled into a black hole was certain @@ -3875,7 +3758,7 @@ def imove(novapush): else: # something else skip(1) - crmshp() + proutn(crmshp()) if iquad == IHWEB: prout(_(" encounters Tholian web at %s;") % w) else: @@ -3883,8 +3766,8 @@ def imove(novapush): proutn(_("Emergency stop required ")) prout(_("%2d units of energy.") % int(stopegy)) game.energy -= stopegy - final.x = int(round(deltax)) - final.y = int(round(deltay)) + final.i = int(round(deltax)) + final.j = int(round(deltay)) game.sector = final if game.energy <= 0: finish(FNRG) @@ -3899,7 +3782,7 @@ def imove(novapush): return def dock(verbose): - # dock our ship at a starbase + "Dock our ship at a starbase." scanner.chew() if game.condition == "docked" and verbose: prout(_("Already docked.")) @@ -3907,9 +3790,8 @@ def dock(verbose): if game.inorbit: prout(_("You must first leave standard orbit.")) return - if not game.base.is_valid() or abs(game.sector.x-game.base.x) > 1 or abs(game.sector.y-game.base.y) > 1: - crmshp() - prout(_(" not adjacent to base.")) + if not game.base.is_valid() or abs(game.sector.i-game.base.i) > 1 or abs(game.sector.j-game.base.j) > 1: + prout(crmshp() + _(" not adjacent to base.")) return game.condition = "docked" if "verbose": @@ -3937,7 +3819,7 @@ def dock(verbose): # are always displayed y - x, where +y is downward! def getcourse(isprobe, akey): - # get course and distance + "Get a course and distance from the user." key = 0 dquad = copy.copy(game.quadrant) navmode = "unspecified" @@ -3957,7 +3839,7 @@ def getcourse(isprobe, akey): prout(_("Computer damaged; manual movement only")) scanner.chew() navmode = "manual" - key = IHEOL + key = "IHEOL" break if isprobe and akey != -1: # For probe launch, use pre-scanned value first time @@ -3965,11 +3847,11 @@ def getcourse(isprobe, akey): akey = -1 else: key = scanner.next() - if key == IHEOL: + if key == "IHEOL": proutn(_("Manual or automatic- ")) iprompt = True scanner.chew() - elif key == IHALPHA: + elif key == "IHALPHA": if scanner.sees("manual"): navmode = "manual" key = scanner.next() @@ -3990,7 +3872,7 @@ def getcourse(isprobe, akey): navmode = "manual" break if navmode == "automatic": - while key == IHEOL: + while key == "IHEOL": if isprobe: proutn(_("Target quadrant or quadrant§or- ")) else: @@ -3998,41 +3880,41 @@ def getcourse(isprobe, akey): scanner.chew() iprompt = True key = scanner.next() - if key != IHREAL: + if key != "IHREAL": huh() return False xi = int(round(scanner.real))-1 key = scanner.next() - if key != IHREAL: + if key != "IHREAL": huh() return False xj = int(round(scanner.real))-1 key = scanner.next() - if key == IHREAL: + if key == "IHREAL": # both quadrant and sector specified xk = int(round(scanner.real))-1 key = scanner.next() - if key != IHREAL: + if key != "IHREAL": huh() return False xl = int(round(scanner.real))-1 - dquad.x = xi - dquad.y = xj - dsect.y = xk - dsect.x = xl + dquad.i = xi + dquad.j = xj + dsect.i = xk + dsect.j = xl else: # only one pair of numbers was specified if isprobe: # only quadrant specified -- go to center of dest quad - dquad.x = xi - dquad.y = xj - dsect.y = dsect.x = 4 # preserves 1-origin behavior + dquad.i = xi + dquad.j = xj + dsect.j = dsect.i = 4 # preserves 1-origin behavior else: # only sector specified - dsect.y = xi - dsect.x = xj + dsect.i = xi + dsect.j = xj itemp = "normal" - if not VALID_QUADRANT(dquad.y,dquad.x) or not VALID_SECTOR(dsect.x,dsect.y): + if not VALID_QUADRANT(dquad.i,dquad.j) or not VALID_SECTOR(dsect.i,dsect.j): huh() return False skip(1) @@ -4044,26 +3926,26 @@ def getcourse(isprobe, akey): prout(_("Ensign Chekov- \"Course laid in, Captain.\"")) # the actual deltas get computed here delta = coord() - delta.x = dquad.y-game.quadrant.y + 0.1*(dsect.x-game.sector.y) - delta.y = game.quadrant.x-dquad.x + 0.1*(game.sector.x-dsect.y) + 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: + while key == "IHEOL": proutn(_("X and Y displacements- ")) scanner.chew() iprompt = True key = scanner.next() itemp = "verbose" - if key != IHREAL: + if key != "IHREAL": huh() return False - delta.x = scanner.real + delta.j = scanner.real key = scanner.next() - if key != IHREAL: + if key != "IHREAL": huh() return False - delta.y = scanner.real + delta.i = scanner.real # Check for zero movement - if delta.x == 0 and delta.y == 0: + if delta.i == 0 and delta.j == 0: scanner.chew() return False if itemp == "verbose" and not isprobe: @@ -4078,7 +3960,7 @@ def getcourse(isprobe, akey): return True def impulse(): - # move under impulse power + "Move under impulse power." game.ididit = False if damaged(DIMPULS): scanner.chew() @@ -4125,7 +4007,7 @@ def impulse(): return def warp(timewarp): - # move under warp drive + "ove under warp drive." blooey = False; twarp = False if not timewarp: # Not WARPX entry game.ididit = False @@ -4166,7 +4048,7 @@ def warp(timewarp): return # Make sure enough time is left for the trip - game.optime = 10.0*game.dist/game.wfacsq + game.optime = 10.0*game.dist/game.warpfac**2 if game.optime >= 0.8*game.state.remtime: skip(1) prout(_("First Officer Spock- \"Captain, I compute that such")) @@ -4204,12 +4086,11 @@ def warp(timewarp): bigger = math.fabs(deltax) else: bigger = math.fabs(deltay) - deltax /= bigger deltay /= bigger n = 10.0 * game.dist * bigger +0.5 - x = game.sector.x - y = game.sector.y + x = game.sector.i + y = game.sector.j for l in range(1, n+1): x += deltax ix = x + 0.5 @@ -4227,7 +4108,7 @@ def warp(timewarp): game.energy -= game.dist*game.warpfac*game.warpfac*game.warpfac*(game.shldup+1) if game.energy <= 0: finish(FNRG) - game.optime = 10.0*game.dist/game.wfacsq + game.optime = 10.0*game.dist/game.warpfac**2 if twarp: timwrp() if blooey: @@ -4240,15 +4121,15 @@ def warp(timewarp): return def setwarp(): - # change the warp factor + "Change the warp factor." while True: key=scanner.next() - if key != IHEOL: + if key != "IHEOL": break scanner.chew() proutn(_("Warp factor- ")) scanner.chew() - if key != IHREAL: + if key != "IHREAL": huh() return if game.damage[DWARPEN] > 10.0: @@ -4266,7 +4147,6 @@ def setwarp(): return oldfac = game.warpfac game.warpfac = scanner.real - game.wfacsq=game.warpfac*game.warpfac if game.warpfac <= oldfac or game.warpfac <= 6.0: prout(_("Helmsman Sulu- \"Warp factor %d, Captain.\"") % int(game.warpfac)) @@ -4281,7 +4161,7 @@ def setwarp(): return def atover(igrab): - # cope with being tossed out of quadrant by supernova or yanked by beam + "Cope with being tossed out of quadrant by supernova or yanked by beam." scanner.chew() # is captain on planet? if game.landed: @@ -4319,17 +4199,14 @@ def atover(igrab): if game.justin: prouts(_("***RED ALERT! RED ALERT!")) skip(1) - proutn(_("The ")) - crmshp() - prout(_(" has stopped in a quadrant containing")) + proutn(_("The %s has stopped in a quadrant containing") % crmshp()) prouts(_(" a supernova.")) skip(2) - proutn(_("***Emergency automatic override attempts to hurl ")) - crmshp() + prout(_("***Emergency automatic override attempts to hurl ")+crmshp()) skip(1) prout(_("safely out of quadrant.")) if not damaged(DRADIO): - game.state.galaxy[game.quadrant.x][game.quadrant.y].charted = True + game.state.galaxy[game.quadrant.i][game.quadrant.j].charted = True # Try to use warp engines if damaged(DWARPEN): skip(1) @@ -4337,14 +4214,13 @@ def atover(igrab): finish(FSNOVAED) return game.warpfac = randreal(6.0, 8.0) - game.wfacsq = game.warpfac * game.warpfac prout(_("Warp factor set to %d") % int(game.warpfac)) power = 0.75*game.energy game.dist = power/(game.warpfac*game.warpfac*game.warpfac*(game.shldup+1)) distreq = randreal(math.sqrt(2)) if distreq < game.dist: game.dist = distreq - game.optime = 10.0*game.dist/game.wfacsq + game.optime = 10.0*game.dist/game.warpfac**2 game.direc = randreal(12) # How dumb! game.justin = False game.inorbit = False @@ -4358,13 +4234,13 @@ def atover(igrab): finish(FSNOVAED) return # Repeat if another snova - if not game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: + if not game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: break if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)==0: finish(FWON) # Snova killed remaining enemy. def timwrp(): - # let's do the time warp again + "Let's do the time warp again." prout(_("***TIME WARP ENTERED.")) if game.state.snap and withprob(0.5): # Go back in time @@ -4400,10 +4276,8 @@ def timwrp(): if game.iscraft == "offship" and not gotit and game.damage[DSHUTTL] >= 0.0: prout(_("Checkov- \"Security reports the Galileo has reappeared in the dock!\"")) game.iscraft = "onship" - # -# * There used to be code to do the actual reconstrction here, -# * but the starchart is now part of the snapshotted galaxy state. -# + # There used to be code to do the actual reconstrction here, + # but the starchart is now part of the snapshotted galaxy state. prout(_("Spock has reconstructed a correct star chart from memory")) else: # Go forward in time @@ -4412,11 +4286,11 @@ def timwrp(): # cheat to make sure no tractor beams occur during time warp postpone(FTBEAM, game.optime) game.damage[DRADIO] += game.optime - newqad(False) + newqad() events() # Stas Sergeev added this -- do pending events def probe(): - # launch deep-space probe + "Launch deep-space probe." # New code to launch a deep space probe if game.nprobes == 0: scanner.chew() @@ -4441,7 +4315,7 @@ def probe(): prout(_("Uhura- \"The previous probe is still reporting data, Sir.\"")) return key = scanner.next() - if key == IHEOL: + if key == "IHEOL": # slow mode, so let Kirk know how many probes there are left if game.nprobes == 1: prout(_("1 probe left.")) @@ -4451,10 +4325,10 @@ def probe(): if ja() == False: return game.isarmed = False - if key == IHALPHA and scanner.token == "armed": + if key == "IHALPHA" and scanner.token == "armed": game.isarmed = True key = scanner.next() - elif key == IHEOL: + elif key == "IHEOL": proutn(_("Arm NOVAMAX warhead? ")) game.isarmed = ja() if not getcourse(isprobe=True, akey=key): @@ -4470,8 +4344,8 @@ def probe(): game.probeiny /= bigger game.probeinx /= bigger game.proben = 10.0*game.dist*bigger +0.5 - game.probex = game.quadrant.x*QUADSIZE + game.sector.x - 1 # We will use better packing than original - game.probey = game.quadrant.y*QUADSIZE + game.sector.y - 1 + game.probex = game.quadrant.i*QUADSIZE + game.sector.i - 1 # We will use better packing than original + game.probey = game.quadrant.j*QUADSIZE + game.sector.j - 1 game.probec = game.quadrant schedule(FDSPROB, 0.01) # Time to move one sector prout(_("Ensign Chekov- \"The deep space probe is launched, Captain.\"")) @@ -4496,7 +4370,7 @@ def probe(): # problem. def mayday(): - # yell for help from nearest starbase + "Yell for help from nearest starbase." # There's more than one way to move in this game! scanner.chew() # Test for conditions which prevent calling for help @@ -4510,13 +4384,11 @@ def mayday(): prout(_("Lt. Uhura- \"Captain, I'm not getting any response from Starbase.\"")) return if game.landed: - proutn(_("You must be aboard the ")) - crmshp() - prout(".") + prout(_("You must be aboard the %s.") % crmshp()) return # OK -- call for help from nearest starbase game.nhelp += 1 - if game.base.x!=0: + if game.base.i!=0: # There's one in this quadrant ddist = (game.base - game.sector).distance() else: @@ -4527,16 +4399,15 @@ def mayday(): ddist = xdist # Since starbase not in quadrant, set up new quadrant game.quadrant = ibq - newqad(True) + newqad() # dematerialize starship - game.quad[game.sector.x][game.sector.y]=IHDOT - proutn(_("Starbase in Quadrant %s responds--") % game.quadrant) - crmshp() - prout(_(" dematerializes.")) - game.sector.x=0 + game.quad[game.sector.i][game.sector.j]=IHDOT + proutn(_("Starbase in Quadrant %s responds--%s dematerializes") \ + % (game.quadrant, crmshp())) + game.sector.invalidate() for m in range(1, 5+1): w = game.base.scatter() - if VALID_SECTOR(ix,iy) and game.quad[ix][iy]==IHDOT: + if VALID_SECTOR(w.i,w.j) and game.quad[w.i][w.j]==IHDOT: # found one -- finish up game.sector = w break @@ -4550,16 +4421,15 @@ def mayday(): if m == 1: proutn(_("1st")) elif m == 2: proutn(_("2nd")) elif m == 3: proutn(_("3rd")) - proutn(_(" attempt to re-materialize ")) - crmshp() + 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 @@ -4568,9 +4438,9 @@ 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!\"")) @@ -4594,7 +4464,7 @@ def mayday(): # can't happen unless you have taken some prisoners. def abandon(): - # abandon ship + "Abandon ship." scanner.chew() if game.condition=="docked": if game.ship!=IHE: @@ -4617,7 +4487,7 @@ def abandon(): if game.iscraft != "onship": prout(_("Shuttle craft not currently available.")) return - # Print abandon ship messages + # Emit abandon ship messages skip(1) prouts(_("***ABANDON SHIP! ABANDON SHIP!")) skip(1) @@ -4628,7 +4498,7 @@ def abandon(): # Oops! no place to go... finish(FABANDN) return - q = game.state.galaxy[game.quadrant.x][game.quadrant.y] + q = game.state.galaxy[game.quadrant.i][game.quadrant.j] # Dispose of crew if not (game.options & OPTION_WORLDS) and not damaged(DTRANSP): prout(_("Remainder of ship's complement beam down")) @@ -4641,7 +4511,6 @@ def abandon(): game.state.crew) game.casual += game.state.crew game.abandoned += game.state.crew - # If at least one base left, give 'em the Faerie Queene skip(1) game.icrystl = False # crystals are lost @@ -4652,23 +4521,23 @@ def abandon(): # Set up quadrant and position FQ adjacient to base if not game.quadrant == game.state.baseq[nb]: game.quadrant = game.state.baseq[nb] - game.sector.x = game.sector.y = 5 - newqad(True) + game.sector.i = game.sector.j = 5 + newqad() while True: # position next to base by trial and error - game.quad[game.sector.x][game.sector.y] = IHDOT + game.quad[game.sector.i][game.sector.j] = IHDOT for l in range(QUADSIZE): game.sector = game.base.scatter() - if VALID_SECTOR(game.sector.x, game.sector.y) and \ - game.quad[game.sector.x][game.sector.y] == IHDOT: + if VALID_SECTOR(game.sector.i, game.sector.j) and \ + game.quad[game.sector.i][game.sector.j] == IHDOT: break if l < QUADSIZE+1: break # found a spot - game.sector.x=QUADSIZE/2 - game.sector.y=QUADSIZE/2 - newqad(True) + game.sector.i=QUADSIZE/2 + game.sector.j=QUADSIZE/2 + newqad() # Get new commission - game.quad[game.sector.x][game.sector.y] = game.ship = IHF + game.quad[game.sector.i][game.sector.j] = game.ship = IHF game.state.crew = FULLCREW prout(_("Starfleet puts you in command of another ship,")) prout(_("the Faerie Queene, which is antiquated but,")) @@ -4688,21 +4557,20 @@ def abandon(): game.lsupres=game.inlsr=3.0 game.shldup=False game.warpfac=5.0 - game.wfacsq=25.0 return # Code from planets.c begins here. def consumeTime(): - # abort a lengthy operation if an event interrupts it + "Abort a lengthy operation if an event interrupts it." game.ididit = True events() - if game.alldone or game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova or game.justin: + if game.alldone or game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova or game.justin: return True return False def survey(): - # report on (uninhabited) planets in the galaxy + "Report on (uninhabited) planets in the galaxy." iknow = False skip(1) scanner.chew() @@ -4730,7 +4598,7 @@ def survey(): prout(_("No information available.")) def orbit(): - # enter standard orbit + "Enter standard orbit." skip(1) scanner.chew() if game.inorbit: @@ -4742,9 +4610,8 @@ def orbit(): if not game.plnet.is_valid(): prout("There is no planet in this sector.") return - if abs(game.sector.x-game.plnet.x)>1 or abs(game.sector.y-game.plnet.y)>1: - crmshp() - prout(_(" not adjacent to planet.")) + if abs(game.sector.i-game.plnet.i)>1 or abs(game.sector.j-game.plnet.j)>1: + prout(crmshp() + _(" not adjacent to planet.")) skip(1) return game.optime = randreal(0.02, 0.05) @@ -4758,7 +4625,7 @@ def orbit(): game.ididit = True def sensor(): - # examine planets in this quadrant + "Examine planets in this quadrant." if damaged(DSRSENS): if game.options & OPTION_TTY: prout(_("Short range sensors damaged.")) @@ -4785,7 +4652,7 @@ def sensor(): prout(_(" is located at Sector %s, Captain.\"") % game.plnet) def beam(): - # use the transporter + "Use the transporter." nrgneed = 0 scanner.chew() skip(1) @@ -4798,8 +4665,7 @@ def beam(): shuttle() return if not game.inorbit: - crmshp() - prout(_(" not in standard orbit.")) + prout(crmshp() + _(" not in standard orbit.")) return if game.shldup: prout(_("Impossible to transport through shields.")) @@ -4877,7 +4743,7 @@ def beam(): return def mine(): - # strip-mine a world for dilithium + "Strip-mine a world for dilithium." skip(1) scanner.chew() if not game.landed: @@ -4893,9 +4759,7 @@ def mine(): prout(_("You've already mined enough crystals for this trip.")) return if game.icrystl and game.cryprob == 0.05: - proutn(_("With all those fresh crystals aboard the ")) - crmshp() - skip(1) + prout(_("With all those fresh crystals aboard the ") + crmshp()) prout(_("there's no reason to mine more at this time.")) return game.optime = randreal(0.1, 0.3)*(ord(game.iplnet.pclass)-ord("L")) @@ -4906,7 +4770,7 @@ def mine(): game.imine = game.ididit = True def usecrystals(): - # use dilithium crystals + "Use dilithium crystals." game.ididit = False skip(1) scanner.chew() @@ -4952,7 +4816,7 @@ def usecrystals(): game.ididit = True def shuttle(): - # use shuttlecraft for planetary jaunt + "Use shuttlecraft for planetary jaunt." scanner.chew() skip(1) if damaged(DSHUTTL): @@ -4967,8 +4831,7 @@ def shuttle(): prout(_("Shuttle craft is now serving Big Macs.")) return if not game.inorbit: - crmshp() - prout(_(" not in standard orbit.")) + prout(crmshp() + _(" not in standard orbit.")) return if (game.iplnet.known != "shuttle_down") and game.iscraft != "onship": prout(_("Shuttle craft not currently available.")) @@ -5036,8 +4899,7 @@ def shuttle(): prout(_("Trip complete.")) return else: - # Kirk on ship - # and so is Galileo + # Kirk on ship and so is Galileo prout(_("Mining party assembles in the hangar deck,")) prout(_("ready to board the shuttle craft \"Galileo\".")) skip(1) @@ -5054,7 +4916,7 @@ def shuttle(): return def deathray(): - # use the big zapper + "Use the big zapper." game.ididit = False skip(1) scanner.chew() @@ -5094,7 +4956,7 @@ def deathray(): prouts(_("Sulu- \"Captain! It's working!\"")) skip(2) 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) + deadkl(game.enemies[1].kloc, game.quad[game.enemies[1].kloc.i][game.enemies[1].kloc.j],game.enemies[1].kloc) prout(_("Ensign Chekov- \"Congratulations, Captain!\"")) if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) == 0: finish(FWON) @@ -5159,7 +5021,7 @@ def deathray(): # Code from reports.c begins here def attackreport(curt): - # report status of bases under attack + "eport status of bases under attack." if not curt: if is_scheduled(FCDBAS): prout(_("Starbase in Quadrant %s is currently under Commander attack.") % game.battle) @@ -5247,7 +5109,7 @@ def report(): skip(1) def lrscan(silent): - # long-range sensor scan + "Long-range sensor scan." if damaged(DLRSENS): # Now allow base's sensors if docked if game.condition != "docked": @@ -5258,10 +5120,10 @@ def lrscan(silent): prout(_("Starbase's long-range scan")) elif not silent: prout(_("Long-range scan")) - for x in range(game.quadrant.x-1, game.quadrant.x+2): + for x in range(game.quadrant.i-1, game.quadrant.i+2): if not silent: proutn(" ") - for y in range(game.quadrant.y-1, game.quadrant.y+2): + for y in range(game.quadrant.j-1, game.quadrant.j+2): if not VALID_QUADRANT(x, y): if not silent: proutn(" -1") @@ -5278,7 +5140,7 @@ def lrscan(silent): prout(" ") def damagereport(): - # damage report + "Damage report." jdam = False scanner.chew() @@ -5295,7 +5157,7 @@ def damagereport(): prout(_("All devices functional.")) def rechart(): - # update the chart in the Enterprise's computer from galaxy data + "Update the chart in the Enterprise's computer from galaxy data." game.lastchart = game.state.date for i in range(GALSIZE): for j in range(GALSIZE): @@ -5305,7 +5167,7 @@ def rechart(): game.state.chart[i][j].stars = game.state.galaxy[i][j].stars def chart(): - # display the star chart + "Display the star chart." scanner.chew() if (game.options & OPTION_AUTOSCAN): lrscan(silent=True) @@ -5314,7 +5176,6 @@ def chart(): if game.lastchart < game.state.date and game.condition == "docked": prout(_("Spock- \"I revised the Star Chart from the starbase's records.\"")) rechart() - prout(_(" STAR CHART FOR THE KNOWN GALAXY")) if game.state.date > game.lastchart: prout(_("(Last surveillance update %d stardates ago).") % ((int)(game.state.date-game.lastchart))) @@ -5322,7 +5183,7 @@ def chart(): for i in range(GALSIZE): proutn("%d |" % (i+1)) for j in range(GALSIZE): - if (game.options & OPTION_SHOWME) and i == game.quadrant.x and j == game.quadrant.y: + if (game.options & OPTION_SHOWME) and i == game.quadrant.i and j == game.quadrant.j: proutn("<") else: proutn(" ") @@ -5335,7 +5196,7 @@ def chart(): else: show = "..." proutn(show) - if (game.options & OPTION_SHOWME) and i == game.quadrant.x and j == game.quadrant.y: + if (game.options & OPTION_SHOWME) and i == game.quadrant.i and j == game.quadrant.j: proutn(">") else: proutn(" ") @@ -5344,24 +5205,23 @@ def chart(): skip(1) 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): + "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("- ") def status(req=0): - # print status report lines - + "Emit status report lines" if not req or req == 1: prstat(_("Stardate"), _("%.1f, Time Left %.2f") \ % (game.state.date, game.state.remtime)) @@ -5408,7 +5268,7 @@ def status(req=0): % (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem)) if not req or req == 10: if game.options & OPTION_WORLDS: - plnet = game.state.galaxy[game.quadrant.x][game.quadrant.y].planet + plnet = game.state.galaxy[game.quadrant.i][game.quadrant.j].planet if plnet and plnet.inhabited: prstat(_("Major system"), plnet.name) else: @@ -5417,8 +5277,9 @@ def status(req=0): attackreport(not req) 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.next() == "IHEOL": proutn(_("Information desired? ")) scanner.chew() if scanner.token in requests: @@ -5429,7 +5290,7 @@ def request(): prout((" energy, torpedoes, shields, klingons, system, time.")) def srscan(): - # short-range scan + "Short-range scan." goodScan=True if damaged(DSRSENS): # Allow base's sensors if docked @@ -5441,10 +5302,10 @@ def srscan(): else: prout(_(" Short-range scan")) if goodScan and not damaged(DRADIO): - game.state.chart[game.quadrant.x][game.quadrant.y].klingons = game.state.galaxy[game.quadrant.x][game.quadrant.y].klingons - game.state.chart[game.quadrant.x][game.quadrant.y].starbase = game.state.galaxy[game.quadrant.x][game.quadrant.y].starbase - game.state.chart[game.quadrant.x][game.quadrant.y].stars = game.state.galaxy[game.quadrant.x][game.quadrant.y].stars - game.state.galaxy[game.quadrant.x][game.quadrant.y].charted = True + game.state.chart[game.quadrant.i][game.quadrant.j].klingons = game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons + game.state.chart[game.quadrant.i][game.quadrant.j].starbase = game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase + game.state.chart[game.quadrant.i][game.quadrant.j].stars = game.state.galaxy[game.quadrant.i][game.quadrant.j].stars + game.state.galaxy[game.quadrant.i][game.quadrant.j].charted = True prout(" 1 2 3 4 5 6 7 8 9 10") if game.condition != "docked": newcnd() @@ -5453,54 +5314,54 @@ 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 + "Use computer to get estimated time of arrival for a warp jump." w1 = coord(); w2 = coord() prompt = False if damaged(DCOMPTR): prout(_("COMPUTER DAMAGED, USE A POCKET CALCULATOR.")) skip(1) return - if scanner.next() != IHREAL: + if scanner.next() != "IHREAL": prompt = True scanner.chew() proutn(_("Destination quadrant and/or sector? ")) - if scanner.next()!=IHREAL: + if scanner.next()!="IHREAL": huh() return - w1.y = int(scanner.real-0.5) - if scanner.next() != IHREAL: + w1.j = int(scanner.real-0.5) + if scanner.next() != "IHREAL": huh() return - w1.x = int(scanner.real-0.5) - if scanner.next() == IHREAL: - w2.y = int(scanner.real-0.5) - if scanner.next() != IHREAL: + w1.i = int(scanner.real-0.5) + if scanner.next() == "IHREAL": + w2.j = int(scanner.real-0.5) + if scanner.next() != "IHREAL": huh() return - w2.x = int(scanner.real-0.5) + w2.i = int(scanner.real-0.5) else: - if game.quadrant.y>w1.x: - w2.x = 0 + if game.quadrant.j>w1.i: + w2.i = 0 else: - w2.x=QUADSIZE-1 - if game.quadrant.x>w1.y: - w2.y = 0 + w2.i=QUADSIZE-1 + if game.quadrant.i>w1.j: + w2.j = 0 else: - w2.y=QUADSIZE-1 - if not VALID_QUADRANT(w1.x, w1.y) or not VALID_SECTOR(w2.x, w2.y): + w2.j=QUADSIZE-1 + if not VALID_QUADRANT(w1.i, w1.j) or not VALID_SECTOR(w2.i, w2.j): huh() return - game.dist = math.sqrt((w1.y-game.quadrant.y+0.1*(w2.y-game.sector.y))**2+ - (w1.x-game.quadrant.x+0.1*(w2.x-game.sector.x))**2) + game.dist = math.sqrt((w1.j-game.quadrant.j+0.1*(w2.j-game.sector.j))**2+ + (w1.i-game.quadrant.i+0.1*(w2.i-game.sector.i))**2) wfl = False if prompt: prout(_("Answer \"no\" if you don't know the value:")) while True: scanner.chew() proutn(_("Time or arrival date? ")) - if scanner.next()==IHREAL: + if scanner.next()=="IHREAL": ttime = scanner.real if ttime > game.state.date: ttime -= game.state.date # Actually a star date @@ -5514,7 +5375,7 @@ def eta(): break scanner.chew() proutn(_("Warp factor? ")) - if scanner.next()== IHREAL: + if scanner.next()== "IHREAL": wfl = True twarp = scanner.real if twarp<1.0 or twarp > 10.0: @@ -5532,7 +5393,7 @@ def eta(): if not wfl: return proutn(_("New warp factor to try? ")) - if scanner.next() == IHREAL: + if scanner.next() == "IHREAL": wfl = True twarp = scanner.real if twarp<1.0 or twarp > 10.0: @@ -5565,7 +5426,7 @@ def eta(): (scheduled(FCDBAS) 10.0: @@ -5575,12 +5436,11 @@ def eta(): scanner.chew() skip(1) return - # Code from setup.c begins here def prelim(): - # issue a historically correct banner + "Issue a historically correct banner." skip(2) prout(_("-SUPER- STAR TREK")) skip(1) @@ -5589,15 +5449,15 @@ def prelim(): # skip(1) def freeze(boss): - # save game + "Save game." if boss: scanner.token = "emsave.trk" else: key = scanner.next() - if key == IHEOL: + if key == "IHEOL": proutn(_("File name: ")) key = scanner.next() - if key != IHALPHA: + if key != "IHALPHA": huh() return scanner.chew() @@ -5612,13 +5472,13 @@ def freeze(boss): fp.close() def thaw(): - # retrieve saved game + "Retrieve saved game." game.passwd[0] = '\0' key = scanner.next() - if key == IHEOL: + if key == "IHEOL": proutn(_("File name: ")) key = scanner.next() - if key != IHALPHA: + if key != "IHALPHA": huh() return True scanner.chew() @@ -5705,19 +5565,17 @@ device = ( ) def setup(): - # prepare to play, set up cosmos + "Prepare to play, set up cosmos." w = coord() # Decide how many of everything if choose(): return # frozen game # Prepare the Enterprise - game.alldone = game.gamewon = False + game.alldone = game.gamewon = game.shldchg = game.shldup = False game.ship = IHE game.state.crew = FULLCREW game.energy = game.inenrg = 5000.0 game.shield = game.inshld = 2500.0 - game.shldchg = False - game.shldup = False game.inlsr = 4.0 game.lsupres = 4.0 game.quadrant = randplace(GALSIZE) @@ -5725,7 +5583,6 @@ def setup(): game.torps = game.intorps = 10 game.nprobes = randrange(2, 5) game.warpfac = 5.0 - game.wfacsq = game.warpfac * game.warpfac for i in range(NDEVICES): game.damage[i] = 0.0 # Set up assorted game parameters @@ -5753,7 +5610,7 @@ def setup(): while True: while True: w = randplace(GALSIZE) - if not game.state.galaxy[w.x][w.y].starbase: + if not game.state.galaxy[w.i][w.j].starbase: break contflag = False # C version: for (j = i-1; j > 0; j--) @@ -5772,7 +5629,7 @@ def setup(): if not contflag: break game.state.baseq.append(w) - game.state.galaxy[w.x][w.y].starbase = game.state.chart[w.x][w.y].starbase = True + game.state.galaxy[w.i][w.j].starbase = game.state.chart[w.i][w.j].starbase = True # Position ordinary Klingon Battle Cruisers krem = game.inkling klumper = 0.25*game.skill*(9.0-game.length)+1.0 @@ -5786,10 +5643,10 @@ def setup(): krem -= klump while True: w = randplace(GALSIZE) - if not game.state.galaxy[w.x][w.y].supernova and \ - game.state.galaxy[w.x][w.y].klingons + klump <= MAXKLQUAD: + if not game.state.galaxy[w.i][w.j].supernova and \ + game.state.galaxy[w.i][w.j].klingons + klump <= MAXKLQUAD: break - game.state.galaxy[w.x][w.y].klingons += int(klump) + game.state.galaxy[w.i][w.j].klingons += int(klump) if krem <= 0: break # Position Klingon Commander Ships @@ -5798,15 +5655,15 @@ def setup(): w = randplace(GALSIZE) if not welcoming(w) or w in game.state.kcmdr: continue - if (game.state.galaxy[w.x][w.y].klingons or withprob(0.25)): + if (game.state.galaxy[w.i][w.j].klingons or withprob(0.25)): break - game.state.galaxy[w.x][w.y].klingons += 1 + game.state.galaxy[w.i][w.j].klingons += 1 game.state.kcmdr.append(w) # Locate planets in galaxy for i in range(game.inplan): while True: w = randplace(GALSIZE) - if game.state.galaxy[w.x][w.y].planet == None: + if game.state.galaxy[w.i][w.j].planet == None: break new = planet() new.quadrant = w @@ -5823,12 +5680,12 @@ def setup(): new.crystals = "present" new.known = "unknown" new.inhabited = False - game.state.galaxy[w.x][w.y].planet = new + game.state.galaxy[w.i][w.j].planet = new game.state.planets.append(new) # Locate Romulans for i in range(game.state.nromrem): w = randplace(GALSIZE) - game.state.galaxy[w.x][w.y].romulans += 1 + game.state.galaxy[w.i][w.j].romulans += 1 # Place the Super-Commander if needed if game.state.nscrem > 0: while True: @@ -5836,7 +5693,7 @@ def setup(): if welcoming(w): break game.state.kscmdr = w - game.state.galaxy[w.x][w.y].klingons += 1 + game.state.galaxy[w.i][w.j].klingons += 1 # Initialize times for extraneous events schedule(FSNOVA, expran(0.5 * game.intime)) schedule(FTBEAM, expran(1.5 * (game.intime / len(game.state.kcmdr)))) @@ -5856,9 +5713,14 @@ def setup(): unschedule(FENSLV) unschedule(FREPRO) # Place thing (in tournament game, we don't want one!) + # New in SST2K: never place the Thing near a starbase. + # This makes sense and avoids a special case in the old code. global thing if game.tourn is None: - thing = randplace(GALSIZE) + while True: + thing = randplace(GALSIZE) + if thing not in game.state.baseq: + break skip(2) game.state.snap = False if game.skill == SKILL_NOVICE: @@ -5891,14 +5753,14 @@ def setup(): if game.state.nscrem: prout(_(" YOU'LL NEED IT.")) waitfor() - newqad(False) + newqad() 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) def choose(): - # choose your game type + "Choose your game type." global thing while True: game.tourn = 0 @@ -5911,7 +5773,7 @@ def choose(): if len(scanner.token)==0: # Try again continue if scanner.sees("tournament"): - while scanner.next() == IHEOL: + while scanner.next() == "IHEOL": proutn(_("Type in tournament number-")) if scanner.real == 0: scanner.chew() @@ -5937,7 +5799,7 @@ def choose(): proutn(_("What is \"%s\"?") % scanner.token) scanner.chew() while game.length==0 or game.skill==SKILL_NONE: - if scanner.next() == IHALPHA: + if scanner.next() == "IHALPHA": if scanner.sees("short"): game.length = 1 elif scanner.sees("medium"): @@ -5965,7 +5827,7 @@ def choose(): 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.next() != "IHALPHA": scanner.chew() proutn(_("Choose your game style (or just press enter): ")) scanner.next() @@ -5984,8 +5846,7 @@ def choose(): setpassword() if game.passwd == "debug": idebug = True - fputs("=== Debug mode enabled\n", sys.stdout) - + prout("=== Debug mode enabled.") # Use parameters to generate initial values of things game.damfac = 0.5 * game.skill game.inbase = randrange(BASEMIN, BASEMAX+1) @@ -6007,56 +5868,49 @@ def choose(): return False def dropin(iquad=None): - # drop a feature on a random dot in the current quadrant - w = coord() + "Drop a feature on a random dot in the current quadrant." while True: w = randplace(QUADSIZE) - if game.quad[w.x][w.y] == IHDOT: + if game.quad[w.i][w.j] == IHDOT: break if iquad is not None: - game.quad[w.x][w.y] = iquad + game.quad[w.i][w.j] = iquad return w def newcnd(): - # update our alert status + "Update our alert status." game.condition = "green" if game.energy < 1000.0: game.condition = "yellow" - if game.state.galaxy[game.quadrant.x][game.quadrant.y].klingons or game.state.galaxy[game.quadrant.x][game.quadrant.y].romulans: + if game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons or game.state.galaxy[game.quadrant.i][game.quadrant.j].romulans: game.condition = "red" if not game.alive: game.condition="dead" def newkling(): - # drop new Klingon into current quadrant + "Drop new Klingon into current quadrant." return enemy(IHK, loc=dropin(), power=randreal(300,450)+25.0*game.skill) -def newqad(shutup): - # set up a new state of quadrant, for when we enter or re-enter it - w = coord() +def newqad(): + "Set up a new state of quadrant, for when we enter or re-enter it." game.justin = True - game.klhere = 0 - game.irhere = 0 - game.iplnet = 0 - game.neutz = False - game.inorbit = False - game.landed = False - game.ientesc = False - game.iseenit = False + game.iplnet = None + game.neutz = game.inorbit = game.landed = False + game.ientesc = 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 game.ientesc = True - q = game.state.galaxy[game.quadrant.x][game.quadrant.y] + q = game.state.galaxy[game.quadrant.i][game.quadrant.j] # cope with supernova if q.supernova: return game.klhere = q.klingons game.irhere = q.romulans # Position Starship - game.quad[game.sector.x][game.sector.y] = game.ship + game.quad[game.sector.i][game.sector.j] = game.ship game.enemies = [] if q.klingons: # Position ordinary Klingons @@ -6066,13 +5920,13 @@ def newqad(shutup): for cmdr in game.state.kcmdr: if cmdr == game.quadrant: e = game.enemies[game.klhere-1] - game.quad[e.kloc.x][e.kloc.y] = IHC + game.quad[e.kloc.i][e.kloc.j] = IHC e.kpower = randreal(950,1350) + 50.0*game.skill break # If we need a super-commander, promote a Klingon if game.quadrant == game.state.kscmdr: e = game.enemies[0] - game.quad[e.kloc.x][e.kloc.y] = IHS + game.quad[e.kloc.i][e.kloc.j] = IHS e.kpower = randreal(1175.0, 1575.0) + 125.0*game.skill game.iscate = (game.state.remkl > 1) # Put in Romulans if needed @@ -6100,15 +5954,14 @@ def newqad(shutup): skip(1) prout(_("INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE.")) prout(_("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!")) - if shutup==0: - # Put in THING if needed - if thing == game.quadrant: - enemy(type=IHQUEST, loc=dropin(), - power=randreal(6000,6500.0)+250.0*game.skill) - if not damaged(DSRSENS): - skip(1) - prout(_("Mr. Spock- \"Captain, this is most unusual.")) - prout(_(" Please examine your short-range scan.\"")) + # Put in THING if needed + if thing == game.quadrant: + enemy(type=IHQUEST, loc=dropin(), + power=randreal(6000,6500.0)+250.0*game.skill) + if not damaged(DSRSENS): + skip(1) + prout(_("Mr. Spock- \"Captain, this is most unusual.")) + prout(_(" Please examine your short-range scan.\"")) # Decide if quadrant needs a Tholian; lighten up if skill is low if game.options & OPTION_THOLIAN: if (game.skill < SKILL_GOOD and withprob(0.02)) or \ @@ -6116,9 +5969,9 @@ def newqad(shutup): (game.skill > SKILL_GOOD and withprob(0.08)): w = coord() while True: - w.x = withprob(0.5) * (QUADSIZE-1) - w.y = withprob(0.5) * (QUADSIZE-1) - if game.quad[w.x][w.y] == IHDOT: + w.i = withprob(0.5) * (QUADSIZE-1) + w.j = withprob(0.5) * (QUADSIZE-1) + if game.quad[w.i][w.j] == IHDOT: break game.tholian = enemy(type=IHT, loc=w, power=randrange(100, 500) + 25.0*game.skill) @@ -6151,7 +6004,7 @@ def newqad(shutup): game.quad[QUADSIZE-1][QUADSIZE-1] = IHDOT def setpassword(): - # set the self-destruct password + "Set the self-destruct password." if game.options & OPTION_PLAIN: while True: scanner.chew() @@ -6209,37 +6062,34 @@ commands = { "HELP": 0, } -def ACCEPT(cmd): return (not commands[cmd] or (commands[cmd] & game.options)) - def listCommands(): - # generate a list of legal commands - k = 0 - proutn(_("LEGAL COMMANDS ARE:")) + "Generate a list of legal commands." + prout(_("LEGAL COMMANDS ARE:")) + emitted = 0 for key in commands: - if ACCEPT(key): - if k % 5 == 0: + if not commands[key] or (commands[key] & game.options): + proutn("%-12s " % key) + emitted += 1 + if emitted % 5 == 4: skip(1) - proutn("%-12s " % key) - k += 1 skip(1) def helpme(): - # browse on-line help - # Give help on commands + "Browse on-line help." key = scanner.next() while True: - if key == IHEOL: + if key == "IHEOL": setwnd(prompt_window) proutn(_("Help on what command? ")) key = scanner.next() setwnd(message_window) - if key == IHEOL: + if key == "IHEOL": return if scanner.token in commands or scanner.token == "ABBREV": break skip(1) listCommands() - key = IHEOL + key = "IHEOL" scanner.chew() skip(1) cmd = scanner.token.upper() @@ -6281,8 +6131,7 @@ def helpme(): fp.close() def makemoves(): - # command-interpretation loop - v = 0 + "Command-interpretation loop." clrscr() setwnd(message_window) while True: # command loop @@ -6295,7 +6144,7 @@ def makemoves(): setwnd(prompt_window) clrscr() proutn("COMMAND> ") - if scanner.next() == IHEOL: + if scanner.next() == "IHEOL": if game.options & OPTION_CURSES: makechart() continue @@ -6422,14 +6271,14 @@ def makemoves(): events() if game.alldone: break # Events did us in - if game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: + if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: atover(False) continue if hitme and not game.justin: attack(torps_ok=True) if game.alldone: break - if game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: + if game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova: atover(False) hitme = True continue @@ -6439,48 +6288,41 @@ def makemoves(): if idebug: prout("=== Ending") -def cramen(cmd): - # return an enemy - if cmd == IHR: s = _("Romulan") - elif cmd == IHK: s = _("Klingon") - elif cmd == IHC: s = _("Commander") - elif cmd == IHS: s = _("Super-commander") - elif cmd == IHSTAR: s = _("Star") - elif cmd == IHP: s = _("Planet") - elif cmd == IHB: s = _("Starbase") - elif cmd == IHBLANK: s = _("Black hole") - elif cmd == IHT: s = _("Tholian") - elif cmd == IHWEB: s = _("Tholian web") - elif cmd == IHQUEST: s = _("Stranger") - elif cmd == IHW: s = _("Inhabited World") +def cramen(type): + "Emit the name of an enemy or feature." + if type == IHR: s = _("Romulan") + elif type == IHK: s = _("Klingon") + elif type == IHC: s = _("Commander") + elif type == IHS: s = _("Super-commander") + elif type == IHSTAR: s = _("Star") + elif type == IHP: s = _("Planet") + elif type == IHB: s = _("Starbase") + elif type == IHBLANK: s = _("Black hole") + elif type == IHT: s = _("Tholian") + elif type == IHWEB: s = _("Tholian web") + elif type == IHQUEST: s = _("Stranger") + elif type == IHW: s = _("Inhabited World") else: s = "Unknown??" - proutn(s) + return s def crmena(stars, enemy, loctype, w): - # print an enemy and his location - if stars: - proutn("***") - cramen(enemy) - proutn(_(" at ")) + "Emit the name of an enemy and his location." buf = "" + if stars: + buf += "***" + buf += cramen(enemy) + _(" at ") if loctype == "quadrant": - buf = _("Quadrant ") + buf += _("Quadrant ") elif loctype == "sector": - buf = _("Sector ") - proutn(buf + `w`) + buf += _("Sector ") + return buf + `w` def crmshp(): - # print our ship name - if game.ship == IHE: - s = _("Enterprise") - elif game.ship == IHF: - s = _("Faerie Queene") - else: - s = "Ship???" - proutn(s) + "Emit our ship name." + return{IHE:_("Enterprise"),IHF:_("Faerie Queene")}.get(game.ship,"Ship???") def stars(): - # print a line of stars + "Emit a line of stars" prouts("******************************************************") skip(1) @@ -6488,10 +6330,10 @@ def expran(avrage): return -avrage*math.log(1e-7 + randreal()) def randplace(size): - # choose a random location + "Choose a random location." w = coord() - w.x = randrange(size) - w.y = randrange(size) + w.i = randrange(size) + w.j = randrange(size) return w class sstscanner: @@ -6513,37 +6355,39 @@ class sstscanner: clrscr() if line == '': return None - # Skip leading white space - line = line.lstrip() if not line: continue else: - self.inqueue = line.lstrip().split() + [IHEOL] + self.inqueue = line.lstrip().split() + ["IHEOL"] # From here on in it's all looking at the queue self.token = self.inqueue.pop(0) - if self.token == IHEOL: - self.type = IHEOL - return IHEOL + if self.token == "IHEOL": + self.type = "IHEOL" + return "IHEOL" try: self.real = float(self.token) - self.type = IHREAL - return IHREAL + self.type = "IHREAL" + return "IHREAL" except ValueError: pass # Treat as alpha self.token = self.token.lower() - self.type = IHALPHA + self.type = "IHALPHA" self.real = None - return IHALPHA - def push(self, toklist): - self.inqueue += toklist + return "IHALPHA" + def append(self, tok): + self.inqueue.append(tok) + def push(self, tok): + self.inqueue.insert(0, tok) + def waiting(self): + return self.inqueue def chew(self): # Demand input for next scan - self.inqueue = None + self.inqueue = [] self.real = self.token = None def chew2(self): - # return IHEOL next time - self.inqueue = [] + # return "IHEOL" next time + self.inqueue = ["IHEOL"] self.real = self.token = None def sees(self, s): # compares s to item and returns true if it matches to the length of s @@ -6551,27 +6395,42 @@ class sstscanner: def int(self): # Round token value to nearest integer return int(round(scanner.real)) + def getcoord(self): + s = coord() + scanner.next() + if scanner.type != "IHREAL": + huh() + return None + s.i = scanner.int()-1 + scanner.next() + if scanner.type != "IHREAL": + huh() + return None + s.j = scanner.int()-1 + return s + def __repr__(str): + return "" % (scanner.token, scanner.type, scanner.inqueue) def ja(): - # yes-or-no confirmation + "Yes-or-no confirmation." scanner.chew() while True: scanner.next() - scanner.chew() if scanner.token == 'y': return True if scanner.token == 'n': return False + scanner.chew() proutn(_("Please answer with \"y\" or \"n\": ")) def huh(): - # complain about unparseable input + "Complain about unparseable input." scanner.chew() skip(1) prout(_("Beg your pardon, Captain?")) def debugme(): - # access to the internals for debugging + "Access to the internals for debugging." proutn("Reset levels? ") if ja() == True: if game.energy < game.inenrg: @@ -6594,12 +6453,10 @@ def debugme(): proutn("Cause selective damage? ") if ja() == True: for i in range(NDEVICES): - proutn("Kill ") - proutn(device[i]) - proutn("? ") + proutn("Kill %s?" % device[i]) scanner.chew() key = scanner.next() - if key == IHALPHA and scanner.sees("y"): + if key == "IHALPHA" and scanner.sees("y"): game.damage[i] = 10.0 proutn("Examine/change events? ") if ja() == True: @@ -6633,33 +6490,34 @@ def debugme(): if key == 'n': unschedule(i) scanner.chew() - elif key == IHREAL: + elif key == "IHREAL": ev = schedule(i, scanner.real) if i == FENSLV or i == FREPRO: scanner.chew() proutn("In quadrant- ") key = scanner.next() - # IHEOL says to leave coordinates as they are - if key != IHEOL: - if key != IHREAL: + # "IHEOL" says to leave coordinates as they are + if key != "IHEOL": + if key != "IHREAL": prout("Event %d canceled, no x coordinate." % (i)) unschedule(i) continue - w.x = int(round(scanner.real)) + w.i = int(round(scanner.real)) key = scanner.next() - if key != IHREAL: + if key != "IHREAL": prout("Event %d canceled, no y coordinate." % (i)) unschedule(i) continue - w.y = int(round(scanner.real)) + w.j = int(round(scanner.real)) ev.quadrant = w scanner.chew() proutn("Induce supernova here? ") if ja() == True: - game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova = True + game.state.galaxy[game.quadrant.i][game.quadrant.j].supernova = True atover(True) if __name__ == '__main__': + import getopt, socket try: global line, thing, game, idebug game = None @@ -6668,11 +6526,10 @@ if __name__ == '__main__': game = gamestate() idebug = 0 game.options = OPTION_ALL &~ (OPTION_IOMODES | OPTION_PLAIN | OPTION_ALMY) - # Disable curses mode until the game logic is working. - # if os.getenv("TERM"): - # game.options |= OPTION_CURSES | OPTION_SHOWME - # else: - game.options |= OPTION_TTY + if os.getenv("TERM"): + game.options |= OPTION_CURSES + else: + game.options |= OPTION_TTY seed = int(time.time()) (options, arguments) = getopt.getopt(sys.argv[1:], "r:s:tx") for (switch, val) in options: @@ -6712,9 +6569,11 @@ 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() - scanner.push(arguments) + map(scanner.append, arguments) try: iostart() while True: # Play a game @@ -6745,5 +6604,7 @@ if __name__ == '__main__': ioend() raise SystemExit, 0 except KeyboardInterrupt: - print"" + if logfp: + logfp.close() + print "" pass