planets.c code incorporated into Python translation.
[super-star-trek.git] / src / sst.py
index 380c1a5a67b1c2d2b2333323f786bd308fef53c1..a032cb7499fc9543ad0bcf6d93fc5cca6ed467b2 100644 (file)
@@ -34,6 +34,26 @@ def distance(c1, c2):        return math.sqrt(square(c1.x - c2.x) + square(c1.y - c2.y)
 def invalidate(w):     w.x = w.y = 0
 def is_valid(w):       return (w.x != 0 and w.y != 0)
 
 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
 class coord:
     def __init(self, x=None, y=None):
         self.x = x
@@ -64,26 +84,8 @@ class planet:
         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"
         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'
+    def __str__(self):
+        return self.name
 
 NOPLANET = None
 class quadrant:
 
 NOPLANET = None
 class quadrant:
@@ -4650,3 +4652,463 @@ def abandon():
     game.warpfac=5.0
     game.wfacsq=25.0
     return
     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 game.state.planets[i].inhabited == UNINHABITED) \
+            or idebug:
+           iknow = True
+           if idebug and game.state.planets[i].known=="unknown":
+               proutn("(Unknown) ")
+           proutn(cramlc(quadrant, 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