X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=sst.py;h=c42171ea645df8d280aef91dfd851d401605417c;hp=ca6206db557b57a7b16f73e7850fa2a0519fcbda;hb=cb9b29764fdd6e50456222e33d7516c8e780fe5b;hpb=a949773474265e7f431068ecf85054dcf6a8eb5a diff --git a/sst.py b/sst.py index ca6206d..c42171e 100755 --- a/sst.py +++ b/sst.py @@ -124,6 +124,14 @@ class Coord: return "%s - %s" % (self.i+1, self.j+1) __repr__ = __str__ +class Thingy(Coord): + "Do not anger the Space Thingy!" + def __init__(self): + Coord.__init__(self) + self.angered = False + def angry(self): + self.angered = True + class Planet: def __init__(self): self.name = None # string-valued if inhabited @@ -378,7 +386,7 @@ class Gamestate: # He says the existing expression is prone to divide-by-zero errors # after killing the last klingon when score is shown -- perhaps also # if the only remaining klingon is SCOM. - game.state.remtime = game.state.remres/(game.state.remkl + 4*len(game.state.kcmdr)) + self.state.remtime = self.state.remres/(self.state.remkl + 4*len(self.state.kcmdr)) FWON = 0 FDEPLETE = 1 @@ -513,7 +521,8 @@ def tryexit(enemy, look, irun): def movebaddy(enemy): "Tactical movement for the bad guys." - goto = Coord(); look = Coord() + goto = Coord() + look = Coord() irun = False # This should probably be just (game.quadrant in game.state.kcmdr) + (game.state.kscmdr==game.quadrant) if game.skill >= SKILL_EXPERT: @@ -523,7 +532,7 @@ def movebaddy(enemy): dist1 = enemy.kdist mdist = int(dist1 + 0.5) # Nearest integer distance # If SC, check with spy to see if should hi-tail it - if enemy.type=='S' and \ + if enemy.type == 'S' and \ (enemy.power <= 500.0 or (game.condition=="docked" and not damaged(DPHOTON))): irun = True motion = -QUADSIZE @@ -632,7 +641,7 @@ def movebaddy(enemy): if success: goto = look if game.idebug: - proutn(`goto`) + proutn(repr(goto)) else: break # done early if game.idebug: @@ -656,7 +665,7 @@ def moveklings(): for enemy in game.enemies: if enemy.type == 'C': movebaddy(enemy) - if game.state.kscmdr==game.quadrant: + if game.state.kscmdr == game.quadrant: for enemy in game.enemies: if enemy.type == 'S': movebaddy(enemy) @@ -681,7 +690,7 @@ def movescom(iq, avoid): game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].klingons -= 1 game.state.kscmdr = iq game.state.galaxy[game.state.kscmdr.i][game.state.kscmdr.j].klingons += 1 - if game.state.kscmdr==game.quadrant: + if game.state.kscmdr == game.quadrant: # SC has scooted, remove him from current quadrant game.iscate = False game.isatb = 0 @@ -712,7 +721,10 @@ def movescom(iq, avoid): def supercommander(): "Move the Super Commander." - iq = Coord(); sc = Coord(); ibq = Coord(); idelta = Coord() + iq = Coord() + sc = Coord() + ibq = Coord() + idelta = Coord() basetbl = [] if game.idebug: prout("== SUPERCOMMANDER") @@ -868,16 +880,16 @@ def movetholian(): game.tholian.move(here) # check to see if all holes plugged for i in range(QUADSIZE): - if game.quad[0][i]!='#' and game.quad[0][i]!='T': + if game.quad[0][i] != '#' and game.quad[0][i] != 'T': return - if game.quad[QUADSIZE-1][i]!='#' and game.quad[QUADSIZE-1][i]!='T': + if game.quad[QUADSIZE-1][i] != '#' and game.quad[QUADSIZE-1][i] != 'T': return - if game.quad[i][0]!='#' and game.quad[i][0]!='T': + if game.quad[i][0] != '#' and game.quad[i][0] != 'T': return - if game.quad[i][QUADSIZE-1]!='#' and game.quad[i][QUADSIZE-1]!='T': + if game.quad[i][QUADSIZE-1] != '#' and game.quad[i][QUADSIZE-1] != 'T': return # All plugged up -- Tholian splits - game.quad[game.tholian.location.i][game.tholian.location.j]='#' + game.quad[game.tholian.location.i][game.tholian.location.j] = '#' dropin(' ') prout(crmena(True, 'T', "sector", game.tholian) + _(" completes web.")) game.tholian.move(None) @@ -939,14 +951,14 @@ def doshield(shraise): prout(_("Shields raising uses up last of energy.")) finish(FNRG) return - game.ididit=True + game.ididit = True return elif action == "SHDN": if not game.shldup: prout(_("Shields already down.")) return - game.shldup=False - game.shldchg=True + game.shldup = False + game.shldchg = True prout(_("Shields lowered.")) game.ididit = True return @@ -1077,11 +1089,12 @@ def torpedo(origin, bearing, dispersion, number, nburst): # Loop to move a single torpedo setwnd(message_window) for step in range(1, QUADSIZE*2): - if not track.next(): break + if not track.next(): + break w = track.sector() if not w.valid_sector(): break - iquad=game.quad[w.i][w.j] + iquad = game.quad[w.i][w.j] tracktorpedo(w, step, number, nburst, iquad) if iquad == '.': continue @@ -1098,7 +1111,7 @@ def torpedo(origin, bearing, dispersion, number, nburst): return hit # Cheat if on a planet # In the C/FORTRAN version, dispersion was 2.5 radians, which # is 143 degrees, which is almost exactly 4.8 clockface units - displacement = course(track.bearing+randreal(-2.4,2.4), distance=2**0.5) + displacement = course(track.bearing+randreal(-2.4, 2.4), distance=2**0.5) displacement.next() bumpto = displacement.sector() if not bumpto.valid_sector(): @@ -1106,7 +1119,7 @@ def torpedo(origin, bearing, dispersion, number, nburst): if game.quad[bumpto.i][bumpto.j] == ' ': finish(FHOLE) return hit - if game.quad[bumpto.i][bumpto.j]!='.': + if game.quad[bumpto.i][bumpto.j] != '.': # can't move into object return hit game.sector = bumpto @@ -1141,7 +1154,7 @@ def torpedo(origin, bearing, dispersion, number, nburst): deadkl(w, iquad, w) return None proutn(crmena(True, iquad, "sector", w)) - displacement = course(track.bearing+randreal(-2.4,2.4), distance=2**0.5) + displacement = course(track.bearing+randreal(-2.4, 2.4), distance=2**0.5) displacement.next() bumpto = displacement.sector() if not bumpto.valid_sector(): @@ -1155,8 +1168,8 @@ def torpedo(origin, bearing, dispersion, number, nburst): else: prout(_(" damaged-- displaced by blast to Sector %s ")%bumpto) enemy.location = bumpto - game.quad[w.i][w.j]='.' - game.quad[bumpto.i][bumpto.j]=iquad + game.quad[w.i][w.j] = '.' + game.quad[bumpto.i][bumpto.j] = iquad for enemy in game.enemies: enemy.kdist = enemy.kavgd = (game.sector-enemy.location).distance() sortenemies() @@ -1218,7 +1231,7 @@ def torpedo(origin, bearing, dispersion, number, nburst): # 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 + thing.angry() return None elif iquad == ' ': # Black hole skip(1) @@ -1287,7 +1300,7 @@ def fry(hit): prout(_(" damaged.")) if damaged(DSHIELD) and game.shldup: prout(_("***Shields knocked down.")) - game.shldup=False + game.shldup = False def attack(torps_ok): # bad guy attacks us @@ -1297,7 +1310,9 @@ def attack(torps_ok): return attempt = False ihurt = False - hitmax=0.0; hittot=0.0; chgfac=1.0 + hitmax = 0.0 + hittot = 0.0 + chgfac = 1.0 where = "neither" if game.idebug: prout("=== ATTACK!") @@ -1312,7 +1327,7 @@ def attack(torps_ok): if (((game.quadrant in game.state.kcmdr or game.state.kscmdr == game.quadrant) and not game.justin) or game.skill == SKILL_EMERITUS) and torps_ok: moveklings() # if no enemies remain after movement, we're done - if len(game.enemies) == 0 or (len(game.enemies) == 1 and thing == game.quadrant and not thing.angry): + if len(game.enemies) == 0 or (len(game.enemies) == 1 and thing == game.quadrant and not thing.angered): return # set up partial hits if attack happens during shield status change pfac = 1.0/game.inshld @@ -1332,7 +1347,7 @@ def attack(torps_ok): r *= 0.25 if enemy.power < 500: r *= 0.25 - if enemy.type == 'T' or (enemy.type == '?' and not thing.angry): + if enemy.type == 'T' or (enemy.type == '?' and not thing.angered): continue # different enemies have different probabilities of throwing a torp usephasers = not torps_ok or \ @@ -1346,7 +1361,7 @@ def attack(torps_ok): continue # Don't waste the effort! attempt = True # Attempt to attack dustfac = randreal(0.8, 0.85) - hit = enemy.power*math.pow(dustfac,enemy.kavgd) + hit = enemy.power*math.pow(dustfac, enemy.kavgd) enemy.power *= 0.75 else: # Enemy uses photon torpedo # We should be able to make the bearing() method work here @@ -1491,7 +1506,7 @@ def targetcheck(w): huh() return None delta = Coord() - # FIXME: C code this was translated from is wacky -- why the sign reversal? + # 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): @@ -1645,14 +1660,13 @@ def checkshctrl(rpow): def hittem(hits): "Register a phaser hit on Klingons and Romulans." - kk = 0 w = Coord() skip(1) - for (k, wham) in enumerate(hits): - if wham==0: + for (kk, wham) in enumerate(hits): + if wham == 0: continue dustfac = randreal(0.9, 1.0) - hit = wham*math.pow(dustfac,game.enemies[kk].kdist) + hit = wham*math.pow(dustfac, game.enemies[kk].kdist) kpini = game.enemies[kk].power kp = math.fabs(kpini) if PHASEFAC*hit < kp: @@ -1670,8 +1684,8 @@ def hittem(hits): else: proutn(_("Very small hit on ")) ienm = game.quad[w.i][w.j] - if ienm=='?': - thing.angry = True + if ienm == '?': + thing.angry() proutn(crmena(False, ienm, "sector", w)) skip(1) if kpow == 0: @@ -1683,7 +1697,7 @@ def hittem(hits): kk -= 1 # don't do the increment continue else: # decide whether or not to emasculate klingon - if kpow>0 and withprob(0.9) and kpow <= randreal(0.4, 0.8)*kpini: + if kpow > 0 and withprob(0.9) and kpow <= randreal(0.4, 0.8)*kpini: prout(_("***Mr. Spock- \"Captain, the vessel at Sector %s")%w) prout(_(" has just lost its firepower.\"")) game.enemies[kk].power = -kpow @@ -1693,10 +1707,16 @@ def hittem(hits): def 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 + kz = 0 + k = 1 + irec = 0 # Cheating inhibitor + ifast = False + no = False + itarg = True + msgflag = True + rpow = 0 automode = "NOTSET" - key=0 + key = 0 skip(1) # SR sensors and Computer are needed for automode if damaged(DSRSENS) or damaged(DCOMPTR): @@ -1722,15 +1742,15 @@ def phasers(): ifast = True # Original code so convoluted, I re-did it all # (That was Tom Almy talking about the C code, I think -- ESR) - while automode=="NOTSET": - key=scanner.next() + while automode == "NOTSET": + key = scanner.next() if key == "IHALPHA": if scanner.sees("manual"): if len(game.enemies)==0: prout(_("There is no enemy present to select.")) scanner.chew() key = "IHEOL" - automode="AUTOMATIC" + automode = "AUTOMATIC" else: automode = "MANUAL" key = scanner.next() @@ -1774,18 +1794,18 @@ def phasers(): key = scanner.next() if key != "IHREAL" and len(game.enemies) != 0: prout(_("Phasers locked on target. Energy available: %.2f")%avail) - irec=0 + irec = 0 while True: scanner.chew() if not kz: for i in range(len(game.enemies)): - irec += math.fabs(game.enemies[i].power)/(PHASEFAC*math.pow(0.90,game.enemies[i].kdist))*randreal(1.01, 1.06) + 1.0 - kz=1 + irec += math.fabs(game.enemies[i].power)/(PHASEFAC*math.pow(0.90, game.enemies[i].kdist))*randreal(1.01, 1.06) + 1.0 + kz = 1 proutn(_("%d units required. ") % irec) scanner.chew() proutn(_("Units to fire= ")) key = scanner.next() - if key!="IHREAL": + if key != "IHREAL": return rpow = scanner.real if rpow > avail: @@ -1794,11 +1814,11 @@ def phasers(): key = "IHEOL" if not rpow > avail: break - if rpow<=0: + if rpow <= 0: # chicken out scanner.chew() return - key=scanner.next() + key = scanner.next() if key == "IHALPHA" and scanner.sees("no"): no = True if ifast: @@ -1815,7 +1835,7 @@ def phasers(): hits.append(0.0) if powrem <= 0: continue - hits[i] = math.fabs(game.enemies[i].power)/(PHASEFAC*math.pow(0.90,game.enemies[i].kdist)) + hits[i] = math.fabs(game.enemies[i].power)/(PHASEFAC*math.pow(0.90, game.enemies[i].kdist)) over = randreal(1.01, 1.06) * hits[i] temp = powrem powrem -= hits[i] + over @@ -1870,7 +1890,7 @@ def phasers(): if key == "IHEOL": scanner.chew() if itarg and k > kz: - irec=(abs(game.enemies[k].power)/(PHASEFAC*math.pow(0.9,game.enemies[k].kdist))) * randreal(1.01, 1.06) + 1.0 + irec = (abs(game.enemies[k].power)/(PHASEFAC*math.pow(0.9, game.enemies[k].kdist))) * randreal(1.01, 1.06) + 1.0 kz = k proutn("(") if not damaged(DCOMPTR): @@ -1979,11 +1999,13 @@ def events(): "Run through the event queue looking for things to do." i = 0 fintim = game.state.date + game.optime - yank=0 + yank = 0 ictbeam = False istract = False - w = Coord(); hold = Coord() - ev = Event(); ev2 = Event() + w = Coord() + hold = Coord() + ev = Event() + ev2 = Event() def tractorbeam(yank): "Tractor-beaming cases merge here." @@ -2105,7 +2127,7 @@ def events(): finish(FDEPLETE) return # Any crew left alive? - if game.state.crew <=0: + if game.state.crew <= 0: finish(FCREW) return # Is life support adequate? @@ -2149,7 +2171,7 @@ def events(): elif evcode == FSPY: # Check with spy to see if SC should tractor beam if game.state.nscrem == 0 or \ ictbeam or istract or \ - game.condition=="docked" or game.isatb==1 or game.iscate: + game.condition == "docked" or game.isatb == 1 or game.iscate: return if game.ientesc or \ (game.energy<2000 and game.torps<4 and game.shield < 1250) or \ @@ -2301,7 +2323,7 @@ def events(): # tell the captain about it if we can if communicating(): prout(_("Uhura- Captain, %s in Quadrant %s reports it is under attack") \ - % (q.planet, `w`)) + % (q.planet, repr(w))) prout(_("by a Klingon invasion fleet.")) if cancelrest(): return @@ -2332,7 +2354,7 @@ def events(): if q.klingons <= 0: q.status = "secure" continue - if game.state.remkl >=MAXKLGAME: + if game.state.remkl >= MAXKLGAME: continue # full right now # reproduce one Klingon w = ev.quadrant @@ -2443,7 +2465,7 @@ def nova(nov): start = hits.pop() for offset.i in range(-1, 1+1): for offset.j in range(-1, 1+1): - if offset.j==0 and offset.i==0: + if offset.j == 0 and offset.i == 0: continue neighbor = start + offset if not neighbor.valid_sector(): @@ -2470,7 +2492,7 @@ def nova(nov): if iquad == 'P': game.state.nplankl += 1 else: - game.state.worldkl += 1 + game.state.nworldkl += 1 prout(crmena(True, 'B', "sector", neighbor) + _(" destroyed.")) game.iplnet.pclass = "destroyed" game.iplnet = None @@ -6287,8 +6309,7 @@ if __name__ == '__main__': try: global line, thing, game game = None - thing = Coord() - thing.angry = False + thing = Thingy() game = Gamestate() game.options = OPTION_ALL &~ (OPTION_IOMODES | OPTION_PLAIN | OPTION_ALMY) if os.getenv("TERM"): @@ -6306,7 +6327,7 @@ if __name__ == '__main__': raise SystemExit, 1 try: line = replayfp.readline().strip() - (leader, key, seed) = line.split() + (leader, __, seed) = line.split() seed = eval(seed) sys.stderr.write("sst2k: seed set to %s\n" % seed) line = replayfp.readline().strip()