IMPORTANT


MISC
. include metadata in homepage index.html
. upload CVS snapshot
o level editor
. finish rpm spec
. include debian package information
. save configuration file
. pause game if program is deactivated

GAME
. kill actors inside a closing door
? use Object reference counts
. make complete puzzle stones explode
o check for and raise errors in LUA interface routines
. no crashes when creating unknown objects or models
. bomb explosions destroy nearby items and the floor underneath
. oxyd_shuffle
. do no allow items on certain floors (like abyss for example)
. let main actor decide whether an item may be dropped 
  (eg, only if in state IDLE)
. pause
. allow definition of new object types in LUA
. options menu
. in-game menu
. background behind floors: water/abyss/space/swamp
. change sprite being followed when switching players
. allow using the mouse wheel for rotating inventory entries
. remember stones<->actor contacts, don't treat these as collisions
. ball--ball collisions
. restitution coefficient for collisions
. let objects create force fields
. use proper 3d coordinates throughout
. handle contact with floor tiles and items
. error handling in world::  (eg world not created)
. client-server architecture
. network/internet game (use quake networking code?)
. also use angular velocities for the marbles

DISPLAY / GRAPHICS
. polish puzzle stone gfx
. support for other resolutions and bit depths
. help screen
. tint_rect()
. special menu entries (editable)
. activate menu entries with the mouse
. mouse cursor for menus
. implement soft scrolling
. highlight current item in inventory
. properly update changed models on the screen
. re-do actor shadows properly
. make black ball shine
. opengl display
. rotating marble

SPECIAL OBJECTS
. rotors
. elastic bands
. level teleporter
. warp tunnels (a la sonic)

ITEMS
. wire
. player switcher
. white bombs
. spade
. coins
. keys in various colors
. warp tunnel
. magnets
. mounds/hollows
. flags
. bags
. sunglasses
. springs

FLOORS
. trampoline
. water
. ice
. brittle floor
. swamp
. emerging/disappearing floor

STONES
o timer stone
. wooden stone
. rotary switch
. death's head stones
. yin-yang stones of all sorts
. white/black switches
. "bolder" stones
. electric stones
. rotating stone
. slot machine
. impulse stones
. fake impulse stones

OPEN QUESTIONS
? edge radius as parameter for stones
? world invariant: no objects are killed during a tick
? nice background image for main menu

REJECTED
- isometric display
- rewrite world to use Layers of objects instead of Fields --
  not worth the trouble
- BMP instead of png? -- alpha channel in pngs is very nice for 
  composing images
- explosion is an effect, not an item model! -- not quite: explosions
  must exist as long as the animation is playing so they can kill
  actors that come too close
- complete Dict class, use it for ImageCache and ValueMap --
  use std::map instead; compilation speed doesn't suffer that much
