public IEnumerable<StaticItem> GetGameObjects(World world) { var exceptions = new List<TileException>(); Tile[,] tiles; var result = new List<StaticItem>(); var walls = GetLayout(world, out tiles); result.AddRange(walls); int initialWorldId = GetStartingWorldAreaId(); StartState ss = GetStartStateForWorldAreaId(initialWorldId); var player = new Player(world, ss.PlayerPosition.ToPosition(), ss.PlayerEnergy); result.Add(player); var playerStartPositions = this._worldAreas.Where(wa => wa.StartState != null).Select(wa => new Grave(world, wa.StartState.PlayerPosition.ToPosition())); exceptions.AddRange(SetTileOccupation(ref tiles, playerStartPositions, false)); var objects = this._xmlDoc.SelectNodes("World/Objects/*"); if (objects == null) throw new InvalidOperationException("No Objects node in world definition."); foreach (XmlElement definition in objects) { StaticItem[] newItems; switch (definition.LocalName) { case "Boulder": { newItems = new StaticItem[] { GetBoulder(world, definition) }; break; } case "Monster": { newItems = new StaticItem[] { GetMonster(world, definition) }; break; } case "Crystal": { newItems = new StaticItem[] { GetCrystal(world, definition) }; break; } case "ForceField": { newItems = GetForceFields(world, definition).Cast<StaticItem>().ToArray(); break; } case "CrumblyWall": { newItems = new StaticItem[] { GetCrumblyWall(world, definition) }; break; } default: throw new InvalidOperationException("Unknown object " + definition.LocalName); } result.AddRange(newItems); exceptions.AddRange(SetTileOccupation(ref tiles, newItems.Where(item => !(item is Monster.Monster) || ((Monster.Monster) item).IsStill), false)); } var fruit = GetListOfFruit(world, ref tiles); result.AddRange(fruit); exceptions.AddRange(SetTileOccupation(ref tiles, result.OfType<Monster.Monster>().Where(m => !m.IsStill), true)); ReviewPotentiallyOccupiedTiles(ref tiles, exceptions); if (exceptions.Count != 0) { string message = string.Empty; var errors = exceptions.Where(te=>te.Type == TileExceptionType.Error).ToList(); var warnings = exceptions.Where(te=>te.Type == TileExceptionType.Warning).ToList(); foreach (TileException te in errors) { if (message.Length != 0) message += "\r\n"; message += string.Format("{0} - {1}", te.Type, te.Message); } if (warnings.Any()) { if (message.Length != 0) message += "\r\n"; foreach (TileException te in warnings) { if (message.Length != 0) message += "\r\n"; message += string.Format("{0} - {1}", te.Type, te.Message); } } if (errors.Any()) throw new InvalidOperationException(message); Trace.WriteLine(message); var dr = MessageBox.Show(message, "Warnings", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); if (dr == DialogResult.Cancel) throw new InvalidOperationException(message); } this._tiles = tiles; return result; }