X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=src%2Fsst.py;h=44b36859d41bb193b41ec09bb93f425ebd9dbad3;hb=fc3d48094d0576a983721f2094781f83a7a55cc7;hp=76fa31a6a911303b02f8141927cdd6907b4730fd;hpb=c16dbbf0caf5f0c5f1a7fb9059db7953d9616d0e;p=super-star-trek.git diff --git a/src/sst.py b/src/sst.py index 76fa31a..44b3685 100644 --- a/src/sst.py +++ b/src/sst.py @@ -200,6 +200,7 @@ MAXKLGAME = 127 MAXKLQUAD = 9 FULLCREW = 428 # BSD Trek was 387, that's wrong FOREVER = 1e30 +MAXBURST = 3 # These functions hide the difference between 0-origin and 1-origin addressing. def VALID_QUADRANT(x, y): return ((x)>=0 and (x)=0 and (y)" % (self.kloc, self.kpower) # For debugging @@ -781,35 +784,33 @@ def movebaddy(enemy): if idebug: proutn("NSTEPS = %d:" % nsteps) # Compute preferred values of delta X and Y - mx = game.sector.x - enemy.kloc.x - my = game.sector.y - enemy.kloc.y - if 2.0 * abs(mx) < abs(my): - mx = 0 - if 2.0 * abs(my) < abs(game.sector.x-enemy.kloc.x): - my = 0 - if mx != 0: - if mx*motion < 0: - mx = -1 + 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: - mx = 1 - if my != 0: - if my*motion < 0: - my = -1 + m.x = 1 + if m.y != 0: + if m.y*motion < 0: + m.y = -1 else: - my = 1 + m.y = 1 next = enemy.kloc # main move loop for ll in range(nsteps): if idebug: proutn(" %d" % (ll+1)) # Check if preferred position available - look.x = next.x + mx - look.y = next.y + my - if mx < 0: + look = next + m + if m.x < 0: krawlx = 1 else: krawlx = -1 - if my < 0: + if m.y < 0: krawly = 1 else: krawly = -1 @@ -820,14 +821,14 @@ def movebaddy(enemy): if look.x < 0 or look.x >= QUADSIZE: if motion < 0 and tryexit(enemy, look, irun): return - if krawlx == mx or my == 0: + if krawlx == m.x or m.y == 0: break look.x = next.x + krawlx krawlx = -krawlx elif look.y < 0 or look.y >= QUADSIZE: if motion < 0 and tryexit(enemy, look, irun): return - if krawly == my or mx == 0: + if krawly == m.y or m.x == 0: break look.y = next.y + krawly krawly = -krawly @@ -837,10 +838,10 @@ def movebaddy(enemy): (enemy.type == IHC or enemy.type == IHS): collision(rammed=True, enemy=enemy) return - if krawlx != mx and my != 0: + if krawlx != m.x and m.y != 0: look.x = next.x + krawlx krawlx = -krawlx - elif krawly != my and mx != 0: + elif krawly != m.y and m.x != 0: look.y = next.y + krawly krawly = -krawly else: @@ -855,13 +856,7 @@ def movebaddy(enemy): break; # done early if idebug: skip(1) - # Put commander in place within same quadrant - game.quad[enemy.kloc.x][enemy.kloc.y] = IHDOT - game.quad[next.x][next.y] = enemy.type - if next != enemy.kloc: - # it moved - enemy.kloc = next - enemy.kdist = enemy.kavgd = distance(game.sector, next) + if enemy.move(next): if not damaged(DSRSENS) or game.condition == "docked": proutn("***") cramen(enemy.type) @@ -1328,16 +1323,16 @@ def collision(rammed, enemy): finish(FWON) return -def torpedo(course, r, incoming, i, n): +def torpedo(course, dispersion, origin, number, nburst): # let a photon torpedo fly iquad = 0 shoved = False - ac = course + 0.25*r + 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 = incoming.x; y = incoming.y + 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)) @@ -1348,7 +1343,7 @@ def torpedo(course, r, incoming, i, n): else: setwnd(message_window) # Loop to move a single torpedo - for l in range(1, 15+1): + for step in range(1, 15+1): x += deltax w.x = int(x + 0.5) y += deltay @@ -1356,7 +1351,7 @@ def torpedo(course, r, incoming, i, n): if not VALID_SECTOR(w.x, w.y): break iquad=game.quad[w.x][w.y] - tracktorpedo(w, l, i, n, iquad) + tracktorpedo(w, step, number, nburst, iquad) if iquad==IHDOT: continue # hit something @@ -1369,7 +1364,7 @@ def torpedo(course, r, incoming, i, n): crmshp() prout(".") hit = 700.0 + randreal(100) - \ - 1000.0 * distance(w, incoming) * math.fabs(math.sin(bullseye-angle)) + 1000.0 * distance(w, origin) * math.fabs(math.sin(bullseye-angle)) newcnd(); # we're blown out of dock # We may be displaced. if game.landed or game.condition=="docked": @@ -1406,7 +1401,7 @@ def torpedo(course, r, incoming, i, n): break kp = math.fabs(e.kpower) h1 = 700.0 + randrange(100) - \ - 1000.0 * distance(w, incoming) * math.fabs(math.sin(bullseye-angle)) + 1000.0 * distance(w, origin) * math.fabs(math.sin(bullseye-angle)) h1 = math.fabs(h1) if kp < h1: h1 = kp @@ -1425,8 +1420,8 @@ def torpedo(course, r, incoming, i, n): temp = math.fabs(math.cos(ang)) xx = -math.sin(ang)/temp yy = math.cos(ang)/temp - jw.x=w.x+xx+0.5 - jw.y=w.y+yy+0.5 + jw.x = int(w.x+xx+0.5) + jw.y = int(w.y+yy+0.5) if not VALID_SECTOR(jw.x, jw.y): prout(_(" damaged but not destroyed.")) return @@ -1523,7 +1518,7 @@ def torpedo(course, r, incoming, i, n): return None elif iquad == IHT: # Hit a Tholian h1 = 700.0 + randrange(100) - \ - 1000.0 * distance(w, incoming) * math.fabs(math.sin(bullseye-angle)) + 1000.0 * distance(w, origin) * math.fabs(math.sin(bullseye-angle)) h1 = math.fabs(h1) if h1 >= 600: game.quad[w.x][w.y] = IHDOT @@ -1658,9 +1653,9 @@ def attack(torps_ok): crmena(False, enemy.type, where, enemy.kloc) attempt = True prout(" ") - r = (randreal()+randreal())*0.5 - 0.5 - r += 0.002*enemy.kpower*r - hit = torpedo(course, r, enemy.kloc, 1, 1) + dispersion = (randreal()+randreal())*0.5 - 0.5 + dispersion += 0.002*enemy.kpower*dispersion + hit = torpedo(course, dispersion, origin=enemy.kloc, number=1, nburst=1) if (game.state.remkl + game.state.remcom + game.state.nscrem)==0: finish(FWON); # Klingons did themselves in! if game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova or game.alldone: @@ -1795,13 +1790,13 @@ def deadkl(w, type, mv): break return -def targetcheck(x, y): +def targetcheck(w): # Return None if target is invalid - if not VALID_SECTOR(x, y): + if not VALID_SECTOR(w.x, w.y): huh() return None - deltx = 0.1*(y - game.sector.y) - delty = 0.1*(x - game.sector.x) + deltx = 0.1*(w.y - game.sector.y) + delty = 0.1*(w.x - game.sector.x) if deltx==0 and delty== 0: skip(1) prout(_("Spock- \"Bridge to sickbay. Dr. McCoy,")) @@ -1836,56 +1831,58 @@ def photon(): if n <= 0: # abort command chew() return - if n > 3: + if n > MAXBURST: chew() - prout(_("Maximum of 3 torpedoes per burst.")) + prout(_("Maximum of %d torpedoes per burst.") % MAXBURST) key = IHEOL return if n <= game.torps: break chew() key = IHEOL - for i in range(1, n+1): + targ = [] + for i in range(MAXBURST): + targ.append(coord()) + for i in range(n): key = scan() - if i==1 and key == IHEOL: + if i==0 and key == IHEOL: break; # we will try prompting - if i==2 and key == IHEOL: + if i==1 and key == IHEOL: # direct all torpedoes at one target while i <= n: - targ[i][1] = targ[1][1] - targ[i][2] = targ[1][2] - course[i] = course[1] + targ[i] = targ[0] + course[i] = course[0] i += 1 break if key != IHREAL: huh() return - targ[i][1] = aaitem + targ[i].x = aaitem key = scan() if key != IHREAL: huh() return - targ[i][2] = aaitem - course[i] = targetcheck(targ[i][1], targ[i][2]) + targ[i].y = aaitem + course[i] = targetcheck(targ[i]) if course[i] == None: return chew() if i == 1 and key == IHEOL: # prompt for each one - for i in range(1, n+1): - proutn(_("Target sector for torpedo number %d- ") % i) + for i in range(n): + proutn(_("Target sector for torpedo number %d- ") % (i+1)) key = scan() if key != IHREAL: huh() return - targ[i][1] = int(aaitem-0.5) + targ[i].x = int(aaitem-0.5) key = scan() if key != IHREAL: huh() return - targ[i][2] = int(aaitem-0.5) + targ[i].y = int(aaitem-0.5) chew() - course[i] = targetcheck(targ[i][1], targ[i][2]) + course[i] = targetcheck(targ[i]) if course[i] == None: return game.ididit = True @@ -1893,10 +1890,10 @@ def photon(): for i in range(n): if game.condition != "docked": game.torps -= 1 - r = (randreal()+randreal())*0.5 -0.5 - if math.fabs(r) >= 0.47: + dispersion = (randreal()+randreal())*0.5 -0.5 + if math.fabs(dispersion) >= 0.47: # misfire! - r *= randreal(1.2, 2.2) + dispersion *= randreal(1.2, 2.2) if n > 0: prouts(_("***TORPEDO NUMBER %d MISFIRES") % (i+1)) else: @@ -1909,8 +1906,8 @@ def photon(): game.damage[DPHOTON] = game.damfac * randreal(1.0, 3.0) break if game.shldup or game.condition == "docked": - r *= 1.0 + 0.0001*game.shield - torpedo(course[i], r, game.sector, i, n) + 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: return if (game.state.remkl + game.state.remcom + game.state.nscrem)==0: @@ -2348,7 +2345,7 @@ def events(): newqad(False) # Adjust finish time to time of tractor beaming fintim = game.state.date+game.optime - attack(False) + attack(torps_ok=False) if game.state.remcom <= 0: unschedule(FTBEAM) else: @@ -2741,7 +2738,7 @@ def wait(): temp = rtime game.optime = temp if game.optime < delay: - attack(False) + attack(torps_ok=False) if game.alldone: return events() @@ -3514,6 +3511,7 @@ def iostart(): #noecho() global fullscreen_window, srscan_window, report_window, status_window global lrscan_window, message_window, prompt_window + (rows, columns) = stdscr.getmaxyx() fullscreen_window = stdscr srscan_window = curses.newwin(12, 25, 0, 0) report_window = curses.newwin(11, 0, 1, 25) @@ -3525,8 +3523,12 @@ def iostart(): setwnd(fullscreen_window) textcolor(DEFAULT) +def ioend(): + "Wrap up I/O. Presently a stub." + pass + def waitfor(): - "wait for user action -- OK to do nothing if on a TTY" + "Wait for user action -- OK to do nothing if on a TTY" if game.options & OPTION_CURSES: stsdcr.getch() @@ -3752,27 +3754,27 @@ def warble(): #nosound() pass -def tracktorpedo(w, l, i, n, iquad): +def tracktorpedo(w, step, i, n, iquad): "Torpedo-track animation." if not game.options & OPTION_CURSES: - if l == 1: + if step == 1: if n != 1: skip(1) proutn(_("Track for torpedo number %d- ") % i) else: skip(1) proutn(_("Torpedo track- ")) - elif l==4 or l==9: + elif step==4 or step==9: skip(1) - proutn("%d - %d " % (w.x, w.y)) + proutn("%s " % w) else: if not damaged(DSRSENS) or game.condition=="docked": - if i != 1 and l == 1: + if i != 0 and step == 1: drawmaps(2) time.sleep(0.4) if (iquad==IHDOT) or (iquad==IHBLANK): put_srscan_sym(w, '+') - #sound(l*10) + #sound(step*10) #time.sleep(0.1) #nosound() put_srscan_sym(w, iquad) @@ -3785,7 +3787,7 @@ def tracktorpedo(w, l, i, n, iquad): curwnd.attroff(curses.A_REVERSE) put_srscan_sym(w, iquad) else: - proutn("%d - %d " % (w.x, w.y)) + proutn("%s " % w) def makechart(): "Display the current galaxy chart." @@ -3827,7 +3829,7 @@ def imove(novapush): game.enemies[m].kdist = finald game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist)) if not game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: - attack(False) + attack(torps_ok=False) for m in range(game.nenhere): game.enemies[m].kavgd = game.enemies[m].kdist newcnd() @@ -3877,7 +3879,7 @@ def imove(novapush): # 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: - attack(False) + attack(torps_ok=False) if game.alldone: return # compute final position -- new quadrant and sector @@ -3927,7 +3929,7 @@ def imove(novapush): game.quad[game.sector.x][game.sector.y] = game.ship newqad(False) if game.skill>SKILL_NOVICE: - attack(False) + attack(torps_ok=False) return iquad = game.quad[w.x][w.y] if iquad != IHDOT: @@ -5997,7 +5999,7 @@ def setup(needprompt): if game.nenhere - (thing == game.quadrant) - (game.tholian != None): game.shldup = True if game.neutz: # bad luck to start in a Romulan Neutral Zone - attack(False) + attack(torps_ok=False) def choose(needprompt): # choose your game type @@ -6213,7 +6215,7 @@ def newqad(shutup): if shutup==0: # Put in THING if needed if thing == game.quadrant: - enemy(symbol=IHQUEST, loc=dropin(), + enemy(type=IHQUEST, loc=dropin(), power=randreal(6000,6500.0)+250.0*game.skill) if not damaged(DSRSENS): skip(1) @@ -6230,7 +6232,7 @@ def newqad(shutup): w.y = withprob(0.5) * (QUADSIZE-1) if game.quad[w.x][w.y] == IHDOT: break - game.tholian = enemy(symbol=IHT, loc=w, + game.tholian = enemy(type=IHT, loc=w, power=randrange(100, 500) + 25.0*game.skill) # Reserve unoccupied corners if game.quad[0][0]==IHDOT: @@ -6451,7 +6453,7 @@ def makemoves(): elif cmd == "DOCK": # dock at starbase dock(True) if game.ididit: - attack(False) + attack(torps_ok=False) elif cmd == "DAMAGES": # damage reports damagereport() elif cmd == "CHART": # chart @@ -6536,7 +6538,7 @@ def makemoves(): atover(False) continue if hitme and not game.justin: - attack(True) + attack(torps_ok=True) if game.alldone: break if game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova: @@ -6813,35 +6815,38 @@ if __name__ == '__main__': logfp.write("# seed %s\n" % seed) logfp.write("# options %s\n" % " ".join(arguments)) random.seed(seed) - iostart() if arguments: inqueue = arguments else: inqueue = None - while True: # Play a game - setwnd(fullscreen_window) - clrscr() - prelim() - setup(needprompt=not inqueue) - if game.alldone: - score() - game.alldone = False - else: - makemoves() - skip(1) - stars() + try: + iostart() + while True: # Play a game + setwnd(fullscreen_window) + clrscr() + prelim() + setup(needprompt=not inqueue) + if game.alldone: + score() + game.alldone = False + else: + makemoves() + skip(1) + stars() + skip(1) + if game.tourn and game.alldone: + proutn(_("Do you want your score recorded?")) + if ja() == True: + chew2() + freeze(False) + chew() + proutn(_("Do you want to play again? ")) + if not ja(): + break skip(1) - if game.tourn and game.alldone: - proutn(_("Do you want your score recorded?")) - if ja() == True: - chew2() - freeze(False) - chew() - proutn(_("Do you want to play again? ")) - if not ja(): - break - skip(1) - prout(_("May the Great Bird of the Galaxy roost upon your home planet.")) + prout(_("May the Great Bird of the Galaxy roost upon your home planet.")) + finally: + ioend() raise SystemExit, 0 except KeyboardInterrupt: print""