Exemplo n.º 1
0
 //Assume he will pick the flint and rocks
 public override void ApplyActionEffects(WorldModelDST worldModel)
 {
     worldModel.Cycle += this.Duration;
     worldModel.RemoveFromWorld(this.Target, 1);
     worldModel.AddToPossessedItems("rocks", 3);
     worldModel.AddToPossessedItems("flint", 2);
 }
Exemplo n.º 2
0
        protected float Playout(WorldModelDST initialPlayoutState)
        {
            List <ActionDST> actions;

            WorldModelDST clone = initialPlayoutState.GenerateChildWorldModel();

            CurrentDepth = 0;
            //int parentID = 0; // ?
            int size = 0, random = 0;

            while (CurrentDepth < MaxPlayoutDepthReached)
            {
                actions = clone.GetExecutableActions();
                foreach (var a in actions)
                {
                    //Console.WriteLine(a);
                }

                size = actions.Count;
                //Console.WriteLine("size:" + size);

                random = this.RandomGenerator.Next(0, size - 1);
                actions[random].ApplyActionEffects(clone);

                //Had clone.getNextPlayer here in proj algorithm
                CurrentDepth++;
            }
            //return score
            return(initialPlayoutState.Score());
        }
Exemplo n.º 3
0
        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;
            worldModel.IncreaseHunger(2);

            worldModel.Walter.Position = worldModel.GetNextPosition(this.Target, "fire");
        }
Exemplo n.º 4
0
 public MCTSAlgorithm(WorldModelDST currentState)
 {
     this.InProgress      = false;
     this.CurrentState    = currentState;
     this.MaxIterations   = 100;
     this.RandomGenerator = new System.Random();
 }
Exemplo n.º 5
0
        protected float Playouts(WorldModelDST initialPlayoutState)
        {
            //Console.WriteLine("Playouts...");

            List <float> rewards = new List <float>(this.MaxPlayouts);
            float        total   = 0;

            for (int CurrentPlayout = 0;
                 CurrentPlayout < MaxPlayouts;
                 CurrentPlayout++)
            {
                //Console.WriteLine("Playout n." + CurrentPlayout.ToString());

                float reward = Playout(initialPlayoutState);
                rewards.Add(reward);
                //Console.WriteLine("Reward: " + reward);
                total += reward;
            }
            float ratio = total / MaxPlayouts;

            /* OLD
             * if (ratio > 0.70f)
             *  return 1f;
             * else if ( ratio == 0)
             *  return 0f;
             * else
             *  return ratio * 0.4f;
             */
            //Console.WriteLine("ratio: " + ratio);
            //Console.WriteLine("init score: " + initialPlayoutState.Score(initialPlayoutState));
            return(ratio);
        }
Exemplo n.º 6
0
        //Fazer Decompose

        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            worldModel.RemoveFromEquipped(this.Target);
            worldModel.RemoveAction("Unequip_" + this.Target);
        }
Exemplo n.º 7
0
 //Assume he will pick the logs
 public override void ApplyActionEffects(WorldModelDST worldModel)
 {
     worldModel.Cycle += this.Duration;
     worldModel.RemoveFromWorld(this.Target, 1);
     worldModel.AddToWorld("log", 2, worldModel.Walter.GetPosX(), worldModel.Walter.GetPosZ());
     worldModel.AvailableActions.Add(new Pickup("log", 1));
 }
Exemplo n.º 8
0
        protected float Playout(WorldModelDST initialPlayoutState)
        {
            //TO DO


            return(0.0f);
        }
Exemplo n.º 9
0
        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            if (Recipes.ContainsKey(this.Recipe))
            {
                foreach (var item in Recipes[this.Recipe])
                {
                    worldModel.RemoveFromPossessedItems(item.Key, item.Value);
                }

                if (this.X != "-" && this.Z != "-")
                {
                    worldModel.AddToWorld(this.Recipe, 1, Convert.ToInt32(this.X), Convert.ToInt32(this.Z));
                }
                else
                {
                    if (!worldModel.IsEquipped("torch") && !worldModel.IsEquipped("pickaxe") && !worldModel.IsEquipped("axe"))
                    {
                        worldModel.AddToEquipped(this.Recipe);
                    }

                    worldModel.AddToPossessedItems(this.Recipe, 1);
                }

                //                if (!worldModel.Possesses(this.Recipe))
                //                {
                //                    worldModel.RemoveAction("Build_" + this.Recipe);
                //                }
            }
        }
