Flight to other quadrants doesn't yet. (The bugs all appear to be
consequences of moving to zero indexing.)
setting) can be damaged separately from the main computer (which
handles weapons targeting, ETA calculation, and self-destruct).
"""
setting) can be damaged separately from the main computer (which
handles weapons targeting, ETA calculation, and self-destruct).
"""
-import os, sys, math, curses, time, atexit, readline, cPickle, random, getopt
+import os,sys,math,curses,time,atexit,readline,cPickle,random,getopt,copy
SSTDOC = "/usr/share/doc/sst/sst.doc"
DOC_NAME = "sst.doc"
SSTDOC = "/usr/share/doc/sst/sst.doc"
DOC_NAME = "sst.doc"
game.optime = 10.0*game.dist/16.0
skip(1)
prout(_("Force of nova displaces starship."))
game.optime = 10.0*game.dist/16.0
skip(1)
prout(_("Force of nova displaces starship."))
game.optime = 10.0*game.dist/16.0
return
game.optime = 10.0*game.dist/16.0
return
def prouts(line):
"print slowly!"
for c in line:
def prouts(line):
"print slowly!"
for c in line:
- curses.delay_output(30)
proutn(c)
if game.options & OPTION_CURSES:
wrefresh(curwnd)
else:
sys.stdout.flush()
proutn(c)
if game.options & OPTION_CURSES:
wrefresh(curwnd)
else:
sys.stdout.flush()
- curses.delay_output(300)
def cgetline():
"Get a line of input."
def cgetline():
"Get a line of input."
srscan_window.attron(curses.A_REVERSE)
put_srscan_sym(w, game.quad[w.x][w.y])
#sound(500)
srscan_window.attron(curses.A_REVERSE)
put_srscan_sym(w, game.quad[w.x][w.y])
#sound(500)
#nosound()
srscan_window.attroff(curses.A_REVERSE)
put_srscan_sym(w, game.quad[w.x][w.y])
#nosound()
srscan_window.attroff(curses.A_REVERSE)
put_srscan_sym(w, game.quad[w.x][w.y])
if not damaged(DSRSENS) or game.condition=="docked":
if i != 1 and l == 1:
drawmaps(2)
if not damaged(DSRSENS) or game.condition=="docked":
if i != 1 and l == 1:
drawmaps(2)
- curses.delay_output(400)
if (iquad==IHDOT) or (iquad==IHBLANK):
put_srscan_sym(w, '+')
#sound(l*10)
if (iquad==IHDOT) or (iquad==IHBLANK):
put_srscan_sym(w, '+')
#sound(l*10)
- #curses.delay_output(100)
#nosound()
put_srscan_sym(w, iquad)
else:
curwnd.attron(curses.A_REVERSE)
put_srscan_sym(w, iquad)
#sound(500)
#nosound()
put_srscan_sym(w, iquad)
else:
curwnd.attron(curses.A_REVERSE)
put_srscan_sym(w, iquad)
#sound(500)
- #curses.delay_output(1000)
#nosound()
curwnd.attroff(curses.A_REVERSE)
put_srscan_sym(w, iquad)
#nosound()
curwnd.attroff(curses.A_REVERSE)
put_srscan_sym(w, iquad)
trbeam = False
def no_quad_change():
trbeam = False
def no_quad_change():
- # No quadrant change -- compute new avg enemy distances
+ # No quadrant change -- compute new average enemy distances
game.quad[game.sector.x][game.sector.y] = game.ship
if game.nenhere:
for m in range(game.nenhere):
game.quad[game.sector.x][game.sector.y] = game.ship
if game.nenhere:
for m in range(game.nenhere):
game.quad[game.sector.x][game.sector.y] = IHDOT
x = game.sector.x
y = game.sector.y
game.quad[game.sector.x][game.sector.y] = IHDOT
x = game.sector.x
y = game.sector.y
- n = 10.0*game.dist*bigger+0.5
+ n = int(10.0*game.dist*bigger+0.5)
if n > 0:
for m in range(1, n+1):
x += deltax
y += deltay
if n > 0:
for m in range(1, n+1):
x += deltax
y += deltay
- w.x = x + 0.5
- w.y = y + 0.5
+ w.x = int(x + 0.5)
+ w.y = int(y + 0.5)
if not VALID_SECTOR(w.x, w.y):
# Leaving quadrant -- allow final enemy attack
# Don't do it if being pushed by Nova
if not VALID_SECTOR(w.x, w.y):
# Leaving quadrant -- allow final enemy attack
# Don't do it if being pushed by Nova
# compute final position -- new quadrant and sector
x = QUADSIZE*(game.quadrant.x-1)+game.sector.x
y = QUADSIZE*(game.quadrant.y-1)+game.sector.y
# compute final position -- new quadrant and sector
x = QUADSIZE*(game.quadrant.x-1)+game.sector.x
y = QUADSIZE*(game.quadrant.y-1)+game.sector.y
- w.x = x+10.0*game.dist*bigger*deltax+0.5
- w.y = y+10.0*game.dist*bigger*deltay+0.5
+ w.x = int(x+10.0*game.dist*bigger*deltax+0.5)
+ w.y = int(y+10.0*game.dist*bigger*deltay+0.5)
# check for edge of galaxy
kinks = 0
while True:
# check for edge of galaxy
kinks = 0
while True:
# because it involves giving x and y motions, yet the coordinates
# are always displayed y - x, where +y is downward!
# because it involves giving x and y motions, yet the coordinates
# are always displayed y - x, where +y is downward!
-def getcd(isprobe, akey):
- # get course and distance
- irowq=game.quadrant.x; icolq=game.quadrant.y; key=0
+def getcourse(isprobe, akey):
+ # get course and distance
+ key = 0
+ dquad = copy.copy(game.quadrant)
navmode = "unspecified"
itemp = "curt"
navmode = "unspecified"
itemp = "curt"
-
- # Get course direction and distance. If user types bad values, return
- # with DIREC = -1.0.
- game.direc = -1.0
-
if game.landed and not isprobe:
prout(_("Dummy! You can't leave standard orbit until you"))
proutn(_("are back aboard the ship."))
chew()
if game.landed and not isprobe:
prout(_("Dummy! You can't leave standard orbit until you"))
proutn(_("are back aboard the ship."))
chew()
while navmode == "unspecified":
if damaged(DNAVSYS):
if isprobe:
while navmode == "unspecified":
if damaged(DNAVSYS):
if isprobe:
akey = -1
else:
key = scan()
akey = -1
else:
key = scan()
if key == IHEOL:
proutn(_("Manual or automatic- "))
iprompt = True
if key == IHEOL:
proutn(_("Manual or automatic- "))
iprompt = True
else: # numeric
if isprobe:
prout(_("(Manual navigation assumed.)"))
else: # numeric
if isprobe:
prout(_("(Manual navigation assumed.)"))
prout(_("(Manual movement assumed.)"))
navmode = "manual"
break
prout(_("(Manual movement assumed.)"))
navmode = "manual"
break
if navmode == "automatic":
while key == IHEOL:
if isprobe:
if navmode == "automatic":
while key == IHEOL:
if isprobe:
chew()
iprompt = True
key = scan()
chew()
iprompt = True
key = scan()
- return
- xi = int(aaitem-0.05)
+ return False
+ xi = int(round(aaitem))-1
key = scan()
if key != IHREAL:
huh()
key = scan()
if key != IHREAL:
huh()
- return
- xj = int(aaitem-0.5)
+ return False
+ xj = int(round(aaitem))-1
key = scan()
if key == IHREAL:
# both quadrant and sector specified
key = scan()
if key == IHREAL:
# both quadrant and sector specified
+ xk = int(round(aaitem))-1
key = scan()
if key != IHREAL:
huh()
key = scan()
if key != IHREAL:
huh()
- return
- xl = aaitem
-
- irowq = xi + 0.5
- icolq = xj + 0.5
- incr.y = xk + 0.5
- incr.x = xl + 0.5
+ return False
+ xl = int(round(aaitem))-1
+ dquad.x = xi
+ dquad.y = xj
+ dsect.y = xk
+ dsect.x = xl
+ # only one pair of numbers was specified
if isprobe:
# only quadrant specified -- go to center of dest quad
if isprobe:
# only quadrant specified -- go to center of dest quad
- irowq = xi + 0.5
- icolq = xj + 0.5
- incr.y = incr.x = 5
+ dquad.x = xi
+ dquad.y = xj
+ dsect.y = dsect.x = 4 # preserves 1-origin behavior
- incr.y = xi + 0.5
- incr.x = xj + 0.5
+ # only sector specified
+ dsect.y = xi
+ dsect.x = xj
- if not VALID_QUADRANT(icolq,irowq) or not VALID_SECTOR(incr.x,incr.y):
+ if not VALID_QUADRANT(dquad.y,dquad.x) or not VALID_SECTOR(dsect.x,dsect.y):
skip(1)
if not isprobe:
if itemp > "curt":
if iprompt:
skip(1)
if not isprobe:
if itemp > "curt":
if iprompt:
- prout(_("Helmsman Sulu- \"Course locked in for Sector %s.\"") % incr)
+ prout(_("Helmsman Sulu- \"Course locked in for Sector %s.\"") % dsect)
else:
prout(_("Ensign Chekov- \"Course laid in, Captain.\""))
else:
prout(_("Ensign Chekov- \"Course laid in, Captain.\""))
- deltax = icolq - game.quadrant.y + 0.1*(incr.x-game.sector.y)
- deltay = game.quadrant.x - irowq + 0.1*(game.sector.x-incr.y)
+ # the actual deltas get computed here
+ deltax = dquad.y-game.quadrant.y + 0.1*(dsect.x-game.sector.y)
+ deltay = game.quadrant.x-dquad.x + 0.1*(game.sector.x-dsect.y)
else: # manual
while key == IHEOL:
proutn(_("X and Y displacements- "))
else: # manual
while key == IHEOL:
proutn(_("X and Y displacements- "))
itemp = "verbose"
if key != IHREAL:
huh()
itemp = "verbose"
if key != IHREAL:
huh()
deltax = aaitem
key = scan()
if key != IHREAL:
huh()
deltax = aaitem
key = scan()
if key != IHREAL:
huh()
deltay = aaitem
# Check for zero movement
if deltax == 0 and deltay == 0:
chew()
deltay = aaitem
# Check for zero movement
if deltax == 0 and deltay == 0:
chew()
if itemp == "verbose" and not isprobe:
skip(1)
prout(_("Helmsman Sulu- \"Aye, Sir.\""))
if itemp == "verbose" and not isprobe:
skip(1)
prout(_("Helmsman Sulu- \"Aye, Sir.\""))
+ # Course actually laid in.
game.dist = math.sqrt(deltax*deltax + deltay*deltay)
game.direc = math.atan2(deltax, deltay)*1.90985932
if game.direc < 0.0:
game.direc += 12.0
chew()
game.dist = math.sqrt(deltax*deltax + deltay*deltay)
game.direc = math.atan2(deltax, deltay)*1.90985932
if game.direc < 0.0:
game.direc += 12.0
chew()
def impulse():
# move under impulse power
def impulse():
# move under impulse power
prout(_("Engineer Scott- \"The impulse engines are damaged, Sir.\""))
return
if game.energy > 30.0:
prout(_("Engineer Scott- \"The impulse engines are damaged, Sir.\""))
return
if game.energy > 30.0:
- getcd(False, 0)
- if game.direc == -1.0:
+ if not getcourse(isprobe=False, akey=0):
return
power = 20.0 + 100.0*game.dist
else:
return
power = 20.0 + 100.0*game.dist
else:
if ja() == False:
return
# Activate impulse engines and pay the cost
if ja() == False:
return
# Activate impulse engines and pay the cost
game.ididit = True
if game.alldone:
return
game.ididit = True
if game.alldone:
return
prout(_(" is repaired, I can only give you warp 4.\""))
return
# Read in course and distance
prout(_(" is repaired, I can only give you warp 4.\""))
return
# Read in course and distance
- getcd(False, 0)
- if game.direc == -1.0:
+ if not getcourse(isprobe=False, akey=0):
return
# Make sure starship has enough energy for the trip
power = (game.dist+0.05)*game.warpfac*game.warpfac*game.warpfac*(game.shldup+1)
return
# Make sure starship has enough energy for the trip
power = (game.dist+0.05)*game.warpfac*game.warpfac*game.warpfac*(game.shldup+1)
blooey = False
twarp = False
# Activate Warp Engines and pay the cost
blooey = False
twarp = False
# Activate Warp Engines and pay the cost
if game.alldone:
return
game.energy -= game.dist*game.warpfac*game.warpfac*game.warpfac*(game.shldup+1)
if game.alldone:
return
game.energy -= game.dist*game.warpfac*game.warpfac*game.warpfac*(game.shldup+1)
elif key == IHEOL:
proutn(_("Arm NOVAMAX warhead? "))
game.isarmed = ja()
elif key == IHEOL:
proutn(_("Arm NOVAMAX warhead? "))
game.isarmed = ja()
- getcd(True, key)
- if game.direc == -1.0:
+ if not getcourse(isprobe=True, akey=key):
return
game.nprobes -= 1
angle = ((15.0 - game.direc) * 0.5235988)
return
game.nprobes -= 1
angle = ((15.0 - game.direc) * 0.5235988)
if game.iplnet.known=="shuttle_down":
prout(_(" Sensors show Galileo still on surface."))
proutn(_(" Readings indicate"))
if game.iplnet.known=="shuttle_down":
prout(_(" Sensors show Galileo still on surface."))
proutn(_(" Readings indicate"))
- if game.iplnet.crystals != present:
+ if game.iplnet.crystals != "present":
proutn(_(" no"))
prout(_(" dilithium crystals present.\""))
if game.iplnet.known == "unknown":
game.iplnet.known = "known"
elif game.iplnet.inhabited:
proutn(_(" no"))
prout(_(" dilithium crystals present.\""))
if game.iplnet.known == "unknown":
game.iplnet.known = "known"
elif game.iplnet.inhabited:
- prout(_("Spock- \"The inhabited planet %s is located at Sector %s, Captain.\"") % (game.iplnet.name, game.plnet))
+ prout(_("Spock- \"The inhabited planet %s ") % game.iplnet.name)
+ prout(_(" is located at Sector %s, Captain.\"") % game.plnet)
def beam():
# use the transporter
def beam():
# use the transporter
prout(_("(Last surveillance update %d stardates ago).") % ((int)(game.state.date-game.lastchart)))
prout(" 1 2 3 4 5 6 7 8")
for i in range(GALSIZE):
prout(_("(Last surveillance update %d stardates ago).") % ((int)(game.state.date-game.lastchart)))
prout(" 1 2 3 4 5 6 7 8")
for i in range(GALSIZE):
for j in range(GALSIZE):
if (game.options & OPTION_SHOWME) and i == game.quadrant.x and j == game.quadrant.y:
proutn("<")
for j in range(GALSIZE):
if (game.options & OPTION_SHOWME) and i == game.quadrant.x and j == game.quadrant.y:
proutn("<")
if game.condition != "docked":
newcnd()
for i in range(QUADSIZE):
if game.condition != "docked":
newcnd()
for i in range(QUADSIZE):
for j in range(QUADSIZE):
sectscan(goodScan, i, j)
skip(1)
for j in range(QUADSIZE):
sectscan(goodScan, i, j)
skip(1)
if aaitem == 0:
chew()
continue # We don't want a blank entry
if aaitem == 0:
chew()
continue # We don't want a blank entry
- game.tourn = int(aaitem)
+ game.tourn = int(round(aaitem))
random.seed(aaitem)
break
if isit("saved") or isit("frozen"):
random.seed(aaitem)
break
if isit("saved") or isit("frozen"):
elif cmd == "SEED": # set random-number seed
key = scan()
if key == IHREAL:
elif cmd == "SEED": # set random-number seed
key = scan()
if key == IHREAL:
+ seed = int(round(aaitem))
#ifdef BSD_BUG_FOR_BUG
# elif cmd == "VISUAL":
# visual() # perform visual scan
#ifdef BSD_BUG_FOR_BUG
# elif cmd == "VISUAL":
# visual() # perform visual scan
def scan():
# Get a token from the user
def scan():
# Get a token from the user
- global inqueue, line, citem
+ global inqueue, line, citem, aaitem
prout("Event %d canceled, no x coordinate." % (i))
unschedule(i)
continue
prout("Event %d canceled, no x coordinate." % (i))
unschedule(i)
continue
+ w.x = int(round(aaitem))
key = scan()
if key != IHREAL:
prout("Event %d canceled, no y coordinate." % (i))
unschedule(i)
continue
key = scan()
if key != IHREAL:
prout("Event %d canceled, no y coordinate." % (i))
unschedule(i)
continue
+ w.y = int(round(aaitem))
ev.quadrant = w
chew()
proutn("Induce supernova here? ")
ev.quadrant = w
chew()
proutn("Induce supernova here? ")