Equates for display character names made sense when the values were
[super-star-trek.git] / src / sst.py
index 7ca3fb7b62a7f2aa7513bce1a56f72dd448a26ab..637a65db0033cbc66e1be7d5caee8881cd37ee4f 100644 (file)
 #!/usr/bin/env python
 """
 #!/usr/bin/env python
 """
-sst.py =-- Super Star Trek in Python
-
-This code is a Python translation of a C translation of a FORTRAN
-original dating back to 1973.  Beautiful Python it is not.  But it
-works.
-
-Dave Matuszek says:
-
-SRSCAN, MOVE, PHASERS, CALL, STATUS, IMPULSE, PHOTONS, ABANDON,
-LRSCAN, WARP, SHIELDS, DESTRUCT, CHART, REST, DOCK, QUIT, and DAMAGE
-were in the original non-"super" version of UT FORTRAN Star Trek.
-
-Tholians were not in the original. Dave is dubious about their merits.
-(They are now controlled by OPTION_THOLIAN and turned off if the game
-type is "plain".)
-
-Planets and dilithium crystals were not in the original.  Dave is OK
-with this idea. (It's now controlled by OPTION_PLANETS and turned 
-off if the game type is "plain".)
+sst.py -- Super Star Trek 2K
 
 
-Dave says the bit about the Galileo getting turned into a
-McDonald's is "consistant with our original vision".  (This has been
-left permanently enabled, as it can only happen if OPTION_PLANETS
-is on.)
+SST2K is a Python translation of a C translation of a FORTRAN
+original dating back to 1973.  Beautiful Python it is not, but it
+works.  Translation by Eric S. Raymond; original game by David Matuszek
+and Paul Reynolds, with modifications by Don Smith, Tom Almy,
+Stas Sergeev, and Eric S. Raymond.
 
 
-Dave also says the Space Thingy should not be preserved across saved
-games, so you can't prove to others that you've seen it.  He says it
-shouldn't fire back, either.  It should do nothing except scream and
-disappear when hit by photon torpedos.  It's OK that it may move
-when attacked, but it didn't in the original.  (Whether the Thingy
-can fire back is now controlled by OPTION_THINGY and turned off if the
-game type is "plain" or "almy".  The no-save behavior has been restored.)
-
-The Faerie Queen, black holes, and time warping were in the original.
-
-Here are Tom Almy's changes:
-
-In early 1997, I got the bright idea to look for references to
-"Super Star Trek" on the World Wide Web. There weren't many hits,
-but there was one that came up with 1979 Fortran sources! This
-version had a few additional features that mine didn't have,
-however mine had some feature it didn't have. So I merged its
-features that I liked. I also took a peek at the DECUS version (a
-port, less sources, to the PDP-10), and some other variations.
-
-1, Compared to the original UT version, I've changed the "help"
-command to "call" and the "terminate" command to "quit" to better
-match user expectations. The DECUS version apparently made those
-changes as well as changing "freeze" to "save". However I like
-"freeze".  (Both "freeze" and "save" work in SST2K.)
-
-2. The experimental deathray originally had only a 5% chance of
-success, but could be used repeatedly. I guess after a couple
-years of use, it was less "experimental" because the 1979
-version had a 70% success rate. However it was prone to breaking
-after use. I upgraded the deathray, but kept the original set of
-failure modes (great humor!).  (Now controlled by OPTION_DEATHRAY
-and turned off if game type is "plain".)
-
-3. The 1979 version also mentions srscan and lrscan working when
-docked (using the starbase's scanners), so I made some changes here
-to do this (and indicating that fact to the player), and then realized
-the base would have a subspace radio as well -- doing a Chart when docked
-updates the star chart, and all radio reports will be heard. The Dock
-command will also give a report if a base is under attack.
-
-4. Tholian Web from the 1979 version.  (Now controlled by
-OPTION_THOLIAN and turned off if game type is "plain".)
-
-5. Enemies can ram the Enterprise. (Now controlled by OPTION_RAMMING
-and turned off if game type is "plain".)
-
-6. Regular Klingons and Romulans can move in Expert and Emeritus games. 
-This code could use improvement. (Now controlled by OPTION_MVBADDY
-and turned off if game type is "plain".)
-
-7. The deep-space probe feature from the DECUS version.  (Now controlled
-by OPTION_PROBE and turned off if game type is "plain").
-
-8. 'emexit' command from the 1979 version.
-
-9. Bugfix: Klingon commander movements are no longer reported if long-range 
-sensors are damaged.
-
-10. Bugfix: Better base positioning at startup (more spread out).
-That made sense to add because most people abort games with 
-bad base placement.
-
-In June 2002, I fixed two known bugs and a documentation typo.
-In June 2004 I fixed a number of bugs involving: 1) parsing invalid
-numbers, 2) manual phasers when SR scan is damaged and commander is
-present, 3) time warping into the future, 4) hang when moving
-klingons in crowded quadrants.  (These fixes are in SST2K.)
-
-Here are Stas Sergeev's changes:
-
-1. The Space Thingy can be shoved, if you ram it, and can fire back if 
-fired upon. (Now controlled by OPTION_THINGY and turned off if game 
-type is "plain" or "almy".)
-
-2. When you are docked, base covers you with an almost invincible shield. 
-(A commander can still ram you, or a Romulan can destroy the base,
-or a SCom can even succeed with direct attack IIRC, but this rarely 
-happens.)  (Now controlled by OPTION_BASE and turned off if game 
-type is "plain" or "almy".)
-
-3. Ramming a black hole is no longer instant death.  There is a
-chance you might get timewarped instead. (Now controlled by 
-OPTION_BLKHOLE and turned off if game type is "plain" or "almy".)
-
-4. The Tholian can be hit with phasers.
-
-5. SCom can't escape from you if no more enemies remain 
-(without this, chasing SCom can take an eternity).
-
-6. Probe target you enter is now the destination quadrant. Before I don't 
-remember what it was, but it was something I had difficulty using.
-
-7. Secret password is now autogenerated.
-
-8. "Plaque" is adjusted for A4 paper :-)
-
-9. Phasers now tells you how much energy needed, but only if the computer 
-is alive.
-
-10. Planets are auto-scanned when you enter the quadrant.
-
-11. Mining or using crystals in presense of enemy now yields an attack.
-There are other minor adjustments to what yields an attack
-and what does not.
-
-12. "freeze" command reverts to "save", most people will understand this
-better anyway. (SST2K recognizes both.)
-
-13. Screen-oriented interface, with sensor scans always up.  (SST2K
-supports both screen-oriented and TTY modes.)
-
-Eric Raymond's changes:
-
-Mainly, I translated this C code out of FORTRAN into C -- created #defines
-for a lot of magic numbers and refactored the heck out of it.
-
-1. "sos" and "call" becomes "mayday", "freeze" and "save" are both good.
-
-2. Status report now indicates when dilithium crystals are on board.
-
-3. Per Dave Matuszek's remarks, Thingy state is never saved across games.
-
-4. Added game option selection so you can play a close (but not bug-for-
-bug identical) approximation of older versions.
-
-5. Half the quadrants now have inhabited planets, from which one 
-cannot mine dilithium (there will still be the same additional number
-of dilithium-bearing planets).  Torpedoing an inhabited world is *bad*.
-There is BSD-Trek-like logic for Klingons to attack and enslave 
-inhabited worlds, producing more ships (only is skill is 'good' or 
-better). (Controlled by OPTION_WORLDS and turned off if game 
-type is "plain" or "almy".)
-
-6. User input is now logged so we can do regression testing.
-
-7. More BSD-Trek features: You can now lose if your entire crew
-dies in battle.  When abandoning ship in a game with inhabited
-worlds enabled, they must have one in the quadrant to beam down
-to; otherwise they die in space and this counts heavily against
-your score.  Docking at a starbase replenishes your crew.
-
-8. Still more BSD-Trek: we now have a weighted damage table.
-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).
-
-After these features were added, I translated this into Python and added
-more:
-
-9. A long-range scan is done silently whenever you call CHART; thus
-the LRSCAN command is no longer needed.  (Controlled by OPTION_AUTOSCAN
-and turned off if game type is "plain" or "almy".)
+See the doc/HACKING file in the distribution for designers notes and advice
+ion how to modify (and how not to modify!) this code.
 """
 import os, sys, math, curses, time, readline, cPickle, random, copy, gettext
 
 """
 import os, sys, math, curses, time, readline, cPickle, random, copy, gettext
 