Exemplo n.º 10
0
        //Fazer Decompose

        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            if (worldModel.Cycle > Convert.ToSingle(15 - (worldModel.CycleInfo[2] + worldModel.CycleInfo[1])) && worldModel.Possesses("torch"))
            {
                ActionDST action = new Equip("torch");
                worldModel.AddAction(action);
            }

            if (this.Target == "berries")
            {
                worldModel.RemoveFromPossessedItems("berries", 1);
                worldModel.DecreaseHunger(9);

                if (!worldModel.Possesses("berries"))
                {
                    worldModel.RemoveAction("Eat_berries");
                }
            }
            else if (this.Target == "carrot")
            {
                worldModel.RemoveFromPossessedItems("carrot", 1);
                worldModel.DecreaseHunger(13);
                worldModel.IncreaseHP(1);

                if (!worldModel.Possesses("carrot"))
                {
                    worldModel.RemoveAction("Eat_carrot");
                }
            }
        }
Exemplo n.º 11
0
        protected float PlayoutHeuristic(WorldModelDST state)
        {
            int   hp  = state.Walter.HP;
            float cHP = Convert.ToSingle(hp);
            //Console.WriteLine(hp);
            //Console.WriteLine(cHP);

            int   hunger  = state.Walter.Hunger;
            float cHunger = Convert.ToSingle(hunger);

            //Console.WriteLine("Is it Night?");
            //Console.WriteLine(Convert.ToSingle(13 - state.CycleInfo[2]) <= (state.Cycle));
            //Console.WriteLine("");

            if (cHP <= 0)
            {
                return(0.0f);
            }
            else if (Convert.ToSingle(15 - state.CycleInfo[2]) <= (state.Cycle))
            {
                //Console.WriteLine("light");
                //Console.WriteLine(state.LightValueNight());
                //Console.WriteLine(state.FoodValue());
                //Console.WriteLine("");
                return((state.LightValueNight()) * 0.9f + state.FoodValue() * 0.1f);
            }
            else
            {
                //float reward = ((cHP/150) + (cHunger/150)*4 + (state.LogsValue())*2 + (state.RocksValue())*2 + (state.TorchValueDay())*10 + (state.AxePickaxeValue())*6 + (state.FoodValue())*7)/32;
                float reward = (state.LightValueDay()) * 0.7f + (state.FoodValue()) * 0.3f;
                return(reward);
            }
        }
Exemplo n.º 12
0
 public MCTSNode(WorldModelDST state)
 {
     State      = state;
     ChildNodes = new List <MCTSNode>();
     N          = 0;
     Q          = 0.0f;
 }
Exemplo n.º 13
0
        //Fazer Decompose

        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            worldModel.AddToEquipped(this.InvObject);
            worldModel.RemoveFromPossessedItems(this.InvObject, 1);
            worldModel.RemoveAction("Equip_" + this.InvObject);
        }
Exemplo n.º 14
0
        //Fazer Decompose

        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            worldModel.RemoveFromPossessedItems(this.InvObject, 1);

            if (!worldModel.Possesses(this.InvObject))
            {
                worldModel.RemoveAction("Drop_" + this.InvObject);
            }
            worldModel.AddToWorld(this.InvObject, this.Quantity, this.Position.Item1, this.Position.Item2);
        }
Exemplo n.º 15
0
        //Fazer Decompose

        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            worldModel.AddToPossessedItems(this.Target, this.Quantity);

            worldModel.RemoveFromWorld(this.Target, this.Quantity);

            if (!worldModel.WorldHas(this.Target))
            {
                worldModel.RemoveAction("Pickup_" + this.Target);
            }
        }
Exemplo n.º 16
0
        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            if (this.Target == "torch")
            {
                worldModel.RemoveFromEquipped("torch");
                worldModel.AddToPossessedItems("torch", 1);

                ActionDST action = new Equip("torch");
                worldModel.AddAction(action);
            }
        }
Exemplo n.º 17
0
        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            if (FoodConverter.ContainsKey(this.InvObject))
            {
                worldModel.RemoveFromPossessedItems(this.InvObject, 1);
                worldModel.AddToPossessedItems(FoodConverter[this.InvObject], 1);

                if (!worldModel.Possesses(this.InvObject))
                {
                    worldModel.RemoveAction(string.Concat("Cook_", this.InvObject));
                }
            }
        }
