an a lot of parallel arrays where a more modern language would use structures
or objects.
"""
-import os, sys, math, curses, time, atexit, readline
+import os, sys, math, curses, time, atexit, readline, cPickle, random
SSTDOC = "/usr/share/doc/sst/sst.doc"
def invalidate(w): w.x = w.y = 0
def is_valid(w): return (w.x != 0 and w.y != 0)
+# How to represent features
+IHR = 'R',
+IHK = 'K',
+IHC = 'C',
+IHS = 'S',
+IHSTAR = '*',
+IHP = 'P',
+IHW = '@',
+IHB = 'B',
+IHBLANK = ' ',
+IHDOT = '.',
+IHQUEST = '?',
+IHE = 'E',
+IHF = 'F',
+IHT = 'T',
+IHWEB = '#',
+IHMATER0 = '-',
+IHMATER1 = 'o',
+IHMATER2 = '0'
+
class coord:
def __init(self, x=None, y=None):
self.x = x
self.pclass = None # could be ""M", "N", "O", or "destroyed"
self.crystals = None # could be "mined", "present", "absent"
self.known = None # could be "unknown", "known", "shuttle_down"
-
-# How to represent features
-IHR = 'R',
-IHK = 'K',
-IHC = 'C',
-IHS = 'S',
-IHSTAR = '*',
-IHP = 'P',
-IHW = '@',
-IHB = 'B',
-IHBLANK = ' ',
-IHDOT = '.',
-IHQUEST = '?',
-IHE = 'E',
-IHF = 'F',
-IHT = 'T',
-IHWEB = '#',
-IHMATER0 = '-',
-IHMATER1 = 'o',
-IHMATER2 = '0'
+ self.inhabited # is it inhabites?
+ def __str__(self):
+ return self.name
NOPLANET = None
class quadrant:
self.nplankl = None # destroyed uninhabited planets
self.nworldkl = None # destroyed inhabited planets
self.planets = [] # Planet information
- for i in range(PLNETMAX):
- self.planets.append(planet())
self.date = None # stardate
self.remres = None # remaining resources
self.remtime = None # remaining time
SKILL_EMERITUS = 5
def damaged(dev): return (game.damage[dev] != 0.0)
+def communicating(): return not damaged(DRADIO) or game.condition=="docked"
# Define future events
FSPY = 0 # Spy event happens always (no future[] entry)
self.kpower = [[0 * (QUADSIZE+1)] * (QUADSIZE+1)] # enemy energy levels
self.kdist = [[0 * (QUADSIZE+1)] * (QUADSIZE+1)] # enemy distances
self.kavgd = [[0 * (QUADSIZE+1)] * (QUADSIZE+1)] # average distances
- self.damage = [0] * NDEVICES # damage encountered
+ self.damage = [0.0] * NDEVICES # damage encountered
self.future = [0.0] * NEVENTS # future events
for i in range(NEVENTS):
self.future.append(event())
# avoid intruding on another commander's territory
if ienm == IHC:
for n in range(1, game.state.remcom+1):
- if same(game.state.kcmdr[n],iq):
+ if game.state.kcmdr[n] == iq:
return False
# refuse to leave if currently attacking starbase
- if same(game.battle, game.quadrant):
+ if game.battle == game.quadrant:
return False
# don't leave if over 1000 units of energy
if game.kpower[loccom] > 1000.0:
game.state.kscmdr=iq
else:
for n in range(1, game.state.remcom+1):
- if same(game.state.kcmdr[n], game.quadrant):
+ if game.state.kcmdr[n] == game.quadrant:
game.state.kcmdr[n]=iq
break
game.comhere = False
# Put commander in place within same quadrant
game.quad[com.x][com.y] = IHDOT
game.quad[next.x][next.y] = ienm
- if not same(next, com):
+ if next != com:
# it moved
game.ks[loccom] = next
game.kdist[loccom] = game.kavgd[loccom] = distance(game.sector, next)
def movescom(iq, avoid):
# commander movement helper
- if same(iq, game.quadrant) or not VALID_QUADRANT(iq.x, iq.y) or \
+ if iq == game.quadrant or not VALID_QUADRANT(iq.x, iq.y) or \
game.state.galaxy[iq.x][iq.y].supernova or \
game.state.galaxy[iq.x][iq.y].klingons > MAXKLQUAD-1:
return 1
if avoid:
# Avoid quadrants with bases if we want to avoid Enterprise
for i in range(1, game.state.rembase+1):
- if same(game.state.baseq[i], iq):
+ if game.state.baseq[i] == iq:
return True
if game.justin and not game.iscate:
return True
sortklings()
# check for a helpful planet
for i in range(game.inplan):
- if same(game.state.planets[i].w, game.state.kscmdr) and \
- game.state.planets[i].crystals == present:
+ if game.state.planets[i].w == game.state.kscmdr and \
+ game.state.planets[i].crystals == "present":
# destroy the planet
- game.state.planets[i].pclass = destroyed
+ game.state.planets[i].pclass = "destroyed"
game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].planet = NOPLANET
- if not damaged(DRADIO) or game.condition == docked:
+ if communicating():
announce()
prout(_("Lt. Uhura- \"Captain, Starfleet Intelligence reports"))
proutn(_(" a planet in Quadrant %s has been destroyed") % game.state.kscmdr)
for i2 in range(1, game.state.rembase+1):
i = basetbl[i2][0]; # bug in original had it not finding nearest
ibq = game.state.baseq[i]
- if same(ibq, game.quadrant) or same(ibq, game.battle) or \
+ if ibq == game.quadrant or ibq == game.battle or \
game.state.galaxy[ibq.x][ibq.y].supernova or \
game.state.galaxy[ibq.x][ibq.y].klingons > MAXKLQUAD-1:
continue
# if there is a commander, and no other base is appropriate,
# we will take the one with the commander
for j in range(1, game.state.remcom+1):
- if same(ibq, game.state.kcmdr[j]) and ifindit!= 2:
+ if ibq == game.state.kcmdr[j] and ifindit!= 2:
ifindit = 2
iwhichb = i
break
else:
for i in range(1, game.state.rembase+1):
ibq = game.state.baseq[i]
- if same(ibq, game.state.kscmdr) and same(game.state.kscmdr, game.battle):
+ if ibq == game.state.kscmdr and game.state.kscmdr == game.battle:
# attack the base
if avoid:
return; # no, don't attack base!
schedule(FSCDBAS, 1.0 +2.0*Rand())
if is_scheduled(FCDBAS):
postpone(FSCDBAS, scheduled(FCDBAS)-game.state.date)
- if damaged(DRADIO) and game.condition != docked:
+ if not communicating():
return; # no warning
game.iseenit = True
announce()
# Check for intelligence report
if not idebug and \
(Rand() > 0.2 or \
- (damaged(DRADIO) and game.condition != docked) or \
+ (not communicating()) or \
not game.state.galaxy[game.state.kscmdr.x][game.state.kscmdr.y].charted):
return
announce()
elif iquad in (IHR, IHK): # Hit a regular enemy
# find the enemy
for ll in range(1, game.nenhere+1):
- if same(w, game.ks[ll]):
+ if w == game.ks[ll]:
break
kp = math.fabs(game.kpower[ll])
h1 = 700.0 + 100.0*Rand() - \
skip(1)
prout(_("***STARBASE DESTROYED.."))
for ll in range(1, game.state.rembase+1):
- if same(game.state.baseq[ll], game.quadrant):
+ if game.state.baseq[ll] == game.quadrant:
game.state.baseq[ll]=game.state.baseq[game.state.rembase]
break
game.quad[w.x][w.y]=IHDOT
if type == IHC:
game.comhere = False
for i in range(1, game.state.remcom+1):
- if same(game.state.kcmdr[i], game.quadrant):
+ if game.state.kcmdr[i] == game.quadrant:
break
game.state.kcmdr[i] = game.state.kcmdr[game.state.remcom]
game.state.kcmdr[game.state.remcom].x = 0
return
game.recompute()
# Remove enemy ship from arrays describing local conditions
- if is_scheduled(FCDBAS) and same(game.battle, game.quadrant) and type==IHC:
+ if is_scheduled(FCDBAS) and game.battle == game.quadrant and type==IHC:
unschedule(FCDBAS)
for i in range(1, game.nenhere+1):
- if same(game.ks[i], w):
+ if game.ks[i] == w:
break
game.nenhere -= 1
if i <= game.nenhere:
game.quadrant = game.state.kcmdr[i]
game.sector = randplace(QUADSIZE)
crmshp()
- proutn(_(" is pulled to "))
- proutn(cramlc(quadrant, game.quadrant))
- proutn(", ")
- prout(cramlc(sector, game.sector))
+ prout(_(" is pulled to Quadrant %s, Sector %s") \
+ % (game.quadrant, game.sector))
if game.resting:
prout(_("(Remainder of rest/repair period cancelled.)"))
game.resting = False
# Code merges here for any commander destroying base
# Not perfect, but will have to do
# Handle case where base is in same quadrant as starship
- if same(game.battle, game.quadrant):
+ if game.battle == game.quadrant:
game.state.chart[game.battle.x][game.battle.y].starbase = False
game.quad[game.base.x][game.base.y] = IHDOT
game.base.x=game.base.y=0
newcnd()
skip(1)
prout(_("Spock- \"Captain, I believe the starbase has been destroyed.\""))
- elif game.state.rembase != 1 and \
- (not damaged(DRADIO) or game.condition == "docked"):
+ elif game.state.rembase != 1 and communicating():
# Get word via subspace radio
announce()
skip(1)
prout(_("Lt. Uhura- \"Captain, Starfleet Command reports that"))
- proutn(_(" the starbase in "))
- proutn(cramlc(quadrant, game.battle))
- prout(_(" has been destroyed by"))
+ proutn(_(" the starbase in Quadrant %s has been destroyed by") % game.battle)
if game.isatb == 2:
prout(_("the Klingon Super-Commander"))
else:
# Remove Starbase from galaxy
game.state.galaxy[game.battle.x][game.battle.y].starbase = False
for i in range(1, game.state.rembase+1):
- if same(game.state.baseq[i], game.battle):
+ if game.state.baseq[i] == game.battle:
game.state.baseq[i] = game.state.baseq[game.state.rembase]
game.state.rembase -= 1
if game.isatb == 2:
i = 0
for j in range(1, game.state.rembase+1):
for k in range(1, game.state.remcom+1):
- if same(game.state.baseq[j], game.state.kcmdr[k]) and \
- not same(game.state.baseq[j], game.quadrant) and \
- not same(game.state.baseq[j], game.state.kscmdr):
+ if game.state.baseq[j] == game.state.kcmdr[k] and \
+ not game.state.baseq[j] == game.quadrant and \
+ not game.state.baseq[j] == game.state.kscmdr:
i = 1
if i == 1:
continue
postpone(FCDBAS, scheduled(FSCDBAS)-game.state.date)
game.future[FBATTAK].date = game.future[FCDBAS].date + expran(0.3*game.intime)
game.iseenit = False
- if damaged(DRADIO) and game.condition != "docked":
+ if not communicating():
continue # No warning :-(
game.iseenit = True
announce()
unschedule(FCDBAS)
# find the lucky pair
for i in range(1, game.state.remcom+1):
- if same(game.state.kcmdr[i], game.battle):
+ if game.state.kcmdr[i] == game.battle:
break
if i > game.state.remcom or game.state.rembase == 0 or \
not game.state.galaxy[game.battle.x][game.battle.y].starbase:
if not VALID_QUADRANT(i, j) or \
game.state.galaxy[game.probec.x][game.probec.y].supernova:
# Left galaxy or ran into supernova
- if not damaged(DRADIO) or game.condition == "docked":
+ if comunicating():
announce()
skip(1)
proutn(_("Lt. Uhura- \"The deep space probe "))
prout(".\"")
unschedule(FDSPROB)
continue
- if not damaged(DRADIO) or game.condition == "docked":
+ if not communicating():
announce()
skip(1)
- proutn(_("Lt. Uhura- \"The deep space probe is now in "))
- proutn(cramlc(quadrant, game.probec))
- prout(".\"")
+ proutn(_("Lt. Uhura- \"The deep space probe is now in Quadrant %s.\"") % game.probec)
pdest = game.state.galaxy[game.probec.x][game.probec.y]
# Update star chart if Radio is working or have access to radio
- if not damaged(DRADIO) or game.condition == "docked":
+ if communicating():
chp = game.state.chart[game.probec.x][game.probec.y]
chp.klingons = pdest.klingons
chp.starbase = pdest.starbase
# supernova'ed, and which has some Klingons in it
w = randplace(GALSIZE)
q = game.state.galaxy[w.x][w.y]
- if not (same(game.quadrant, w) or q.planet == NOPLANET or \
- game.state.planets[q.planet].inhabited == UNINHABITED or \
+ if not (game.quadrant == w or q.planet == NOPLANET or \
+ not game.state.planets[q.planet].inhabited or \
q.supernova or q.status!=secure or q.klingons<=0):
break
else:
q.status = distressed
# tell the captain about it if we can
- if not damaged(DRADIO) or game.condition == "docked":
+ if communicating():
prout(_("Uhura- Captain, %s in Quadrant %s reports it is under attack") \
% (q.planet, `w`))
prout(_("by a Klingon invasion fleet."))
ev2.quadrant = ev.quadrant
# report the disaster if we can
- if not damaged(DRADIO) or game.condition == "docked":
+ if communicating():
prout(_("Uhura- We've lost contact with starsystem %s") % \
q.planet)
prout(_("in Quadrant %s.\n") % ev.quadrant)
# deliver the child
game.state.remkl += 1
q.klingons += 1
- if same(game.quadrant, w):
- newkling(++game.klhere)
-
+ if game.quadrant == w:
+ game.klhere += 1
+ newkling(game.klhere)
# recompute time left
game.recompute()
# report the disaster if we can
- if not damaged(DRADIO) or game.condition == "docked":
- if same(game.quadrant, w):
+ if communicating():
+ if game.quadrant == w:
prout(_("Spock- sensors indicate the Klingons have"))
prout(_("launched a warship from %s.") % q.planet)
else:
elif iquad == IHB: # Destroy base
game.state.galaxy[game.quadrant.x][game.quadrant.y].starbase = False
for i in range(1, game.state.rembase+1):
- if same(game.state.baseq[i], game.quadrant):
+ if game.state.baseq[i] == game.quadrant:
break
game.state.baseq[i] = game.state.baseq[game.state.rembase]
game.state.rembase -= 1
deadkl(scratch,iquad, scratch)
elif iquad in (IHC,IHS,IHR): # Damage/destroy big enemies
for ll in range(1, game.nenhere+1):
- if same(game.ks[ll], scratch):
+ if game.ks[ll] == scratch:
break
game.kpower[ll] -= 800.0 # If firepower is lost, die
if game.kpower[ll] <= 0.0:
# can't move into something else
skip(1)
break
- proutn(_(", buffeted to "))
- proutn(cramlc(sector, newc))
+ proutn(_(", buffeted to Sector %s") % newc)
game.quad[scratch.x][scratch.y] = IHDOT
game.quad[newc.x][newc.y] = iquad
game.ks[ll] = newc
if ja() == True:
nq = game.quadrant
- if not same(nq, game.quadrant) or game.justin:
+ if not nq == game.quadrant or game.justin:
# it isn't here, or we just entered (treat as enroute)
- if not damaged(DRADIO) or game.condition == "docked":
+ if communicating():
skip(1)
prout(_("Message from Starfleet Command Stardate %.2f") % game.state.date)
prout(_(" Supernova in Quadrant %s; caution advised.") % nq)
# destroy any Klingons in supernovaed quadrant
kldead = game.state.galaxy[nq.x][nq.y].klingons
game.state.galaxy[nq.x][nq.y].klingons = 0
- if same(nq, game.state.kscmdr):
+ if nq == game.state.kscmdr:
# did in the Supercommander!
game.state.nscrem = game.state.kscmdr.x = game.state.kscmdr.y = game.isatb = 0
game.iscate = False
if game.state.remcom:
maxloop = game.state.remcom
for l in range(1, maxloop+1):
- if same(game.state.kcmdr[l], nq):
+ if game.state.kcmdr[l] == nq:
game.state.kcmdr[l] = game.state.kcmdr[game.state.remcom]
invalidate(game.state.kcmdr[game.state.remcom])
game.state.remcom -= 1
game.state.nromrem -= nrmdead
# Destroy planets
for loop in range(game.inplan):
- if same(game.state.planets[loop].w, nq):
+ if game.state.planets[loop].w == nq:
game.state.planets[loop].pclass = destroyed
npdead += 1
# Destroy any base in supernovaed quadrant
if game.state.rembase:
maxloop = game.state.rembase
for loop in range(1, maxloop+1):
- if same(game.state.baseq[loop], nq):
+ if game.state.baseq[loop] == nq:
game.state.baseq[loop] = game.state.baseq[game.state.rembase]
invalidate(game.state.baseq[game.state.rembase])
game.state.rembase -= 1
game.state.basekl += game.state.galaxy[nq.x][nq.y].starbase
game.state.nplankl += npdead
# mark supernova in galaxy and in star chart
- if same(game.quadrant, nq) or not damaged(DRADIO) or game.condition == "docked":
+ if game.quadrant == nq or communicating():
game.state.galaxy[nq.x][nq.y].supernova = True
# If supernova destroys last Klingons give special message
- if (game.state.remkl + game.state.remcom + game.state.nscrem)==0 and not same(nq, game.quadrant):
+ if (game.state.remkl + game.state.remcom + game.state.nscrem)==0 and not nq == game.quadrant:
skip(2)
if not induced:
prout(_("Lucky you!"))
prout(_("the Federation in a prisoner-of-war exchange."))
nb = Rand()*game.state.rembase+1
# Set up quadrant and position FQ adjacient to base
- if not same(game.quadrant, game.state.baseq[nb]):
+ if not game.quadrant == game.state.baseq[nb]:
game.quadrant = game.state.baseq[nb]
game.sector.x = game.sector.y = 5
newqad(True)
game.warpfac=5.0
game.wfacsq=25.0
return
+
+# Code from planets.c begins here.
+
+def consumeTime():
+ # abort a lengthy operation if an event interrupts it
+ game.ididit = True
+ events()
+ if game.alldone or game.state.galaxy[game.quadrant.x][game.quadrant.y].supernova or game.justin:
+ return True
+ return False
+
+def survey():
+ # report on (uninhabited) planets in the galaxy
+ iknow = False
+ skip(1)
+ chew()
+ prout(_("Spock- \"Planet report follows, Captain.\""))
+ skip(1)
+ for i in range(game.inplan):
+ if game.state.planets[i].pclass == destroyed:
+ continue
+ if (game.state.planets[i].known != "unknown" \
+ and not game.state.planets[i].inhabited) \
+ or idebug:
+ iknow = True
+ if idebug and game.state.planets[i].known=="unknown":
+ proutn("(Unknown) ")
+ proutn(_("Quadrant %s") % game.state.planets[i].w)
+ proutn(_(" class "))
+ proutn(game.state.planets[i].pclass)
+ proutn(" ")
+ if game.state.planets[i].crystals != present:
+ proutn(_("no "))
+ prout(_("dilithium crystals present."))
+ if game.state.planets[i].known=="shuttle_down":
+ prout(_(" Shuttle Craft Galileo on surface."))
+ if not iknow:
+ prout(_("No information available."))
+
+def orbit():
+ # enter standard orbit
+ skip(1)
+ chew()
+ if game.inorbit:
+ prout(_("Already in standard orbit."))
+ return
+ if damaged(DWARPEN) and damaged(DIMPULS):
+ prout(_("Both warp and impulse engines damaged."))
+ return
+ if not is_valid(game.plnet) or abs(game.sector.x-game.plnet.x) > 1 or abs(game.sector.y-game.plnet.y) > 1:
+ crmshp()
+ prout(_(" not adjacent to planet."))
+ skip(1)
+ return
+ game.optime = 0.02+0.03*Rand()
+ prout(_("Helmsman Sulu- \"Entering standard orbit, Sir.\""))
+ newcnd()
+ if consumeTime():
+ return
+ game.height = (1400.0+7200.0*Rand())
+ prout(_("Sulu- \"Entered orbit at altitude %.2f kilometers.\"") % game.height)
+ game.inorbit = True
+ game.ididit = True
+
+def sensor():
+ # examine planets in this quadrant
+ if damaged(DSRSENS):
+ if game.options & OPTION_TTY:
+ prout(_("Short range sensors damaged."))
+ return
+ if not is_valid(game.plnet):
+ if game.options & OPTION_TTY:
+ prout(_("Spock- \"No planet in this quadrant, Captain.\""))
+ return
+ if game.state.planets[game.iplnet].known == "unknown":
+ prout(_("Spock- \"Sensor scan for Quadrant %s-") % game.quadrant)
+ skip(1)
+ prout(_(" Planet at Sector %s is of class %s.") %
+ (sector,game.plnet, game.state.planets[game.iplnet]))
+ if game.state.planets[game.iplnet].known=="shuttle_down":
+ prout(_(" Sensors show Galileo still on surface."))
+ proutn(_(" Readings indicate"))
+ if game.state.planets[game.iplnet].crystals != present:
+ proutn(_(" no"))
+ prout(_(" dilithium crystals present.\""))
+ if game.state.planets[game.iplnet].known == "unknown":
+ game.state.planets[game.iplnet].known = "known"
+
+def beam():
+ # use the transporter
+ nrgneed = 0
+ chew()
+ skip(1)
+ if damaged(DTRANSP):
+ prout(_("Transporter damaged."))
+ if not damaged(DSHUTTL) and (game.state.planets[game.iplnet].known=="shuttle_down" or game.iscraft == "onship"):
+ skip(1)
+ proutn(_("Spock- \"May I suggest the shuttle craft, Sir?\" "))
+ if ja() == True:
+ shuttle()
+ return
+ if not game.inorbit:
+ crmshp()
+ prout(_(" not in standard orbit."))
+ return
+ if game.shldup:
+ prout(_("Impossible to transport through shields."))
+ return
+ if game.state.planets[game.iplnet].known=="unknown":
+ prout(_("Spock- \"Captain, we have no information on this planet"))
+ prout(_(" and Starfleet Regulations clearly state that in this situation"))
+ prout(_(" you may not go down.\""))
+ return
+ if not game.landed and game.state.planets[game.iplnet].crystals==absent:
+ prout(_("Spock- \"Captain, I fail to see the logic in"))
+ prout(_(" exploring a planet with no dilithium crystals."))
+ proutn(_(" Are you sure this is wise?\" "))
+ if ja() == False:
+ chew()
+ return
+ if not (game.options & OPTION_PLAIN):
+ nrgneed = 50 * game.skill + game.height / 100.0
+ if nrgneed > game.energy:
+ prout(_("Engineering to bridge--"))
+ prout(_(" Captain, we don't have enough energy for transportation."))
+ return
+ if not game.landed and nrgneed * 2 > game.energy:
+ prout(_("Engineering to bridge--"))
+ prout(_(" Captain, we have enough energy only to transport you down to"))
+ prout(_(" the planet, but there wouldn't be an energy for the trip back."))
+ if game.state.planets[game.iplnet].known == "shuttle_down":
+ prout(_(" Although the Galileo shuttle craft may still be on a surface."))
+ proutn(_(" Are you sure this is wise?\" "))
+ if ja() == False:
+ chew()
+ return
+ if game.landed:
+ # Coming from planet
+ if game.state.planets[game.iplnet].known=="shuttle_down":
+ proutn(_("Spock- \"Wouldn't you rather take the Galileo?\" "))
+ if ja() == True:
+ chew()
+ return
+ prout(_("Your crew hides the Galileo to prevent capture by aliens."))
+ prout(_("Landing party assembled, ready to beam up."))
+ skip(1)
+ prout(_("Kirk whips out communicator..."))
+ prouts(_("BEEP BEEP BEEP"))
+ skip(2)
+ prout(_("\"Kirk to enterprise- Lock on coordinates...energize.\""))
+ else:
+ # Going to planet
+ prout(_("Scotty- \"Transporter room ready, Sir.\""))
+ skip(1)
+ prout(_("Kirk and landing party prepare to beam down to planet surface."))
+ skip(1)
+ prout(_("Kirk- \"Energize.\""))
+ game.ididit = True
+ skip(1)
+ prouts("WWHOOOIIIIIRRRRREEEE.E.E. . . . . . .")
+ skip(2)
+ if Rand() > 0.98:
+ prouts("BOOOIIIOOOIIOOOOIIIOIING . . .")
+ skip(2)
+ prout(_("Scotty- \"Oh my God! I've lost them.\""))
+ finish(FLOST)
+ return
+ prouts(". . . . . . .E.E.EEEERRRRRIIIIIOOOHWW")
+ game.landed = not game.landed
+ game.energy -= nrgneed
+ skip(2)
+ prout(_("Transport complete."))
+ if game.landed and game.state.planets[game.iplnet].known=="shuttle_down":
+ prout(_("The shuttle craft Galileo is here!"))
+ if not game.landed and game.imine:
+ game.icrystl = True
+ game.cryprob = 0.05
+ game.imine = False
+ return
+
+def mine():
+ # strip-mine a world for dilithium
+ skip(1)
+ chew()
+ if not game.landed:
+ prout(_("Mining party not on planet."))
+ return
+ if game.state.planets[game.iplnet].crystals == mined:
+ prout(_("This planet has already been strip-mined for dilithium."))
+ return
+ elif game.state.planets[game.iplnet].crystals == absent:
+ prout(_("No dilithium crystals on this planet."))
+ return
+ if game.imine:
+ prout(_("You've already mined enough crystals for this trip."))
+ return
+ if game.icrystl and game.cryprob == 0.05:
+ proutn(_("With all those fresh crystals aboard the "))
+ crmshp()
+ skip(1)
+ prout(_("there's no reason to mine more at this time."))
+ return
+ game.optime = (0.1+0.2*Rand())*game.state.planets[game.iplnet].pclass
+ if consumeTime():
+ return
+ prout(_("Mining operation complete."))
+ game.state.planets[game.iplnet].crystals = mined
+ game.imine = game.ididit = True
+
+def usecrystals():
+ # use dilithium crystals
+ game.ididit = False
+ skip(1)
+ chew()
+ if not game.icrystl:
+ prout(_("No dilithium crystals available."))
+ return
+ if game.energy >= 1000:
+ prout(_("Spock- \"Captain, Starfleet Regulations prohibit such an operation"))
+ prout(_(" except when Condition Yellow exists."))
+ return
+ prout(_("Spock- \"Captain, I must warn you that loading"))
+ prout(_(" raw dilithium crystals into the ship's power"))
+ prout(_(" system may risk a severe explosion."))
+ proutn(_(" Are you sure this is wise?\" "))
+ if ja() == False:
+ chew()
+ return
+ skip(1)
+ prout(_("Engineering Officer Scott- \"(GULP) Aye Sir."))
+ prout(_(" Mr. Spock and I will try it.\""))
+ skip(1)
+ prout(_("Spock- \"Crystals in place, Sir."))
+ prout(_(" Ready to activate circuit.\""))
+ skip(1)
+ prouts(_("Scotty- \"Keep your fingers crossed, Sir!\""))
+ skip(1)
+ if Rand() <= game.cryprob:
+ prouts(_(" \"Activating now! - - No good! It's***"))
+ skip(2)
+ prouts(_("***RED ALERT! RED A*L********************************"))
+ skip(1)
+ stars()
+ prouts(_("****************** KA-BOOM!!!! *******************"))
+ skip(1)
+ kaboom()
+ return
+ game.energy += 5000.0*(1.0 + 0.9*Rand())
+ prouts(_(" \"Activating now! - - "))
+ prout(_("The instruments"))
+ prout(_(" are going crazy, but I think it's"))
+ prout(_(" going to work!! Congratulations, Sir!\""))
+ game.cryprob *= 2.0
+ game.ididit = True
+
+def shuttle():
+ # use shuttlecraft for planetary jaunt
+ chew()
+ skip(1)
+ if damaged(DSHUTTL):
+ if game.damage[DSHUTTL] == -1.0:
+ if game.inorbit and game.state.planets[game.iplnet].known == "shuttle_down":
+ prout(_("Ye Faerie Queene has no shuttle craft bay to dock it at."))
+ else:
+ prout(_("Ye Faerie Queene had no shuttle craft."))
+ elif game.damage[DSHUTTL] > 0:
+ prout(_("The Galileo is damaged."))
+ else: # game.damage[DSHUTTL] < 0
+ prout(_("Shuttle craft is now serving Big Macs."))
+ return
+ if not game.inorbit:
+ crmshp()
+ prout(_(" not in standard orbit."))
+ return
+ if (game.state.planets[game.iplnet].known != "shuttle_down") and game.iscraft != "onship":
+ prout(_("Shuttle craft not currently available."))
+ return
+ if not game.landed and game.state.planets[game.iplnet].known=="shuttle_down":
+ prout(_("You will have to beam down to retrieve the shuttle craft."))
+ return
+ if game.shldup or game.condition == "docked":
+ prout(_("Shuttle craft cannot pass through shields."))
+ return
+ if game.state.planets[game.iplnet].known=="unknown":
+ prout(_("Spock- \"Captain, we have no information on this planet"))
+ prout(_(" and Starfleet Regulations clearly state that in this situation"))
+ prout(_(" you may not fly down.\""))
+ return
+ game.optime = 3.0e-5*game.height
+ if game.optime >= 0.8*game.state.remtime:
+ prout(_("First Officer Spock- \"Captain, I compute that such"))
+ proutn(_(" a maneuver would require approximately %2d%% of our") % \
+ int(100*game.optime/game.state.remtime))
+ prout(_("remaining time."))
+ proutn(_("Are you sure this is wise?\" "))
+ if ja() == False:
+ game.optime = 0.0
+ return
+ if game.landed:
+ # Kirk on planet
+ if game.iscraft == "onship":
+ # Galileo on ship!
+ if not damaged(DTRANSP):
+ proutn(_("Spock- \"Would you rather use the transporter?\" "))
+ if ja() == True:
+ beam()
+ return
+ proutn(_("Shuttle crew"))
+ else:
+ proutn(_("Rescue party"))
+ prout(_(" boards Galileo and swoops toward planet surface."))
+ game.iscraft = "offship"
+ skip(1)
+ if consumeTime():
+ return
+ game.state.planets[game.iplnet].known="shuttle_down"
+ prout(_("Trip complete."))
+ return
+ else:
+ # Ready to go back to ship
+ prout(_("You and your mining party board the"))
+ prout(_("shuttle craft for the trip back to the Enterprise."))
+ skip(1)
+ prouts(_("The short hop begins . . ."))
+ skip(1)
+ game.state.planets[game.iplnet].known="known"
+ game.icraft = True
+ skip(1)
+ game.landed = False
+ if consumeTime():
+ return
+ game.iscraft = "onship"
+ game.icraft = False
+ if game.imine:
+ game.icrystl = True
+ game.cryprob = 0.05
+ game.imine = False
+ prout(_("Trip complete."))
+ return
+ else:
+ # Kirk on ship
+ # and so is Galileo
+ prout(_("Mining party assembles in the hangar deck,"))
+ prout(_("ready to board the shuttle craft \"Galileo\"."))
+ skip(1)
+ prouts(_("The hangar doors open; the trip begins."))
+ skip(1)
+ game.icraft = True
+ game.iscraft = "offship"
+ if consumeTime():
+ return
+ game.state.planets[game.iplnet].known = "shuttle_down"
+ game.landed = True
+ game.icraft = False
+ prout(_("Trip complete."))
+ return
+
+def deathray():
+ # use the big zapper
+ r = Rand()
+
+ game.ididit = False
+ skip(1)
+ chew()
+ if game.ship != IHE:
+ prout(_("Ye Faerie Queene has no death ray."))
+ return
+ if game.nenhere==0:
+ prout(_("Sulu- \"But Sir, there are no enemies in this quadrant.\""))
+ return
+ if damaged(DDRAY):
+ prout(_("Death Ray is damaged."))
+ return
+ prout(_("Spock- \"Captain, the 'Experimental Death Ray'"))
+ prout(_(" is highly unpredictible. Considering the alternatives,"))
+ proutn(_(" are you sure this is wise?\" "))
+ if ja() == False:
+ return
+ prout(_("Spock- \"Acknowledged.\""))
+ skip(1)
+ game.ididit = True
+ prouts(_("WHOOEE ... WHOOEE ... WHOOEE ... WHOOEE"))
+ skip(1)
+ prout(_("Crew scrambles in emergency preparation."))
+ prout(_("Spock and Scotty ready the death ray and"))
+ prout(_("prepare to channel all ship's power to the device."))
+ skip(1)
+ prout(_("Spock- \"Preparations complete, sir.\""))
+ prout(_("Kirk- \"Engage!\""))
+ skip(1)
+ prouts(_("WHIRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR"))
+ skip(1)
+ dprob = .30
+ if game.options & OPTION_PLAIN:
+ dprob = .5
+ if r > dprob:
+ prouts(_("Sulu- \"Captain! It's working!\""))
+ skip(2)
+ while game.nenhere > 0:
+ deadkl(game.ks[1], game.quad[game.ks[1].x][game.ks[1].y],game.ks[1])
+ prout(_("Ensign Chekov- \"Congratulations, Captain!\""))
+ if (game.state.remkl + game.state.remcom + game.state.nscrem) == 0:
+ finish(FWON)
+ if (game.options & OPTION_PLAIN) == 0:
+ prout(_("Spock- \"Captain, I believe the `Experimental Death Ray'"))
+ if Rand() <= 0.05:
+ prout(_(" is still operational.\""))
+ else:
+ prout(_(" has been rendered nonfunctional.\""))
+ game.damage[DDRAY] = 39.95
+ return
+ r = Rand() # Pick failure method
+ if r <= .30:
+ prouts(_("Sulu- \"Captain! It's working!\""))
+ skip(1)
+ prouts(_("***RED ALERT! RED ALERT!"))
+ skip(1)
+ prout(_("***MATTER-ANTIMATTER IMPLOSION IMMINENT!"))
+ skip(1)
+ prouts(_("***RED ALERT! RED A*L********************************"))
+ skip(1)
+ stars()
+ prouts(_("****************** KA-BOOM!!!! *******************"))
+ skip(1)
+ kaboom()
+ return
+ if r <= .55:
+ prouts(_("Sulu- \"Captain! Yagabandaghangrapl, brachriigringlanbla!\""))
+ skip(1)
+ prout(_("Lt. Uhura- \"Graaeek! Graaeek!\""))
+ skip(1)
+ prout(_("Spock- \"Fascinating! . . . All humans aboard"))
+ prout(_(" have apparently been transformed into strange mutations."))
+ prout(_(" Vulcans do not seem to be affected."))
+ skip(1)
+ prout(_("Kirk- \"Raauch! Raauch!\""))
+ finish(FDRAY)
+ return
+ if r <= 0.75:
+ intj
+ prouts(_("Sulu- \"Captain! It's --WHAT?!?!\""))
+ skip(2)
+ proutn(_("Spock- \"I believe the word is"))
+ prouts(_(" *ASTONISHING*"))
+ prout(_(" Mr. Sulu."))
+ for i in range(1, QUADSIZE+1):
+ for j in range(1, QUADSIZE+1):
+ if game.quad[i][j] == IHDOT:
+ game.quad[i][j] = IHQUEST
+ prout(_(" Captain, our quadrant is now infested with"))
+ prouts(_(" - - - - - - *THINGS*."))
+ skip(1)
+ prout(_(" I have no logical explanation.\""))
+ return
+ prouts(_("Sulu- \"Captain! The Death Ray is creating tribbles!\""))
+ skip(1)
+ prout(_("Scotty- \"There are so many tribbles down here"))
+ prout(_(" in Engineering, we can't move for 'em, Captain.\""))
+ finish(FTRIBBLE)
+ return
+
+# Code from reports.c begins here
+
+def attackreport(curt):
+ # report status of bases under attack
+ if not curt:
+ if is_scheduled(FCDBAS):
+ prout(_("Starbase in Quadrant %s is currently under Commander attack.") % game.battle)
+ prout(_("It can hold out until Stardate %d.") % int(scheduled(FCDBAS)))
+ elif game.isatb == 1:
+ prout(_("Starbase in Quadrant %s is under Super-commander attack.") % game.state.kscmdr)
+ prout(_("It can hold out until Stardate %d.") % int(scheduled(FSCDBAS)))
+ else:
+ prout(_("No Starbase is currently under attack."))
+ else:
+ if is_scheduled(FCDBAS):
+ proutn(_("Base in %s attacked by C. Alive until %.1f") % (game.battle, scheduled(FCDBAS)))
+ if game.isatb:
+ proutn(_("Base in %s attacked by S. Alive until %.1f") % (game.state.kscmdr, scheduled(FSCDBAS)))
+ clreol()
+
+def report():
+ # report on general game status
+ chew()
+ s1 = "" and game.thawed and _("thawed ")
+ s2 = {1:"short", 2:"medium", 4:"long"}[game.length]
+ s3 = (None, _("novice"). _("fair"),
+ _("good"), _("expert"), _("emeritus"))[game.skill]
+ prout(_("You %s a %s%s %s game.") % ((_("were playing"), _("are playing"))[game.alldone], s1, s2, s3))
+ if game.skill>SKILL_GOOD and game.thawed and not game.alldone:
+ prout(_("No plaque is allowed."))
+ if game.tourn:
+ prout(_("This is tournament game %d.") % game.tourn)
+ prout(_("Your secret password is \"%s\"") % game.passwd)
+ proutn(_("%d of %d Klingons have been killed") % (((game.inkling + game.incom + game.inscom) - (game.state.remkl + game.state.remcom + game.state.nscrem)),
+ (game.inkling + game.incom + game.inscom)))
+ if game.incom - game.state.remcom:
+ prout(_(", including %d Commander%s.") % (game.incom - game.state.remcom, (_("s"), "")[(game.incom - game.state.remcom)==1]))
+ elif game.inkling - game.state.remkl + (game.inscom - game.state.nscrem) > 0:
+ prout(_(", but no Commanders."))
+ else:
+ prout(".")
+ if game.skill > SKILL_FAIR:
+ prout(_("The Super Commander has %sbeen destroyed.") % ("", _("not "))[game.state.nscrem])
+ if game.state.rembase != game.inbase:
+ proutn(_("There "))
+ if game.inbase-game.state.rembase==1:
+ proutn(_("has been 1 base"))
+ else:
+ proutn(_("have been %d bases") % (game.inbase-game.state.rembase))
+ prout(_(" destroyed, %d remaining.") % game.state.rembase)
+ else:
+ prout(_("There are %d bases.") % game.inbase)
+ if communicating() or game.iseenit:
+ # Don't report this if not seen and
+ # either the radio is dead or not at base!
+ attackreport(False)
+ game.iseenit = True
+ if game.casual:
+ prout(_("%d casualt%s suffered so far.") % (game.casual, ("y", "ies")[game.casual!=1]))
+ if game.nhelp:
+ prout(_("There were %d call%s for help.") % (game.nhelp, ("" , _("s"))[game.nhelp!=1]))
+ if game.ship == IHE:
+ proutn(_("You have "))
+ if game.nprobes:
+ proutn("%d" % (game.nprobes))
+ else:
+ proutn(_("no"))
+ proutn(_(" deep space probe"))
+ if game.nprobes!=1:
+ proutn(_("s"))
+ prout(".")
+ if communicating() and is_scheduled(FDSPROB):
+ if game.isarmed:
+ proutn(_("An armed deep space probe is in "))
+ else:
+ proutn(_("A deep space probe is in "))
+ prout("Quadrant %s." % game.probec)
+ if game.icrystl:
+ if game.cryprob <= .05:
+ prout(_("Dilithium crystals aboard ship... not yet used."))
+ else:
+ i=0
+ ai = 0.05
+ while game.cryprob > ai:
+ ai *= 2.0
+ i += 1
+ prout(_("Dilithium crystals have been used %d time%s.") % \
+ (i, (_("s"), "")[i==1]))
+ skip(1)
+
+def lrscan():
+ # long-range sensor scan
+ if damaged(DLRSENS):
+ # Now allow base's sensors if docked
+ if game.condition != "docked":
+ prout(_("LONG-RANGE SENSORS DAMAGED."))
+ return
+ prout(_("Starbase's long-range scan"))
+ else:
+ prout(_("Long-range scan"))
+ for x in range(game.quadrant.x-1, game.quadrant.x+2):
+ proutn(" ")
+ for y in range(game.quadrant.y-1, game.quadrant.y+2):
+ if not VALID_QUADRANT(x, y):
+ proutn(" -1")
+ else:
+ if not damaged(DRADIO):
+ game.state.galaxy[x][y].charted = True
+ game.state.chart[x][y].klingons = game.state.galaxy[x][y].klingons
+ game.state.chart[x][y].starbase = game.state.galaxy[x][y].starbase
+ game.state.chart[x][y].stars = game.state.galaxy[x][y].stars
+ if game.state.galaxy[x][y].supernova:
+ proutn(" ***")
+ else:
+ proutn(" %3d" % (game.state.chart[x][y].klingons*100 + game.state.chart[x][y].starbase * 10 + game.state.chart[x][y].stars))
+ prout(" ")
+
+def damagereport():
+ # damage report
+ jdam = False
+ chew()
+
+ for i in range(NDEVICES):
+ if damaged(i):
+ if not jdam:
+ prout(_("\tDEVICE\t\t\t-REPAIR TIMES-"))
+ prout(_("\t\t\tIN FLIGHT\t\tDOCKED"))
+ jdam = True
+ prout(" %-26s\t%8.2f\t\t%8.2f" % (device[i],
+ game.damage[i]+0.05,
+ game.docfac*game.damage[i]+0.005))
+ if not jdam:
+ prout(_("All devices functional."))
+
+def rechart():
+ # update the chart in the Enterprise's computer from galaxy data
+ game.lastchart = game.state.date
+ for i in range(1, GALSIZE+1):
+ for j in range(1, GALSIZE+1):
+ if game.state.galaxy[i][j].charted:
+ game.state.chart[i][j].klingons = game.state.galaxy[i][j].klingons
+ game.state.chart[i][j].starbase = game.state.galaxy[i][j].starbase
+ game.state.chart[i][j].stars = game.state.galaxy[i][j].stars
+
+def chart():
+ # display the star chart
+ chew()
+ if not damaged(DRADIO):
+ rechart()
+ if game.lastchart < game.state.date and game.condition == "docked":
+ prout(_("Spock- \"I revised the Star Chart from the starbase's records.\""))
+ rechart()
+
+ prout(_(" STAR CHART FOR THE KNOWN GALAXY"))
+ if game.state.date > game.lastchart:
+ 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(1, GALSIZE+1):
+ proutn("%d |" % (i))
+ for j in range(1, GALSIZE+1):
+ if (game.options & OPTION_SHOWME) and i == game.quadrant.x and j == game.quadrant.y:
+ proutn("<")
+ else:
+ proutn(" ")
+ if game.state.galaxy[i][j].supernova:
+ strcpy(buf, "***")
+ elif not game.state.galaxy[i][j].charted and game.state.galaxy[i][j].starbase:
+ strcpy(buf, ".1.")
+ elif game.state.galaxy[i][j].charted:
+ sprintf(buf, "%3d" % (game.state.chart[i][j].klingons*100 + game.state.chart[i][j].starbase * 10 + game.state.chart[i][j].stars))
+ else:
+ strcpy(buf, "...")
+ proutn(buf)
+ if (game.options & OPTION_SHOWME) and i == game.quadrant.x and j == game.quadrant.y:
+ proutn(">")
+ else:
+ proutn(" ")
+ proutn(" |")
+ if i<GALSIZE:
+ skip(1)
+
+def sectscan(goodScan, i, j):
+ # 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.quad[i][j] != game.ship:
+ highvideo()
+ proutn("%c " % game.quad[i][j])
+ textcolor(DEFAULT)
+ else:
+ proutn("- ")
+
+def status(req):
+ # print status report lines
+
+ if not req or req == 1:
+ prstat(_("Stardate"), _("%.1f, Time Left %.2f") \
+ % (game.state.date, game.state.remtime))
+ elif not req or req == 2:
+ if game.condition != "docked":
+ newcnd()
+ dam = 0
+ for t in range(0, NDEVICES):
+ if game.damage[t]>0:
+ dam += 1
+ prstat(_("Condition"), _("%s, %i DAMAGES") % (game.condition.upper(), dam))
+ elif not req or req == 3:
+ prstat(_("Position"), "%s , %s" % (game.quadrant, game.sector))
+ elif not req or req == 4:
+ if damaged(DLIFSUP):
+ if game.condition == "docked":
+ sprintf(s, _("DAMAGED, Base provides"))
+ else:
+ sprintf(s, _("DAMAGED, reserves=%4.2f") % game.lsupres)
+ else:
+ sprintf(s, _("ACTIVE"))
+ prstat(_("Life Support"), s)
+ elif not req or req == 5:
+ prstat(_("Warp Factor"), "%.1f" % (game.warpfac))
+ elif not req or req == 6:
+ extra = ""
+ if game.icrystl and (game.options & OPTION_SHOWME):
+ extra = _(" (have crystals)")
+ prstat(_("Energy"), "%.2f%s" % game.energy, extra)
+ elif not req or req == 7:
+ prstat(_("Torpedoes"), "%d" % (game.torps))
+ elif not req or req == 8:
+ if damaged(DSHIELD):
+ strcpy(s, _("DAMAGED,"))
+ elif game.shldup:
+ strcpy(s, _("UP,"))
+ else:
+ strcpy(s, _("DOWN,"))
+ data = _(" %d%% %.1f units") \
+ % (int((100.0*game.shield)/game.inshld + 0.5), game.shield)
+ prstat(_("Shields"), s)
+ elif not req or req == 9:
+ prstat(_("Klingons Left"), "%d" \
+ % (game.state.remkl + game.state.remcom + game.state.nscrem))
+ elif not req or req == 10:
+ if game.options & OPTION_WORLDS:
+ plnet = game.state.galaxy[game.quadrant.x][game.quadrant.y].planet
+ if plnet != NOPLANET and game.state.planets[plnet].inhabited:
+ prstat(_("Major system"), plnet.name)
+ else:
+ prout(_("Sector is uninhabited"))
+ elif not req or req == 11:
+ attackreport(not req)
+
+def request():
+ requests = ("da","co","po","ls","wa","en","to","sh","kl","sy", "ti")
+ while scan() == IHEOL:
+ proutn(_("Information desired? "))
+ chew()
+ if citem in requests:
+ status(requests.index(citem))
+ else:
+ prout(_("UNRECOGNIZED REQUEST. Legal requests are:"))
+ prout((" date, condition, position, lsupport, warpfactor,"))
+ prout((" energy, torpedoes, shields, klingons, system, time."))
+
+def srscan():
+ # short-range scan
+ goodScan=True
+ if damaged(DSRSENS):
+ # Allow base's sensors if docked
+ if game.condition != "docked":
+ prout(_(" S.R. SENSORS DAMAGED!"))
+ goodScan=False
+ else:
+ prout(_(" [Using Base's sensors]"))
+ else:
+ prout(_(" Short-range scan"))
+ if goodScan and not damaged(DRADIO):
+ game.state.chart[game.quadrant.x][game.quadrant.y].klingons = game.state.galaxy[game.quadrant.x][game.quadrant.y].klingons
+ game.state.chart[game.quadrant.x][game.quadrant.y].starbase = game.state.galaxy[game.quadrant.x][game.quadrant.y].starbase
+ game.state.chart[game.quadrant.x][game.quadrant.y].stars = game.state.galaxy[game.quadrant.x][game.quadrant.y].stars
+ game.state.galaxy[game.quadrant.x][game.quadrant.y].charted = True
+ prout(" 1 2 3 4 5 6 7 8 9 10")
+ if game.condition != "docked":
+ newcnd()
+ for i in range(1, QUADSIZE+1):
+ proutn("%2d " % (i))
+ for j in range(1, QUADSIZE+1):
+ sectscan(goodScan, i, j)
+ skip(1)
+
+
+def eta():
+ # use computer to get estimated time of arrival for a warp jump
+ w1 = coord(); w2 = coord()
+ prompt = False
+ if damaged(DCOMPTR):
+ prout(_("COMPUTER DAMAGED, USE A POCKET CALCULATOR."))
+ skip(1)
+ return
+ if scan() != IHREAL:
+ prompt = True
+ chew()
+ proutn(_("Destination quadrant and/or sector? "))
+ if scan()!=IHREAL:
+ huh()
+ return
+ w1.y = aaitem +0.5
+ if scan() != IHREAL:
+ huh()
+ return
+ w1.x = aaitem + 0.5
+ if scan() == IHREAL:
+ w2.y = aaitem + 0.5
+ if scan() != IHREAL:
+ huh()
+ return
+ w2.x = aaitem + 0.5
+ else:
+ if game.quadrant.y>w1.x:
+ w2.x = 1
+ else:
+ w2.x=QUADSIZE
+ if game.quadrant.x>w1.y:
+ w2.y = 1
+ else:
+ w2.y=QUADSIZE
+
+ if not VALID_QUADRANT(w1.x, w1.y) or not VALID_SECTOR(w2.x, w2.y):
+ huh()
+ return
+ game.dist = math.sqrt(square(w1.y-game.quadrant.y+0.1*(w2.y-game.sector.y))+
+ square(w1.x-game.quadrant.x+0.1*(w2.x-game.sector.x)))
+ wfl = False
+
+ if prompt:
+ prout(_("Answer \"no\" if you don't know the value:"))
+ while True:
+ chew()
+ proutn(_("Time or arrival date? "))
+ if scan()==IHREAL:
+ ttime = aaitem
+ if ttime > game.state.date:
+ ttime -= game.state.date # Actually a star date
+ twarp=(math.floor(math.sqrt((10.0*game.dist)/ttime)*10.0)+1.0)/10.0
+ if ttime <= 1e-10 or twarp > 10:
+ prout(_("We'll never make it, sir."))
+ chew()
+ return
+ if twarp < 1.0:
+ twarp = 1.0
+ break
+ chew()
+ proutn(_("Warp factor? "))
+ if scan()== IHREAL:
+ wfl = True
+ twarp = aaitem
+ if twarp<1.0 or twarp > 10.0:
+ huh()
+ return
+ break
+ prout(_("Captain, certainly you can give me one of these."))
+ while True:
+ chew()
+ ttime = (10.0*game.dist)/square(twarp)
+ tpower = game.dist*twarp*twarp*twarp*(game.shldup+1)
+ if tpower >= game.energy:
+ prout(_("Insufficient energy, sir."))
+ if not game.shldup or tpower > game.energy*2.0:
+ if not wfl:
+ return
+ proutn(_("New warp factor to try? "))
+ if scan() == IHREAL:
+ wfl = True
+ twarp = aaitem
+ if twarp<1.0 or twarp > 10.0:
+ huh()
+ return
+ continue
+ else:
+ chew()
+ skip(1)
+ return
+ prout(_("But if you lower your shields,"))
+ proutn(_("remaining"))
+ tpower /= 2
+ else:
+ proutn(_("Remaining"))
+ prout(_(" energy will be %.2f.") % (game.energy-tpower))
+ if wfl:
+ prout(_("And we will arrive at stardate %.2f.") % (game.state.date+ttime))
+ elif twarp==1.0:
+ prout(_("Any warp speed is adequate."))
+ else:
+ prout(_("Minimum warp needed is %.2f,") % (twarp))
+ prout(_("and we will arrive at stardate %.2f.") % (game.state.date+ttime))
+ if game.state.remtime < ttime:
+ prout(_("Unfortunately, the Federation will be destroyed by then."))
+ if twarp > 6.0:
+ prout(_("You'll be taking risks at that speed, Captain"))
+ if (game.isatb==1 and game.state.kscmdr == w1 and \
+ scheduled(FSCDBAS)< ttime+game.state.date) or \
+ (scheduled(FCDBAS)<ttime+game.state.date and game.battle == w1):
+ prout(_("The starbase there will be destroyed by then."))
+ proutn(_("New warp factor to try? "))
+ if scan() == IHREAL:
+ wfl = True
+ twarp = aaitem
+ if twarp<1.0 or twarp > 10.0:
+ huh()
+ return
+ else:
+ chew()
+ skip(1)
+ return
+
+
+#ifdef BSD_BUG_FOR_BUG
+# A visual scan is made in a particular direction of three sectors
+# in the general direction specified. This takes time, and
+# Klingons can attack you, so it should be done only when sensors
+# are out. Code swiped from BSD-Trek. Not presently used, as we
+# automatically display all adjacent sectors on the short-range
+# scan even when short-range sensors are out.
+
+# This struct[] has the delta x, delta y for particular directions
+
+visdelta = (
+ (-1,-1),
+ (-1, 0),
+ (-1, 1),
+ (0, 1),
+ (1, 1),
+ (1, 0),
+ (1, -1),
+ (0, -1),
+ (-1,-1),
+ (-1, 0),
+ (-1, 1),
+)
+
+def visual():
+ v = coord()
+ if scan() != IHREAL:
+ chew()
+ proutn(_("Direction? "))
+ if scan()!=IHREAL:
+ huh()
+ return
+ if aaitem < 0.0 or aaitem > 360.0:
+ return
+ co = (aaitem + 22) / 45
+ v = visdelta[co]
+ ix = game.sector.x + v.x
+ iy = game.sector.y + v.y
+ if ix < 0 or ix >= QUADSIZE or iy < 0 or iy >= QUADSIZE:
+ co = '?'
+ else:
+ co = game.quad[ix][iy]
+ printf("%d,%d %c " % (ix, iy, co))
+ v += 1
+ ix = game.sector.x + v.x
+ iy = game.sector.y + v.y
+ if ix < 0 or ix >= QUADSIZE or iy < 0 or iy >= QUADSIZE:
+ co = '?'
+ else:
+ co = game.quad[ix][iy]
+ printf("%c " % (co))
+ v += 1
+ ix = game.sector.x + v.x
+ iy = game.sector.y + v.y
+ if ix < 0 or ix >= QUADSIZE or iy < 0 or iy >= QUADSIZE:
+ co = '?'
+ else:
+ co = game.quad[ix][iy]
+ prout("%c %d,%d\n" % (co, ix, iy))
+ game.optime = 0.5
+ game.ididit = True
+#endif
+
+# Code from setup.c begins here
+
+def filelength(fd):
+ return os.fstat(fd).st_size
+
+def prelim():
+ # issue a historically correct banner
+ skip(2)
+ prout(_("-SUPER- STAR TREK"))
+ skip(1)
+#ifdef __HISTORICAL__
+# prout(_("Latest update-21 Sept 78"))
+# skip(1)
+#endif __HISTORICAL__
+
+def freeze(boss):
+ # save game
+ if boss:
+ citem = "emsave.trk"
+ else:
+ key = scan()
+ if key == IHEOL:
+ proutn(_("File name: "))
+ key = scan()
+ if key != IHALPHA:
+ huh()
+ return
+ chew()
+ if '.' not in citem:
+ citem += ".trk"
+ try:
+ fp = open(citem, "wb")
+ except IOError:
+ prout(_("Can't freeze game as file %s") % citem)
+ return
+ cPickle.dump(game, fp)
+ fp.close()
+
+def thaw():
+ # retrieve saved game
+ game.passwd[0] = '\0'
+ key = scan()
+ if key == IHEOL:
+ proutn(_("File name: "))
+ key = scan()
+ if key != IHALPHA:
+ huh()
+ return True
+ chew()
+ if '.' not in citem:
+ citem += ".trk"
+ try:
+ fp = open(citem, "rb")
+ except IOError:
+ prout(_("Can't thaw game in %s") % citem)
+ return
+ game = cPickle.load(fp)
+ fp.close()
+ return False
+
+# I used <http://www.memory-alpha.org> to find planets
+# with references in ST:TOS. Eath and the Alpha Centauri
+# Colony have been omitted.
+#
+# Some planets marked Class G and P here will be displayed as class M
+# because of the way planets are generated. This is a known bug.
+systnames = (
+ # Federation Worlds
+ _("Andoria (Fesoan)"), # several episodes
+ _("Tellar Prime (Miracht)"), # TOS: "Journey to Babel"
+ _("Vulcan (T'Khasi)"), # many episodes
+ _("Medusa"), # TOS: "Is There in Truth No Beauty?"
+ _("Argelius II (Nelphia)"),# TOS: "Wolf in the Fold" ("IV" in BSD)
+ _("Ardana"), # TOS: "The Cloud Minders"
+ _("Catulla (Cendo-Prae)"), # TOS: "The Way to Eden"
+ _("Gideon"), # TOS: "The Mark of Gideon"
+ _("Aldebaran III"), # TOS: "The Deadly Years"
+ _("Alpha Majoris I"), # TOS: "Wolf in the Fold"
+ _("Altair IV"), # TOS: "Amok Time
+ _("Ariannus"), # TOS: "Let That Be Your Last Battlefield"
+ _("Benecia"), # TOS: "The Conscience of the King"
+ _("Beta Niobe I (Sarpeidon)"), # TOS: "All Our Yesterdays"
+ _("Alpha Carinae II"), # TOS: "The Ultimate Computer"
+ _("Capella IV (Kohath)"), # TOS: "Friday's Child" (Class G)
+ _("Daran V"), # TOS: "For the World is Hollow and I Have Touched the Sky"
+ _("Deneb II"), # TOS: "Wolf in the Fold" ("IV" in BSD)
+ _("Eminiar VII"), # TOS: "A Taste of Armageddon"
+ _("Gamma Canaris IV"), # TOS: "Metamorphosis"
+ _("Gamma Tranguli VI (Vaalel)"), # TOS: "The Apple"
+ _("Ingraham B"), # TOS: "Operation: Annihilate"
+ _("Janus IV"), # TOS: "The Devil in the Dark"
+ _("Makus III"), # TOS: "The Galileo Seven"
+ _("Marcos XII"), # TOS: "And the Children Shall Lead",
+ _("Omega IV"), # TOS: "The Omega Glory"
+ _("Regulus V"), # TOS: "Amok Time
+ _("Deneva"), # TOS: "Operation -- Annihilate!"
+ # Worlds from BSD Trek
+ _("Rigel II"), # TOS: "Shore Leave" ("III" in BSD)
+ _("Beta III"), # TOS: "The Return of the Archons"
+ _("Triacus"), # TOS: "And the Children Shall Lead",
+ _("Exo III"), # TOS: "What Are Little Girls Made Of?" (Class P)
+# # Others
+# _("Hansen's Planet"), # TOS: "The Galileo Seven"
+# _("Taurus IV"), # TOS: "The Galileo Seven" (class G)
+# _("Antos IV (Doraphane)"), # TOS: "Whom Gods Destroy", "Who Mourns for Adonais?"
+# _("Izar"), # TOS: "Whom Gods Destroy"
+# _("Tiburon"), # TOS: "The Way to Eden"
+# _("Merak II"), # TOS: "The Cloud Minders"
+# _("Coridan (Desotriana)"), # TOS: "Journey to Babel"
+# _("Iotia"), # TOS: "A Piece of the Action"
+)
+
+device = (
+ _("S. R. Sensors"), \
+ _("L. R. Sensors"), \
+ _("Phasers"), \
+ _("Photon Tubes"), \
+ _("Life Support"), \
+ _("Warp Engines"), \
+ _("Impulse Engines"), \
+ _("Shields"), \
+ _("Subspace Radio"), \
+ _("Shuttle Craft"), \
+ _("Computer"), \
+ _("Navigation System"), \
+ _("Transporter"), \
+ _("Shield Control"), \
+ _("Death Ray"), \
+ _("D. S. Probe"), \
+)
+
+def setup(needprompt):
+ # prepare to play, set up cosmos
+ intj, krem, klumper
+ w = coord()
+
+ # Decide how many of everything
+ if choose(needprompt):
+ return # frozen game
+ # Prepare the Enterprise
+ game.alldone = game.gamewon = 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)
+ game.sector = randplace(QUADSIZE)
+ game.torps = game.intorps = 10
+ game.nprobes = int(3.0*Rand() + 2.0) # Give them 2-4 of these
+ game.warpfac = 5.0
+ game.wfacsq = game.warpfac * game.warpfac
+ for i in range(0, NDEVICES):
+ game.damage[i] = 0.0
+ # Set up assorted game parameters
+ invalidate(game.battle)
+ game.state.date = game.indate = 100.0*int(31.0*Rand()+20.0)
+ game.nkinks = game.nhelp = game.casual = game.abandoned = 0
+ game.iscate = game.resting = game.imine = game.icrystl = game.icraft = False
+ game.isatb = game.state.nplankl = 0
+ game.state.starkl = game.state.basekl = 0
+ game.iscraft = "onship"
+ game.landed = False
+ game.alive = True
+ game.docfac = 0.25
+ for i in range(1, GALSIZE+1):
+ for j in range(1, GALSIZE+1):
+ quad = game.state.galaxy[i][j]
+ quad.charted = 0
+ quad.planet = NOPLANET
+ quad.romulans = 0
+ quad.klingons = 0
+ quad.starbase = False
+ quad.supernova = False
+ quad.status = "secure"
+ # Initialize times for extraneous events
+ schedule(FSNOVA, expran(0.5 * game.intime))
+ schedule(FTBEAM, expran(1.5 * (game.intime / game.state.remcom)))
+ schedule(FSNAP, 1.0 + Rand()) # Force an early snapshot
+ schedule(FBATTAK, expran(0.3*game.intime))
+ unschedule(FCDBAS)
+ if game.state.nscrem:
+ schedule(FSCMOVE, 0.2777)
+ else:
+ unschedule(FSCMOVE)
+ unschedule(FSCDBAS)
+ unschedule(FDSPROB)
+ if (game.options & OPTION_WORLDS) and game.skill >= SKILL_GOOD:
+ schedule(FDISTR, expran(1.0 + game.intime))
+ else:
+ unschedule(FDISTR)
+ unschedule(FENSLV)
+ unschedule(FREPRO)
+ # Starchart is functional but we've never seen it
+ game.lastchart = FOREVER
+ # Put stars in the galaxy
+ game.instar = 0
+ for i in range(1, GALSIZE+1):
+ for j in range(1, GALSIZE+1):
+ k = Rand()*9.0 + 1.0
+ game.instar += k
+ game.state.galaxy[i][j].stars = k
+ # Locate star bases in galaxy
+ for i in range(1, game.inbase+1):
+ while True:
+ while True:
+ w = randplace(GALSIZE)
+ if not game.state.galaxy[w.x][w.y].starbase:
+ break
+ contflag = False
+ # C version: for (j = i-1; j > 0; j--)
+ # so it did them in the opposite order.
+ for j in range(i):
+ # Improved placement algorithm to spread out bases
+ distq = w.distance(baseq[j])
+ if distq < 6.0*(BASEMAX+1-game.inbase) and Rand() < 0.75:
+ contflag = True
+ if idebug:
+ prout("=== Abandoning base #%d at %s" % (i, w))
+ break
+ elif distq < 6.0 * (BASEMAX+1-game.inbase):
+ if idebug:
+ prout("=== Saving base #%d, close to #%d" % (i, j))
+ if not contflag:
+ break
+ game.state.baseq[i] = w
+ game.state.galaxy[w.x][w.y].starbase = True
+ game.state.chart[w.x][w.y].starbase = True
+ # Position ordinary Klingon Battle Cruisers
+ krem = game.inkling
+ klumper = 0.25*game.skill*(9.0-game.length)+1.0
+ if klumper > MAXKLQUAD:
+ klumper = MAXKLQUAD
+ while True:
+ r = Rand()
+ klump = (1.0 - r*r)*klumper
+ if klump > krem:
+ klump = krem
+ krem -= klump
+ while True:
+ w = randplace(GALSIZE)
+ if not game.state.galaxy[w.x][w.y].supernova and \
+ game.state.galaxy[w.x][w.y].klingons + klump <= MAXKLQUAD:
+ break
+ game.state.galaxy[w.x][w.y].klingons += klump
+ if krem <= 0:
+ break
+ # Position Klingon Commander Ships
+ for i in range(1, game.incom+1):
+ while True:
+ w = randplace(GALSIZE)
+ if (game.state.galaxy[w.x][w.y].klingons or Rand()>=0.75) and \
+ not game.state.galaxy[w.x][w.y].supernova and \
+ game.state.galaxy[w.x][w.y].klingons <= MAXKLQUAD-1 and \
+ not w in game.state.kcmdr[:i]:
+ break
+ game.state.galaxy[w.x][w.y].klingons += 1
+ game.state.kcmdr[i] = w
+ # Locate planets in galaxy
+ for i in range(game.inplan):
+ while True:
+ w = randplace(GALSIZE)
+ if game.state.galaxy[w.x][w.y].planet == NOPLANET:
+ break
+ new = planet()
+ new.w = w
+ new.crystals = "absent"
+ if (game.options & OPTION_WORLDS) and i < NINHAB:
+ new.pclass = "M" # All inhabited planets are class M
+ new.crystals = "absent"
+ new.known = "known"
+ new.name = systnames[i]
+ new.inhabited = True
+ else:
+ new.pclass = ("M", "N", "O")[Rand()*3.0]
+ if Rand()*1.5: # 1 in 3 chance of crystals
+ new.crystals = "present"
+ new.known = "unknown"
+ new.inhabited = False
+ game.state.galaxy[w.x][w.y].planet = new
+ game.state.plnets.append(new)
+ # Locate Romulans
+ for i in range(1, game.state.nromrem+1):
+ w = randplace(GALSIZE)
+ game.state.galaxy[w.x][w.y].romulans += 1
+ # Locate the Super Commander
+ if game.state.nscrem > 0:
+ while True:
+ w = randplace(GALSIZE)
+ if not game.state.galaxy[w.x][w.y].supernova and game.state.galaxy[w.x][w.y].klingons <= MXKLQUAD:
+ break
+ game.state.kscmdr = w
+ game.state.galaxy[w.x][w.y].klingons += 1
+ # Place thing (in tournament game, thingx == -1, don't want one!)
+ if thing.x != -1:
+ thing = randplace(GALSIZE)
+ else:
+ invalidate(thing)
+ skip(2)
+ game.state.snap = False
+ if game.skill == SKILL_NOVICE:
+ prout(_("It is stardate %d. The Federation is being attacked by") % int(game.state.date))
+ prout(_("a deadly Klingon invasion force. As captain of the United"))
+ prout(_("Starship U.S.S. Enterprise, it is your mission to seek out"))
+ prout(_("and destroy this invasion force of %d battle cruisers.") % ((game.inkling + game.incom + game.inscom)))
+ prout(_("You have an initial allotment of %d stardates to complete") % int(game.intime))
+ prout(_("your mission. As you proceed you may be given more time."))
+ skip(1)
+ prout(_("You will have %d supporting starbases.") % (game.inbase))
+ proutn(_("Starbase locations- "))
+ else:
+ prout(_("Stardate %d.") % int(game.state.date))
+ skip(1)
+ prout(_("%d Klingons.") % (game.inkling + game.incom + game.inscom))
+ prout(_("An unknown number of Romulans."))
+ if game.state.nscrem:
+ prout(_("And one (GULP) Super-Commander."))
+ prout(_("%d stardates.") % int(game.intime))
+ proutn(_("%d starbases in ") % game.inbase)
+ for i in range(1, game.inbase+1):
+ proutn(`game.state.baseq[i]`)
+ proutn(" ")
+ skip(2)
+ proutn(_("The Enterprise is currently in Quadrant %s") % game.quadrant)
+ proutn(_(" Sector %s") % game.sector)
+ skip(2)
+ prout(_("Good Luck!"))
+ if game.state.nscrem:
+ prout(_(" YOU'LL NEED IT."))
+ waitfor()
+ newqad(False)
+ if game.nenhere - iqhere-game.ithere:
+ game.shldup = True
+ if game.neutz: # bad luck to start in a Romulan Neutral Zone
+ attack(False)
+
+def choose(needprompt):
+ # choose your game type
+ while True:
+ game.tourn = 0
+ game.thawed = False
+ game.skill = SKILL_NONE
+ game.length = 0
+ if needprompt: # Can start with command line options
+ proutn(_("Would you like a regular, tournament, or saved game? "))
+ scan()
+ if len(citem)==0: # Try again
+ continue
+ if isit("tournament"):
+ while scan() == IHEOL:
+ proutn(_("Type in tournament number-"))
+ if aaitem == 0:
+ chew()
+ continue # We don't want a blank entry
+ game.tourn = int(aaitem)
+ thing.x = -1
+ random.seed(aaitem)
+ break
+ if isit("saved") or isit("frozen"):
+ if thaw():
+ continue
+ chew()
+ if game.passwd == None:
+ continue
+ if not game.alldone:
+ game.thawed = True # No plaque if not finished
+ report()
+ waitfor()
+ return True
+ if isit("regular"):
+ break
+ proutn(_("What is \""))
+ proutn(citem)
+ prout("\"?")
+ chew()
+ while game.length==0 or game.skill==SKILL_NONE:
+ if scan() == IHALPHA:
+ if isit("short"):
+ game.length = 1
+ elif isit("medium"):
+ game.length = 2
+ elif isit("long"):
+ game.length = 4
+ elif isit("novice"):
+ game.skill = SKILL_NOVICE
+ elif isit("fair"):
+ game.skill = SKILL_FAIR
+ elif isit("good"):
+ game.skill = SKILL_GOOD
+ elif isit("expert"):
+ game.skill = SKILL_EXPERT
+ elif isit("emeritus"):
+ game.skill = SKILL_EMERITUS
+ else:
+ proutn(_("What is \""))
+ proutn(citem)
+ prout("\"?")
+ else:
+ chew()
+ if game.length==0:
+ proutn(_("Would you like a Short, Medium, or Long game? "))
+ 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 scan() != IHALPHA:
+ chew()
+ proutn(_("Choose your game style (or just press enter): "))
+ scan()
+ if isit("plain"):
+ # Approximates the UT FORTRAN version.
+ game.options &=~ (OPTION_THOLIAN | OPTION_PLANETS | OPTION_THINGY | OPTION_PROBE | OPTION_RAMMING | OPTION_MVBADDY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS)
+ game.options |= OPTION_PLAIN
+ elif isit("almy"):
+ # Approximates Tom Almy's version.
+ game.options &=~ (OPTION_THINGY | OPTION_BLKHOLE | OPTION_BASE | OPTION_WORLDS)
+ game.options |= OPTION_ALMY
+ elif isit("fancy"):
+ pass
+ elif len(citem):
+ proutn(_("What is \"%s\"?") % citem)
+ setpassword()
+ if game.passwd == "debug":
+ idebug = True
+ fputs("=== Debug mode enabled\n", sys.stdout)
+
+ # Use parameters to generate initial values of things
+ game.damfac = 0.5 * game.skill
+ game.state.rembase = 2.0 + Rand()*(BASEMAX-2.0)
+ game.inbase = game.state.rembase
+ game.inplan = 0
+ if game.options & OPTION_PLANETS:
+ game.inplan += (MAXUNINHAB/2) + (MAXUNINHAB/2+1)*Rand()
+ if game.options & OPTION_WORLDS:
+ game.inplan += NINHAB
+ game.state.nromrem = game.inrom = (2.0+Rand())*game.skill
+ game.state.nscrem = game.inscom = (game.skill > SKILL_FAIR)
+ game.state.remtime = 7.0 * game.length
+ game.intime = game.state.remtime
+ game.state.remkl = game.inkling = 2.0*game.intime*((game.skill+1 - 2*Rand())*game.skill*0.1+.15)
+ game.incom = game.skill + 0.0625*game.inkling*Rand()
+ game.state.remcom = min(10, game.incom)
+ game.incom = game.state.remcom
+ game.state.remres = (game.inkling+4*game.incom)*game.intime
+ game.inresor = game.state.remres
+ if game.inkling > 50:
+ game.state.rembase += 1
+ game.inbase = game.state.rembase
+ return False
+
+def dropin(iquad):
+ # drop a feature on a random dot in the current quadrant
+ w = coord()
+ while True:
+ w = randplace(QUADSIZE)
+ if game.quad[w.x][w.y] == IHDOT:
+ break
+ game.quad[w.x][w.y] = iquad
+ return w
+
+def newcnd():
+ # update our alert status
+ game.condition = "green"
+ if game.energy < 1000.0:
+ game.condition = "yellow"
+ if game.state.galaxy[game.quadrant.x][game.quadrant.y].klingons or game.state.galaxy[game.quadrant.x][game.quadrant.y].romulans:
+ game.condition = "red"
+ if not game.alive:
+ game.condition="dead"
+
+def newkling(i):
+ # drop new Klingon into current quadrant
+ pi = dropin(IHK)
+ game.ks[i] = pi
+ game.kdist[i] = game.kavgd[i] = distance(game.sector, pi)
+ game.kpower[i] = Rand()*150.0 +300.0 +25.0*game.skill
+ return pi
+
+def newqad(shutup):
+ # set up a new state of quadrant, for when we enter or re-enter it
+ w = coord()
+ game.justin = True
+ invalidate(game.base)
+ game.klhere = 0
+ game.comhere = False
+ invalidate(game.plnet)
+ game.ishere = False
+ game.irhere = 0
+ game.iplnet = 0
+ game.nenhere = 0
+ game.neutz = False
+ game.inorbit = False
+ game.landed = False
+ game.ientesc = False
+ game.ithere = False
+ iqhere = False
+ iqengry = False
+ game.iseenit = False
+ if game.iscate:
+ # Attempt to escape Super-commander, so tbeam back!
+ game.iscate = False
+ game.ientesc = True
+ # Clear quadrant
+ for i in range(1, QUADSIZE+1):
+ for j in range(1, QUADSIZE+1):
+ game.quad[i][j] = IHDOT
+ q = game.state.galaxy[game.quadrant.x][game.quadrant.y]
+ # cope with supernova
+ if q.supernova:
+ return
+ game.klhere = q.klingons
+ game.irhere = q.romulans
+ game.nenhere = game.klhere + game.irhere
+
+ # Position Starship
+ game.quad[game.sector.x][game.sector.y] = game.ship
+
+ if q.klingons:
+ w.x = w.y = 0 # quiet a gcc warning
+ # Position ordinary Klingons
+ for i in range(1, game.klhere+1):
+ w = newkling(i)
+ # If we need a commander, promote a Klingon
+ for i in range(1, game.state.remcom+1):
+ if same(game.state.kcmdr[i], game.quadrant):
+ break
+
+ if i <= game.state.remcom:
+ game.quad[w.x][w.y] = IHC
+ game.kpower[game.klhere] = 950.0+400.0*Rand()+50.0*game.skill
+ game.comhere = True
+
+ # If we need a super-commander, promote a Klingon
+ if same(game.quadrant, game.state.kscmdr):
+ game.quad[game.ks[1].x][game.ks[1].y] = IHS
+ game.kpower[1] = 1175.0 + 400.0*Rand() + 125.0*game.skill
+ game.iscate = (game.state.remkl > 1)
+ game.ishere = True
+ # Put in Romulans if needed
+ for i in range(game.klhere+1, game.nenhere+1):
+ w = dropin(IHR)
+ game.ks[i] = w
+ game.kdist[i] = game.kavgd[i] = distance(game.sector, w)
+ game.kpower[i] = Rand()*400.0 + 450.0 + 50.0*game.skill
+ # If quadrant needs a starbase, put it in
+ if q.starbase:
+ game.base = dropin(IHB)
+
+ # If quadrant needs a planet, put it in
+ if q.planet != NOPLANET:
+ game.iplnet = q.planet
+ if game.state.planets[q.planet].inhabited == UNINHABITED:
+ game.plnet = dropin(IHP)
+ else:
+ game.plnet = dropin(IHW)
+ # Check for condition
+ newcnd()
+ # And finally the stars
+ for i in range(1, q.stars+1):
+ dropin(IHSTAR)
+
+ # Check for RNZ
+ if game.irhere > 0 and game.klhere == 0:
+ game.neutz = True
+ if not damaged(DRADIO):
+ skip(1)
+ prout(_("LT. Uhura- \"Captain, an urgent message."))
+ prout(_(" I'll put it on audio.\" CLICK"))
+ skip(1)
+ prout(_("INTRUDER! YOU HAVE VIOLATED THE ROMULAN NEUTRAL ZONE."))
+ prout(_("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!"))
+
+ if shutup==0:
+ # Put in THING if needed
+ if same(thing, game.quadrant):
+ w = dropin(IHQUEST)
+ thing = randplace(GALSIZE)
+ game.nenhere += 1
+ iqhere = True
+ game.ks[game.nenhere] = w
+ game.kdist[game.nenhere] = game.kavgd[game.nenhere] = \
+ distance(game.sector, w)
+ game.kpower[game.nenhere] = Rand()*6000.0 +500.0 +250.0*game.skill
+ if not damaged(DSRSENS):
+ skip(1)
+ prout(_("Mr. Spock- \"Captain, this is most unusual."))
+ prout(_(" Please examine your short-range scan.\""))
+
+ # Decide if quadrant needs a Tholian; lighten up if skill is low
+ if game.options & OPTION_THOLIAN:
+ if (game.skill < SKILL_GOOD and Rand() <= 0.02) or \
+ (game.skill == SKILL_GOOD and Rand() <= 0.05) or \
+ (game.skill > SKILL_GOOD and Rand() <= 0.08):
+ while True:
+ game.tholian.x = random.choice((1, QUADSIZE))
+ game.tholian.y = random.choice((1, QUADSIZE))
+ if game.quad[game.tholian.x][game.tholian.y] == IHDOT:
+ break
+ game.quad[game.tholian.x][game.tholian.y] = IHT
+ game.ithere = True
+ game.nenhere += 1
+ game.ks[game.nenhere] = game.tholian
+ game.kdist[game.nenhere] = game.kavgd[game.nenhere] = \
+ distance(game.sector, game.tholian)
+ game.kpower[game.nenhere] = Rand()*400.0 +100.0 +25.0*game.skill
+ # Reserve unoccupied corners
+ if game.quad[1][1]==IHDOT:
+ game.quad[1][1] = 'X'
+ if game.quad[1][QUADSIZE]==IHDOT:
+ game.quad[1][QUADSIZE] = 'X'
+ if game.quad[QUADSIZE][1]==IHDOT:
+ game.quad[QUADSIZE][1] = 'X'
+ if game.quad[QUADSIZE][QUADSIZE]==IHDOT:
+ game.quad[QUADSIZE][QUADSIZE] = 'X'
+ sortklings()
+
+ # Put in a few black holes
+ for i in range(1, 3+1):
+ if Rand() > 0.5:
+ dropin(IHBLANK)
+
+ # Take out X's in corners if Tholian present
+ if game.ithere:
+ if game.quad[1][1]=='X':
+ game.quad[1][1] = IHDOT
+ if game.quad[1][QUADSIZE]=='X':
+ game.quad[1][QUADSIZE] = IHDOT
+ if game.quad[QUADSIZE][1]=='X':
+ game.quad[QUADSIZE][1] = IHDOT
+ if game.quad[QUADSIZE][QUADSIZE]=='X':
+ game.quad[QUADSIZE][QUADSIZE] = IHDOT
+
+def sortklings():
+ # sort Klingons by distance from us
+ # The author liked bubble sort. So we will use it. :-(
+ if game.nenhere-iqhere-game.ithere < 2:
+ return
+ while True:
+ sw = False
+ for j in range(1, game.nenhere):
+ if game.kdist[j] > game.kdist[j+1]:
+ sw = True
+ t = game.kdist[j]
+ game.kdist[j] = game.kdist[j+1]
+ game.kdist[j+1] = t
+ t = game.kavgd[j]
+ game.kavgd[j] = game.kavgd[j+1]
+ game.kavgd[j+1] = t
+ k = game.ks[j].x
+ game.ks[j].x = game.ks[j+1].x
+ game.ks[j+1].x = k
+ k = game.ks[j].y
+ game.ks[j].y = game.ks[j+1].y
+ game.ks[j+1].y = k
+ t = game.kpower[j]
+ game.kpower[j] = game.kpower[j+1]
+ game.kpower[j+1] = t
+ if not sw:
+ break
+
+def setpassword():
+ # set the self-destruct password
+ if game.options & OPTION_PLAIN:
+ while True:
+ chew()
+ proutn(_("Please type in a secret password- "))
+ scan()
+ game.passwd = citem
+ if game.passwd != None:
+ break
+ else:
+ game.passwd = ""
+ for i in range(3):
+ game.passwd[i] += chr(97+int(Rand()*25))