@@ -201,26 +33,6 @@ FOREVER     = 1e30
 MAXBURST       = 3
 MINCMDR        = 10
 
 MAXBURST       = 3
 MINCMDR        = 10
 
-# 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 TrekError:
     pass
 
 class TrekError:
     pass
 
@@ -435,10 +247,10 @@ class enemy:
         motion = (loc != self.kloc)
         if self.kloc.i is not None and self.kloc.j is not None:
             if motion:
         motion = (loc != self.kloc)
         if self.kloc.i is not None and self.kloc.j is not None:
             if motion:
-                if self.type == IHT:
-                    game.quad[self.kloc.i][self.kloc.j] = IHWEB
+                if self.type == 'T':
+                    game.quad[self.kloc.i][self.kloc.j] = '#'
                 else:
                 else:
-                    game.quad[self.kloc.i][self.kloc.j] = IHDOT
+                    game.quad[self.kloc.i][self.kloc.j] = '.'
         if loc:
             self.kloc = copy.copy(loc)
             game.quad[self.kloc.i][self.kloc.j] = self.type
         if loc:
             self.kloc = copy.copy(loc)
             game.quad[self.kloc.i][self.kloc.j] = self.type
@@ -539,25 +351,6 @@ class gamestate:
         # if the only remaining klingon is SCOM.
         game.state.remtime = game.state.remres/(game.state.remkl + 4*len(game.state.kcmdr))
 
         # if the only remaining klingon is SCOM.
         game.state.remtime = game.state.remres/(game.state.remkl + 4*len(game.state.kcmdr))
 
-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'
-
 FWON = 0
 FDEPLETE = 1
 FLIFESUP = 2
 FWON = 0
 FDEPLETE = 1
 FLIFESUP = 2
@@ -615,11 +408,11 @@ def tryexit(enemy, look, irun):
     iq.j = game.quadrant.j+(look.j+(QUADSIZE-1))/QUADSIZE - 1
     if not welcoming(iq):
        return False;
     iq.j = game.quadrant.j+(look.j+(QUADSIZE-1))/QUADSIZE - 1
     if not welcoming(iq):
        return False;
-    if enemy.type == IHR:
+    if enemy.type == 'R':
        return False; # Romulans cannot escape! 
     if not irun:
        # avoid intruding on another commander's territory 
        return False; # Romulans cannot escape! 
     if not irun:
        # avoid intruding on another commander's territory 
-       if enemy.type == IHC:
+       if enemy.type == 'C':
             if iq in game.state.kcmdr:
                 return False
            # refuse to leave if currently attacking starbase 
             if iq in game.state.kcmdr:
                 return False
            # refuse to leave if currently attacking starbase 
@@ -642,7 +435,7 @@ def tryexit(enemy, look, irun):
     # Handle global matters related to escape 
     game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons -= 1
     game.state.galaxy[iq.i][iq.j].klingons += 1
     # Handle global matters related to escape 
     game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons -= 1
     game.state.galaxy[iq.i][iq.j].klingons += 1
-    if enemy.type==IHS:
+    if enemy.type=='S':
        game.iscate = False
        game.ientesc = False
        game.isatb = 0
        game.iscate = False
        game.ientesc = False
        game.isatb = 0
@@ -706,7 +499,7 @@ def movebaddy(enemy):
     dist1 = enemy.kdist
     mdist = int(dist1 + 0.5); # Nearest integer distance 
     # If SC, check with spy to see if should hi-tail it 
     dist1 = enemy.kdist
     mdist = int(dist1 + 0.5); # Nearest integer distance 
     # If SC, check with spy to see if should hi-tail it 
-    if enemy.type==IHS and \
+    if enemy.type=='S' and \
        (enemy.kpower <= 500.0 or (game.condition=="docked" and not damaged(DPHOTON))):
        irun = True
        motion = -QUADSIZE
        (enemy.kpower <= 500.0 or (game.condition=="docked" and not damaged(DPHOTON))):
        irun = True
        motion = -QUADSIZE
@@ -796,10 +589,10 @@ def movebaddy(enemy):
                    break
                look.j = next.j + krawlj
                krawlj = -krawlj
                    break
                look.j = next.j + krawlj
                krawlj = -krawlj
-           elif (game.options & OPTION_RAMMING) and game.quad[look.i][look.j] != IHDOT:
+           elif (game.options & OPTION_RAMMING) and game.quad[look.i][look.j] != '.':
                # See if enemy should ram ship 
                if game.quad[look.i][look.j] == game.ship and \
                # See if enemy should ram ship 
                if game.quad[look.i][look.j] == game.ship and \
-                   (enemy.type == IHC or enemy.type == IHS):
+                   (enemy.type == 'C' or enemy.type == 'S'):
                    collision(rammed=True, enemy=enemy)
                    return
                if krawli != m.i and m.j != 0:
                    collision(rammed=True, enemy=enemy)
                    return
                if krawli != m.i and m.j != 0:
@@ -837,11 +630,11 @@ def moveklings():
     # and do move
     if game.quadrant in game.state.kcmdr:
         for enemy in game.enemies:
     # and do move
     if game.quadrant in game.state.kcmdr:
         for enemy in game.enemies:
-           if enemy.type == IHC:
+           if enemy.type == 'C':
                movebaddy(enemy)
     if game.state.kscmdr==game.quadrant:
         for enemy in game.enemies:
                movebaddy(enemy)
     if game.state.kscmdr==game.quadrant:
         for enemy in game.enemies:
-           if enemy.type == IHS:
+           if enemy.type == 'S':
                movebaddy(enemy)
                break
     # If skill level is high, move other Klingons and Romulans too!
                movebaddy(enemy)
                break
     # If skill level is high, move other Klingons and Romulans too!
@@ -849,7 +642,7 @@ def moveklings():
     # commander(s) do.
     if game.skill >= SKILL_EXPERT and (game.options & OPTION_MVBADDY):
         for enemy in game.enemies:
     # commander(s) do.
     if game.skill >= SKILL_EXPERT and (game.options & OPTION_MVBADDY):
         for enemy in game.enemies:
-            if enemy.type in (IHK, IHR):
+            if enemy.type in ('K', 'R'):
                movebaddy(enemy)
     game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
 
                movebaddy(enemy)
     game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
 
@@ -871,7 +664,7 @@ def movescom(iq, avoid):
        game.ientesc = False
        unschedule(FSCDBAS)
        for enemy in game.enemies:
        game.ientesc = False
        unschedule(FSCDBAS)
        for enemy in game.enemies:
-           if enemy.type == IHS:
+           if enemy.type == 'S':
                break
        enemy.move(None)
        game.klhere -= 1
                break
        enemy.move(None)
        game.klhere -= 1
@@ -1031,34 +824,34 @@ def movetholian():
         prout("***Internal error: Tholian in a bad spot.")
        return
     # do nothing if we are blocked 
         prout("***Internal error: Tholian in a bad spot.")
        return
     # do nothing if we are blocked 
-    if game.quad[id.i][id.j] not in (IHDOT, IHWEB):
+    if game.quad[id.i][id.j] not in ('.', '#'):
        return
     here = copy.copy(game.tholian.kloc)
     delta = (id - game.tholian.kloc).sgn()
     # move in x axis 
     while here.i != id.i:
         here.i += delta.i
        return
     here = copy.copy(game.tholian.kloc)
     delta = (id - game.tholian.kloc).sgn()
     # move in x axis 
     while here.i != id.i:
         here.i += delta.i
-        if game.quad[here.i][here.j]==IHDOT:
+        if game.quad[here.i][here.j]=='.':
             game.tholian.move(here)
     # move in y axis 
     while here.j != id.j:
         here.j += delta.j
             game.tholian.move(here)
     # move in y axis 
     while here.j != id.j:
         here.j += delta.j
-        if game.quad[here.i][here.j]==IHDOT:
+        if game.quad[here.i][here.j]=='.':
             game.tholian.move(here)
     # check to see if all holes plugged 
     for i in range(QUADSIZE):
             game.tholian.move(here)
     # check to see if all holes plugged 
     for i in range(QUADSIZE):
-       if game.quad[0][i]!=IHWEB and game.quad[0][i]!=IHT:
+       if game.quad[0][i]!='#' and game.quad[0][i]!='T':
            return
            return
-       if game.quad[QUADSIZE-1][i]!=IHWEB and game.quad[QUADSIZE-1][i]!=IHT:
+       if game.quad[QUADSIZE-1][i]!='#' and game.quad[QUADSIZE-1][i]!='T':
            return
            return
