Mark Damon Hughes  | Umbra

Screenshot 1
Starry Night
Blooded by the Bloody Bones
A bad way to start the day...
Oh, no, Mr. Techie, it's a sanity-blasting altar!
And you thought Hari Krishnas were annoying...
Just hope you don't run out of batteries...
The night watchman has more than just keys to throw at you
I knew we shoulda taken a left at Albuquerque
These ruins seem pretty quiet by day...
(click to zoom the image)
...But the night-life's another story!
Remember to pack a life preserver
Lighting by Moire
A weary party in search of training


version 0.11 (2002Sep17)

Umbra is an open-source computer role-playing game written in Python. The world is randomly-generated for new play every time, but there is an eventual goal and storyline. It was heavily influenced by roguelike games, Alternate Reality, console RPGs, and the works of H.P. Lovecraft and Clark Ashton Smith.

You can also read my Design Notes, which lay out what the game is, why it is this way, and what's coming for it.

The open-source license and README.html make good light reading, too.

Umbra is © Copyright 2001 by Mark Damon Hughes <>

All Rights Reserved


Umbra is set after a Lovecraftian apocalypse - the ancient god Mogth has risen from ages of deathlike slumber, conquered the world, thrown down civilization, and now man huddles in primitive communities, scattered and dying out. You play a band of heroes who will attempt to free humanity!


Windows users without Python:
Standalone Umbra 0.11 Tk binary (1.4MB)
Everyone else:


  1. Unzip anywhere on your hard drive, which will create an "umbra" directory.
  2. Download Python from <>
  3. You can now run it:
    cd umbra; ./
    MacOS X:
    Follow the instructions here first
    Now, from a Terminal window:
    % cd umbra; pythonw -O
    open the "umbra" folder and double-click on umbra.cmd
    open the "umbra" folder and double-click on umbra.bat
  4. Start a new game, wait a few moments for it to create the world, create one or more characters, and you will see a starting town! If you walk into the wireframe grid at the edge of the map, you enter a new "sector". The world is vast, though currently only the town and plains are populated. Your game is saved automatically when you quit. If you want to make backups of a saved game, Copy it from the main menu.
  5. If you get the message "RuntimeError: Bad magic number in .pyc file", you don't have Python 2.1; the bytecode format is different between every minor version, and very different from 1.5. You can get Python 2.1 at Python 2.1 download.
  6. Peformance is a problem. I develop on a K6-2 550MHz/128MB, with a crappy video card, and get acceptable but not great speed. If you're below that, `-viewdist 8` will probably make a huge improvement. You probably can't plausibly run it on less than a P-200. And you know, 15 years ago, Alternate Reality did almost as much (with better graphics, oh, the shame and humiliation) on a 1.77MHz 6502/64K. To compute is to laugh.
  7. Send me some feedback at <> - let me know if this is the greatest thing you've ever seen, or if you had troubles installing or running it, or if the interface is just awful, or anything you feel like sharing with me.
    Thank you.
  8. Check back at <> every week for new versions and news.


You can use the following options on the command line: <OPTIONS>
If specified when you start a new game, you will start at the door of a temple, one sector west of the usual starting town (so head towards the sunrise to get back to town), with some minimal equipment instead of cash.
-viewdist {distance}
Changes the number of grid squares (2m*2m) ahead and to the sides that you can see. The default of 8 is just barely acceptable on my own machine, so you might want to lower it if you have a slow video card, or increase it if you have a fast one. (The default used to be 16, but the lighting slowed things enough that a lower default made sense).
Disables lighting, which requires some heavy processing at present; as soon as I can optimize the lighting code, this option will be going away.
A less drastic solution, this disables line-of-sight checks for lighting, so that light sources work through walls, doors, etc. This option will also go away when the lighting code is sped up.
A debugging tool, if you're not sure why it's so slow on your machine, this shows exactly what's taking up all the time. "turn" includes updating other creatures and your map. "redraw" includes, among other things, working out the lighting. "showMap" is the actual drawing of everything, "showSky" is just the sky-based part of showMap, and "update" is the redrawing of the player status bar. If your showMap is the largest part, your video card is not up to snuff. If your turn or redraw is higher, you need a faster CPU.
-size {pixels} (UmbraTk only)
Changes the size of the view window; the default is 480 now.
-fog (UmbraTk only)
Turns on distance fog, which makes objects "popping" into visibility more acceptable for some people.

Or for a text-only version:

python -O UmbraText.pyo <OPTIONS>

A typical text-mode map looks like this:

                                _S9 A_S   _S9 B_S8                         
                                _S9  _S9  _S9            #S6               
                      ..2  #S  C_S9 D_S8 E_S8  #S8                         
                           ..2  ..8  ==7  ..7  ..7                         
                                ..7  ==6  ..6  ..6                         
                      #S6  #S6 F_S6 G_S5 H_S5  #S5  #S5                    
                                ==4  ==4  ==4                              

@=Jack; Killer; Sneak; Techie; Arcanist|G=a door
A=a lamp; Boss Uxaru Fnuw              |H=a door
B=a window                             |#S=Stone Wall
C=a window                             |..=Grass
D=a door                               |===Road
E=a window                             |_S=Stone Floor
F=a door                               |

Each grid shows a 'map key' (@, A..H on this example), which is defined below the map; then a two-character terrain type, also defined below the map; then the light level, 1..9 indicating 10-90%, ' ' indicating fully-lit. Any empty grid is not visible, either because it is blocked by a wall, or because it is too dark to see.

It's not pretty, but it's usable if you don't have a machine fast enough to run the Tk version.

Last modified: 2002Sep17
version 0.11

iOS Games & Utilities: [Brigand] [Perilar] [Castles] [DungeonDice] [UnixTime] [Notecraft] Computer Games: [Dormanica] [Aiee] [GameScroll] [Hephaestus] [JPerilar] [Umbra] Utilities: [JICB] [Javascript]
Copyright © 2007 by Mark Damon Hughes  |  email