A RoomGenerator is now made up of two "method" classes that do separate
things:
1. A RectMethod takes the size of the area to generate and creates an
iterable stream of Rects to fill that area.
2. A RoomMethod takes a Rect and creates a room inside of it.
These two components are composable in interesting ways, and allow a
more data-driven approach to map generation, though I don't yet have the
ability to make this mechansim entirely data-driven.
This configuration object can actually apply to all room generators.
Notably: copy the default configuration object before setting it to self.configuration.
- Generate creates rooms and corridors, and apply applies them to a tile grid.
- Add up and down stairs generation to the Room Generators.
- Clean up Room.wall_points and Room.floor_points to make it easier to
write a generic apply() method on RoomGenerator
- Move room generators to map.generators.room
- Move corridor generators to map.generators.corridor
Generators have a generate() method that generates the things they place,
and an apply() method that applies their objects to a grid of tiles.