コード例 #1
0
ファイル: Controller.cs プロジェクト: EttienneS/Contingency
        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;
        }
コード例 #2
0
ファイル: Controller.cs プロジェクト: EttienneS/Contingency
 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);
     }
 }