-       if game.quad[i][0]!=IHWEB and game.quad[i][0]!=IHT:
+       if game.quad[i][0]!='#' and game.quad[i][0]!='T':
            return
            return
-       if game.quad[i][QUADSIZE-1]!=IHWEB and game.quad[i][QUADSIZE-1]!=IHT:
+       if game.quad[i][QUADSIZE-1]!='#' and game.quad[i][QUADSIZE-1]!='T':
            return
     # All plugged up -- Tholian splits 
            return
     # All plugged up -- Tholian splits 
-    game.quad[game.tholian.kloc.i][game.tholian.kloc.j]=IHWEB
-    dropin(IHBLANK)
-    prout(crmena(True, IHT, "sector", game.tholian) + _(" completes web."))
+    game.quad[game.tholian.kloc.i][game.tholian.kloc.j]='#'
+    dropin(' ')
+    prout(crmena(True, 'T', "sector", game.tholian) + _(" completes web."))
     game.tholian.move(None)
     return
 
     game.tholian.move(None)
     return
 
@@ -1228,7 +1021,7 @@ def collision(rammed, enemy):
     skip(2)
     proutn("***")
     proutn(crmshp())
     skip(2)
     proutn("***")
     proutn(crmshp())
-    hardness = {IHR:1.5, IHC:2.0, IHS:2.5, IHT:0.5, IHQUEST:4.0}.get(enemy.type, 1.0)
+    hardness = {'R':1.5, 'C':2.0, 'S':2.5, 'T':0.5, '?':4.0}.get(enemy.type, 1.0)
     if rammed:
         proutn(_(" rammed by "))
     else:
     if rammed:
         proutn(_(" rammed by "))
     else:
@@ -1282,12 +1075,12 @@ def torpedo(origin, bearing, dispersion, number, nburst):
            break
        iquad=game.quad[w.i][w.j]
        tracktorpedo(origin, w, step, number, nburst, iquad)
            break
        iquad=game.quad[w.i][w.j]
        tracktorpedo(origin, w, step, number, nburst, iquad)
-       if iquad==IHDOT:
+       if iquad=='.':
            continue
        # hit something 
        if not damaged(DSRSENS) or game.condition == "docked":
            skip(1);    # start new line after text track 
            continue
        # hit something 
        if not damaged(DSRSENS) or game.condition == "docked":
            skip(1);    # start new line after text track 
-       if iquad in (IHE, IHF): # Hit our ship 
+       if iquad in ('E', 'F'): # Hit our ship 
            skip(1)
            prout(_("Torpedo hits %s.") % crmshp())
            hit = 700.0 + randreal(100) - \
            skip(1)
            prout(_("Torpedo hits %s.") % crmshp())
            hit = 700.0 + randreal(100) - \
@@ -1302,24 +1095,24 @@ def torpedo(origin, bearing, dispersion, number, nburst):
             bumpto = displacement.sector()
            if not bumpto.valid_sector():
                return hit
             bumpto = displacement.sector()
            if not bumpto.valid_sector():
                return hit
-           if game.quad[bumpto.i][bumpto.j]==IHBLANK:
+           if game.quad[bumpto.i][bumpto.j]==' ':
                finish(FHOLE)
                return hit
                finish(FHOLE)
                return hit
-           if game.quad[bumpto.i][bumpto.j]!=IHDOT:
+           if game.quad[bumpto.i][bumpto.j]!='.':
                # can't move into object 
                return hit
            game.sector = bumpto
            proutn(crmshp())
                # can't move into object 
                return hit
            game.sector = bumpto
            proutn(crmshp())
-            game.quad[w.i][w.j]=IHDOT
+            game.quad[w.i][w.j]='.'
             game.quad[bumpto.i][bumpto.j]=iquad
             prout(_(" displaced by blast to Sector %s ") % bumpto)
             for enemy in game.enemies:
                 enemy.kdist = enemy.kavgd = (game.sector-enemy.kloc).distance()
             game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
             return None
             game.quad[bumpto.i][bumpto.j]=iquad
             prout(_(" displaced by blast to Sector %s ") % bumpto)
             for enemy in game.enemies:
                 enemy.kdist = enemy.kavgd = (game.sector-enemy.kloc).distance()
             game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
             return None
-       elif iquad in (IHC, IHS, IHR, IHK): # Hit a regular enemy 
+       elif iquad in ('C', 'S', 'R', 'K'): # Hit a regular enemy 
            # find the enemy 
            # find the enemy 
-           if iquad in (IHC, IHS) and withprob(0.05):
+           if iquad in ('C', 'S') and withprob(0.05):
                prout(crmena(True, iquad, "sector", w) + _(" uses anti-photon device;"))
                prout(_("   torpedo neutralized."))
                return None
                prout(crmena(True, iquad, "sector", w) + _(" uses anti-photon device;"))
                prout(_("   torpedo neutralized."))
                return None
@@ -1346,63 +1139,63 @@ def torpedo(origin, bearing, dispersion, number, nburst):
             if not bumpto.valid_sector():
                prout(_(" damaged but not destroyed."))
                return
             if not bumpto.valid_sector():
                prout(_(" damaged but not destroyed."))
                return
-           if game.quad[bumpto.i][bumpto.j] == IHBLANK:
+           if game.quad[bumpto.i][bumpto.j] == ' ':
                prout(_(" buffeted into black hole."))
                deadkl(w, iquad, bumpto)
                prout(_(" buffeted into black hole."))
                deadkl(w, iquad, bumpto)
-           if game.quad[bumpto.i][bumpto.j] != IHDOT:
+           if game.quad[bumpto.i][bumpto.j] != '.':
                prout(_(" damaged but not destroyed."))
             else:
                 prout(_(" damaged-- displaced by blast to Sector %s ")%bumpto)
                 enemy.kloc = bumpto
                prout(_(" damaged but not destroyed."))
             else:
                 prout(_(" damaged-- displaced by blast to Sector %s ")%bumpto)
                 enemy.kloc = bumpto
-                game.quad[w.i][w.j]=IHDOT
+                game.quad[w.i][w.j]='.'
                 game.quad[bumpto.i][bumpto.j]=iquad
                 for enemy in game.enemies:
                     enemy.kdist = enemy.kavgd = (game.sector-enemy.kloc).distance()
                 game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
             return None
                 game.quad[bumpto.i][bumpto.j]=iquad
                 for enemy in game.enemies:
                     enemy.kdist = enemy.kavgd = (game.sector-enemy.kloc).distance()
                 game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
             return None
-       elif iquad == IHB: # Hit a base 
+       elif iquad == 'B': # Hit a base 
            skip(1)
            prout(_("***STARBASE DESTROYED.."))
             game.state.baseq = filter(lambda x: x != game.quadrant, game.state.baseq)
            skip(1)
            prout(_("***STARBASE DESTROYED.."))
             game.state.baseq = filter(lambda x: x != game.quadrant, game.state.baseq)
-           game.quad[w.i][w.j]=IHDOT
+           game.quad[w.i][w.j]='.'
            game.base.invalidate()
            game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase -= 1
            game.state.chart[game.quadrant.i][game.quadrant.j].starbase -= 1
            game.state.basekl += 1
            newcnd()
            return None
            game.base.invalidate()
            game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase -= 1
            game.state.chart[game.quadrant.i][game.quadrant.j].starbase -= 1
            game.state.basekl += 1
            newcnd()
            return None
-       elif iquad == IHP: # Hit a planet 
+       elif iquad == 'P': # Hit a planet 
            prout(crmena(True, iquad, "sector", w) + _(" destroyed."))
            game.state.nplankl += 1
            game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None
            game.iplnet.pclass = "destroyed"
            game.iplnet = None
            game.plnet.invalidate()
            prout(crmena(True, iquad, "sector", w) + _(" destroyed."))
            game.state.nplankl += 1
            game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None
            game.iplnet.pclass = "destroyed"
            game.iplnet = None
            game.plnet.invalidate()
-           game.quad[w.i][w.j] = IHDOT
+           game.quad[w.i][w.j] = '.'
            if game.landed:
                # captain perishes on planet 
                finish(FDPLANET)
            return None
            if game.landed:
                # captain perishes on planet 
                finish(FDPLANET)
            return None
