X-Git-Url: https://jxself.org/git/?p=super-star-trek.git;a=blobdiff_plain;f=src%2Fsst.py;h=de271754c729573b501a1c12e0dd875ad8fb88c2;hp=baaea8c0fa5be65d90d9d912e8254ed678f5693f;hb=cb3e7cba68f4c30aa4933ca0a99d87fb754cf8b6;hpb=9166a6df132fa18c32881b2019e1fcc41716a3ab diff --git a/src/sst.py b/src/sst.py index baaea8c..de27175 100644 --- a/src/sst.py +++ b/src/sst.py @@ -227,10 +227,6 @@ IHMATER0 = '-', IHMATER1 = 'o', IHMATER2 = '0' -IHEOL = '\n' -IHREAL = 0.0 -IHALPHA = " " - class coord: def __init__(self, x=None, y=None): self.i = x @@ -759,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: @@ -777,16 +770,7 @@ def movebaddy(enemy): m.i = 0 if 2.0 * abs(m.j) < abs(game.sector.i-enemy.kloc.i): m.j = 0 - if m.i != 0: - if m.i*motion < 0: - m.i = -1 - else: - m.i = 1 - if m.j != 0: - if m.j*motion < 0: - m.j = -1 - else: - m.j = 1 + m = (motion * m).sgn() next = enemy.kloc # main move loop for ll in range(nsteps): @@ -1096,7 +1080,7 @@ def doshield(shraise): action = "SHUP" else: key = scanner.next() - if key == IHALPHA: + if key == "IHALPHA": if scanner.sees("transfer"): action = "NRG" else: @@ -1155,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() @@ -1289,6 +1273,10 @@ def collision(rammed, enemy): 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 @@ -1296,17 +1284,12 @@ def torpedo(origin, course, dispersion, number, nburst): delta = coord(-math.sin(angle), math.cos(angle)) bigger = max(abs(delta.i), abs(delta.j)) delta /= bigger - x = origin.i; y = origin.j w = coord(0, 0); jw = coord(0, 0) - if not damaged(DSRSENS) or game.condition=="docked": - setwnd(srscan_window) - else: - setwnd(message_window) + ungridded = copy.copy(origin) # Loop to move a single torpedo - for step in range(1, 15+1): - x += delta.i - y += delta.j - w = coord(x, y).snaptogrid() + 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.i][w.j] @@ -1345,13 +1328,12 @@ def torpedo(origin, course, dispersion, number, nburst): game.sector = jw proutn(crmshp()) shoved = True - elif iquad in (IHC, IHS): # Hit a commander + elif iquad in (IHC, IHS, IHR, IHK): # Hit a regular enemy + # find the enemy if 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 == enemy.kloc: break @@ -1760,15 +1742,15 @@ def photon(): # First, get torpedo count while True: scanner.next() - if scanner.token == IHALPHA: + if scanner.token == "IHALPHA": huh() return - elif scanner.token == IHEOL or not scanner.waiting(): + elif scanner.token == "IHEOL" or not scanner.waiting(): prout(_("%d torpedoes left.") % game.torps) scanner.chew() proutn(_("Number of torpedoes to fire- ")) continue # Go back around to get a number - else: # key == IHREAL + else: # key == "IHREAL" n = scanner.int() if n <= 0: # abort command scanner.chew() @@ -1785,24 +1767,24 @@ def photon(): target = [] for i in range(n): key = scanner.next() - if i==0 and key == IHEOL: + if i==0 and key == "IHEOL": break; # no coordinate waiting, we will try prompting - if i==1 and key == IHEOL: + if i==1 and key == "IHEOL": # direct all torpedoes at one target while i < n: - target.append(targets[0]) + target.append(target[0]) course.append(course[0]) i += 1 break - scanner.push(key) + scanner.push(scanner.token) target.append(scanner.getcoord()) if target[-1] == None: return - course.append(targetcheck(target[1])) - if course[i] == None: + course.append(targetcheck(target[-1])) + if course[-1] == None: return scanner.chew() - if i == 0: + if len(target) == 0: # prompt for each one for i in range(n): proutn(_("Target sector for torpedo number %d- ") % (i+1)) @@ -1966,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" @@ -1989,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" @@ -1998,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" @@ -2011,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: @@ -2027,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: @@ -2041,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! @@ -2080,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: @@ -2105,11 +2087,11 @@ def phasers(): not game.sector.distance(aim)<2**0.5 and ienm in (IHC, IHS): 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 @@ -2122,14 +2104,14 @@ def phasers(): 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 @@ -2150,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() @@ -2429,12 +2411,14 @@ 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 = ibq schedule(FCDBAS, randreal(1.0, 4.0)) @@ -2623,11 +2607,11 @@ def wait(): 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 @@ -3884,7 +3868,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 @@ -3892,11 +3876,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() @@ -3917,7 +3901,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: @@ -3925,21 +3909,21 @@ 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 @@ -3974,18 +3958,18 @@ def getcourse(isprobe, akey): delta.i = dquad.j-game.quadrant.j + 0.1*(dsect.j-game.sector.j) delta.j = game.quadrant.i-dquad.i + 0.1*(game.sector.i-dsect.i) 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.j = scanner.real key = scanner.next() - if key != IHREAL: + if key != "IHREAL": huh() return False delta.i = scanner.real @@ -4093,7 +4077,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")) @@ -4153,7 +4137,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: @@ -4169,12 +4153,12 @@ def setwarp(): "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: @@ -4192,7 +4176,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)) @@ -4260,14 +4243,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 @@ -4362,7 +4344,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.")) @@ -4372,10 +4354,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): @@ -4604,7 +4586,6 @@ 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. @@ -5327,7 +5308,7 @@ def status(req=0): 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: @@ -5371,21 +5352,21 @@ def eta(): 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.j = int(scanner.real-0.5) - if scanner.next() != IHREAL: + if scanner.next() != "IHREAL": huh() return w1.i = int(scanner.real-0.5) - if scanner.next() == IHREAL: + if scanner.next() == "IHREAL": w2.j = int(scanner.real-0.5) - if scanner.next() != IHREAL: + if scanner.next() != "IHREAL": huh() return w2.i = int(scanner.real-0.5) @@ -5409,7 +5390,7 @@ def eta(): 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 @@ -5423,7 +5404,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: @@ -5441,7 +5422,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: @@ -5474,7 +5455,7 @@ def eta(): (scheduled(FCDBAS) 10.0: @@ -5502,10 +5483,10 @@ def freeze(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() @@ -5523,10 +5504,10 @@ def thaw(): "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() @@ -5619,13 +5600,11 @@ def setup(): 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) @@ -5633,7 +5612,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 @@ -5824,7 +5802,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() @@ -5850,7 +5828,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"): @@ -5878,7 +5856,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() @@ -6127,18 +6105,18 @@ def helpme(): "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() @@ -6193,7 +6171,7 @@ def makemoves(): setwnd(prompt_window) clrscr() proutn("COMMAND> ") - if scanner.next() == IHEOL: + if scanner.next() == "IHEOL": if game.options & OPTION_CURSES: makechart() continue @@ -6404,30 +6382,30 @@ 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, tok): + 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): @@ -6435,8 +6413,8 @@ class sstscanner: self.inqueue = [] self.real = self.token = None def chew2(self): - # return IHEOL next time - self.inqueue = [IHEOL] + # 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 @@ -6447,16 +6425,18 @@ class sstscanner: def getcoord(self): s = coord() scanner.next() - if scanner.type != IHREAL: + if scanner.type != "IHREAL": huh() return None s.i = scanner.int()-1 scanner.next() - if scanner.type != IHREAL: + 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." @@ -6503,7 +6483,7 @@ def debugme(): 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: @@ -6537,21 +6517,21 @@ 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.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 @@ -6618,7 +6598,7 @@ if __name__ == '__main__': logfp.write("# options %s\n" % " ".join(arguments)) random.seed(seed) scanner = sstscanner() - map(scanner.push, arguments) + map(scanner.append, arguments) try: iostart() while True: # Play a game @@ -6649,5 +6629,5 @@ if __name__ == '__main__': ioend() raise SystemExit, 0 except KeyboardInterrupt: - print"" + print "" pass