Esempio n. 1
0
    def generate_tree(self):
        """Generates the tree for the tree."""
        tree = bt.Sequence()
        tree.add_child(self.Grow(self))
        tree.add_child(self.DecreasePollenTimer(self))

        logic_fallback = bt.FallBack()
        tree.add_child(logic_fallback)

        # Check if dead
        dead_or_alive_sequence = bt.Sequence()
        logic_fallback.add_child(dead_or_alive_sequence)
        dead_or_alive_sequence.add_child(self.IsDead(self))
        dead_or_alive_sequence.add_child(self.Die(self))

        production_sequence = bt.Sequence()
        logic_fallback.add_child(production_sequence)

        # Produce nectar
        nectar_production = bt.FallBack()
        production_sequence.add_child(nectar_production)
        nectar_production.add_child(self.CantProduceNectar(self))
        nectar_production.add_child(self.ProduceNectar(self))

        # Produce pollen
        pollen_production = bt.FallBack()
        production_sequence.add_child(pollen_production)
        pollen_production.add_child(self.CantProducePollen(self))
        pollen_production.add_child(self.ProducePollen(self))

        return tree
Esempio n. 2
0
    def generate_tree(self):
        """Generates the tree for the knight."""
        tree = bt.FallBack()

        # Attack or chase enemies
        enemy_handling = bt.Sequence()
        enemy_visible = self.EnemyVisible(self)
        enemy_fallback = bt.FallBack()
        enemy_attack = bt.Sequence()
        enemy_adjacent = self.EnemyAdjacent(self)
        attack = self.Attack(self)
        enemy_attack.add_child(enemy_adjacent)
        enemy_attack.add_child(attack)
        enemy_javelin = bt.Sequence()
        can_javelin = self.CanJavelin(self)
        javelin = self.Javelin(self)
        move_towards_enemy = self.MoveTowardsEnemy(self)
        enemy_javelin.add_child(can_javelin)
        enemy_javelin.add_child(javelin)
        enemy_javelin.add_child(move_towards_enemy)
        enemy_chase = bt.Sequence()
        enemy_chase.add_child(move_towards_enemy)
        enemy_chase.add_child(enemy_attack)
        enemy_fallback.add_child(enemy_attack)
        enemy_fallback.add_child(enemy_javelin)
        enemy_fallback.add_child(enemy_chase)
        enemy_handling.add_child(enemy_visible)
        enemy_handling.add_child(enemy_fallback)
        tree.add_child(enemy_handling)

        # Random movement
        move_randomly = self.MoveRandomly(self)
        tree.add_child(move_randomly)

        return tree
Esempio n. 3
0
    def generate_tree(self):
        tree = bt.FallBack()

        SEKMatchBefore = bt.Sequence()
        SEKcheckBefore = self.CheckForSEKBefore(self)
        SEKBeforeTake = self.SEKBeforeTake(self)
        SEKMatchBefore.add_child(SEKcheckBefore)
        SEKMatchBefore.add_child(SEKBeforeTake)

        keywordMatch = bt.Sequence()
        checkKeywordRow = self.CheckKeywordRow(self)
        takeByKeywordRow = self.KeywordTakeRow(self)
        keywordMatch.add_child(checkKeywordRow)
        keywordMatch.add_child(takeByKeywordRow)

        SEKMatchAfter = bt.Sequence()
        SEKcheckAfter = self.CheckForSEKAfter(self)
        SEKAfterTake = self.SEKAfterTake(self)
        SEKMatchAfter.add_child(SEKcheckAfter)
        SEKMatchAfter.add_child(SEKAfterTake)

        naiveTake = self.NaiveTake(self)

        tree.add_child(SEKMatchBefore)
        tree.add_child(keywordMatch)
        tree.add_child(SEKMatchAfter)
        tree.add_child(naiveTake)
        return tree