Exemplo n.º 18
0
        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            if (PickableConverter.ContainsKey(this.Target))
            {
                worldModel.RemoveFromWorld(this.Target, 1);
                worldModel.AddToPossessedItems(PickableConverter[this.Target], 1);

                if (!worldModel.WorldHas(this.Target))
                {
                    worldModel.RemoveAction(string.Concat("Pick_", this.Target));
                }
            }
        }
Exemplo n.º 19
0
        protected MCTSNode Expand(MCTSNode parent, ActionDST action)
        {
            WorldModelDST newState = parent.State.GenerateChildWorldModel();

            action.ApplyActionEffects(newState);

            var child = new MCTSNode(newState)
            {
                Action = action,
                Parent = parent,
            };

            parent.ChildNodes.Add(child);

            return(child);
        }
Exemplo n.º 20
0
        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;
            worldModel.IncreaseHunger(1);
            string usedfuel = worldModel.Fuel[0].Item1;

            worldModel.RemoveFromPossessedItems(usedfuel, 1);
            worldModel.RemoveFromFuel(usedfuel);

            worldModel.Walter.Position = worldModel.GetNextPosition(this.Target, "fire");

            ActionDST action;

            if (usedfuel == "twigs")
            {
                if (!worldModel.Possesses("twigs", 2))
                {
                    worldModel.RemoveAction("Build_torch");
                    worldModel.RemoveAction("Build_pickaxe");
                }
                if (!worldModel.Possesses("twigs", 1))
                {
                    worldModel.RemoveAction("Build_axe");
                }
            }
            else if (usedfuel == "log")
            {
                if (!worldModel.Possesses("log", 2))
                {
                    worldModel.RemoveAction("Build_firepit");
                    worldModel.RemoveAction("Build_campfire");
                }
            }
            else if (usedfuel == "cutgrass")
            {
                if (!worldModel.Possesses("cutgrass", 3))
                {
                    worldModel.RemoveAction("Build_campfire");
                }
                if (!worldModel.Possesses("cutgrass", 2))
                {
                    action = new Build("torch");
                    worldModel.RemoveAction("Build_torch");
                }
            }
        }
Exemplo n.º 21
0
        //Fazer Decompose

        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            //<OPTIMIZATION - Dict instead of chained if's>
            if (FoodIndex.ContainsKey(this.Target))
            {
                worldModel.RemoveFromPossessedItems(this.Target, 1);

                int[] foodValues = FoodIndex[this.Target];
                int   HungerVal  = foodValues[0];

                if (HungerVal > 0)
                {
                    worldModel.DecreaseHunger(foodValues[0]);
                }
                else if (HungerVal < 0)
                {
                    worldModel.IncreaseHunger(Math.Abs(foodValues[0]));
                }

                if (foodValues.Length > 1)
                {
                    int HPVal = foodValues[1];
                    if (HPVal > 0)
                    {
                        worldModel.IncreaseHP(foodValues[1]);
                    }
                    else if (HPVal < 0)
                    {
                        worldModel.DecreaseHP(Math.Abs(foodValues[1]));
                    }
                }

                if (!worldModel.Possesses(this.Target))
                {
                    worldModel.RemoveAction("Eat_" + this.Target);
                }
            }
        }
Exemplo n.º 22
0
        protected float Playout(WorldModelDST initialPlayoutState)
        {
            List <ActionDST> executableActions;
            ActionDST        action = null;
            int           randomIndex;
            WorldModelDST state = initialPlayoutState;

            while (this.CurrentDepth < this.MaxPlayoutDepthReached)
            {
                executableActions = state.GetExecutableActions();

                if (executableActions.Count > 0)
                {
                    this.CurrentDepth++;

                    randomIndex = this.RandomGenerator.Next(0, executableActions.Count);
                    action      = executableActions[randomIndex];
                    state       = state.GenerateChildWorldModel();
                    action.ApplyActionEffects(state);
                }
                else
                {
                    this.CurrentDepth++;
                }
            }

            if (this.CurrentDepth < this.MaxPlayoutDepthReached)
            {
                this.CurrentDepth = this.MaxPlayoutDepthReached;
            }

            //Console.WriteLine("Value Heuristic:");
            //Console.WriteLine(PlayoutHeuristic(state));
            //Console.WriteLine("");

            return(PlayoutHeuristic(state));
        }
Exemplo n.º 23
0
 public virtual void ApplyActionEffects(WorldModelDST worldState)
 {
 }
