OK, warp flight between quadrants works now.
[super-star-trek.git] / src / sst.py
index 0c47c96064bc3f6f0a8fe2195fe0a6160f679e9f..aa22fe10418a10d26f86d952bd3a65b574e164df 100644 (file)
@@ -173,7 +173,7 @@ Also, the nav subsystem (enabling automatic course
 setting) can be damaged separately from the main computer (which
 handles weapons targeting, ETA calculation, and self-destruct).
 """
-import os, sys, math, curses, time, atexit, readline, cPickle, random, getopt
+import os,sys,math,curses,time,atexit,readline,cPickle,random,getopt,copy
 
 SSTDOC         = "/usr/share/doc/sst/sst.doc"
 DOC_NAME       = "sst.doc"
@@ -1260,7 +1260,7 @@ def ram(ibumpd, ienm, w):
     proutn("***")
     crmshp()
     prout(_(" heavily damaged."))
-    icas = 10.0+20.0*random.random()
+    icas = 10 + random.randrange(20)
     prout(_("***Sickbay reports %d casualties"), icas)
     game.casual += icas
     game.state.crew -= icas
@@ -1527,7 +1527,6 @@ def fry(hit):
     # a critical hit occured 
     if hit < (275.0-25.0*game.skill)*(1.0+0.5*random.random()):
        return
-
     ncrit = 1.0 + hit/(500.0+100.0*random.random())
     proutn(_("***CRITICAL HIT--"))
     # Select devices and cause damage
@@ -1564,42 +1563,32 @@ def attack(torps_ok):
     hitmax=0.0; hittot=0.0; chgfac=1.0
     jay = coord()
     where = "neither"
-
     # game could be over at this point, check 
     if game.alldone:
        return
-
     if idebug:
        prout("=== ATTACK!")
-
-    # Tholian gewts to move before attacking 
+    # Tholian gets to move before attacking 
     if game.ithere:
        movetholian()
-
     # if you have just entered the RNZ, you'll get a warning 
     if game.neutz: # The one chance not to be attacked 
        game.neutz = False
        return
-
     # commanders get a chance to tac-move towards you 
     if (((game.comhere or game.ishere) and not game.justin) or game.skill == SKILL_EMERITUS) and torps_ok:
        moveklings()
-
     # if no enemies remain after movement, we're done 
     if game.nenhere==0 or (game.nenhere==1 and thing == game.quadrant and not iqengry):
        return
-
     # set up partial hits if attack happens during shield status change 
     pfac = 1.0/game.inshld
     if game.shldchg:
        chgfac = 0.25+0.5*random.random()
-
     skip(1)
-
     # message verbosity control 
     if game.skill <= SKILL_FAIR:
        where = "sector"
-
     for loop in range(game.nenhere):
        if game.kpower[loop] < 0:
            continue;   # too weak to attack 
@@ -1723,7 +1712,6 @@ def attack(torps_ok):
 def deadkl(w, type, mv):
     # kill a Klingon, Tholian, Romulan, or Thingy 
     # Added mv to allow enemy to "move" before dying 
-
     crmena(True, type, sector, mv)
     # Decide what kind of enemy it is and update appropriately 
     if type == IHR:
@@ -1766,7 +1754,6 @@ def deadkl(w, type, mv):
            unschedule(FSCDBAS)
        else:
            prout("*** Internal error, deadkl() called on %s\n" % type)
-
     # For each kind of enemy, finish message to player 
     prout(_(" destroyed."))
     game.quad[w.x][w.y] = IHDOT
@@ -1923,7 +1910,6 @@ def overheat(rpow):
 
 def checkshctrl(rpow):
     # check shield control 
-       
     skip(1)
     if random.random() < 0.998:
        prout(_("Shields lowered."))
@@ -2014,7 +2000,6 @@ def phasers():
     ifast = False; no = False; itarg = True; msgflag = True
     automode = "NOTSET"
     key=0
-
     skip(1)
     # SR sensors and Computer are needed fopr automode 
     if damaged(DSRSENS) or damaged(DCOMPTR):
@@ -2038,8 +2023,8 @@ def phasers():
            return
        prout(_("Weapons Officer Sulu-  \"High-speed shield control enabled, sir.\""))
        ifast = True
-               
-    # Original code so convoluted, I re-did it all 
+    # Original code so convoluted, I re-did it all
+    # (That was Tom Almy talking about the C code, I think -- ESR)
     while automode=="NOTSET":
        key=scan()
        if key == IHALPHA:
@@ -2262,8 +2247,6 @@ def phasers():
 # only have one FDISTR/FENSLV/FREPRO sequence going at any given time
 # BSD Trek, from which we swiped the idea, can have up to 5.
 
-import math
-
 def unschedule(evtype):
     # remove an event from the schedule 
     game.future[evtype].date = FOREVER
@@ -2295,7 +2278,6 @@ def cancelrest():
            game.resting = False
            game.optime = 0.0
            return True
-
     return False
 
 def events():
@@ -2497,7 +2479,7 @@ def events():
             if game.state.remcom == 0:
                 unschedule(FTBEAM)
                 continue
-            i = random.random()*game.state.remcom+1.0
+            i = random.randrange(game.state.remcom)
             yank = square(game.state.kcmdr[i].x-game.quadrant.x) + square(game.state.kcmdr[i].y-game.quadrant.y)
             if istract or game.condition == "docked" or yank == 0:
                 # Drats! Have to reschedule 
@@ -2733,9 +2715,7 @@ def wait():
        proutn(_("Are you sure? "))
        if ja() == False:
            return
-
     # Alternate resting periods (events) with attacks 
-
     game.resting = True
     while True:
        if delay <= 0:
@@ -2778,12 +2758,10 @@ def nova(nov):
     # star goes nova 
     course = (0.0, 10.5, 12.0, 1.5, 9.0, 0.0, 3.0, 7.5, 6.0, 4.5)
     newc = coord(); scratch = coord()
-
     if random.random() < 0.05:
        # Wow! We've supernova'ed 
        supernova(False, nov)
        return
-
     # handle initial nova 
     game.quad[nov.x][nov.y] = IHDOT
     crmena(False, IHSTAR, sector, nov)
@@ -2924,7 +2902,7 @@ def nova(nov):
     game.optime = 10.0*game.dist/16.0
     skip(1)
     prout(_("Force of nova displaces starship."))
-    imove(True)
+    imove(novapush=True)
     game.optime = 10.0*game.dist/16.0
     return
        
@@ -2932,7 +2910,6 @@ def supernova(induced, w=None):
     # star goes supernova 
     num = 0; npdead = 0
     nq = coord()
-
     if w != None: 
        nq = w
     else:
@@ -2945,7 +2922,7 @@ def supernova(induced, w=None):
                stars += game.state.galaxy[nq.x][nq.y].stars
        if stars == 0:
            return # nothing to supernova exists 
-       num = random.random()*stars + 1
+       num = random.randrange(stars) + 1
        for nq.x in range(GALSIZE):
            for nq.y in range(GALSIZE):
                num -= game.state.galaxy[nq.x][nq.y].stars
@@ -2957,7 +2934,6 @@ def supernova(induced, w=None):
            proutn("=== Super nova here?")
            if ja() == True:
                nq = game.quadrant
-
     if not nq == game.quadrant or game.justin:
        # it isn't here, or we just entered (treat as enroute) 
        if communicating():
@@ -2967,7 +2943,7 @@ def supernova(induced, w=None):
     else:
        ns = coord()
        # we are in the quadrant! 
-       num = random.random()* game.state.galaxy[nq.x][nq.y].stars + 1
+       num = random.randrange(game.state.galaxy[nq.x][nq.y].stars) + 1
        for ns.x in range(QUADSIZE):
            for ns.y in range(QUADSIZE):
                if game.quad[ns.x][ns.y]==IHSTAR:
@@ -2976,7 +2952,6 @@ def supernova(induced, w=None):
                        break
            if num==0:
                break
-
        skip(1)
        prouts(_("***RED ALERT!  RED ALERT!"))
        skip(1)
@@ -3128,7 +3103,6 @@ def badpoints():
         badpt += 200.0
     return badpt
 
-
 def finish(ifin):
     # end the game, with appropriate notfications 
     igotit = False
@@ -3339,7 +3313,6 @@ def finish(ifin):
 def score():
     # compute player's score 
     timused = game.state.date - game.indate
-
     iskill = game.skill
     if (timused == 0 or (game.state.remkl + game.state.remcom + game.state.nscrem) != 0) and timused < 5.0:
        timused = 5.0
@@ -3438,7 +3411,6 @@ def plaque():
     winner = cgetline()
     # The 38 below must be 64 for 132-column paper 
     nskip = 38 - len(winner)/2
-
     fp.write("\n\n\n\n")
     # --------DRAW ENTERPRISE PICTURE. 
     fp.write("                                       EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE\n" )
@@ -3551,7 +3523,6 @@ def iostart():
        setwnd(fullscreen_window)
        textcolor(DEFAULT)
 
-
 def waitfor():
     "wait for user action -- OK to do nothing if on a TTY"
     if game.options & OPTION_CURSES:
@@ -3624,13 +3595,13 @@ def prout(line):
 def prouts(line):
     "print slowly!" 
     for c in line:
-       curses.delay_output(30)
+       time.sleep(0.03)
        proutn(c)
        if game.options & OPTION_CURSES:
            wrefresh(curwnd)
        else:
            sys.stdout.flush()
-    curses.delay_output(300)
+    time.sleep(0.03)
 
 def cgetline():
     "Get a line of input."
@@ -3750,7 +3721,7 @@ def boom(w):
        srscan_window.attron(curses.A_REVERSE)
        put_srscan_sym(w, game.quad[w.x][w.y])
        #sound(500)
-       #delay(1000)
+       #time.sleep(1.0)
        #nosound()
        srscan_window.attroff(curses.A_REVERSE)
        put_srscan_sym(w, game.quad[w.x][w.y])
@@ -3786,18 +3757,18 @@ def tracktorpedo(w, l, i, n, iquad):
        if not damaged(DSRSENS) or game.condition=="docked":
            if i != 1 and l == 1:
                drawmaps(2)
-               curses.delay_output(400)
+               time.sleep(0.4)
            if (iquad==IHDOT) or (iquad==IHBLANK):
                put_srscan_sym(w, '+')
                #sound(l*10)
-               #curses.delay_output(100)
+               #time.sleep(0.1)
                #nosound()
                put_srscan_sym(w, iquad)
            else:
                curwnd.attron(curses.A_REVERSE)
                put_srscan_sym(w, iquad)
                #sound(500)
-               #curses.delay_output(1000)
+               #time.sleep(1.0)
                #nosound()
                curwnd.attroff(curses.A_REVERSE)
                put_srscan_sym(w, iquad)
@@ -3835,7 +3806,7 @@ def imove(novapush):
     trbeam = False
 
     def no_quad_change():
-        # No quadrant change -- compute new avg enemy distances 
+        # No quadrant change -- compute new average enemy distances 
         game.quad[game.sector.x][game.sector.y] = game.ship
         if game.nenhere:
             for m in range(game.nenhere):
@@ -3850,12 +3821,10 @@ def imove(novapush):
         newcnd()
         drawmaps(0)
         setwnd(message_window)
-
     w.x = w.y = 0
     if game.inorbit:
        prout(_("Helmsman Sulu- \"Leaving standard orbit.\""))
        game.inorbit = False
-
     angle = ((15.0 - game.direc) * 0.5235988)
     deltax = -math.sin(angle)
     deltay = math.cos(angle)
@@ -3863,10 +3832,8 @@ def imove(novapush):
        bigger = math.fabs(deltax)
     else:
        bigger = math.fabs(deltay)
-               
     deltay /= bigger
     deltax /= bigger
-
     # If tractor beam is to occur, don't move full distance 
     if game.state.date+game.optime >= scheduled(FTBEAM):
        trbeam = True
@@ -3877,14 +3844,13 @@ def imove(novapush):
     game.quad[game.sector.x][game.sector.y] = IHDOT
     x = game.sector.x
     y = game.sector.y
-    n = 10.0*game.dist*bigger+0.5
-
+    n = int(10.0*game.dist*bigger+0.5)
     if n > 0:
        for m in range(1, n+1):
             x += deltax
             y += deltay
-           w.x = x + 0.5
-           w.y = y + 0.5
+           w.x = int(round(x))
+           w.y = int(round(y))
            if not VALID_SECTOR(w.x, w.y):
                # Leaving quadrant -- allow final enemy attack 
                # Don't do it if being pushed by Nova 
@@ -3903,31 +3869,30 @@ def imove(novapush):
                    if game.alldone:
                        return
                # compute final position -- new quadrant and sector 
-               x = QUADSIZE*(game.quadrant.x-1)+game.sector.x
-               y = QUADSIZE*(game.quadrant.y-1)+game.sector.y
-               w.x = x+10.0*game.dist*bigger*deltax+0.5
-               w.y = y+10.0*game.dist*bigger*deltay+0.5
+               x = (QUADSIZE*game.quadrant.x)+game.sector.x
+               y = (QUADSIZE*game.quadrant.y)+game.sector.y
+               w.x = int(round(x+10.0*game.dist*bigger*deltax))
+               w.y = int(round(y+10.0*game.dist*bigger*deltay))
                # check for edge of galaxy 
                kinks = 0
                 while True:
-                   kink = 0
-                   if w.x <= 0:
-                       w.x = -w.x + 1
-                       kink = 1
-                   if w.y <= 0:
-                       w.y = -w.y + 1
-                       kink = 1
-                   if w.x > GALSIZE*QUADSIZE:
-                       w.x = (GALSIZE*QUADSIZE*2)+1 - w.x
-                       kink = 1
-                   if w.y > GALSIZE*QUADSIZE:
-                       w.y = (GALSIZE*QUADSIZE*2)+1 - w.y
-                       kink = 1
+                   kink = False
+                   if w.x < 0:
+                       w.x = -w.x
+                       kink = True
+                   if w.y < 0:
+                       w.y = -w.y
+                       kink = True
+                   if w.x >= GALSIZE*QUADSIZE:
+                       w.x = (GALSIZE*QUADSIZE*2) - w.x
+                       kink = True
+                   if w.y >= GALSIZE*QUADSIZE:
+                       w.y = (GALSIZE*QUADSIZE*2) - w.y
+                       kink = True
                    if kink:
-                       kinks = 1
-               if not kink:
-                    break
-
+                       kinks += 1
+                    else:
+                        break
                if kinks:
                    game.nkinks += 1
                    if game.nkinks == 3:
@@ -3941,10 +3906,10 @@ def imove(novapush):
                # Compute final position in new quadrant 
                if trbeam: # Don't bother if we are to be beamed 
                    return
-               game.quadrant.x = (w.x+(QUADSIZE-1))/QUADSIZE
-               game.quadrant.y = (w.y+(QUADSIZE-1))/QUADSIZE
-               game.sector.x = w.x - QUADSIZE*(game.quadrant.x-1)
-               game.sector.y = w.y - QUADSIZE*(game.quadrant.y-1)
+               game.quadrant.x = w.x/QUADSIZE
+               game.quadrant.y = w.y/QUADSIZE
+               game.sector.x = w.x - (QUADSIZE*game.quadrant.x)
+               game.sector.y = w.y - (QUADSIZE*game.quadrant.y)
                skip(1)
                prout(_("Entering Quadrant %s.") % game.quadrant)
                game.quad[game.sector.x][game.sector.y] = game.ship
@@ -3957,7 +3922,7 @@ def imove(novapush):
                # object encountered in flight path 
                stopegy = 50.0*game.dist/game.optime
                game.dist = distance(game.sector, w) / (QUADSIZE * 1.0)
-                if iquad in (IHT. IHK, OHC, IHS, IHR, IHQUEST):
+                if iquad in (IHT, IHK, OHC, IHS, IHR, IHQUEST):
                    game.sector = w
                    ram(False, iquad, game.sector)
                    final = game.sector
@@ -4038,8 +4003,7 @@ def dock(verbose):
        prout(_("Lt. Uhura- \"Captain, an important message from the starbase:\""))
        attackreport(False)
        game.iseenit = True
-
-# 
 # This program originally required input in terms of a (clock)
 # direction and distance. Somewhere in history, it was changed to
 # cartesian coordinates. So we need to convert.  Probably
@@ -4047,25 +4011,20 @@ def dock(verbose):
 # pain if the computer isn't working! Manual mode is still confusing
 # because it involves giving x and y motions, yet the coordinates
 # are always displayed y - x, where +y is downward!
-# 
 
-def getcd(isprobe, akey):
-    # get course and distance 
-    irowq=game.quadrant.x; icolq=game.quadrant.y; key=0
+def getcourse(isprobe, akey):
+    # get course and distance
+    key = 0
+    dquad = copy.copy(game.quadrant)
     navmode = "unspecified"
     itemp = "curt"
-    incr = coord()
+    dsect = coord()
     iprompt = False
-
-    # Get course direction and distance. If user types bad values, return
-    # with DIREC = -1.0.
-    game.direc = -1.0
-       
     if game.landed and not isprobe:
        prout(_("Dummy! You can't leave standard orbit until you"))
        proutn(_("are back aboard the ship."))
        chew()
-       return
+       return False
     while navmode == "unspecified":
        if damaged(DNAVSYS):
            if isprobe:
@@ -4082,7 +4041,6 @@ def getcd(isprobe, akey):
            akey = -1
        else: 
            key = scan()
-
        if key == IHEOL:
            proutn(_("Manual or automatic- "))
            iprompt = True
@@ -4099,7 +4057,7 @@ def getcd(isprobe, akey):
            else:
                huh()
                chew()
-               return
+               return False
        else: # numeric 
            if isprobe:
                prout(_("(Manual navigation assumed.)"))
@@ -4107,7 +4065,6 @@ def getcd(isprobe, akey):
                prout(_("(Manual movement assumed.)"))
            navmode = "manual"
            break
-
     if navmode == "automatic":
        while key == IHEOL:
            if isprobe:
@@ -4117,52 +4074,53 @@ def getcd(isprobe, akey):
            chew()
            iprompt = True
            key = scan()
-
        if key != IHREAL:
            huh()
-           return
-       xi = int(aaitem-0.05)
+           return False
+       xi = int(round(aaitem))-1
        key = scan()
        if key != IHREAL:
            huh()
-           return
-       xj = int(aaitem-0.5)
+           return False
+       xj = int(round(aaitem))-1
        key = scan()
        if key == IHREAL:
            # both quadrant and sector specified 
-           xk = aaitem
+           xk = int(round(aaitem))-1
            key = scan()
            if key != IHREAL:
                huh()
-               return
-           xl = aaitem
-
-           irowq = xi + 0.5
-           icolq = xj + 0.5
-           incr.y = xk + 0.5
-           incr.x = xl + 0.5
+               return False
+           xl = int(round(aaitem))-1
+           dquad.x = xi
+           dquad.y = xj
+           dsect.y = xk
+           dsect.x = xl
        else:
+            # only one pair of numbers was specified
            if isprobe:
                # only quadrant specified -- go to center of dest quad 
-               irowq = xi + 0.5
-               icolq = xj + 0.5
-               incr.y = incr.x = 5
+               dquad.x = xi
+               dquad.y = xj
+               dsect.y = dsect.x = 4   # preserves 1-origin behavior
            else:
-               incr.y = xi + 0.5
-               incr.x = xj + 0.5
+                # only sector specified
+               dsect.y = xi
+               dsect.x = xj
            itemp = "normal"
-       if not VALID_QUADRANT(icolq,irowq) or not VALID_SECTOR(incr.x,incr.y):
+       if not VALID_QUADRANT(dquad.y,dquad.x) or not VALID_SECTOR(dsect.x,dsect.y):
            huh()
-           return
+           return False
        skip(1)
        if not isprobe:
            if itemp > "curt":
                if iprompt:
-                   prout(_("Helmsman Sulu- \"Course locked in for Sector %s.\"") % incr)
+                   prout(_("Helmsman Sulu- \"Course locked in for Sector %s.\"") % dsect)
            else:
                prout(_("Ensign Chekov- \"Course laid in, Captain.\""))
-       deltax = icolq - game.quadrant.y + 0.1*(incr.x-game.sector.y)
-       deltay = game.quadrant.x - irowq + 0.1*(game.sector.x-incr.y)
+        # the actual deltas get computed here
+       deltax = dquad.y-game.quadrant.y + 0.1*(dsect.x-game.sector.y)
+       deltay = game.quadrant.x-dquad.x + 0.1*(game.sector.x-dsect.y)
     else: # manual 
        while key == IHEOL:
            proutn(_("X and Y displacements- "))
@@ -4172,26 +4130,27 @@ def getcd(isprobe, akey):
        itemp = "verbose"
        if key != IHREAL:
            huh()
-           return
+           return False
        deltax = aaitem
        key = scan()
        if key != IHREAL:
            huh()
-           return
+           return False
        deltay = aaitem
     # Check for zero movement 
     if deltax == 0 and deltay == 0:
        chew()
-       return
+       return False
     if itemp == "verbose" and not isprobe:
        skip(1)
        prout(_("Helmsman Sulu- \"Aye, Sir.\""))
+    # Course actually laid in.
     game.dist = math.sqrt(deltax*deltax + deltay*deltay)
     game.direc = math.atan2(deltax, deltay)*1.90985932
     if game.direc < 0.0:
        game.direc += 12.0
     chew()
-    return
+    return True
 
 def impulse():
     # move under impulse power 
@@ -4202,13 +4161,11 @@ def impulse():
        prout(_("Engineer Scott- \"The impulse engines are damaged, Sir.\""))
        return
     if game.energy > 30.0:
-       getcd(False, 0)
-       if game.direc == -1.0:
+        if not getcourse(isprobe=False, akey=0):
            return
        power = 20.0 + 100.0*game.dist
     else:
        power = 30.0
-
     if power >= game.energy:
        # Insufficient power for trip 
        skip(1)
@@ -4231,7 +4188,7 @@ def impulse():
        if ja() == False:
            return
     # Activate impulse engines and pay the cost 
-    imove(False)
+    imove(novapush=False)
     game.ididit = True
     if game.alldone:
        return
@@ -4258,12 +4215,9 @@ def warp(timewarp):
            prout(_("Engineer Scott- \"Sorry, Captain. Until this damage"))
            prout(_("  is repaired, I can only give you warp 4.\""))
            return
-                       
-       # Read in course and distance 
-       getcd(False, 0)
-       if game.direc == -1.0:
+               # Read in course and distance 
+        if not getcourse(isprobe=False, akey=0):
            return
-
        # Make sure starship has enough energy for the trip 
        power = (game.dist+0.05)*game.warpfac*game.warpfac*game.warpfac*(game.shldup+1)
        if power >= game.energy:
@@ -4340,10 +4294,8 @@ def warp(timewarp):
                if game.quad[ix][iy] != IHDOT:
                    blooey = False
                    twarp = False
-                               
-
     # Activate Warp Engines and pay the cost 
-    imove(False)
+    imove(novapush=False)
     if game.alldone:
        return
     game.energy -= game.dist*game.warpfac*game.warpfac*game.warpfac*(game.shldup+1)
@@ -4404,7 +4356,6 @@ def setwarp():
 
 def atover(igrab):
     # cope with being tossed out of quadrant by supernova or yanked by beam 
-
     chew()
     # is captain on planet? 
     if game.landed:
@@ -4431,13 +4382,11 @@ def atover(igrab):
                game.icrystl = True
     if igrab:
        return
-
     # Check to see if captain in shuttle craft 
     if game.icraft:
        finish(FSTRACTOR)
     if game.alldone:
        return
-
     # Inform captain of attempt to reach safety 
     skip(1)
     while True:
@@ -4566,7 +4515,6 @@ def probe():
            prout(_("Uhura- \"The previous probe is still reporting data, Sir.\""))
        return
     key = scan()
-
     if key == IHEOL:
        # slow mode, so let Kirk know how many probes there are left
         if game.nprobes == 1:
@@ -4576,7 +4524,6 @@ def probe():
        proutn(_("Are you sure you want to fire a probe? "))
        if ja() == False:
            return
-
     game.isarmed = False
     if key == IHALPHA and citem == "armed":
        game.isarmed = True
@@ -4584,8 +4531,7 @@ def probe():
     elif key == IHEOL:
        proutn(_("Arm NOVAMAX warhead? "))
        game.isarmed = ja()
-    getcd(True, key)
-    if game.direc == -1.0:
+    if not getcourse(isprobe=True, akey=key):
        return
     game.nprobes -= 1
     angle = ((15.0 - game.direc) * 0.5235988)
@@ -4595,7 +4541,6 @@ def probe():
        bigger = math.fabs(game.probeinx)
     else:
        bigger = math.fabs(game.probeiny)
-               
     game.probeiny /= bigger
     game.probeinx /= bigger
     game.proben = 10.0*game.dist*bigger +0.5
@@ -4628,7 +4573,6 @@ def mayday():
     # yell for help from nearest starbase 
     # There's more than one way to move in this game! 
     line = 0
-
     chew()
     # Test for conditions which prevent calling for help 
     if game.condition == "docked":
@@ -4907,13 +4851,14 @@ def sensor():
        if game.iplnet.known=="shuttle_down": 
            prout(_("         Sensors show Galileo still on surface."))
        proutn(_("         Readings indicate"))
-       if game.iplnet.crystals != present:
+       if game.iplnet.crystals != "present":
            proutn(_(" no"))
        prout(_(" dilithium crystals present.\""))
        if game.iplnet.known == "unknown":
            game.iplnet.known = "known"
     elif game.iplnet.inhabited:
-        prout(_("Spock-  \"The inhabited planet %s is located at Sector %s, Captain.\"") % (game.iplnet.name, game.plnet))
+        prout(_("Spock-  \"The inhabited planet %s ") % game.iplnet.name)
+        prout(_("        is located at Sector %s, Captain.\"") % game.plnet)
 
 def beam():
     # use the transporter 
@@ -5187,7 +5132,6 @@ def shuttle():
 def deathray():
     # use the big zapper 
     r = random.random()
-       
     game.ididit = False
     skip(1)
     chew()
@@ -5446,7 +5390,7 @@ def chart():
        prout(_("(Last surveillance update %d stardates ago).") % ((int)(game.state.date-game.lastchart)))
     prout("      1    2    3    4    5    6    7    8")
     for i in range(GALSIZE):
-       proutn("%d |" % (i))
+       proutn("%d |" % (i+1))
        for j in range(GALSIZE):
            if (game.options & OPTION_SHOWME) and i == game.quadrant.x and j == game.quadrant.y:
                proutn("<")
@@ -5575,7 +5519,7 @@ def srscan():
     if game.condition != "docked":
        newcnd()
     for i in range(QUADSIZE):
-       proutn("%2d  " % (i))
+       proutn("%2d  " % (i+1))
        for j in range(QUADSIZE):
            sectscan(goodScan, i, j)
        skip(1)
@@ -5616,14 +5560,12 @@ def eta():
            w2.y = 0
        else:
            w2.y=QUADSIZE-1
-
     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:
@@ -5771,9 +5713,6 @@ def visual():
 
 # Code from setup.c begins here
 
-def filelength(fd):
-    return os.fstat(fd).st_size
-
 def prelim():
     # issue a historically correct banner 
     skip(2)
@@ -5903,7 +5842,6 @@ device = (
 def setup(needprompt):
     # prepare to play, set up cosmos 
     w = coord()
-
     #  Decide how many of everything
     if choose(needprompt):
        return # frozen game
@@ -6125,7 +6063,7 @@ def choose(needprompt):
            if aaitem == 0:
                chew()
                continue # We don't want a blank entry
-           game.tourn = int(aaitem)
+           game.tourn = int(round(aaitem))
            random.seed(aaitem)
            break
         if isit("saved") or isit("frozen"):
@@ -6274,10 +6212,8 @@ def newqad(shutup):
     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
@@ -6292,7 +6228,6 @@ def newqad(shutup):
            game.quad[w.x][w.y] = IHC
            game.kpower[game.klhere] = 950.0+400.0*random.random()+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[0].x][game.ks[0].y] = IHS
@@ -6308,7 +6243,6 @@ def newqad(shutup):
     # 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:
        game.iplnet = q.planet
@@ -6332,7 +6266,6 @@ def newqad(shutup):
            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
         global thing
@@ -6348,7 +6281,6 @@ def newqad(shutup):
                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 random.random() <= 0.02) or \
@@ -6376,12 +6308,10 @@ def newqad(shutup):
            if game.quad[QUADSIZE-1][QUADSIZE-1]==IHDOT:
                game.quad[QUADSIZE-1][QUADSIZE-1] = 'X'
     sortklings()
-
     # Put in a few black holes
     for i in range(1, 3+1):
        if random.random() > 0.5: 
            dropin(IHBLANK)
-
     # Take out X's in corners if Tholian present
     if game.ithere:
        if game.quad[0][0]=='X':
@@ -6689,7 +6619,7 @@ def makemoves():
        elif cmd == "SEED":             # set random-number seed
            key = scan()
            if key == IHREAL:
-               seed = int(aaitem)
+               seed = int(round(aaitem))
 #ifdef BSD_BUG_FOR_BUG
 #      elif cmd == "VISUAL":
 #          visual()                    # perform visual scan
@@ -6735,22 +6665,17 @@ def cramen(cmd):
     else: s = "Unknown??"
     proutn(s)
 
-def cramlc(loctype, w):
-    # name a location 
-    if loctype == "quadrant":
-       buf = _("Quadrant ")
-    elif loctype == "sector":
-       buf = _("Sector ")
-    buf += ("%d - %d" % (w.x, w.y))
-    return buf
-
 def crmena(stars, enemy, loctype, w):
     # print an enemy and his location 
     if stars:
        proutn("***")
     cramen(enemy)
     proutn(_(" at "))
-    proutn(cramlc(loctype, w))
+    if loctype == "quadrant":
+       buf = _("Quadrant ")
+    elif loctype == "sector":
+       buf = _("Sector ")
+    proutn(buf + `w`)
 
 def crmshp():
     # print our ship name 
@@ -6789,7 +6714,7 @@ def chew2():
 
 def scan():
     # Get a token from the user
-    global inqueue, line, citem
+    global inqueue, line, citem, aaitem
     aaitem = 0.0
     citem = ''
 
@@ -6919,13 +6844,13 @@ def debugme():
                            prout("Event %d canceled, no x coordinate." % (i))
                            unschedule(i)
                            continue
-                       w.x = int(aaitem)
+                       w.x = int(round(aaitem))
                        key = scan()
                        if key != IHREAL:
                            prout("Event %d canceled, no y coordinate." % (i))
                            unschedule(i)
                            continue
-                       w.y = int(aaitem)
+                       w.y = int(round(aaitem))
                        ev.quadrant = w
        chew()
     proutn("Induce supernova here? ")
@@ -6941,14 +6866,12 @@ if __name__ == '__main__':
     iqengry = False
     game = gamestate()
     idebug = 0
-
     game.options = OPTION_ALL &~ (OPTION_IOMODES | OPTION_SHOWME | OPTION_PLAIN | OPTION_ALMY)
     # Disable curses mode until the game logic is working.
     #    if os.getenv("TERM"):
     #  game.options |= OPTION_CURSES | OPTION_SHOWME
     #    else:
     game.options |= OPTION_TTY
-
     seed = time.time()
     (options, arguments) = getopt.getopt(sys.argv[1:], "r:tx")
     for (switch, val) in options:
@@ -6984,13 +6907,11 @@ if __name__ == '__main__':
        #setlinebuf(logfp)
        logfp.write("seed %d\n" % (seed))
     random.seed(seed)
-
     iostart()
     if arguments:
         inqueue = arguments
     else:
         inqueue = None
-
     while True: # Play a game 
        setwnd(fullscreen_window)
        clrscr()
@@ -7004,7 +6925,6 @@ if __name__ == '__main__':
        skip(1)
        stars()
        skip(1)
-
        if game.tourn and game.alldone:
            proutn(_("Do you want your score recorded?"))
            if ja() == True:
@@ -7016,4 +6936,3 @@ if __name__ == '__main__':
     skip(1)
     prout(_("May the Great Bird of the Galaxy roost upon your home planet."))
     raise SysExit, 0
-