-       elif iquad == IHW: # Hit an inhabited world -- very bad! 
+       elif iquad == '@': # Hit an inhabited world -- very bad! 
            prout(crmena(True, iquad, "sector", w) + _(" destroyed."))
            game.state.nworldkl += 1
            game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None
            game.iplnet.pclass = "destroyed"
            game.iplnet = None
            game.plnet.invalidate()
            prout(crmena(True, iquad, "sector", w) + _(" destroyed."))
            game.state.nworldkl += 1
            game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None
            game.iplnet.pclass = "destroyed"
            game.iplnet = None
            game.plnet.invalidate()
-           game.quad[w.i][w.j] = IHDOT
+           game.quad[w.i][w.j] = '.'
            if game.landed:
                # captain perishes on planet 
                finish(FDPLANET)
            prout(_("The torpedo destroyed an inhabited planet."))
            return None
            if game.landed:
                # captain perishes on planet 
                finish(FDPLANET)
            prout(_("The torpedo destroyed an inhabited planet."))
            return None
-       elif iquad == IHSTAR: # Hit a star 
+       elif iquad == '*': # Hit a star 
            if withprob(0.9):
                nova(w)
             else:
            if withprob(0.9):
                nova(w)
             else:
-                prout(crmena(True, IHSTAR, "sector", w) + _(" unaffected by photon blast."))
+                prout(crmena(True, '*', "sector", w) + _(" unaffected by photon blast."))
            return None
            return None
-       elif iquad == IHQUEST: # Hit a thingy 
+       elif iquad == '?': # Hit a thingy 
            if not (game.options & OPTION_THINGY) or withprob(0.3):
                skip(1)
                prouts(_("AAAAIIIIEEEEEEEEAAAAAAAAUUUUUGGGGGHHHHHHHHHHHH!!!"))
            if not (game.options & OPTION_THINGY) or withprob(0.3):
                skip(1)
                prouts(_("AAAAIIIIEEEEEEEEAAAAAAAAUUUUUGGGGGHHHHHHHHHHHH!!!"))
@@ -1420,32 +1213,32 @@ def torpedo(origin, bearing, dispersion, number, nburst):
                thing.angry = True
                shoved = True
            return None
                thing.angry = True
                shoved = True
            return None
-       elif iquad == IHBLANK: # Black hole 
+       elif iquad == ' ': # Black hole 
            skip(1)
            skip(1)
-           prout(crmena(True, IHBLANK, "sector", w) + _(" swallows torpedo."))
+           prout(crmena(True, ' ', "sector", w) + _(" swallows torpedo."))
            return None
            return None
-       elif iquad == IHWEB: # hit the web 
+       elif iquad == '#': # hit the web 
            skip(1)
            prout(_("***Torpedo absorbed by Tholian web."))
            return None
            skip(1)
            prout(_("***Torpedo absorbed by Tholian web."))
            return None
-       elif iquad == IHT:  # Hit a Tholian 
+       elif iquad == 'T':  # Hit a Tholian 
            h1 = 700.0 + randrange(100) - \
                1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-angle))
            h1 = math.fabs(h1)
            if h1 >= 600:
            h1 = 700.0 + randrange(100) - \
                1000.0 * (w-origin).distance() * math.fabs(math.sin(bullseye-angle))
            h1 = math.fabs(h1)
            if h1 >= 600:
-               game.quad[w.i][w.j] = IHDOT
+               game.quad[w.i][w.j] = '.'
                deadkl(w, iquad, w)
                game.tholian = None
                return None
            skip(1)
                deadkl(w, iquad, w)
                game.tholian = None
                return None
            skip(1)
-           proutn(crmena(True, IHT, "sector", w))
+           proutn(crmena(True, 'T', "sector", w))
            if withprob(0.05):
                prout(_(" survives photon blast."))
                return None
            prout(_(" disappears."))
            game.tholian.move(None)
            if withprob(0.05):
                prout(_(" survives photon blast."))
                return None
            prout(_(" disappears."))
            game.tholian.move(None)
-           game.quad[w.i][w.j] = IHWEB
-           dropin(IHBLANK)
+           game.quad[w.i][w.j] = '#'
+           dropin(' ')
            return None
         else: # Problem!
            skip(1)
            return None
         else: # Problem!
            skip(1)
@@ -1530,15 +1323,15 @@ def attack(torps_ok):
            r *= 0.25
        if enemy.kpower < 500:
            r *= 0.25; 
            r *= 0.25
        if enemy.kpower < 500:
            r *= 0.25; 
-       if enemy.type==IHT or (enemy.type==IHQUEST and not thing.angry):
+       if enemy.type=='T' or (enemy.type=='?' and not thing.angry):
            continue
        # different enemies have different probabilities of throwing a torp 
        usephasers = not torps_ok or \
            continue
        # different enemies have different probabilities of throwing a torp 
        usephasers = not torps_ok or \
-           (enemy.type == IHK and r > 0.0005) or \
-           (enemy.type==IHC and r > 0.015) or \
-           (enemy.type==IHR and r > 0.3) or \
-           (enemy.type==IHS and r > 0.07) or \
-           (enemy.type==IHQUEST and r > 0.05)
+           (enemy.type == 'K' and r > 0.0005) or \
+           (enemy.type=='C' and r > 0.015) or \
+           (enemy.type=='R' and r > 0.3) or \
+           (enemy.type=='S' and r > 0.07) or \
+           (enemy.type=='?' and r > 0.05)
        if usephasers:      # Enemy uses phasers 
            if game.condition == "docked":
                continue; # Don't waste the effort! 
        if usephasers:      # Enemy uses phasers 
            if game.condition == "docked":
                continue; # Don't waste the effort! 
@@ -1639,15 +1432,15 @@ def deadkl(w, type, mv):
     # Added mv to allow enemy to "move" before dying 
     proutn(crmena(True, type, "sector", mv))
     # Decide what kind of enemy it is and update appropriately 
     # Added mv to allow enemy to "move" before dying 
     proutn(crmena(True, type, "sector", mv))
     # Decide what kind of enemy it is and update appropriately 
-    if type == IHR:
+    if type == 'R':
         # Chalk up a Romulan 
         game.state.galaxy[game.quadrant.i][game.quadrant.j].romulans -= 1
         game.irhere -= 1
         game.state.nromrem -= 1
         # Chalk up a Romulan 
         game.state.galaxy[game.quadrant.i][game.quadrant.j].romulans -= 1
         game.irhere -= 1
         game.state.nromrem -= 1
-    elif type == IHT:
+    elif type == 'T':
         # Killed a Tholian 
         game.tholian = None
         # Killed a Tholian 
         game.tholian = None
-    elif type == IHQUEST:
+    elif type == '?':
         # Killed a Thingy
         global thing
         thing = None
         # Killed a Thingy
         global thing
         thing = None
@@ -1655,16 +1448,16 @@ def deadkl(w, type, mv):
         # Killed some type of Klingon 
         game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons -= 1
         game.klhere -= 1
         # Killed some type of Klingon 
         game.state.galaxy[game.quadrant.i][game.quadrant.j].klingons -= 1
         game.klhere -= 1
-        if type == IHC:
+        if type == 'C':
             game.state.kcmdr.remove(game.quadrant)
             unschedule(FTBEAM)
             if game.state.kcmdr:
                 schedule(FTBEAM, expran(1.0*game.incom/len(game.state.kcmdr)))
             if is_scheduled(FCDBAS) and game.battle == game.quadrant:
                 unschedule(FCDBAS)    
             game.state.kcmdr.remove(game.quadrant)
             unschedule(FTBEAM)
             if game.state.kcmdr:
                 schedule(FTBEAM, expran(1.0*game.incom/len(game.state.kcmdr)))
             if is_scheduled(FCDBAS) and game.battle == game.quadrant:
                 unschedule(FCDBAS)    
-        elif type ==  IHK:
+        elif type ==  'K':
             game.state.remkl -= 1
             game.state.remkl -= 1
-        elif type ==  IHS:
+        elif type ==  'S':
             game.state.nscrem -= 1
             game.state.kscmdr.invalidate()
             game.isatb = 0
             game.state.nscrem -= 1
             game.state.kscmdr.invalidate()
             game.isatb = 0
@@ -1868,7 +1661,7 @@ def hittem(hits):
        else:
            proutn(_("Very small hit on "))
        ienm = game.quad[w.i][w.j]
        else:
            proutn(_("Very small hit on "))
        ienm = game.quad[w.i][w.j]
-       if ienm==IHQUEST:
+       if ienm=='?':
            thing.angry = True
        proutn(crmena(False, ienm, "sector", w))
        skip(1)
            thing.angry = True
        proutn(crmena(False, ienm, "sector", w))
        skip(1)
