29 May 2004 Work in progress. Current version contains Dungeon, comprising a grid of DungeonCells, each of which has a single TileType and a list of FieldType. Also, memo_tile and memo_fields, which indicate whether the player's memorized those features of the dungeon yet. Those have to be set inside the Interface-controlled LOS code, which is inconsistent. Needs fix. Player, who knows what Dungeon he is in, and which DungeonCell he is in, in that Dungeon. Interface, which controls the conio stuff through user hooks. Universe, which controls the algorithmic stuff, including a hook for the user to define a Line-Of-Sight (LOS) algorithm, has_LOS(Dungeon *dg, x1,y1, x2,y2), which returns TRUE or FALSE depending as cell (x2,y2) is visible from (x1,y1). Dungeon::default_LOS is provided as an example simple LOS algorithm, and DecentLOS is provided as an example of a more complex algorithm. PatchyLOS is provided as an example of an experimental, "compound" algorithm that uses DecentLOS as a subroutine. Dungeon also contains utilities for use by user-defined dungeon generators. These generators must have a member operator()(Dungeon*) which can be passed an already-sized dungeon to mold as they see fit. OvalGenerator is provided as an example dungeon generator. SlantGenerator is provided as an example dungeon generator. MyTiles defines the various tile types. MyFields defines the various field types. MyDisplay defines the various conio hooks required by Interface; namely, void myDisplayCell(int x, int y, char r, int c); Display 'r' in color 'c' at screen location (x,y), where x is horizontal and y is vertical, and both coordinates are relative to the upper left corner of the map screen display. int myGetKey(void); Get a single keypress and return a keycode for it. void myDisplayMessage(const char *msg); Display a message to the user. void myHighlightPlayer(); Highlight the player character with the cursor. At the moment, the project is at such a state that the Player can be controlled via an infinite game loop comprising calls to Interface::displayDungeon() and Player.command(). The player can move freely about the randomly-generated dungeon, and go up and down stairs to a depth of 10 levels. The stair- related code is part of MyDungeonStructure, a sample dungeon-master. These levels are persistent, as opposed to Angband's level system; it would not be hard to change the design of MyDungeonStructure to allow non-persistent levels.