Esempio n. 4
0
    def generate_tree(self):
        """Generates the tree for the knight."""
        tree = bt.FallBack()
        exist_injured_friend_sequence = bt.Sequence()
        friend_fallback = bt.FallBack()
        exist_injured_friend_sequence.add_child(self.ExistsInjuredFriend(self))
        injured_friend_in_range_sequence = bt.Sequence()
        friend_fallback.add_child(injured_friend_in_range_sequence)
        exist_injured_friend_sequence.add_child(friend_fallback)
        injured_friend_in_range_sequence.add_child(
            self.InjuredFriendInRange(self))
        injured_friend_in_range_sequence.add_child(
            self.FindHighestPriorityFriend(self))
        injured_friend_in_range_sequence.add_child(self.Heal(self))

        find_injured_friend_sequence = bt.Sequence()
        find_injured_friend_sequence.add_child(
            self.FindClosestInjuredFriend(self))
        find_injured_friend_sequence.add_child(self.CreatePath(self))
        find_injured_friend_sequence.add_child(self.MoveOnPath(self))
        find_injured_friend_sequence.add_child(
            injured_friend_in_range_sequence)

        friend_fallback.add_child(find_injured_friend_sequence)

        # Random movement
        move_randomly = self.MoveRandomly(self)
        tree.add_child(exist_injured_friend_sequence)
        tree.add_child(move_randomly)

        return tree
Esempio n. 5
0
    def generate_tree(self):
        """Generates the tree for the mage."""
        tree = bt.FallBack()

        enemy_visible_sequence = bt.Sequence()
        enemy_visible_sequence.add_child(self.EnemyVisible(self))
        attack_sequence = bt.Sequence()
        attack_sequence.add_child(self.FindBestTarget(self))
        attack_sequence.add_child(self.Attack(self))
        enemy_visible_sequence.add_child(attack_sequence)

        enemies_not_visible_sequence = bt.Sequence()

        move_fallback = bt.FallBack()
        move_sequence = bt.Sequence()
        move_sequence.add_child(self.FindClosestEnemy(self))
        move_sequence.add_child(self.CreatePath(self))
        move_sequence.add_child(self.MoveOnPath(self))
        move_fallback.add_child(move_sequence)
        move_fallback.add_child(self.MoveRandomly(self))

        enemies_not_visible_sequence.add_child(move_fallback)
        enemies_not_visible_sequence.add_child(enemy_visible_sequence)

        tree.add_child(enemy_visible_sequence)
        tree.add_child(enemies_not_visible_sequence)

        return tree
Esempio n. 6
0
    def generate_tree(self):
        """Generates the tree for the hive."""
        tree = bt.FallBack()

        sequence = bt.Sequence()
        create_bee_sequence = bt.Sequence()
        create_bee_sequence.add_child(self.ShouldCreateBee(self))
        create_bee_sequence.add_child(self.HaveEnoughtRoom(self))
        create_bee_sequence.add_child(self.CreateBee(self))
        sequence.add_child(create_bee_sequence)

        tree.add_child(sequence)
        return tree
Esempio n. 7
0
    def generate_tree(self):
        """Generates the tree for the burrow."""
        tree = bt.Sequence()

        tree.add_child(self.IncreaseTimeSinceUsed(self))

        return tree
Esempio n. 8
0
    def generate_tree(self):
        """Generates the tree for the ranger."""
        tree = bt.FallBack()

        # Attack or chase/run from enemies
        enemy_handling = bt.Sequence()
        enemy_visible = self.EnemyVisible(self)
        enemy_handling.add_child(enemy_visible)

        enemy_fallback = bt.FallBack()
        enemy_in_range = bt.Sequence()
        enemy_in_attack_range = self.EnemyInAttackRange(self)
        enemy_in_range.add_child(enemy_in_attack_range)
        attack = self.Attack(self)
        enemy_in_range.add_child(attack)

        enemy_close = bt.Sequence()
        enemy_too_close = self.EnemyTooClose(self)
        enemy_close.add_child(enemy_too_close)
        move_away = self.MoveAway(self)
        enemy_close.add_child(move_away)
        enemy_close.add_child(enemy_in_range)
        enemy_fallback.add_child(enemy_close)

        enemy_far = bt.Sequence()
        enemy_too_far = self.EnemyTooFar(self)
        enemy_far.add_child(enemy_too_far)
        move_towards = self.MoveTowards(self)
        enemy_far.add_child(move_towards)
        enemy_far.add_child(enemy_in_range)
        enemy_fallback.add_child(enemy_far)

        enemy_fallback.add_child(enemy_in_range)
        enemy_handling.add_child(enemy_fallback)
        tree.add_child(enemy_handling)

        move_fallback = bt.FallBack()
        move_sequence = bt.Sequence()
        move_sequence.add_child(self.OffensiveStrategy(self))
        move_sequence.add_child(self.FindClosestEnemy(self))
        move_sequence.add_child(self.CreatePath(self))
        move_sequence.add_child(self.MoveOnPath(self))
        move_fallback.add_child(move_sequence)
        move_fallback.add_child(self.MoveRandomly(self))
        tree.add_child(move_fallback)

        return tree