@@ -2058,7 +1851,7 @@ def phasers():
                msgflag = False
                rpow = 0.0
            if damaged(DSRSENS) and \
                msgflag = False
                rpow = 0.0
            if damaged(DSRSENS) and \
-               not game.sector.distance(aim)<2**0.5 and ienm in (IHC, IHS):
+               not game.sector.distance(aim)<2**0.5 and ienm in ('C', 'S'):
                prout(cramen(ienm) + _(" can't be located without short range scan."))
                scanner.chew()
                key = "IHEOL"
                prout(cramen(ienm) + _(" can't be located without short range scan."))
                scanner.chew()
                key = "IHEOL"
@@ -2235,7 +2028,7 @@ def events():
         # Handle case where base is in same quadrant as starship 
         if game.battle == game.quadrant:
             game.state.chart[game.battle.i][game.battle.j].starbase = False
         # Handle case where base is in same quadrant as starship 
         if game.battle == game.quadrant:
             game.state.chart[game.battle.i][game.battle.j].starbase = False
-            game.quad[game.base.i][game.base.j] = IHDOT
+            game.quad[game.base.i][game.base.j] = '.'
             game.base.invalidate()
             newcnd()
             skip(1)
             game.base.invalidate()
             newcnd()
             skip(1)
@@ -2627,8 +2420,8 @@ def nova(nov):
        supernova(game.quadrant)
        return
     # handle initial nova 
        supernova(game.quadrant)
        return
     # handle initial nova 
-    game.quad[nov.i][nov.j] = IHDOT
-    prout(crmena(False, IHSTAR, "sector", nov) + _(" novas."))
+    game.quad[nov.i][nov.j] = '.'
+    prout(crmena(False, '*', "sector", nov) + _(" novas."))
     game.state.galaxy[game.quadrant.i][game.quadrant.j].stars -= 1
     game.state.starkl += 1
     # Set up queue to recursively trigger adjacent stars 
     game.state.galaxy[game.quadrant.i][game.quadrant.j].stars -= 1
     game.state.starkl += 1
     # Set up queue to recursively trigger adjacent stars 
@@ -2646,9 +2439,9 @@ def nova(nov):
                     continue
                 iquad = game.quad[neighbor.i][neighbor.j]
                 # Empty space ends reaction
                     continue
                 iquad = game.quad[neighbor.i][neighbor.j]
                 # Empty space ends reaction
-                if iquad in (IHDOT, IHQUEST, IHBLANK, IHT, IHWEB):
+                if iquad in ('.', '?', ' ', 'T', '#'):
                     pass
                     pass
-                elif iquad == IHSTAR: # Affect another star 
+                elif iquad == '*': # Affect another star 
                     if withprob(0.05):
                         # This star supernovas 
                         supernova(game.quadrant)
                     if withprob(0.05):
                         # This star supernovas 
                         supernova(game.quadrant)
@@ -2657,33 +2450,33 @@ def nova(nov):
                         hits.append(neighbor)
                        game.state.galaxy[game.quadrant.i][game.quadrant.j].stars -= 1
                        game.state.starkl += 1
                         hits.append(neighbor)
                        game.state.galaxy[game.quadrant.i][game.quadrant.j].stars -= 1
                        game.state.starkl += 1
-                       proutn(crmena(True, IHSTAR, "sector", neighbor))
+                       proutn(crmena(True, '*', "sector", neighbor))
                        prout(_(" novas."))
                        prout(_(" novas."))
-                        game.quad[neighbor.i][neighbor.j] = IHDOT
+                        game.quad[neighbor.i][neighbor.j] = '.'
                         kount += 1
                         kount += 1
-                elif iquad in (IHP, IHW): # Destroy planet 
+                elif iquad in ('P', '@'): # Destroy planet 
                     game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None
                     game.state.galaxy[game.quadrant.i][game.quadrant.j].planet = None
-                    if iquad == IHP:
+                    if iquad == 'P':
                         game.state.nplankl += 1
                     else:
                         game.state.worldkl += 1
                         game.state.nplankl += 1
                     else:
                         game.state.worldkl += 1
-                    prout(crmena(True, IHB, "sector", neighbor) + _(" destroyed."))
+                    prout(crmena(True, 'B', "sector", neighbor) + _(" destroyed."))
                     game.iplnet.pclass = "destroyed"
                     game.iplnet = None
                     game.plnet.invalidate()
                     if game.landed:
                         finish(FPNOVA)
                         return
                     game.iplnet.pclass = "destroyed"
                     game.iplnet = None
                     game.plnet.invalidate()
                     if game.landed:
                         finish(FPNOVA)
                         return
-                    game.quad[neighbor.i][neighbor.j] = IHDOT
-                elif iquad == IHB: # Destroy base 
+                    game.quad[neighbor.i][neighbor.j] = '.'
+                elif iquad == 'B': # Destroy base 
                     game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase = False
                     game.state.baseq = filter(lambda x: x!= game.quadrant, game.state.baseq)
                     game.base.invalidate()
                     game.state.basekl += 1
                     newcnd()
                     game.state.galaxy[game.quadrant.i][game.quadrant.j].starbase = False
                     game.state.baseq = filter(lambda x: x!= game.quadrant, game.state.baseq)
                     game.base.invalidate()
                     game.state.basekl += 1
                     newcnd()
-                    prout(crmena(True, IHB, "sector", neighbor) + _(" destroyed."))
-                    game.quad[neighbor.i][neighbor.j] = IHDOT
-                elif iquad in (IHE, IHF): # Buffet ship 
+                    prout(crmena(True, 'B', "sector", neighbor) + _(" destroyed."))
+                    game.quad[neighbor.i][neighbor.j] = '.'
+                elif iquad in ('E', 'F'): # Buffet ship 
                     prout(_("***Starship buffeted by nova."))
                     if game.shldup:
                         if game.shield >= 2000.0:
                     prout(_("***Starship buffeted by nova."))
                     if game.shldup:
                         if game.shield >= 2000.0:
@@ -2702,9 +2495,9 @@ def nova(nov):
                         return
                     # add in course nova contributes to kicking starship
                     bump += (game.sector-hits[mm]).sgn()
                         return
                     # add in course nova contributes to kicking starship
                     bump += (game.sector-hits[mm]).sgn()
-                elif iquad == IHK: # kill klingon 
+                elif iquad == 'K': # kill klingon 
                     deadkl(neighbor, iquad, neighbor)
                     deadkl(neighbor, iquad, neighbor)
-                elif iquad in (IHC,IHS,IHR): # Damage/destroy big enemies 
+                elif iquad in ('C','S','R'): # Damage/destroy big enemies 
                     for ll in range(len(game.enemies)):
                         if game.enemies[ll].kloc == neighbor:
                             break
                     for ll in range(len(game.enemies)):
                         if game.enemies[ll].kloc == neighbor:
                             break
@@ -2719,17 +2512,17 @@ def nova(nov):
                         skip(1)
                         break
                     iquad1 = game.quad[newc.i][newc.j]
                         skip(1)
                         break
                     iquad1 = game.quad[newc.i][newc.j]
-                    if iquad1 == IHBLANK:
-                        proutn(_(", blasted into ") + crmena(False, IHBLANK, "sector", newc))
+                    if iquad1 == ' ':
+                        proutn(_(", blasted into ") + crmena(False, ' ', "sector", newc))
                         skip(1)
                         deadkl(neighbor, iquad, newc)
                         break
                         skip(1)
                         deadkl(neighbor, iquad, newc)
                         break
-                    if iquad1 != IHDOT:
+                    if iquad1 != '.':
                         # can't move into something else 
                         skip(1)
                         break
                     proutn(_(", buffeted to Sector %s") % newc)
                         # can't move into something else 
                         skip(1)
                         break
                     proutn(_(", buffeted to Sector %s") % newc)
-                    game.quad[neighbor.i][neighbor.j] = IHDOT
+                    game.quad[neighbor.i][neighbor.j] = '.'
                     game.quad[newc.i][newc.j] = iquad
                     game.enemies[ll].move(newc)
     # Starship affected by nova -- kick it away. 
                     game.quad[newc.i][newc.j] = iquad
                     game.enemies[ll].move(newc)
     # Starship affected by nova -- kick it away. 
@@ -2785,7 +2578,7 @@ def supernova(w):
        num = randrange(game.state.galaxy[nq.i][nq.j].stars) + 1
        for ns.i in range(QUADSIZE):
            for ns.j in range(QUADSIZE):
        num = randrange(game.state.galaxy[nq.i][nq.j].stars) + 1
        for ns.i in range(QUADSIZE):
            for ns.j in range(QUADSIZE):
