roguelike.git
9 years agoInitial AI implementation. master
Neil Moore [Sat, 10 Apr 2010 03:10:53 +0000]
Initial AI implementation.

creature.Creature:
  new member speed:
    Average number of moves per tick.
  new method tick_turns():
    Number of moves this tick.

ai.Attitude:
  New class: monster attitudes (enumeration).

ai.Monster:
  new member default_attitude:
    Attitude for newly-encountered creatures.
  new member attitudes:
    Dictionary from creatures to attitude.
  new method attitude():
    Get attitude toward another creature.
  act():
    Refactor into:
      new method see_creatures():
Act based on attitude to seen creatures.
      new method approach():
Approach a location.
      new method flee():
Flee a location.
  tick():
    Act tick_turns() times.

roguelike.main():
  Create three monsters, speed 0.9.
    One tame, one friendly, one wary.

10 years agoPlace multiple rooms and stairs.
Neil Moore [Sun, 15 Jun 2008 21:11:44 +0000]
Place multiple rooms and stairs.

10 years agoMore room generation.
Neil Moore [Thu, 12 Jun 2008 03:28:51 +0000]
More room generation.

Split off Room class (nested in level.RoomMap).
  Move place and is_clear to Room.

level.RoomMap.tile_for (and helper Room.tile_for) to generate Tiles.

Add the first room randomly, then pick a wall and dig a corridor.
  To be done: place a room at a random corridor tip.

level.Level.make_room_map(): get tiles with tile_from; eliminate most
  of the code (moved to RoomMap).

10 years agoIncomplete steps toward a new room generator.
Neil Moore [Wed, 11 Jun 2008 03:54:55 +0000]
Incomplete steps toward a new room generator.

New class RoomMap to generate a map with rooms.

Use a RoomMap in Level.make_room_map().

10 years agoMerge branch 'python24'
Neil Moore [Fri, 6 Jun 2008 18:22:29 +0000]
Merge branch 'python24'

Conflicts:
loc.py

10 years agoFinish python 2.4 conversion.
Neil Moore [Fri, 6 Jun 2008 18:19:33 +0000]
Finish python 2.4 conversion.

10 years agoFix a bug with door opening.
Neil Moore [Fri, 6 Jun 2008 18:00:01 +0000]
Fix a bug with door opening.

loc.Door.setattr:  close rather than hide when the 'opened' attr is unset.

10 years agoStart changing conditional expressions to statements.
Neil Moore [Fri, 6 Jun 2008 17:58:27 +0000]
Start changing conditional expressions to statements.

10 years agoUse profile, not cProfile.
Neil Moore [Fri, 6 Jun 2008 17:53:23 +0000]
Use profile, not cProfile.

10 years agoPerimeter-based visibility.
Neil Moore [Thu, 5 Jun 2008 07:54:18 +0000]
Perimeter-based visibility.

Level.visible_path():
  Use a simpler loop with floating-point math, rather than Bresenham.
  Return the list of all visible coordinates along the path.

Creature.can_see():
  Adjust for change to visible_path.

