A brief rundown of the hierarchy of the game data objects:
Configuration - loaded from XML files, has Descriptors, among other things
Atlas - has a Configuration, has a CreatureInstance(represents the player's creature instance), is an associative array of AtlasColumns
AtlasColumn - has an Atlas(parent), is an associative array of AtlasCells
AtlasCell - has an AtlasColumn(parent), is an associative array of Layers
Layer - has an AtlasCell(parent), is an associative array of LayerColumns
LayerColumn - has a Layer(parent), is an associative array of LayerCells
LayerCell - has a LayerColumn(parent), has a CreatureInstance, a array of ItemInstances, and a TerrainInstance
CreatureInstance/ItemInstance/TerrainInstance - has a LayerCell(parent), has a Descriptor
Descriptor - has an associative array of properties needed by an instance to do its particular function
The most important thing in the Configuration are the Descriptors. A Descriptor has all of the properties that are needed by the various types of instances. It has properties that drive behavior, what it looks like on screen, and so on.
So here's the part that bothers me:
Everything... EVERYTHING, from Atlas to TerrainInstance can talk up and down the entire chain, the reason being that if, for example, the TerrainInstance is a square upon which a player steps and suddenly a number of monsters are conjured around him, the TerrainInstance needs to have access to the neighboring LayerCells. Or for another example if a CreatureInstance when attacking the player's CreatureInstance is able to take items from the player's inventory, and relocate them somewhere else in the dungeon, it needs access to a different Layer or AtlasCell in order to put the item where it needs to go.
An alternative that would appear to be "better encapsulated" might be a messaging system that sends little message objects up and down the chain and handles things at the appropriate level, but is that really any BETTER than just having the objects be aware of one another?
The game I'm writing started out with mostly hardcoded item and creature types, and gradually morphed its way into something similar to the more flexible roguelike framework that I've detailed above. I'm finally switching from C# to Java for it(the language is immaterial, however), and I'd like to not have missed something glaringly obvious that will cause great pains later when I need to refactor it.
So, the question: is the apparent lack of encapsulation within the data/business objects of the game demonstrate a fatal flaw in the architecture? And if so, what is that flaw and how can I correct it before I get too far along?