Esempio n. 9
0
    def generate_tree(self):
        """Generates the tree for the mage."""
        tree = bt.FallBack()

        enemy_visible_sequence = bt.Sequence()
        enemy_visible_sequence.add_child(self.EnemyVisible(self))
        attack_sequence = bt.Sequence()
        attack_sequence.add_child(self.FindBestTarget(self))
        attack_sequence.add_child(self.Attack(self))
        enemy_visible_sequence.add_child(attack_sequence)
        move_randomly_sequence = bt.Sequence()
        move_randomly_sequence.add_child(self.MoveRandomly(self))
        move_randomly_sequence.add_child(enemy_visible_sequence)

        tree.add_child(enemy_visible_sequence)
        tree.add_child(move_randomly_sequence)

        return tree
Esempio n. 10
0
    def generate_tree(self):
        tree = bt.FallBack()

        specialCase = bt.Sequence()
        specalCaseCheck = self.SpecialCaseCheck(self)
        specalCaseTake = self.SpecialCaseTake(self)
        specialCase.add_child(specalCaseCheck)
        specialCase.add_child(specalCaseTake)

        formatCase = bt.Sequence()
        formatCheck = self.FormatsCheck(self)
        formatTake = self.FormatsTake(self)
        formatCase.add_child(formatCheck)
        formatCase.add_child(formatTake)

        tree.add_child(specialCase)
        tree.add_child(formatCase)
        return tree
Esempio n. 11
0
    def generate_tree(self):
        """Generates the tree for the water."""
        tree = bt.FallBack()
        dry_sequence = bt.Sequence()
        dry_sequence.add_child(self.IsDry(self))
        dry_sequence.add_child(self.DryOut(self))

        tree.add_child(dry_sequence)
        tree.add_child(self.MoveWater(self))
        return tree
Esempio n. 12
0
    def generate_tree(self):
        tree = bt.FallBack()

        first_sequence = bt.Sequence()
        regular_format_match = self.RegularFormat(self)
        find_keyword = self.FindKeywordFirst(self)
        first_sequence.add_child(regular_format_match)
        first_sequence.add_child(find_keyword)

        tree.add_child(first_sequence)

        second_sequence = bt.Sequence()
        regular_format_match = self.NoPercentage(self)
        find_keyword = self.FindKeywordSecond(self)
        second_sequence.add_child(regular_format_match)
        second_sequence.add_child(find_keyword)

        tree.add_child(second_sequence)
        return tree