-               if game.quad[ns.i][ns.j]==IHSTAR:
+               if game.quad[ns.i][ns.j]=='*':
                    num -= 1
                    if num==0:
                        break
                    num -= 1
                    if num==0:
                        break
@@ -2892,7 +2685,7 @@ def selfdestruct():
 
 def kaboom():
     stars()
 
 def kaboom():
     stars()
-    if game.ship==IHE:
+    if game.ship=='E':
        prouts("***")
     prouts(_("********* Entropy of %s maximized *********") % crmshp())
     skip(1)
        prouts("***")
     prouts(_("********* Entropy of %s maximized *********") % crmshp())
     skip(1)
@@ -2926,7 +2719,7 @@ def badpoints():
             45.0*game.nhelp +\
             100.0*game.state.basekl +\
             3.0*game.abandoned
             45.0*game.nhelp +\
             100.0*game.state.basekl +\
             3.0*game.abandoned
-    if game.ship == IHF:
+    if game.ship == 'F':
         badpt += 100.0
     elif game.ship == None:
         badpt += 200.0
         badpt += 100.0
     elif game.ship == None:
         badpt += 200.0
@@ -3098,10 +2891,10 @@ def finish(ifin):
        prout(_("You are crushed into extremely dense matter."))
     elif ifin == FCREW:
        prout(_("Your last crew member has died."))
        prout(_("You are crushed into extremely dense matter."))
     elif ifin == FCREW:
        prout(_("Your last crew member has died."))
-    if game.ship == IHF:
+    if game.ship == 'F':
        game.ship = None
        game.ship = None
-    elif game.ship == IHE:
-       game.ship = IHF
+    elif game.ship == 'E':
+       game.ship = 'F'
     game.alive = False
     if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) != 0:
        goodies = game.state.remres/game.inresor
     game.alive = False
     if (game.state.remkl + len(game.state.kcmdr) + game.state.nscrem) != 0:
        goodies = game.state.remres/game.inresor
@@ -3136,9 +2929,9 @@ def score():
     iwon = 0
     if game.gamewon:
        iwon = 100*game.skill
     iwon = 0
     if game.gamewon:
        iwon = 100*game.skill
-    if game.ship == IHE
+    if game.ship == 'E'
        klship = 0
        klship = 0
-    elif game.ship == IHF
+    elif game.ship == 'F'
        klship = 1
     else:
        klship = 2
        klship = 1
     else:
        klship = 2
@@ -3444,11 +3237,6 @@ def clrscr():
        curwnd.refresh()
     linecount = 0
     
        curwnd.refresh()
     linecount = 0
     
-def highvideo():
-    "Set highlight video, if this is reasonable."
-    if game.options & OPTION_CURSES:
-       curwnd.attron(curses.A_REVERSE)
 #
 # Things past this point have policy implications.
 # 
 #
 # Things past this point have policy implications.
 # 
@@ -3525,7 +3313,7 @@ def tracktorpedo(origin, w, step, i, n, iquad):
            if i != 0 and step == 1:
                drawmaps(2)
                time.sleep(0.4)
            if i != 0 and step == 1:
                drawmaps(2)
                time.sleep(0.4)
-           if (iquad==IHDOT) or (iquad==IHBLANK):
+           if (iquad=='.') or (iquad==' '):
                put_srscan_sym(w, '+')
                #sound(step*10)
                #time.sleep(0.1)
                put_srscan_sym(w, '+')
                #sound(step*10)
                #time.sleep(0.1)
@@ -3630,16 +3418,16 @@ def imove(course=None, noattack=False):
 
     def check_collision(h):
         iquad = game.quad[h.i][h.j]
 
     def check_collision(h):
         iquad = game.quad[h.i][h.j]
-        if iquad != IHDOT:
+        if iquad != '.':
             # object encountered in flight path 
             stopegy = 50.0*course.distance/game.optime
             # object encountered in flight path 
             stopegy = 50.0*course.distance/game.optime
-            if iquad in (IHT, IHK, IHC, IHS, IHR, IHQUEST):
+            if iquad in ('T', 'K', 'C', 'S', 'R', '?'):
                 for enemy in game.enemies:
                     if enemy.kloc == game.sector:
                         break
                 collision(rammed=False, enemy=enemy)
                 return True
                 for enemy in game.enemies:
                     if enemy.kloc == game.sector:
                         break
                 collision(rammed=False, enemy=enemy)
                 return True
-            elif iquad == IHBLANK:
+            elif iquad == ' ':
                 skip(1)
                 prouts(_("***RED ALERT!  RED ALERT!"))
                 skip(1)
                 skip(1)
                 prouts(_("***RED ALERT!  RED ALERT!"))
                 skip(1)
@@ -3662,7 +3450,7 @@ def imove(course=None, noattack=False):
                 # something else 
                 skip(1)
                 proutn(crmshp())
                 # something else 
                 skip(1)
                 proutn(crmshp())
-                if iquad == IHWEB:
+                if iquad == '#':
                     prout(_(" encounters Tholian web at %s;") % h)
                 else:
                     prout(_(" blocked by object at %s;") % h)
                     prout(_(" encounters Tholian web at %s;") % h)
                 else:
                     prout(_(" blocked by object at %s;") % h)
@@ -3685,7 +3473,7 @@ def imove(course=None, noattack=False):
        course.distance = course.distance*(scheduled(FTBEAM)-game.state.date)/game.optime + 0.1
        game.optime = scheduled(FTBEAM) - game.state.date + 1e-5
     # Move out
        course.distance = course.distance*(scheduled(FTBEAM)-game.state.date)/game.optime + 0.1
        game.optime = scheduled(FTBEAM) - game.state.date + 1e-5
     # Move out
-    game.quad[game.sector.i][game.sector.j] = IHDOT
+    game.quad[game.sector.i][game.sector.j] = '.'
     for m in range(course.moves):
         course.next()
         w = course.sector()
     for m in range(course.moves):
         course.next()
         w = course.sector()
@@ -4064,7 +3852,7 @@ def warp(course, involuntary):
                 w = course.sector()
                 if not w.valid_sector():
                     break
                 w = course.sector()
                 if not w.valid_sector():
                     break
-               if game.quad[w.i][w.j] != IHDOT:
+               if game.quad[w.i][w.j] != '.':
                    blooey = False
                    twarp = False
             course.reset()
                    blooey = False
                    twarp = False
             course.reset()
@@ -4231,7 +4019,7 @@ def timwrp():
        for l in range(game.inplan):
            if game.state.planets[l].known == "shuttle_down":
                gotit = True
        for l in range(game.inplan):
            if game.state.planets[l].known == "shuttle_down":
                gotit = True
-               if game.iscraft == "onship" and game.ship==IHE:
+               if game.iscraft == "onship" and game.ship=='E':
                    prout(_("Chekov-  \"Security reports the Galileo has disappeared, Sir!"))
                    game.iscraft = "offship"
        # Likewise, if in the original time the Galileo was abandoned, but
                    prout(_("Chekov-  \"Security reports the Galileo has disappeared, Sir!"))
                    game.iscraft = "offship"
        # Likewise, if in the original time the Galileo was abandoned, but
@@ -4258,7 +4046,7 @@ def probe():
     if game.nprobes == 0:
        scanner.chew()
        skip(1)
     if game.nprobes == 0:
        scanner.chew()
        skip(1)
-       if game.ship == IHE
+       if game.ship == 'E'
            prout(_("Engineer Scott- \"We have no more deep space probes, Sir.\""))
        else:
            prout(_("Ye Faerie Queene has no deep space probes."))
            prout(_("Engineer Scott- \"We have no more deep space probes, Sir.\""))
        else:
            prout(_("Ye Faerie Queene has no deep space probes."))
@@ -4337,13 +4125,13 @@ def mayday():
        game.quadrant = ibq
        newqad()
     # dematerialize starship 
        game.quadrant = ibq
        newqad()
     # dematerialize starship 
-    game.quad[game.sector.i][game.sector.j]=IHDOT
+    game.quad[game.sector.i][game.sector.j]='.'
     proutn(_("Starbase in Quadrant %s responds--%s dematerializes") \
            % (game.quadrant, crmshp()))
     game.sector.invalidate()
     for m in range(1, 5+1):
         w = game.base.scatter() 
     proutn(_("Starbase in Quadrant %s responds--%s dematerializes") \
            % (game.quadrant, crmshp()))
     game.sector.invalidate()
     for m in range(1, 5+1):
         w = game.base.scatter() 