Creature.visibles(): implement perimeter-based visibility testing
  Find the coordinates in the perimeter of the visibility radius (using
    Bresenham's circle algorithm).
  For each of these coordinates, compute the visible_path from me to
    there, and union it into the set of visible tiles.

10 years agoBe less over-the-top about testing for addwstr.
Neil Moore [Sat, 31 May 2008 21:43:41 +0000]
Be less over-the-top about testing for addwstr.

10 years agoUnicode support.
Neil Moore [Sat, 31 May 2008 20:51:52 +0000]
Unicode support.

New module appui.  Eventually AppUI will move there; for now, it
  contains just the hasuni (Unicode supported) flag.

Test for window.addwstr, and enable hasuni if it exists.

Modify render() functions to return an (ascii, unicode, attr) triple.

Add "uni" (unicode character) attribute to each item class.

Level.draw_level(), AppUI.draw_inventory(): draw with Unicode if
  possible.

Note that Unicode support will not work with stock Python: it needs
  the 'addwstr' curses window method, which is a local customization.

10 years agoMake 'quit' an ordinary command.
Neil Moore [Sat, 31 May 2008 21:49:21 +0000]
Make 'quit' an ordinary command.

New exception class PlayerQuit, thrown when the player quits the game.

Catch PlayerQuit and return in the event loop.

10 years agoAdd *.pyc and tags to .gitignore.
Neil Moore [Sat, 31 May 2008 20:52:57 +0000]
Add *.pyc and tags to .gitignore.

10 years agoRearrange AI code.
Neil Moore [Sat, 31 May 2008 13:03:40 +0000]
Rearrange AI code.

Move Monster to module ai (from creature).

Fold AI class into Monster.

10 years agoAdd monsters and AIs.
Neil Moore [Sat, 31 May 2008 12:53:16 +0000]
Add monsters and AIs.

New method Creature.tick():
  Call self.breathe().

Call tick, not breathe, from AppUI.event_loop.

All monsters can swim (with 50% effectiveness).

New module ai, with class AI.
  Method act: pick something to do.
  Method die: give up the ghost.

Make a Monster, not a Creature, on the starting level.

New class creature.Monster: a creature with an AI.
  Monster.tick(): call AI.act().

10 years agoDeath improvements.
Neil Moore [Sat, 31 May 2008 11:47:11 +0000]
Death improvements.

New material: flesh.

New item: corpse.

When a creature dies, drop its inventory and a corpse.

10 years agoCreature invalidation fixes.
Neil Moore [Sat, 31 May 2008 11:31:07 +0000]
Creature invalidation fixes.

Add a creature when starting the game.

Color unknown creatures red.

Do not make Creature invalidations important.

Make Player invalidations important.

Check for no location in Thing.invalidate.

10 years agoIntrinsics cleanup.
Neil Moore [Sat, 31 May 2008 11:02:25 +0000]
Intrinsics cleanup.

Remove Creature.{gain,lose}_intr (.add/|= and .remove/-= are easier).

Add Creature.has to test for an intrinsic.

Rename item attribute 'intrinsic' to 'intrinsics'.

ItemClass.__new__: initialize a set of Intrinsics from a string.

ItemClass.__new__: hasstr() helper function.

10 years agoRepresent flow direction in water tile rendering.
Neil Moore [Sat, 31 May 2008 07:28:27 +0000]
Represent flow direction in water tile rendering.

New method loc.Water.recalc_flow to compute the rendering symbol based
  on flowx and flowy, saving its value in self.flowsign.

Use self.flowsign rather than '~' in Water.render_bg.

Call recalc_flow from Water.__init__ and Water.setattr.

Remove unused method loc.Water.set_flow (holdover from before setattr).

10 years agoSupport for intrinsics.
Neil Moore [Thu, 29 May 2008 18:19:14 +0000]
Support for intrinsics.

New class thing.Intrinsic.
  Set thing.intrinsics of instances (will be externalized later).

Thing.unwield/place: return a boolean for success, can't place if
unwield failed.
  For future support of cursed items.

New material: lapis.
New items: helmet, mask, and "mask of water breathing"
New attribute "intrinsic" for wieldables.

Randomly generate masks of water breathing.

Each creature has a set of intrinsics and extrinsics (the latter from
worn equipment).
  Methods creature.gain_intr, creature.lose_intr.

Creatures can breathe water if they have "waterbreathing".

Creature.wield/unwield: gain/lose extrinsics.

Display instrinsics in stats panel.
  New method Player.format_intrinsics for support.

10 years agoMinor death fix-up.
Neil Moore [Thu, 29 May 2008 05:32:04 +0000]
Minor death fix-up.

Switch avatars only if the current one died (not if any died).

Arrange Creature.can_breathe to make room for future checks.

10 years agoHit points, oxygen, and death.
Neil Moore [Thu, 29 May 2008 05:28:24 +0000]
Hit points, oxygen, and death.

Change 'hand' slot abbreviation to 'W'.
Add new slot 'head' (abbreviated 'H').

Creatures have (by default) 10 HP, 10 max HP, and 10 rounds of oxygen.
Creatures have head slot by default.

New Creature methods:
  can_breathe(): can it breathe at the current location?
  breathe(): take a breath, or lose oxygen or HP.
  losehp(): lose HP and maybe die.
  die(): die (and relocate to nowhere).

Creature.invalidate: do nothing if we are nowhere.

New method AppUI.draw_stats to draw stats window with HP and oxygen.

New method AppUI.more to wait for the user to press space.

AppUI.message: clear the message area before writing a message.

thing.level(): return None if there is no location or level.

Update event loop:
  Draw stats.
  Have each player breathe.
  Check for dead players and remove them from the player list.

10 years agoSplit and rename things.py .
Neil Moore [Wed, 28 May 2008 23:35:16 +0000]
Split and rename things.py .

New module creature.py
  Split off Creature, Player, and slotabbrev from things.py.

Rename things.py to thing.py.

Adjust level.py and roguelike.py to reflect changes.

10 years agoAdd copyright notices (GPL v2 or later).
Neil Moore [Wed, 28 May 2008 08:07:26 +0000]
Add copyright notices (GPL v2 or later).

10 years agoSave Stair targets.
Neil Moore [Wed, 28 May 2008 07:54:03 +0000]
Save Stair targets.

level.py:
  New class Loc representing a location being exported
  Level constructor: take level id, not filename.
    New member lid.
    The filename is "levels/%s.sav".
    New classmethod Level.generate_id to generate an lid if needed.
  Methods LocationProxy.as_loc to convert to a Loc.
  Up default number of rooms for room maps from 5 to 10.
  Decode "Loc" not "loc" in Level.load_file.

loc.py:
  Method Tile.as_loc to convert to a Loc.
  Stair.export:
    Export the target only if it is a location or proxy.
    Export using as_loc.

roguelike.py:
  Initialize the first Level by lid, not filename.

levels/level*.sav:
  Rename loc to Loc everywhere

10 years agoRoom cleanups and fixes, and wet rooms.
Neil Moore [Wed, 28 May 2008 07:07:21 +0000]
Room cleanups and fixes, and wet rooms.

Remove unused union-find support from Room class.

Do not try to pick two preceding Rooms if there is only one.

Rooms have a 1/10 chance to be full of water (instead of floor).

10 years agoConnect rooms in rogue-style levels.
Neil Moore [Wed, 28 May 2008 06:57:26 +0000]
Connect rooms in rogue-style levels.

level0.sav:
  Swap stairs to level1 and unassigned (random) stairs.

roguelike.py:
  Change starting positions.

level.py:
  New class Room (currently for internal use only).
  New method Level.connect to connect two rooms.
  Create Rooms in Level.make_room_map, connect each to
    one or two preceding rooms.

10 years agoGenerate rogue-style levels with rooms.
Neil Moore [Wed, 28 May 2008 04:51:20 +0000]
Generate rogue-style levels with rooms.

New method level.Level.make_room_map to make such a map.
Generate such maps 90% of the time (otherwise use pick_tile{,_1}).

Rooms are unconnected currently.

Check for already-wielded object in AppUI.try_wield()
Clear the messages after each keypress in the main event loop.

10 years agoIndent test cases in cacher.py.
Neil Moore [Wed, 28 May 2008 03:07:58 +0000]
Indent test cases in cacher.py.

10 years agoWieldables.
Neil Moore [Wed, 28 May 2008 02:13:30 +0000]
Wieldables.

items/items.itm:
  Rearrange item hierarchy (new base class 'wieldable').

things.py:
  New item attribute 'wielded': either None, or a (Player, slotname) pair.
  New item attribute 'slot' (where the item may be wielded, or None).
    Typically set in the item class; None in the base.
  New methods Item.unwield, Creature.wield/unwield, Item.wieldable.
  New module-level dict of slot abbreviations (for the inventory screen).
  Move inv and Player.pick_up to Creature.
  Override Item.place to unwield the item if neceesary.

roguelike.py:
  New commands 'wield' and 'unwield', with keybindings 'w' and 'W'.
  Show slot abbreviation for wielded items in inventory screen.

10 years agoAdd a pair of stairs that lead between different points in level0.
Chaun Reynolds [Tue, 27 May 2008 20:50:03 +0000]
Add a pair of stairs that lead between different points in level0.

10 years agoCleanup related to modularization.
Neil Moore [Tue, 27 May 2008 09:07:24 +0000]
Cleanup related to modularization.

Remove last uses of from...import, except for Material.load().

10 years agoModularize.
Neil Moore [Tue, 27 May 2008 09:05:27 +0000]
Modularize.

Split code up into modules:
  level:    Level, LevelProxy, and LocationProxy
  loc:      Location and descendants.
  things:   Thing and descendants, Material, ItemClass
  ui:       Color
  __main__: AppUI
This division is not final.

Remove unused imports.

Eliminate most from...import statements.

10 years agoAdd a new metaclass cacher.Singleton.
Neil Moore [Tue, 27 May 2008 19:23:41 +0000]
Add a new metaclass cacher.Singleton.

Add another couple of tests to cacher.FirstArg

10 years agoMore unit tests for cacher.FirstArg.
Neil Moore [Tue, 27 May 2008 08:28:30 +0000]
More unit tests for cacher.FirstArg.

Add a number of extra unit tests (key immutability, distinctness of
  subclasses, etc.).
Use doctest to run the unit tests when invoked directly.

10 years agoMove Cacher class to cacher.FirstArg.
Neil Moore [Tue, 27 May 2008 08:00:26 +0000]
Move Cacher class to cacher.FirstArg.

10 years agoMove colors from AppUI to separate Color class.
Neil Moore [Mon, 26 May 2008 15:10:24 +0000]
Move colors from AppUI to separate Color class.

10 years agoVisibility refactorings.
Neil Moore [Mon, 26 May 2008 10:51:39 +0000]
Visibility refactorings.

Move main visibility code from Level.draw to new Creature.visibles.
Simplify drawing code somewhat.

10 years agoUse item.names not item[0] in ItemClass parser.
Neil Moore [Mon, 26 May 2008 10:04:11 +0000]
Use item.names not item[0] in ItemClass parser.

10 years agoInheritance of Items
Neil Moore [Mon, 26 May 2008 10:03:01 +0000]
Inheritance of Items

Modify ItemClass.__new__ to take a name and a list of properties, rather
  than name, ascii, material.  Correspondingly modify load().
New Item property 'isa' to denote the base itemclass.  This property is
  not left in the item class's dict.

Rearrange the parser somewhat.
Most importantly, treat the parse result as a sequence, not a dict,
  so that item classes are created in the correct order.

Add new base item classes to items/items.itm, and have some of the
  existing item classes inherit from them.

10 years agoMake ItemClass a metaclass.
Neil Moore [Mon, 26 May 2008 08:52:57 +0000]
Make ItemClass a metaclass.

Make Thing (hence Item) a new-style class.
Derive ItemClass from type.
Replace ItemClass.__init__ with __new__, and remove __call__.
Remove Item.__init__: everything is handled in ItemClass or Thing now.

10 years agoItem classes and loading from files.
Neil Moore [Sat, 24 May 2008 09:50:07 +0000]
Item classes and loading from files.

Implement an ItemClass class representing a species of object.
  Calling an ItemClass instance creates a new Item of that class.

Move Item.parse() to ItemClass.load(), convert into a pseudo-generator.
Implement Item.loadall() (return a list from the generator)

Remove material lazy-loading code from Item.
  Now handled by ItemClass.

Make Item constructor require an ItemClass.

Add more item classes to the items.itm file.

Load the items.itm file.

10 years agoUse Cacher for Level, too.
Neil Moore [Sat, 24 May 2008 09:16:49 +0000]
Use Cacher for Level, too.

Allow Cacher keys to be None (we never reuse an object with a None key, but
  we still remember the last such object in __instcache{None}).

Use Cacher as Level's metaclass.
Remove Level.__new__().
Rename Level.init() back to __init__().

Modify Level's callers so that filename is always used as a positional
  rather than keyword argument.

Error check: if a filename was specified, all the other constructor
  parameters should be None.

10 years agoUse a metaclass to cache Materials.
Neil Moore [Sat, 24 May 2008 09:03:52 +0000]
Use a metaclass to cache Materials.

Implement a Cacher metaclass that caches objects by their first
  constructor parameter.

Remove Materials.__new__(), rename init() back to __init__().
Use Cacher as Material's metaclass.

10 years agoParser for item descriptions.
Neil Moore [Sat, 24 May 2008 08:22:30 +0000]
Parser for item descriptions.

New method Item.parse(), using pyparsing.
Begin a list of item classes in items/items.itm .

10 years agoRefine Material error checking.
Neil Moore [Sat, 24 May 2008 06:45:43 +0000]
Refine Material error checking.

Material.__new__():
  Check for attrs == None instead of the boolean value.
    attr = 0 is potentially a color pair!
  Make sure name is true.

10 years agoMaterial error checking.
Neil Moore [Sat, 24 May 2008 06:40:18 +0000]
Material error checking.

Material.__new__():
  If attrs or adj is provided and differs from the cached value, raise
    an exception (assertion).
  If attrs is not provided and there is no cached value, raise an
    exception.

Remove an obsolete TODO comment.

10 years agoAssign attributes in Tile constructors.
Neil Moore [Sat, 24 May 2008 05:37:49 +0000]
Assign attributes in Tile constructors.

Level.load_file():
  Load extra lines before constructing the grid; save results in a dict
    from (y,x) tuples to dicts from names to values.
  Pass name,value dict to decode_tile.

Level.decode_tile():
  Flatten the passed-in attribute dict into keyword parameters and pass
    to the constructors.

Stair.__init__():
  Accept tgt and oneway as keyword parameters.

10 years agoLoad material descriptions from a file.
Neil Moore [Sat, 24 May 2008 04:58:03 +0000]
Load material descriptions from a file.

Implement a memoizing Material.__new__().
Rename __init__() to init() and call from __new__().

Allow Items to be created with a Material name (instead of a Material).
Item.material(): new function
Returns the material (looking up the name if necessary).

Allow Materials to be created with a color name (defer AppUI.cp() calls).
Material.attr(): convert None to cp('Default'), string to cp(string).

No longer use 'stuff' as a default material.
Remove material definitions from the code.

Add classmethod Material.load() generator to load materials from a file.
Add classmethod Material.loadall() as a wrapper around load().

AppUI: Rename BrightWhite => White/BrightGray, White => Gray.
AppUI: Alias DarkGray to BrightBlack.
AppUI: Add aliases 'Grey' for 'Gray' (etc for Bright/DarkGrey).

New file materials/materials.mtl with the default materials.

10 years agoFix crash on closing/opening non-Doors.
Neil Moore [Wed, 21 May 2008 23:45:38 +0000]
Fix crash on closing/opening non-Doors.

Implement Tile.close() and Tile.open() stubs.

10 years agoVisibility fix
Neil Moore [Wed, 21 May 2008 09:38:11 +0000]
Visibility fix

Fix a silly bug in our Bresenham implementation.
  Forgot to subtract from the error when incrementing y.

10 years agoForce all player invalidations
Neil Moore [Wed, 21 May 2008 09:13:45 +0000]
Force all player invalidations

Remove the 'important' parameter from Thing.invalidate().
  Now it is always False for base Things, True for Players.

When adding/removing Things to/from a tile, invalidate through the
  object (to get the important flag).

Remove special invalidation in AppUI.try_traverse.

10 years agoForced invalidation
Neil Moore [Wed, 21 May 2008 09:07:59 +0000]
Forced invalidation

Add an optional parameter 'important' to the invalidation functions.
  If true, the tile will always be redrawn, regardless of visibility.

New member Level.important_repaints.
  Handle in Level.draw()

When crossing stairs, flag the old location as an important redraw.
  Really, this should be done whenever the player's old location is
  not visible from the new.

10 years agoMerge branch 'master' into visibility
Neil Moore [Wed, 21 May 2008 07:18:54 +0000]
Merge branch 'master' into visibility

10 years agoTouch up level1
Neil Moore [Wed, 21 May 2008 07:18:01 +0000]
Touch up level1

Add one more secret door to avoid a diagonal passage.

10 years agoAdd todo comments about visibility.
Neil Moore [Wed, 21 May 2008 07:13:28 +0000]
Add todo comments about visibility.

10 years agoReal visibility.
Neil Moore [Wed, 21 May 2008 07:09:21 +0000]
Real visibility.

New boolean method Location.transparent().

New boolean method Level.visible_path(): returns False if there were any
  non-transparent locations on the path between two locations.  Uses
  Bresenham's algorithm to find the path.

New method Creature.vis_radius() to return the maximum visible range.

New boolean method Player.can_see(): returns True if the player can see
  a position (i.e. if the position is within the visibility radius and a
  visible_path exists between the two.

Avoid out-of-bounds in Level.draw() by clipping test ranges.

10 years agoMake visibility faster.
Neil Moore [Wed, 21 May 2008 05:47:18 +0000]
Make visibility faster.

Don't uselessly compute visibility for each square.
Remove Level.is_visible().  This would be more profitable as a method on
  Players.

10 years agoBasic visibility support.
Neil Moore [Wed, 21 May 2008 05:34:23 +0000]
Basic visibility support.

Only paint visible tiles.
  Currently, all tiles within distance 5 of a Player.
New method Level.is_visible(y,x) to implement this logic.

The current version is very slow.  This will be fixed.

10 years agoImplement level/location proxies, fix level cache
Neil Moore [Tue, 20 May 2008 05:17:47 +0000]
Implement level/location proxies, fix level cache

Do not reinitialize existing levels.
 * Rename Level.__init__ to Level.init.
 * In Level.__new__, call init on new instances (not those from the cache)

Add LevelProxy and LocationProxy classes.
Add new attr types: level (a level name) and loc (levelname y x).
  These types are converted into proxies.
Handle proxies in Stair.traverse().

10 years agoRecentering fixes.
Neil Moore [Tue, 20 May 2008 00:16:56 +0000]
Recentering fixes.

Recenter at the beginning of the event loop, so we recenter after every
  command, even if it takes no time.
When recentering, call Window.mvderwin at most once (avoiding flicker).
Fix silly typo in stair exports.
Remove some debug messages.

10 years agoAttribute fixups.
Neil Moore [Mon, 19 May 2008 23:56:45 +0000]
Attribute fixups.

Use setattr not __setattr__ to set attributes.
Add setattr method to Tile subclasses that have attribues.
Support hidden doors (self.hidden, self.hide(), self.unhide()).
Render hidden doors as # (closed) = (open), the same color as walls.
Save attributes of Stairs and Doors.
Make some hidden doors in level1.sav.

10 years agoConnecting levels.
Neil Moore [Mon, 19 May 2008 05:26:01 +0000]
Connecting levels.

Stairs may now be oneway.
Added a new map encoding: < is a drop targets (target for oneway stairs).

Stair targets can now be:
    None:       make a level and connect to one of its stairs/drop targets
    string:    load a level and connect to one if its stairs/drop targets
    Level:     connect to one of the level's stairs/drop targets
    Location:  connected
  After stair.traverse() is called, the target is a location.

If a Stair's tgt attribute is set, remove the Stair from the list of
  unconnected stairs (or add it if tgt is becoming false).

Make Level.unconnected_stairs a set again.
New methods Level.stair_available()/unavailable() for adding/removing to
  the set of unconnected stairs.

level0.sav:
  Add small room with a drop target.
  Make left stairs oneway, connect to level1.sav (see below).

level1.sav:
  New level.
  Drop target in one corner (from level0).
  Oneway stair back to level0's drop target in other corner.
  Two-way stair near the middle (hidden once we have visibility.

10 years agoDistinguish target() and traverse().
Neil Moore [Mon, 19 May 2008 03:07:01 +0000]
Distinguish target() and traverse().

Tile.traverse() calls Tile.target() by default.
Stair.target() does not create a new level, while Stair.traverse() does.

Use self.level() instead of self.container() in a number of locations.

10 years agoMultiple levels, multiple avatars.
Neil Moore [Sun, 18 May 2008 07:36:41 +0000]
Multiple levels, multiple avatars.

Levels now track their unconnected stairs.
When traversing an unconnected stair, connect it to an existing
  unconnected stair on the destination map (rather than adding a new
  stair at a random location).
Add a second generated level (Level.pick_tile_1), and choose randomly
  between them for each generated level.
Add an extra stair to level0.sav.

AppUI now maintains a list of players (really avatars at the moment).
New command 'switch' (default mapping @) to change to the next avatar.
Color inactive avatars dark magenta, not bright.
Create two avatars in main().

Add level() method to Thing, Location, etc. to find the containing
  level (following the 'container' and 'location' relations until
  we reach a Level).

10 years agoSplit out level file loading into a new method.
Neil Moore [Sun, 18 May 2008 05:51:40 +0000]
Split out level file loading into a new method.

10 years agoReverse water flow in level0.sav.
Neil Moore [Sat, 17 May 2008 05:15:41 +0000]
Reverse water flow in level0.sav.

10 years agoSave/restore extra information.
Neil Moore [Sat, 17 May 2008 05:13:16 +0000]
Save/restore extra information.

Add a type field to the format.  Currently supported are int, float,
  bool, and str.
Add types to level0.sav.
Better error checking when parsing a level file.
Parse attribute lines, and set the referenced tile's attributes appropriately.
Turn Location into a new-style class (so we can use __setattr__).
Always use floats, not ints, for Water.flow{x,y}.

10 years agoSimplify inventory window code.
Neil Moore [Sat, 17 May 2008 01:29:29 +0000]
Simplify inventory window code.

Eliminate inv_wait, inv_drop, inv_throw.
AppUI.draw_inventory(): eliminate function parameter.
AppUI.draw_inventory(): import old inv_throw code.
AppUI.try_drop(): handler to drop the selected inventory item.

10 years agoNew AppUI.location() method to get player's location.
Neil Moore [Sat, 17 May 2008 01:19:46 +0000]
New AppUI.location() method to get player's location.

10 years agoMove event loop to AppUI class
Neil Moore [Sat, 17 May 2008 01:14:18 +0000]
Move event loop to AppUI class

New method AppUI.level().

10 years agoRequire a player to construct an AppUI.
Neil Moore [Sat, 17 May 2008 01:00:43 +0000]
Require a player to construct an AppUI.

AppUI.__init__(): require a player parameter.
Construct the Player, then the AppUI, then the Level; then place the
  Player.

10 years agoDefine bright colors in AppUI
Neil Moore [Sat, 17 May 2008 00:50:32 +0000]
Define bright colors in AppUI

Define entries in AppUI.color_pairs for bright variants of the colors.
Use AppUI.cp('BrightFoo') instead of curses.A_BOLD|AppUI.cp('Foo').
Add BrightBlack as a possibility for floor color.

10 years agoMove recentering code to AppUI
Neil Moore [Sat, 17 May 2008 00:41:38 +0000]
Move recentering code to AppUI

New method AppUI.recenter().
Recenter before drawing a new level (avoiding flicker or traverse).

10 years agoMake Inventory list-like.
Neil Moore [Sat, 17 May 2008 00:33:44 +0000]
Make Inventory list-like.

Rename Inventory.getitem to __getitem__.
Use inv[index] instead of inv.getitem(index) or inv._items[index].

10 years agoSimplify inventory command.
Neil Moore [Sat, 17 May 2008 00:25:19 +0000]
Simplify inventory command.

Have inv_wait return False.
Map the 'inventory' command to AppUI.draw_inventory instead of a lambda.

10 years agoSimplify commands map.
Neil Moore [Sat, 17 May 2008 00:19:27 +0000]
Simplify commands map.

Move save() to AppUI class.
Use nullary functions in self.commands.

10 years agoFix open and close.
Neil Moore [Sat, 17 May 2008 00:12:20 +0000]
Fix open and close.

Move try_open and try_close to AppUI.
AppUI.set_level(): position the panel.

10 years agoRemove unused constants AppUI.Red and friends. v0.0.2
Neil Moore [Fri, 16 May 2008 23:44:12 +0000]
Remove unused constants AppUI.Red and friends.

10 years agoMore AppUI consolidation.
Neil Moore [Fri, 16 May 2008 23:42:53 +0000]
More AppUI consolidation.

Rename Tile.traverse to Tile.target; eliminate thing parameter.
Move draw_inventory, try_traverse, and try_throw into AppUI.
AppUI.try_traverse(): place the player.
Update commands dict to reflect.

10 years agoMove stuff into AppUI.
Neil Moore [Fri, 16 May 2008 23:23:56 +0000]
Move stuff into AppUI.

Move get_direction into AppUI.
Move commands and keymap dicts into AppUI.
Add AppUI.message() method.

10 years agoAdd a new AppUI class (singleton).
Neil Moore [Fri, 16 May 2008 23:13:56 +0000]
Add a new AppUI class (singleton).

Get curses color pairs from the AppUI class.
Create panels, windows, etc. in the AppUI constructor.

10 years agoMake 'throw' a normal command.
Neil Moore [Fri, 16 May 2008 22:18:11 +0000]
Make 'throw' a normal command.

10 years agoImprove stairs and multilevel support.
Neil Moore [Fri, 16 May 2008 09:27:24 +0000]
Improve stairs and multilevel support.

Fix window resize bug in main() when changing levels:
  We had been overwriting the screen size globals with the window size.
Import random, not its functions.
When loading a level, make sure to track active tiles.
Remove Level.stairs list and Level.find_stairs().
Add Level.make_stair() to add a new Stair at a random location.
Remove target parameter from Stair constructor.
Add Stair.connect() to link up two locations (should be moved).

10 years agoDoors, stairs, etc.
Neil Moore [Thu, 15 May 2008 15:20:33 +0000]
Doors, stairs, etc.

Add doors, (o)pen and (c)lose.
Add stairs (links to other levels), (>)traverse.
New member function Person.level().
Levels now contain their own window object.
Levels keep a list of stairs.
Access the level (and the main window) through me.
get_direction: display prompt in message panel.
levels/level0.sav: sdd some doors and stairs.

10 years agoReorganize profiling output. v0.0.1
Neil Moore [Wed, 14 May 2008 07:32:50 +0000]
Reorganize profiling output.

Put profiling outputs into a new profiling/ directory.

10 years agoFixes.
Neil Moore [Wed, 14 May 2008 07:29:56 +0000]
Fixes.

Fix a few leftover uses of Location's content arrays.
Rename Thing.move() to Thing.try_move().
Lift Item.place() and Creature.place() into Thing.place().
Quit on Q, not ESC.

10 years agoActually commit the source.
Neil Moore [Wed, 14 May 2008 07:14:47 +0000]
Actually commit the source.

See last message.

10 years agoAdd fast(er) repainting
Neil Moore [Wed, 14 May 2008 07:14:03 +0000]
Add fast(er) repainting

Access Location contents through remove() and add() methods.
Track invalid tiles (those that need a repaint).
Level.draw(): only draw invalid and/or active tiles.
Thing.render(): return a tuple not a list.
Implement profiling support.
Add two profiler outputs: {original,selective-redraw.prof}

10 years agoAdd .gitignore to make sure lvl.sav stays ignored. original
Neil Moore [Wed, 14 May 2008 06:07:47 +0000]
Add .gitignore to make sure lvl.sav stays ignored.

10 years agoRemoved extraneous lvl.sav from VC.
Neil Moore [Wed, 14 May 2008 06:03:32 +0000]
Removed extraneous lvl.sav from VC.

10 years agoInitial import.
Neil Moore [Wed, 14 May 2008 06:03:00 +0000]
Initial import.