Esempio n. 13
0
    def generate_tree(self):
        """Generates the tree for the worker."""
        tree = bt.FallBack()

        # Build on adjacent blueprints
        build = bt.Sequence()
        build.add_child(self.BlueprintAdjacent(self))
        build.add_child(self.BuildBlueprint(self))
        tree.add_child(build)

        # Avoid enemies
        enemies = bt.Sequence()
        enemies.add_child(self.EnemyVisible(self))
        enemies.add_child(self.MoveAwayFromEnemy(self))
        tree.add_child(enemies)

        # Move towards blueprints with no workers
        #find_blueprint = bt.Sequence()

        #tree.add_child(find_blueprint)

        # Add blueprints
        add_blueprint = bt.Sequence()
        add_blueprint.add_child(self.NeedAnotherFactory(self))
        add_blueprint.add_child(self.EnoughKarboniteToBuild(self))
        add_blueprint.add_child(self.AddBlueprint(self))
        tree.add_child(add_blueprint)

        # Mine karbonite
        karbonite = bt.FallBack()
        adjacent_karbonite_sequence = bt.Sequence()
        adjacent_karbonite_sequence.add_child(
            self.KarboniteInAdjacentCell(self))
        adjacent_karbonite_sequence.add_child(self.HarvestKarbonite(self))
        no_adj_karbonite_sequence = bt.Sequence()
        no_adj_karbonite_sequence.add_child(self.KarboniteExists(self))
        path_fallback = bt.FallBack()
        path_following_sequence = bt.Sequence()
        path_following_sequence.add_child(self.ExistsPath(self))
        path_following_sequence.add_child(self.MoveOnPath(self))
        create_path_fallback = bt.FallBack()
        create_path_sequence = bt.Sequence()
        create_path_sequence.add_child(self.NearbyKarboniteCells(self))
        create_path_sequence.add_child(self.CreatePath(self))
        create_path_fallback.add_child(create_path_sequence)
        create_path_fallback.add_child(self.FindNearbyKarboniteCells(self))
        path_fallback.add_child(path_following_sequence)
        path_fallback.add_child(create_path_fallback)
        no_adj_karbonite_sequence.add_child(path_fallback)

        karbonite.add_child(adjacent_karbonite_sequence)
        karbonite.add_child(self.CloseCombat(self))
        karbonite.add_child(no_adj_karbonite_sequence)
        karbonite.add_child(self.MoveRandomly(self))
        tree.add_child(karbonite)

        return tree
Esempio n. 14
0
    def generate_tree(self):
        """Generates the tree for the tree."""
        tree = bt.Sequence()

        flood_fallback = bt.FallBack()
        flood_fallback.add_child(self.IsNotFlooded(self))
        flood_fallback.add_child(self.Flood(self))

        tree.add_child(flood_fallback)
        tree.add_child(self.MoveWater(self))
        return tree
Esempio n. 15
0
    def generate_tree(self):
        """Generates the tree for the knight."""
        tree = bt.FallBack()

        # Attack or chase enemies
        enemy_handling = bt.Sequence()
        enemy_visible = self.EnemyVisible(self)
        enemy_fallback = bt.FallBack()
        enemy_attack = bt.Sequence()
        enemy_adjacent = self.EnemyAdjacent(self)
        attack = self.Attack(self)
        enemy_attack.add_child(enemy_adjacent)
        enemy_attack.add_child(attack)
        enemy_javelin = bt.Sequence()
        can_javelin = self.CanJavelin(self)
        javelin = self.Javelin(self)
        move_towards_enemy = self.MoveTowardsEnemy(self)
        enemy_javelin.add_child(can_javelin)
        enemy_javelin.add_child(javelin)
        enemy_javelin.add_child(move_towards_enemy)
        enemy_chase = bt.Sequence()
        enemy_chase.add_child(move_towards_enemy)
        enemy_chase.add_child(enemy_attack)
        enemy_fallback.add_child(enemy_attack)
        enemy_fallback.add_child(enemy_javelin)
        enemy_fallback.add_child(enemy_chase)
        enemy_handling.add_child(enemy_visible)
        enemy_handling.add_child(enemy_fallback)
        tree.add_child(enemy_handling)

        move_fallback = bt.FallBack()
        move_sequence = bt.Sequence()
        move_sequence.add_child(self.OffensiveStrategy(self))
        move_sequence.add_child(self.FindClosestEnemy(self))
        move_sequence.add_child(self.CreatePath(self))
        move_sequence.add_child(self.MoveOnPath(self))
        move_fallback.add_child(move_sequence)
        move_fallback.add_child(self.MoveRandomly(self))
        tree.add_child(move_fallback)

        return tree