-       if w.valid_sector() and game.quad[w.i][w.j]==IHDOT:
+       if w.valid_sector() and game.quad[w.i][w.j]=='.':
            # found one -- finish up 
             game.sector = w
            break
            # found one -- finish up 
             game.sector = w
            break
@@ -4358,25 +4146,21 @@ def mayday():
        elif m == 2: proutn(_("2nd"))
        elif m == 3: proutn(_("3rd"))
        proutn(_(" attempt to re-materialize ") + crmshp())
        elif m == 2: proutn(_("2nd"))
        elif m == 3: proutn(_("3rd"))
        proutn(_(" attempt to re-materialize ") + crmshp())
-       game.quad[ix][iy]=(IHMATER0,IHMATER1,IHMATER2)[m-1]
-       #textcolor("red")
+       game.quad[ix][iy]=('-','o','O')[m-1]
        warble()
        if randreal() > probf:
            break
        prout(_("fails."))
        curses.delay_output(500)
        warble()
        if randreal() > probf:
            break
        prout(_("fails."))
        curses.delay_output(500)
-       #textcolor(None)
     if m > 3:
     if m > 3:
-       game.quad[ix][iy]=IHQUEST
+       game.quad[ix][iy]='?'
        game.alive = False
        drawmaps(1)
        setwnd(message_window)
        finish(FMATERIALIZE)
        return
     game.quad[ix][iy]=game.ship
        game.alive = False
        drawmaps(1)
        setwnd(message_window)
        finish(FMATERIALIZE)
        return
     game.quad[ix][iy]=game.ship
-    #textcolor("green")
     prout(_("succeeds."))
     prout(_("succeeds."))
-    #textcolor(None)
     dock(False)
     skip(1)
     prout(_("Lt. Uhura-  \"Captain, we made it!\""))
     dock(False)
     skip(1)
     prout(_("Lt. Uhura-  \"Captain, we made it!\""))
@@ -4385,7 +4169,7 @@ def abandon():
     "Abandon ship."
     scanner.chew()
     if game.condition=="docked":
     "Abandon ship."
     scanner.chew()
     if game.condition=="docked":
-       if game.ship!=IHE:
+       if game.ship!='E':
            prout(_("You cannot abandon Ye Faerie Queene."))
            return
     else:
            prout(_("You cannot abandon Ye Faerie Queene."))
            return
     else:
@@ -4443,11 +4227,11 @@ def abandon():
            newqad()
        while True:
            # position next to base by trial and error 
            newqad()
        while True:
            # position next to base by trial and error 
-           game.quad[game.sector.i][game.sector.j] = IHDOT
+           game.quad[game.sector.i][game.sector.j] = '.'
            for l in range(QUADSIZE):
                game.sector = game.base.scatter()
                if game.sector.valid_sector() and \
            for l in range(QUADSIZE):
                game.sector = game.base.scatter()
                if game.sector.valid_sector() and \
-                       game.quad[game.sector.i][game.sector.j] == IHDOT:
+                       game.quad[game.sector.i][game.sector.j] == '.':
                     break
            if l < QUADSIZE+1:
                break # found a spot 
                     break
            if l < QUADSIZE+1:
                break # found a spot 
@@ -4455,7 +4239,7 @@ def abandon():
            game.sector.j=QUADSIZE/2
            newqad()
     # Get new commission 
            game.sector.j=QUADSIZE/2
            newqad()
     # Get new commission 
-    game.quad[game.sector.i][game.sector.j] = game.ship = IHF
+    game.quad[game.sector.i][game.sector.j] = game.ship = 'F'
     game.state.crew = FULLCREW
     prout(_("Starfleet puts you in command of another ship,"))
     prout(_("the Faerie Queene, which is antiquated but,"))
     game.state.crew = FULLCREW
     prout(_("Starfleet puts you in command of another ship,"))
     prout(_("the Faerie Queene, which is antiquated but,"))
@@ -4838,7 +4622,7 @@ def deathray():
     game.ididit = False
     skip(1)
     scanner.chew()
     game.ididit = False
     skip(1)
     scanner.chew()
-    if game.ship != IHE:
+    if game.ship != 'E':
        prout(_("Ye Faerie Queene has no death ray."))
        return
     if len(game.enemies)==0:
        prout(_("Ye Faerie Queene has no death ray."))
        return
     if len(game.enemies)==0:
@@ -4922,8 +4706,8 @@ def deathray():
        prout(_(" Mr. Sulu."))
        for i in range(QUADSIZE):
            for j in range(QUADSIZE):
        prout(_(" Mr. Sulu."))
        for i in range(QUADSIZE):
            for j in range(QUADSIZE):
-               if game.quad[i][j] == IHDOT:
-                   game.quad[i][j] = IHQUEST
+               if game.quad[i][j] == '.':
+                   game.quad[i][j] = '?'
        prout(_("  Captain, our quadrant is now infested with"))
        prouts(_(" - - - - - -  *THINGS*."))
        skip(1)
        prout(_("  Captain, our quadrant is now infested with"))
        prouts(_(" - - - - - -  *THINGS*."))
        skip(1)
@@ -4997,7 +4781,7 @@ def report():
        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]))
        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:
+    if game.ship == 'E':
        proutn(_("You have "))
        if game.nprobes:
            proutn("%d" % (game.nprobes))
        proutn(_("You have "))
        if game.nprobes:
            proutn("%d" % (game.nprobes))
@@ -5124,16 +4908,7 @@ def chart():
 def sectscan(goodScan, i, j):
     "Light up an individual dot in a sector."
     if goodScan or (abs(i-game.sector.i)<= 1 and abs(j-game.sector.j) <= 1):
 def sectscan(goodScan, i, j):
     "Light up an individual dot in a sector."
     if goodScan or (abs(i-game.sector.i)<= 1 and abs(j-game.sector.j) <= 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])
        proutn("%c " % game.quad[i][j])
-       #textcolor(None)
     else:
        proutn("- ")
 
     else:
        proutn("- ")
 
@@ -5485,7 +5260,7 @@ def setup():
        return # frozen game
     # Prepare the Enterprise
     game.alldone = game.gamewon = game.shldchg = game.shldup = False
        return # frozen game
     # Prepare the Enterprise
     game.alldone = game.gamewon = game.shldchg = game.shldup = False
-    game.ship = IHE
+    game.ship = 'E'
     game.state.crew = FULLCREW
     game.energy = game.inenrg = 5000.0
     game.shield = game.inshld = 2500.0
     game.state.crew = FULLCREW
     game.energy = game.inenrg = 5000.0
     game.shield = game.inshld = 2500.0
@@ -5782,7 +5557,7 @@ def dropin(iquad=None):
     "Drop a feature on a random dot in the current quadrant."
     while True:
         w = randplace(QUADSIZE)
     "Drop a feature on a random dot in the current quadrant."
     while True:
         w = randplace(QUADSIZE)
-        if game.quad[w.i][w.j] == IHDOT:
+        if game.quad[w.i][w.j] == '.':
             break
     if iquad is not None:
         game.quad[w.i][w.j] = iquad
             break
     if iquad is not None:
         game.quad[w.i][w.j] = iquad
@@ -5800,7 +5575,7 @@ def newcnd():
 
 def newkling():
     "Drop new Klingon into current quadrant."
 
 def newkling():
     "Drop new Klingon into current quadrant."
-    return enemy(IHK, loc=dropin(), power=randreal(300,450)+25.0*game.skill)
+    return enemy('K', loc=dropin(), power=randreal(300,450)+25.0*game.skill)
 
 def newqad():
     "Set up a new state of quadrant, for when we enter or re-enter it."
 
 def newqad():
     "Set up a new state of quadrant, for when we enter or re-enter it."
@@ -5809,7 +5584,7 @@ def newqad():
     game.neutz = game.inorbit = game.landed = False
     game.ientesc = game.iseenit = False
     # Create a blank quadrant
     game.neutz = game.inorbit = game.landed = False
     game.ientesc = game.iseenit = False
     # Create a blank quadrant
-    game.quad = fill2d(QUADSIZE, lambda i, j: IHDOT)
+    game.quad = fill2d(QUADSIZE, lambda i, j: '.')
     if game.iscate:
        # Attempt to escape Super-commander, so tbeam back!
        game.iscate = False
     if game.iscate:
        # Attempt to escape Super-commander, so tbeam back!
        game.iscate = False
