private static Menu GetAllActions(WorldModel worldModel) { Tile current = worldModel.Player.CurrentTile; Menu menu = new Menu(); Menu atackOption = new Menu(menu, "Attack", null); Menu eatOption = new Menu(menu, "Eat", null); Menu pickUpOption = new Menu(menu, "Pick Up", null); Menu buildOption = new Menu(menu, "Build", null); Menu useOption = new Menu(menu, "Use", null); List<IEntity> entities = current.TileContents.Where(f => !(f is Player)).ToList(); entities.AddRange(worldModel.Player.Inventory); foreach (IEntity entity in entities) { if (entity is IEdible) { IAnimate i = entity as IAnimate; if (i != null) { // if the entity is animate it can fight back, so kill it before eating it if (i.Health > 0) { atackOption.AddOption(entity.Name, worldModel.Player.Attack, entity); } else { // entity is dead, can be eaten CheckIfCanBeEaten(worldModel, entity, eatOption); } } else { // entity is not animate so it cannot attack, eat it without struggle CheckIfCanBeEaten(worldModel, entity, eatOption); } } IItem item = entity as IItem; if (item != null) { if (!worldModel.Player.Inventory.Contains(entity) && item.CanLoot()) { pickUpOption.AddOption(entity.Name, worldModel.Player.PickUp, entity); } } } if (worldModel.Player.Inventory.Any(i => i is Rock)) { buildOption.AddOption("Rock wall", worldModel.Player.Build, new Wall()); } foreach (var item in worldModel.Player.Inventory.Where(i => i is IUseable)) { useOption.AddOption(item.Name, worldModel.Player.Use, worldModel.Player.Inventory.First(f => f is IUseable)); } if (atackOption.MenuOptions.Count > 0) menu.MenuOptions.Add(atackOption); if (eatOption.MenuOptions.Count > 0) menu.MenuOptions.Add(eatOption); if (pickUpOption.MenuOptions.Count > 0) menu.MenuOptions.Add(pickUpOption); if (buildOption.MenuOptions.Count > 0) menu.MenuOptions.Add(buildOption); if (useOption.MenuOptions.Count > 0) menu.MenuOptions.Add(useOption); menu.MenuOptions.Add(new Menu(menu, "Stay", worldModel.Player.Stay)); worldModel.ActiveMenu = menu; return menu; }
private static void CheckIfCanBeEaten(WorldModel worldModel, IEntity entity, Menu eatOption) { IEdible e = entity as IEdible; if (e != null && worldModel.Player.DesiredFood.HasFlag(e.ProvidesFoodType) && e.CanBeEaten()) { eatOption.AddOption(e.FoodName, worldModel.Player.Eat, entity); } }