Esempio n. 16
0
    def generate_tree(self):
        tree = bt.Sequence()

        unload = self.Unload(self)
        tree.add_child(unload)

        build_fallback = bt.FallBack()
        workers = bt.Sequence()
        need_more_workers = self.NeedMoreWorkers(self)
        workers.add_child(need_more_workers)
        can_build_worker = self.CanBuildWorker(self)
        workers.add_child(can_build_worker)
        build_worker = self.BuildWorker(self)
        workers.add_child(build_worker)
        build_fallback.add_child(workers)

        non_workers = bt.Sequence()
        can_build = self.CanBuild(self)
        non_workers.add_child(can_build)
        non_workers_fallback = bt.FallBack()
        local_damage = bt.Sequence()
        damaged_units = self.DamagedUnits(self)
        local_damage.add_child(damaged_units)
        no_healer_nearby = self.NoHealerNearby(self)
        local_damage.add_child(no_healer_nearby)
        build_healer = self.BuildHealer(self)
        local_damage.add_child(build_healer)
        non_workers_fallback.add_child(local_damage)
        local_enemies = bt.Sequence()
        enemies_nearby = self.EnemiesNearby(self)
        local_enemies.add_child(enemies_nearby)
        build_knight = self.BuildKnight(self)
        local_enemies.add_child(build_knight)
        non_workers_fallback.add_child(local_enemies)
        build_global = self.BuildGlobal(self)
        non_workers_fallback.add_child(build_global)
        non_workers.add_child(non_workers_fallback)
        build_fallback.add_child(non_workers)
        tree.add_child(build_fallback)

        return tree
Esempio n. 17
0
    def generate_tree(self):
        """Generates the tree for the tree."""
        tree = bt.Sequence()
        dead_or_alive_fallback = bt.FallBack()
        dead_or_alive_fallback.add_child(self.IsAlive(self))
        dead_or_alive_fallback.add_child(self.Die(self))

        flood_fallback = bt.FallBack()
        flood_fallback.add_child(self.IsNotFlooded(self))
        flood_fallback.add_child(self.Flood(self))

        reproduce_sequence = bt.Sequence()
        reproduce_sequence.add_child(self.CanReproduce(self))
        reproduce_sequence.add_child(self.Reproduce(self))

        tree.add_child(dead_or_alive_fallback)
        tree.add_child(flood_fallback)
        tree.add_child(self.Grow(self))
        tree.add_child(reproduce_sequence)
        tree.add_child(self.MoveWater(self))
        return tree
Esempio n. 18
0
    def generate_tree(self):
        tree = bt.FallBack()

        firstMatch = bt.Sequence()
        checkFirstMatch = self.FirstMatch(self)
        takeFirstMatch = self.TakeFirstMatch(self)

        firstMatch.add_child(checkFirstMatch)
        firstMatch.add_child(takeFirstMatch)

        secondMatch = bt.Sequence()
        checkSecondMatch = self.SecondMatch(self)
        takeSecondMatch = self.TakeSecondMatch(self)

        secondMatch.add_child(checkSecondMatch)
        secondMatch.add_child(takeSecondMatch)

        naiveTake = self.NaiveTake(self)
        tree.add_child(firstMatch)
        tree.add_child(secondMatch)
        tree.add_child(naiveTake)
        return tree
Esempio n. 19
0
    def generate_tree(self):
        tree = bt.Sequence()

        checkTopWordFallback = bt.FallBack()
        checkFirstWord = self.CheckFirstWord(self)
        removeTopWord = self.RemoveTopWord(self)
        checkTopWordFallback.add_child(checkFirstWord)
        checkTopWordFallback.add_child(removeTopWord)

        takeTopWord = self.TakeTopWord(self)

        tree.add_child(checkTopWordFallback)
        tree.add_child(takeTopWord)
        return tree
Esempio n. 20
0
 def generate_tree(self):
     tree = bt.Sequence()
     naiveTake = self.NaiveTake(self)
     tree.add_child(naiveTake)
     return tree
Esempio n. 21
0
 def generate_tree(self):
     tree = bt.Sequence()
     t = self.OneLine(self)
     tree.add_child(t)
     return tree