@@ -5831,28 +5606,28 @@ def newqad():
         for cmdr in game.state.kcmdr:
            if cmdr == game.quadrant:
                 e = game.enemies[game.klhere-1]
         for cmdr in game.state.kcmdr:
            if cmdr == game.quadrant:
                 e = game.enemies[game.klhere-1]
-                game.quad[e.kloc.i][e.kloc.j] = IHC
+                game.quad[e.kloc.i][e.kloc.j] = 'C'
                 e.kpower = randreal(950,1350) + 50.0*game.skill
                break   
        # If we need a super-commander, promote a Klingon
        if game.quadrant == game.state.kscmdr:
             e = game.enemies[0]
                 e.kpower = randreal(950,1350) + 50.0*game.skill
                break   
        # If we need a super-commander, promote a Klingon
        if game.quadrant == game.state.kscmdr:
             e = game.enemies[0]
-           game.quad[e.kloc.i][e.kloc.j] = IHS
+           game.quad[e.kloc.i][e.kloc.j] = 'S'
            e.kpower = randreal(1175.0,  1575.0) + 125.0*game.skill
            game.iscate = (game.state.remkl > 1)
     # Put in Romulans if needed
     for i in range(q.romulans):
            e.kpower = randreal(1175.0,  1575.0) + 125.0*game.skill
            game.iscate = (game.state.remkl > 1)
     # Put in Romulans if needed
     for i in range(q.romulans):
-        enemy(IHR, loc=dropin(), power=randreal(400.0,850.0)+50.0*game.skill)
+        enemy('R', loc=dropin(), power=randreal(400.0,850.0)+50.0*game.skill)
     # If quadrant needs a starbase, put it in
     if q.starbase:
     # If quadrant needs a starbase, put it in
     if q.starbase:
-       game.base = dropin(IHB)
+       game.base = dropin('B')
     # If quadrant needs a planet, put it in
     if q.planet:
        game.iplnet = q.planet
        if not q.planet.inhabited:
     # If quadrant needs a planet, put it in
     if q.planet:
        game.iplnet = q.planet
        if not q.planet.inhabited:
-           game.plnet = dropin(IHP)
+           game.plnet = dropin('P')
        else:
        else:
-           game.plnet = dropin(IHW)
+           game.plnet = dropin('@')
     # Check for condition
     newcnd()
     # Check for RNZ
     # Check for condition
     newcnd()
     # Check for RNZ
@@ -5867,7 +5642,7 @@ def newqad():
            prout(_("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!"))
     # Put in THING if needed
     if thing == game.quadrant:
            prout(_("LEAVE AT ONCE, OR YOU WILL BE DESTROYED!"))
     # Put in THING if needed
     if thing == game.quadrant:
-        enemy(type=IHQUEST, loc=dropin(),
+        enemy(type='?', loc=dropin(),
                   power=randreal(6000,6500.0)+250.0*game.skill)
         if not damaged(DSRSENS):
             skip(1)
                   power=randreal(6000,6500.0)+250.0*game.skill)
         if not damaged(DSRSENS):
             skip(1)
@@ -5882,37 +5657,37 @@ def newqad():
             while True:
                w.i = withprob(0.5) * (QUADSIZE-1)
                w.j = withprob(0.5) * (QUADSIZE-1)
             while True:
                w.i = withprob(0.5) * (QUADSIZE-1)
                w.j = withprob(0.5) * (QUADSIZE-1)
-                if game.quad[w.i][w.j] == IHDOT:
+                if game.quad[w.i][w.j] == '.':
                     break
                     break
-            game.tholian = enemy(type=IHT, loc=w,
+            game.tholian = enemy(type='T', loc=w,
                                  power=randrange(100, 500) + 25.0*game.skill)
            # Reserve unoccupied corners 
                                  power=randrange(100, 500) + 25.0*game.skill)
            # Reserve unoccupied corners 
-           if game.quad[0][0]==IHDOT:
+           if game.quad[0][0]=='.':
                game.quad[0][0] = 'X'
                game.quad[0][0] = 'X'
-           if game.quad[0][QUADSIZE-1]==IHDOT:
+           if game.quad[0][QUADSIZE-1]=='.':
                game.quad[0][QUADSIZE-1] = 'X'
                game.quad[0][QUADSIZE-1] = 'X'
-           if game.quad[QUADSIZE-1][0]==IHDOT:
+           if game.quad[QUADSIZE-1][0]=='.':
                game.quad[QUADSIZE-1][0] = 'X'
                game.quad[QUADSIZE-1][0] = 'X'
-           if game.quad[QUADSIZE-1][QUADSIZE-1]==IHDOT:
+           if game.quad[QUADSIZE-1][QUADSIZE-1]=='.':
                game.quad[QUADSIZE-1][QUADSIZE-1] = 'X'
     game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
     # And finally the stars
     for i in range(q.stars):
                game.quad[QUADSIZE-1][QUADSIZE-1] = 'X'
     game.enemies.sort(lambda x, y: cmp(x.kdist, y.kdist))
     # And finally the stars
     for i in range(q.stars):
-       dropin(IHSTAR)
+       dropin('*')
     # Put in a few black holes
     for i in range(1, 3+1):
        if withprob(0.5): 
     # Put in a few black holes
     for i in range(1, 3+1):
        if withprob(0.5): 
-           dropin(IHBLANK)
+           dropin(' ')
     # Take out X's in corners if Tholian present
     if game.tholian:
        if game.quad[0][0]=='X':
     # Take out X's in corners if Tholian present
     if game.tholian:
        if game.quad[0][0]=='X':
-           game.quad[0][0] = IHDOT
+           game.quad[0][0] = '.'
        if game.quad[0][QUADSIZE-1]=='X':
        if game.quad[0][QUADSIZE-1]=='X':
-           game.quad[0][QUADSIZE-1] = IHDOT
+           game.quad[0][QUADSIZE-1] = '.'
        if game.quad[QUADSIZE-1][0]=='X':
        if game.quad[QUADSIZE-1][0]=='X':
-           game.quad[QUADSIZE-1][0] = IHDOT
+           game.quad[QUADSIZE-1][0] = '.'
        if game.quad[QUADSIZE-1][QUADSIZE-1]=='X':
        if game.quad[QUADSIZE-1][QUADSIZE-1]=='X':
-           game.quad[QUADSIZE-1][QUADSIZE-1] = IHDOT
+           game.quad[QUADSIZE-1][QUADSIZE-1] = '.'
 
 def setpassword():
     "Set the self-destruct password."
 
 def setpassword():
     "Set the self-destruct password."
@@ -6199,18 +5974,18 @@ def makemoves():
 
 def cramen(type):
     "Emit the name of an enemy or feature." 
 
 def cramen(type):
     "Emit the name of an enemy or feature." 
-    if   type == IHR: s = _("Romulan")
-    elif type == IHK: s = _("Klingon")
-    elif type == IHC: s = _("Commander")
-    elif type == IHS: s = _("Super-commander")
-    elif type == IHSTAR: s = _("Star")
-    elif type == IHP: s = _("Planet")
-    elif type == IHB: s = _("Starbase")
-    elif type == IHBLANK: s = _("Black hole")
-    elif type == IHT: s = _("Tholian")
-    elif type == IHWEB: s = _("Tholian web")
-    elif type == IHQUEST: s = _("Stranger")
-    elif type == IHW: s = _("Inhabited World")
+    if   type == 'R': s = _("Romulan")
+    elif type == 'K': s = _("Klingon")
+    elif type == 'C': s = _("Commander")
+    elif type == 'S': s = _("Super-commander")
+    elif type == '*': s = _("Star")
+    elif type == 'P': s = _("Planet")
+    elif type == 'B': s = _("Starbase")
+    elif type == ' ': s = _("Black hole")
+    elif type == 'T': s = _("Tholian")
+    elif type == '#': s = _("Tholian web")
+    elif type == '?': s = _("Stranger")
+    elif type == '@': s = _("Inhabited World")
     else: s = "Unknown??"
     return s
 
     else: s = "Unknown??"
     return s
 
@@ -6228,7 +6003,7 @@ def crmena(stars, enemy, loctype, w):
 
 def crmshp():
     "Emit our ship name." 
 
 def crmshp():
     "Emit our ship name." 
-    return{IHE:_("Enterprise"),IHF:_("Faerie Queene")}.get(game.ship,"Ship???")
+    return{'E':_("Enterprise"),'F':_("Faerie Queene")}.get(game.ship,"Ship???")
 
 def stars():
     "Emit a line of stars" 
 
 def stars():
     "Emit a line of stars"