From 76b6127e9fc107e3eb757b1f6764b9f4c960e066 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Wed, 4 Oct 2006 16:37:14 +0000 Subject: [PATCH] planets.c code incorporated into Python translation. --- src/sst.py | 502 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 482 insertions(+), 20 deletions(-) diff --git a/src/sst.py b/src/sst.py index 380c1a5..a032cb7 100644 --- a/src/sst.py +++ b/src/sst.py @@ -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) +# 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 @@ -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" - -# 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: @@ -4650,3 +4652,463 @@ def abandon(): 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 -- 2.31.1