private static IBehaviour <BtContext> BuildHouseBehaviour()
        {
            const int requiredStones = 2;
            const int requiredWood   = 4;

            var gatherRequiredResources = FluentBuilder.FluentBuilder.Create <BtContext>()
                                          .Sequence("Gather resources")
                                          .Selector("Gather wood")
                                          .Condition("Has enough wood?", c => BotBehaviourFunctions.HasItem(c, ItemTypes.Wood, requiredWood))
                                          .Subtree(ChopWoodBehaviour())
                                          .End()
                                          .Selector("Gather stone")
                                          .Condition("Has enough stone?", c => BotBehaviourFunctions.HasItem(c, ItemTypes.Stone, requiredStones))
                                          .Subtree(MineStoneBehaviour())
                                          .End()
                                          .End()
                                          .Build();

            return(FluentBuilder.FluentBuilder.Create <BtContext>()
                   .PrioritySequence("Build house")
                   .Subtree(gatherRequiredResources)
                   .Do("Spawn house", c => BotBehaviourFunctions.BuildHouse(c, requiredStones, requiredWood))
                   .End()
                   .Build());
        }
 private static IBehaviour <BtContext> FindAndPickupItem(ItemTypes itemType)
 {
     return(FluentBuilder.FluentBuilder.Create <BtContext>()
            .Sequence("Find and pick up item")
            .Do($"Set closest [{itemType}] as target", c => BotBehaviourFunctions.SetItemAsTarget(c, itemType))
            .Do("Move to target", BotBehaviourFunctions.MoveToTargetEntity)
            .Do("Pickup target", BotBehaviourFunctions.PickupTarget)
            .End()
            .Build());
 }
 private static IBehaviour <BtContext> ChopWoodBehaviour()
 {
     return(FluentBuilder.FluentBuilder.Create <BtContext>()
            .PrioritySequence("Chop wood")
            .Selector("Get axe")
            .Condition("Has axe?", c => BotBehaviourFunctions.HasItem(c, ItemTypes.Axe, 1))
            .Subtree(FindAndPickupItem(ItemTypes.Axe))
            .End()
            .Subtree(FindAndPickupItem(ItemTypes.Wood))
            .End()
            .Build());
 }
 private static IBehaviour <BtContext> MineStoneBehaviour()
 {
     return(FluentBuilder.FluentBuilder.Create <BtContext>()
            .PrioritySequence("Mine stone")
            .Selector("Get pickaxe")
            .Condition("Has pickaxe?", c => BotBehaviourFunctions.HasItem(c, ItemTypes.Pickaxe, 1))
            .Subtree(FindAndPickupItem(ItemTypes.Pickaxe))
            .End()
            .Subtree(FindAndPickupItem(ItemTypes.Stone))
            .End()
            .Build());
 }