Exemplo n.º 24
0
        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;

            if (this.Target == "torch")
            {
                worldModel.RemoveFromPossessedItems("twigs", 2);
                worldModel.RemoveFromPossessedItems("cutgrass", 2);
                worldModel.AddToPossessedItems("torch", 1);

                if (!worldModel.Possesses("twigs", 2))
                {
                    worldModel.RemoveAction("Build_pickaxe");
                }
                if (!worldModel.Possesses("twigs", 1))
                {
                    worldModel.RemoveAction("Build_axe");
                }
                if (!worldModel.Possesses("twigs", 2) || !worldModel.Possesses("cutgrass", 2))
                {
                    worldModel.RemoveAction("Build_torch");
                }
                if (worldModel.EquippedItems.Count == 0)
                {
                    ActionDST action = new Unequip("torch");
                    worldModel.AddAction(action);
                }
            }
            else if (this.Target == "pickaxe")
            {
                worldModel.RemoveFromPossessedItems("twigs", 2);
                worldModel.RemoveFromPossessedItems("flint", 2);
                worldModel.AddToPossessedItems("pickaxe", 1);

                if (!worldModel.Possesses("twigs", 2) || !worldModel.Possesses("flint", 2))
                {
                    worldModel.RemoveAction("Build_pickaxe");
                }
                if (!worldModel.Possesses("twigs", 1) || !worldModel.Possesses("flint", 1))
                {
                    worldModel.RemoveAction("Build_axe");
                }
                if (!worldModel.Possesses("twigs", 2))
                {
                    worldModel.RemoveAction("Build_torch");
                }
            }
            else if (this.Target == "axe")
            {
                worldModel.RemoveFromPossessedItems("twigs", 1);
                worldModel.RemoveFromPossessedItems("flint", 1);
                worldModel.AddToPossessedItems("axe", 1);

                if (!worldModel.Possesses("twigs", 2) || !worldModel.Possesses("flint", 2))
                {
                    worldModel.RemoveAction("Build_pickaxe");
                }
                if (!worldModel.Possesses("twigs", 1) || !worldModel.Possesses("flint", 1))
                {
                    worldModel.RemoveAction("Build_axe");
                }
                if (!worldModel.Possesses("twigs", 2))
                {
                    worldModel.RemoveAction("Build_torch");
                }
            }
            else if (this.Target == "campfire")
            {
                worldModel.RemoveFromPossessedItems("log", 2);
                worldModel.RemoveFromPossessedItems("cutgrass", 3);
                worldModel.AddToWorld("campfire", 1, worldModel.Walter.Position.Item1, worldModel.Walter.Position.Item2);
                worldModel.AddToFire("campfire", worldModel.Walter.Position.Item1, worldModel.Walter.Position.Item2);

                if (!worldModel.Possesses("log", 2))
                {
                    worldModel.RemoveAction("Build_firepit");
                }
                if (!worldModel.Possesses("log", 2) || !worldModel.Possesses("cutgrass", 3))
                {
                    worldModel.RemoveAction("Build_campfire");
                }
                if (!worldModel.Possesses("cutgrass", 2))
                {
                    worldModel.RemoveAction("Build_torch");
                }
            }
            else if (this.Target == "firepit")
            {
                worldModel.RemoveFromPossessedItems("log", 2);
                worldModel.RemoveFromPossessedItems("rocks", 12);
                worldModel.AddToWorld("firepit", 1, worldModel.Walter.Position.Item1, worldModel.Walter.Position.Item2);
                worldModel.AddToFire("firepit", worldModel.Walter.Position.Item1, worldModel.Walter.Position.Item2);

                if (!worldModel.Possesses("log", 2) || !worldModel.Possesses("rocks", 12))
                {
                    worldModel.RemoveAction("Build_firepit");
                }
                if (!worldModel.Possesses("log", 2))
                {
                    worldModel.RemoveAction("Build_campfire");
                }
            }
        }
Exemplo n.º 25
0
 public override void ApplyActionEffects(WorldModelDST worldModel)
 {
     worldModel.Cycle += this.Duration;
     worldModel.IncreaseHunger(1);
 }