- proper GC for scheme objects -- use lua instead of guile
- speed up leak tracer (use hashing?) -- updated to newer version
- Create binary level format? -- no, can always use byte compiled LUA code
- find and fix bug in RectList::sub -- no bug, only unbearably slow
- ODE solver -- no need for RK4: euler does well enough so far
- reference counting for `Object'
- may object attributes affect their appearance on the screen? No!
  Data should only flow from world:: to display:: and all special
  effects (if necessary) can be realized by introducing special
  functions in display::.

DONE
--- before 0.38 ---
x there seems to be a subtle bug in the laser code. track down and fix.
x new level: mirrors
x fix LaserSensitive to handle laser stones and mirrors
x fix interaction laser beams <-> doors
x glass stone
x new level: space
x switch gfx
x shogun dot/stone gfx
x switch
x shogun stones
x shogun dots
x doors
x door gfx
x inverse motion floor
x space
x put together a small homepage
x puzzle stones
x chameleon stone
--- before 0.37 ---
x submit project description for savannah
x level preview
x finish levels if certain criteria are met
x play music during the game
x implement image cache
x level selection menu
x return error codes from lua::Dofile
x add license information in all source files
x register at savannah
x add fadein/fadeout effect when (re-)starting a level
x move to next level when all oxyd stones are open
x oxyd stones open when hit by a laser beam
x re-start level when all main actors have been killed
x explosion as new item type
x different model for extra life in inventory
x animation for falling marble
x abyss
x time limited text display in the inventory area
x more accurate collision detection with laser beams
x implement on/off actions for switches etc.
x marble shatters when hit by a laser or an explosion
x paint laser stones in other orientations
x message handler for LaserStone
x fix update of inventory when displaying messages
x make it easier to create objects in level description files
x clean up display_2d.cc
x let laser beams pass through floating stones
x ignite dynamite and bombs when hit by laser
x do screen updates more cleverly
x recalc light only once, and at the end of a turn
x laser recalc on changes to "illuminated" fields
x invoke removal() when objects are removed from the grid
x fix laser recalc when moving mirrors
x fix laserhv gfx
x laser beams
x laser
x mirrors
x mirror gfx / impl
x oneway stone gfx + impl
x use GridPos instead of explicit (int x, int y) specifications
x GridObject _always_ know about their position (heck, memory is cheap
  these days, 8 bytes more for each object won't hurt that much)
x interface for naming objects/retrieving objects by name
x image cache
x animation for active laser stone
x LoadImage, LoadFont routines in enigma.cc
x configure.in: create config.h, including DEFAULT_DATA_PATH
x enigma::FindDataFile
x load data from the installation directory
x add a way to define overlay images
x paint missing oxyd stones 
x make data path configurable
x make "make install" work 
x adapt item_under, floor_under in SetFloor, SetItem, etc. [removed
  these fields from ActorInfo]
x include LUA in distribution (convert to autoconf?)
x call Item::on_drop for dropped items
x clean up state transition in dynamite and bombs
x play sound on collisions with stones
x fake oxyd stones
x complete implementation of oxyd stones
x remove generic model manager in display.cc (use map<> instead)
x reversible animations
x animation callbacks
x remove class Model, do not pass Model objects between display and world
x gfx swap stone
x proper state transitions for oxyd stones
x opening and closing animations for oxyd stones
x composite model
x make --help actually output something
x complete bomb impl.
x complete dynamite impl.
x active objects in world::
x add --nosound option
x easier ways to define animations in models-2d.lua
x burning dynamite animation
x oxyd stones
x reset text display when entering a new world
x complete menu implementation
x colored fonts (in ttf2bmf ?)
x main menu
x check for SDL_ttf
x build ttf2bmf only if SDL_ttf present
x oxyd stone animation
x implement text display (only in inventory? on the screen? scrolling?)
x px/font.cc|hh
x fonts/ttf22bmf
x option for mouse sensitivity
x object callbacks to LUA functions
x calling Object::on_message from LUA
x only redraw sprites that have actually changed
x add border stones that keep objects from leaving the level
x fix add_contact()
x swap stones
x distribute all necessary files
x implement scrolling (also soft scrolling?)
x scroll if main actor of current player reaches the border of the screen
x set tile width/height in model description file
x make certain stones movable
x gfx: bombstone
x remove scheme code, adjust configure.in/Makefile.am
x write lua interface code
x lua interface code for display_2d, models-2d.lua completed
x load a configuration file
x rewrite guile files in LUA
x bomb stone
x make px::Array2 exception safe
x write .spec file
x it-dynamite
x it-black bombs
x it-magic wand
x it-hammer
x it-umbrella
x it-one up
x it-trigger
x actor-stone collision fine tuning (rounded edges for stones)
x make marble a little smaller
x vector reflection: use plane instead of line
x drop items or kill them if they so desire
x scanlines are seldomly used in px::Surface; calculate on demand
x insert picked up items at the beginning of the inventory
x do not pick up items if any mouse button is pressed
x activate objects
x player:: must have a way to determine the main actor for every player
x pick up items => on_pickup
x inventory management
x build and link LUA
x fix type checks in scheme interface
x object attributes (en-set-attrib / en-get-attrib)
x find and plug memory leaks
x random model factory
x reduce screen overdraw (particularly bad for many collision animation)
x make it compatible with older Guile versions
x inventory window
x two sprite types: ACTOR and EFFECT
x remove finished animations
x allow animationens for stones, items etc.
x px::abs(Vector) --> px::length(Vector)
x rename project to Enigma
x fix strange bug: ball can penetrate (and pass) solid stones
x fix rebounding from adjacent stones
x define animations
x show animation at collision points
x collision with stones => stone->on_hit()
x draw marble above stone shadows
x display2d: ShadedModel new
x remove `max_force' method
x collision handling (how?)
x physics simulation
x ball--stone collisions
x rebound from stones
x friction
x pass mouse force to world::
x use Assert<TypeError> in Value::get* instead of assert()
x world::get_force(Object *obj) -> friction, force fields etc
x force management in world.cc
x bewegung + position von actors in Terra richtig (->on_creation...)
x use o2-make-object instead of -make-actor, -item, ...
x correctly set window caption
x sprite movement: also redraw old position
x display_2d: fix screen update
x scheme-interface for model definitions in display_2d.cc
x display_2d.cc: do not save sprite positions in the model itself but
  keep it separate -> unified meaning of draw_at()
x display_2d.cc: implement animations as a vector<Model2d*>
x evtl: draw_at() und draw_shadow_at() fr jedes Model2d?
x define models in scheme; remove init.cc
x redraw sprites only if they really moved on the screen
x World::tick
x rewrite main loop / screen update
x fix crash when reloading levels
x at program start: flush the event queue to avoid mouse jumps
x mouse force
x mouse grab
x make_actor, set_actor
x animation, sprite, animatedsprite
x timing module
x link to guile
