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)<GALSIZE and (y)>=0 and (y)<GALSIZE)
FHOLE = 20
FCREW = 21
-# From enumerated type 'COLORS'
-DEFAULT = 0
-BLACK = 1
-BLUE = 2
-GREEN = 3
-CYAN = 4
-RED = 5
-MAGENTA = 6
-BROWN = 7
-LIGHTGRAY = 8
-DARKGRAY = 9
-LIGHTBLUE = 10
-LIGHTGREEN = 11
-LIGHTCYAN = 12
-LIGHTRED = 13
-LIGHTMAGENTA = 14
-YELLOW = 15
-WHITE = 16
-
# Log the results of pulling random numbers so we can check determinism.
import traceback
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))
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
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
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":
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
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
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
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:
prout(_("%d%%, torpedoes left %d") % (percent, game.torps))
# Check if anyone was hurt
if hitmax >= 200 or hittot >= 500:
- icas = randrange(hittot * 0.015)
+ icas = randrange(int(hittot * 0.015))
if icas >= 2:
skip(1)
prout(_("Mc Coy- \"Sickbay to bridge. We suffered %d casualties") % icas)
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,"))
return
elif key == IHEOL:
prout(_("%d torpedoes left.") % game.torps)
+ chew()
proutn(_("Number of torpedoes to fire- "))
key = scan()
else: # key == IHREAL {
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
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:
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:
prouts(_("Sulu- \"Captain! Shield malfunction! Phaser fire contained!\""))
skip(2)
prout(_("Lt. Uhura- \"Sir, all decks reporting damage.\""))
- icas = randrange(hit*0.012)
+ icas = randrange(int(hit*0.012))
skip(1)
fry(0.8*hit)
if icas:
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:
temp = rtime
game.optime = temp
if game.optime < delay:
- attack(False)
+ attack(torps_ok=False)
if game.alldone:
return
events()
#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)
setwnd(fullscreen_window)
textcolor(DEFAULT)
+def textcolor(color):
+ "Set text foreground color. Presently a stub."
+ pass # FIXME
+
+def ioend():
+ "Wrap up I/O. Presently a stub."
+ pass
+
def waitfor():
- "wait for user action -- OK to do nothing if on a TTY"
+ "Wait for user action -- OK to do nothing if on a TTY"
if game.options & OPTION_CURSES:
stsdcr.getch()
curwnd.move(0, 0)
curwnd.refresh()
linecount = 0
-
-def textcolor(color):
- "Set the current text color"
- if game.options & OPTION_CURSES:
- if color == DEFAULT:
- curwnd.attrset(0)
- elif color == BLACK:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_BLACK))
- elif color == BLUE:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_BLUE))
- elif color == GREEN:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_GREEN))
- elif color == CYAN:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_CYAN))
- elif color == RED:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_RED))
- elif color == MAGENTA:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_MAGENTA))
- elif color == BROWN:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_YELLOW))
- elif color == LIGHTGRAY:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_WHITE))
- elif color == DARKGRAY:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_BLACK) | curses.A_BOLD)
- elif color == LIGHTBLUE:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_BLUE) | curses.A_BOLD)
- elif color == LIGHTGREEN:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_GREEN) | curses.A_BOLD)
- elif color == LIGHTCYAN:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_CYAN) | curses.A_BOLD)
- elif color == LIGHTRED:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_RED) | curses.A_BOLD)
- elif color == LIGHTMAGENTA:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_MAGENTA) | curses.A_BOLD)
- elif color == YELLOW:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_YELLOW) | curses.A_BOLD)
- elif color == WHITE:
- curwnd.attron(curses.COLOR_PAIR(curses.COLOR_WHITE) | curses.A_BOLD)
-
+
def highvideo():
"Set highlight video, if this is reasonable."
if game.options & OPTION_CURSES:
#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)
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."
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()
# 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
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:
proutn(_(" attempt to re-materialize "))
crmshp()
game.quad[ix][iy]=(IHMATER0,IHMATER1,IHMATER2)[m-1]
- textcolor(RED)
+ textcolor("red")
warble()
if randreal() > probf:
break
prout(_("fails."))
curses.delay_output(500)
- textcolor(DEFAULT)
+ textcolor(None)
if m > 3:
game.quad[ix][iy]=IHQUEST
game.alive = False
finish(FMATERIALIZE)
return
game.quad[ix][iy]=game.ship
- textcolor(GREEN)
+ textcolor("green")
prout(_("succeeds."))
- textcolor(DEFAULT)
+ textcolor(None)
dock(False)
skip(1)
prout(_("Lt. Uhura- \"Captain, we made it!\""))
# light up an individual dot in a sector
if goodScan or (abs(i-game.sector.x)<= 1 and abs(j-game.sector.y) <= 1):
if (game.quad[i][j]==IHMATER0) or (game.quad[i][j]==IHMATER1) or (game.quad[i][j]==IHMATER2) or (game.quad[i][j]==IHE) or (game.quad[i][j]==IHF):
- if game.condition == "red": textcolor(RED)
- elif game.condition == "green": textcolor(GREEN)
- elif game.condition == "yellow": textcolor(YELLOW)
- elif game.condition == "docked": textcolor(CYAN)
- elif game.condition == "dead": textcolor(BROWN)
+ if game.condition == "red": textcolor("red")
+ elif game.condition == "green": textcolor("green")
+ elif game.condition == "yellow": textcolor("yellow")
+ elif game.condition == "docked": textcolor("cyan")
+ elif game.condition == "dead": textcolor("brown")
if game.quad[i][j] != game.ship:
highvideo()
proutn("%c " % game.quad[i][j])
- textcolor(DEFAULT)
+ textcolor(None)
else:
proutn("- ")
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
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)
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:
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
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:
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""