Exemplo n.º 26
0
        //This is where the main body of the MCTS Search must be implemented
        private IEnumerable <DynamicPropertyResult> MCTSSearch(IQueryContext context, Name actionVar, Name targetVar)
        {
            //How to clone the KB with our JSON serializer
            var jsonSerializer = new JSONSerializer();
            var memStream      = new MemoryStream();
            var json           = jsonSerializer.SerializeToJson(this.m_kb);
            var kbCloned       = jsonSerializer.DeserializeFromJson <KB>(json);

            //Escrever comentário

            if (this.NextActionInfo.Item1 != "")
            {
                NextAction PriorityAction = new NextAction(NextActionInfo.Item1, kbCloned);

                if (this.NextActionInfo.Item2 <= 1)
                {
                    this.NextActionInfo = new Pair <string, int>("", 0);
                }
                else
                {
                    this.NextActionInfo.Item2 -= 1;
                }

                Pair <string, string> pairOfPriorityAction = PriorityAction.ConstructNextAction();
                this.ToDoActionsList.Add(pairOfPriorityAction);
            }

            if (this.ToDoActionsList.Count == 0)
            {
                PreWorldState preWorldState = new PreWorldState(kbCloned);
                //, this.UnequippableTorches, this.EquippedItems);

                WorldModelDST worldModel = new WorldModelDST(preWorldState);

                foreach (var action in worldModel.AvailableActions)
                {
                    Console.WriteLine(action.Name);
                }
                Console.WriteLine("");

                this.Mcts = new MCTSAlgorithm(worldModel);
                this.Mcts.InitializeMCTSearch();

                ActionDST MacroAction = this.Mcts.Run();
                //this.LastActionInfo = MacroAction.Name;
                this.ToDoActionsList = MacroAction.Decompose(preWorldState);

                this.NextActionInfo       = MacroAction.NextActionInfo();
                this.NextActionInfo.Item1 = preWorldState.CompleteNextActionInfo(this.NextActionInfo.Item1);
            }

            Pair <string, string> CurrentAction = this.ToDoActionsList[0];

            this.ToDoActionsList.Remove(CurrentAction);

            Console.WriteLine("Next Action:");
            Console.WriteLine(CurrentAction.Item1 + " " + CurrentAction.Item2);
            Console.WriteLine("");

            //UpdateEquippedItems(CurrentAction);

            var actionSub = new Substitution(actionVar, new ComplexValue(Name.BuildName(CurrentAction.Item1)));
            var targetSub = new Substitution(targetVar, new ComplexValue(Name.BuildName(CurrentAction.Item2)));

            //var actionSub = new Substitution(actionVar, new ComplexValue(Name.BuildName("Action(WALKTO, -, "+ posxWalter.ToString() +", " + poszWalter.ToString() + ", -)")));
            //var targetSub = new Substitution(targetVar, new ComplexValue(Name.BuildName("-")));

            foreach (var subSet in context.Constraints)
            {
                subSet.AddSubstitution(actionSub);
                subSet.AddSubstitution(targetSub);

                yield return(new DynamicPropertyResult(new ComplexValue(Name.BuildName(true), 1.0f), subSet));
            }
        }