Esempio n. 22
0
    def generate_tree(self):
        """Generates the tree for the bee."""
        tree = bt.FallBack()

        is_dead_sequence = bt.Sequence()
        is_dead_sequence.add_child(self.Dying(self))
        is_dead_sequence.add_child(self.Die(self))

        sequence = bt.Sequence()
        logic_fallback = bt.FallBack()
        eat_sequence = bt.Sequence()
        eat_sequence.add_child(self.NeedsToEat(self))
        eat_fallback = bt.FallBack()
        eat_sequence.add_child(eat_fallback)
        eat_in_hive_sequence = bt.Sequence()
        eat_own_food_sequence = bt.Sequence()
        eat_fallback.add_child(eat_in_hive_sequence)
        eat_fallback.add_child(eat_own_food_sequence)
        eat_in_hive_sequence.add_child(self.InHive(self))
        eat_in_hive_sequence.add_child(self.HiveHasFood(self))
        eat_in_hive_sequence.add_child(self.EatInHive(self))
        eat_own_food_sequence.add_child(self.HaveFood(self))
        eat_own_food_sequence.add_child(self.EatOwnFood(self))
        logic_fallback.add_child(eat_sequence)
        scout_sequence = bt.Sequence()
        recruit_sequence = bt.Sequence()
        logic_fallback.add_child(scout_sequence)
        logic_fallback.add_child(recruit_sequence)

        # Scout

        scout_sequence.add_child(self.IsScout(self))
        scout_fallback = bt.FallBack()
        scout_sequence.add_child(scout_fallback)
        should_rest_fallback = bt.FallBack()
        should_rest_in_hive_sequence = bt.Sequence()
        should_rest_in_hive_sequence.add_child(self.InHive(self))
        should_rest_in_hive_sequence.add_child(self.ShouldRestInHive(self))
        should_return_to_hive_sequence = bt.Sequence()
        should_return_to_hive_sequence.add_child(self.ShouldReturnToHive(self))
        should_return_to_hive_sequence.add_child(
            self.SetHiveTargetLocation(self))
        should_return_to_hive_sequence.add_child(self.CanMove(self))
        should_return_to_hive_sequence.add_child(
            self.FlyToTargetLocation(self))
        should_rest_fallback.add_child(should_rest_in_hive_sequence)
        should_rest_fallback.add_child(should_return_to_hive_sequence)
        scout_fallback.add_child(should_rest_fallback)
        food_known_sequence = bt.Sequence()
        scout_fallback.add_child(food_known_sequence)
        food_known_fallback = bt.FallBack()
        food_known_sequence.add_child(self.KnowWhereFoodIs(self))
        food_known_sequence.add_child(food_known_fallback)
        in_hive_sequence = bt.Sequence()
        in_hive_sequence.add_child(self.InHive(self))
        in_hive_sequence.add_child(self.AvailableRecruits(self))
        in_hive_sequence.add_child(self.SendRecruits(self))
        food_known_fallback.add_child(in_hive_sequence)
        fly_to_hive_sequence = bt.Sequence()
        fly_to_hive_sequence.add_child(self.NotInHive(self))
        fly_to_hive_sequence.add_child(self.SetHiveTargetLocation(self))
        fly_to_hive_sequence.add_child(self.CanMove(self))
        fly_to_hive_sequence.add_child(self.FlyToTargetLocation(self))
        food_known_fallback.add_child(fly_to_hive_sequence)

        search_food_sequence = bt.Sequence()
        scout_fallback.add_child(search_food_sequence)
        search_food_sequence.add_child(self.DontKnowAboutFood(self))
        search_food_sequence.add_child(self.ShouldScoutForFood(self))

        scout_food_fallback = bt.FallBack()
        search_food_sequence.add_child(scout_food_fallback)

        can_see_food_sequence = bt.Sequence()
        can_see_food_sequence.add_child(self.CanSeeFood(self))

        smell_food_sequence = bt.Sequence()
        smell_food_sequence.add_child(self.FindBestSmell(self))
        smell_food_sequence.add_child(self.CanMove(self))
        smell_food_sequence.add_child(self.FlyToTargetLocation(self))

        random_movement_sequence = bt.Sequence()
        random_movement_sequence.add_child(self.CanMove(self))
        random_movement_sequence.add_child(self.Explore(self))

        scout_food_fallback.add_child(smell_food_sequence)
        scout_food_fallback.add_child(random_movement_sequence)
        scout_food_fallback.add_child(can_see_food_sequence)

        # Recruit
        recruit_sequence.add_child(self.IsRecruit(self))
        recruit_fallback = bt.FallBack()
        recruit_sequence.add_child(recruit_fallback)

        ## Collect nectar
        on_food_target_sequence = bt.Sequence()
        on_food_target_sequence.add_child(self.IsOnFoodTargetLocation(self))
        on_food_target_fallback = bt.FallBack()
        on_food_target_sequence.add_child(on_food_target_fallback)
        location_have_nectar_sequence = bt.Sequence()
        on_food_target_fallback.add_child(location_have_nectar_sequence)
        location_have_nectar_sequence.add_child(
            self.HaveTargetLocationNectar(self))
        location_have_nectar_sequence.add_child(self.TakeNectar(self))
        on_food_target_fallback.add_child(self.RemoveFoodTargetLocation(self))
        recruit_fallback.add_child(on_food_target_sequence)

        ## Have nectar

        have_nectar_sequence = bt.Sequence()
        have_nectar_sequence.add_child(self.HaveFood(self))
        have_nectar_fallback = bt.FallBack()
        have_nectar_sequence.add_child(have_nectar_fallback)
        recruit_in_hive_sequence = bt.Sequence()
        have_nectar_fallback.add_child(recruit_in_hive_sequence)
        recruit_in_hive_sequence.add_child(self.InHive(self))
        recruit_in_hive_sequence.add_child(self.LeaveFoodInHive(self))
        move_to_hive_sequence = bt.Sequence()
        move_to_hive_sequence.add_child(self.SetHiveTargetLocation(self))
        move_to_hive_sequence.add_child(self.CanMove(self))
        move_to_hive_sequence.add_child(self.FlyToTargetLocation(self))
        have_nectar_fallback.add_child(move_to_hive_sequence)

        recruit_no_food_fallback = bt.FallBack()
        recruit_know_food_sequence = bt.Sequence()
        recruit_no_food_fallback.add_child(recruit_know_food_sequence)
        recruit_know_food_sequence.add_child(self.KnowWhereFoodIs(self))
        recruit_know_food_sequence.add_child(self.SetFoodAsTarget(self))
        recruit_know_food_sequence.add_child(self.CanMove(self))
        recruit_know_food_sequence.add_child(self.FlyToTargetLocation(self))

        recruit_dont_know_food_sequence = bt.Sequence()
        recruit_dont_know_food_sequence.add_child(self.NotInHive(self))
        recruit_dont_know_food_sequence.add_child(self.DontKnowAboutFood(self))
        recruit_dont_know_food_sequence.add_child(
            self.SetHiveTargetLocation(self))
        recruit_dont_know_food_sequence.add_child(self.CanMove(self))
        recruit_dont_know_food_sequence.add_child(
            self.FlyToTargetLocation(self))

        recruit_fallback.add_child(have_nectar_sequence)
        recruit_fallback.add_child(recruit_no_food_fallback)
        recruit_fallback.add_child(recruit_dont_know_food_sequence)

        sequence.add_child(self.MakeScoutIfNeeded(self))
        sequence.add_child(self.ReduceMovementTimer(self))
        sequence.add_child(self.IncreaseAge(self))
        sequence.add_child(self.IncreaseHunger(self))
        sequence.add_child(self.TakeDamage(self))
        sequence.add_child(self.ReplenishHealth(self))
        sequence.add_child(self.UpdateOrientationMap(self))

        sequence.add_child(logic_fallback)

        tree.add_child(is_dead_sequence)
        tree.add_child(sequence)
        return tree