Exemplo n.º 27
0
        public override void ApplyActionEffects(WorldModelDST worldModel)
        {
            worldModel.Cycle += this.Duration;
            worldModel.IncreaseHunger(1);

            worldModel.Walter.Position = worldModel.GetNextPosition(this.Target, "world");

            if (this.Target == "tree")
            {
                worldModel.RemoveFromWorld("tree", 1);
                worldModel.AddToPossessedItems("log", 1);
                worldModel.AddToFuel("log", 1);

                ActionDST action;
                if (worldModel.Possesses("rocks", 12))
                {
                    action = new Build("firepit");
                    worldModel.AddAction(action);
                }
                if (worldModel.Possesses("cutgrass", 3))
                {
                    action = new Build("campfire");
                    worldModel.AddAction(action);
                }
            }
            else if (this.Target == "boulder")
            {
                worldModel.RemoveFromWorld("boulder", 1);
                worldModel.AddToPossessedItems("rocks", 2);
                worldModel.AddToPossessedItems("flint", 1);

                ActionDST action;
                if (worldModel.Possesses("log", 2) && worldModel.Possesses("rocks", 12))
                {
                    action = new Build("firepit");
                    worldModel.AddAction(action);
                }
                if (worldModel.Possesses("twigs", 1))
                {
                    action = new Build("axe");
                    worldModel.AddAction(action);
                }
                if (worldModel.Possesses("twigs", 2) && worldModel.Possesses("flint", 2))
                {
                    action = new Build("pickaxe");
                    worldModel.AddAction(action);
                }
            }
            else if (this.Target == "log")
            {
                worldModel.RemoveFromWorld("log", 1);
                worldModel.AddToPossessedItems("log", 1);
                worldModel.AddToFuel("log", 1);

                ActionDST action;
                if (worldModel.Possesses("log", 2) && worldModel.Possesses("cutgrass", 2))
                {
                    action = new Build("campfire");
                    worldModel.AddAction(action);
                }
                if (worldModel.Possesses("log", 2) && worldModel.Possesses("rocks", 12))
                {
                    action = new Build("firepit");
                    worldModel.AddAction(action);
                }
            }
            else if (this.Target == "twigs")
            {
                worldModel.RemoveFromWorld("twigs", 1);
                worldModel.AddToPossessedItems("twigs", 1);
                worldModel.AddToFuel("twigs", 1);

                ActionDST action;
                if (worldModel.Possesses("flint", 1))
                {
                    action = new Build("axe");
                    worldModel.AddAction(action);
                }
                if (worldModel.Possesses("flint", 2) && worldModel.Possesses("twigs", 2))
                {
                    action = new Build("pickaxe");
                    worldModel.AddAction(action);
                }
            }
            else if (this.Target == "sapling")
            {
                worldModel.RemoveFromWorld("sapling", 1);
                worldModel.AddToPossessedItems("twigs", 1);
                worldModel.AddToFuel("twigs", 1);

                ActionDST action;
                if (worldModel.Possesses("flint", 1))
                {
                    action = new Build("axe");
                    worldModel.AddAction(action);
                }
                if (worldModel.Possesses("flint", 2) && worldModel.Possesses("twigs", 2))
                {
                    action = new Build("pickaxe");
                    worldModel.AddAction(action);
                }
            }
            else if (this.Target == "flint")
            {
                worldModel.RemoveFromWorld("flint", 1);
                worldModel.AddToPossessedItems("flint", 1);

                ActionDST action;
                if (worldModel.Possesses("twigs", 1))
                {
                    action = new Build("axe");
                    worldModel.AddAction(action);
                }
                if (worldModel.Possesses("twigs", 2) && worldModel.Possesses("flint", 2))
                {
                    action = new Build("pickaxe");
                    worldModel.AddAction(action);
                }
            }
            else if (this.Target == "cutgrass")
            {
                worldModel.RemoveFromWorld("cutgrass", 1);
                worldModel.AddToPossessedItems("cutgrass", 1);
                worldModel.AddToFuel("cutgrass", 1);

                ActionDST action;
                if (worldModel.Possesses("cutgrass", 3) && worldModel.Possesses("log", 2))
                {
                    action = new Build("campfire");
                    worldModel.AddAction(action);
                }
                if (worldModel.Possesses("cutgrass", 2) && worldModel.Possesses("twigs", 2))
                {
                    action = new Build("torch");
                    worldModel.AddAction(action);
                }
            }
            else if (this.Target == "grass")
            {
                worldModel.RemoveFromWorld("grass", 1);
                worldModel.AddToPossessedItems("cutgrass", 1);
                worldModel.AddToFuel("cutgrass", 1);

                ActionDST action;
                if (worldModel.Possesses("cutgrass", 3) && worldModel.Possesses("log", 2))
                {
                    action = new Build("campfire");
                    worldModel.AddAction(action);
                }
                if (worldModel.Possesses("cutgrass", 2) && worldModel.Possesses("twigs", 2))
                {
                    action = new Build("torch");
                    worldModel.AddAction(action);
                }
            }
            else if (this.Target == "rocks")
            {
                worldModel.RemoveFromWorld("rocks", 1);
                worldModel.AddToPossessedItems("rocks", 1);

                ActionDST action;
                if (worldModel.Possesses("log", 2) && worldModel.Possesses("rocks", 12))
                {
                    action = new Build("firepit");
                    worldModel.AddAction(action);
                }
            }
            else if (this.Target == "berrybush")
            {
                worldModel.RemoveFromWorld("berrybush", 1);
                worldModel.AddToPossessedItems("berries", 2);

                ActionDST action = new Eat("berries");
                worldModel.AddAction(action);
            }
            else if (this.Target == "carrot" || this.Target == "carrot_planted")
            {
                worldModel.RemoveFromWorld("carrot", 1);
                worldModel.AddToPossessedItems("carrot", 1);

                ActionDST action = new Eat("carrot");
                worldModel.AddAction(action);
            }
            else if (this.Target == "berries")
            {
                worldModel.RemoveFromWorld("berries", 1);
                worldModel.AddToPossessedItems("berries", 1);

                ActionDST action = new Eat("berries");
                worldModel.AddAction(action);
            }
        }