Beispiel #1
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var entity   = context.Entity;
            var movement = entity.GetComponent <MovementComponent>();

            return(movement.CanMove() ? BehaviourTreeStatus.Success : BehaviourTreeStatus.Failure);
        }
Beispiel #2
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            if (!IsContextValid(context))
            {
                return(BehaviourTreeStatus.Failure);
            }

            var cellsSuitableForSkillUse = this.boardNavigator
                                           .WithinSkillRange(
                GetTargetPoint(context),
                context.Entity.transform.position,
                context.Entity.GetComponent <SpellbookComponent>().FindOnActionBar(this.skillId))
                                           .Where(cell => cell.IsWalkable && !cell.IsOccupied)
                                           .Where(cell => this.pathfinder.IsTargetReachable(context.Entity, cell.transform.position))
                                           .ToList();

            if (cellsSuitableForSkillUse.Count == 0)
            {
                return(BehaviourTreeStatus.Failure);
            }

            context.TargetPoint = cellsSuitableForSkillUse
                                  .OrderBy(cell => (cell.transform.position - context.Entity.transform.position).sqrMagnitude)
                                  .First()
                                  .transform.position;

            return(BehaviourTreeStatus.Success);
        }
Beispiel #3
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var target = context.TargetEntity;

            return(target.GetComponent <BehavioursComponent>().IsSlowed
                ? BehaviourTreeStatus.Success : BehaviourTreeStatus.Failure);
        }
Beispiel #4
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var path = this.pathfinder.FindPath(
                context.Entity, context.RequireTargetEntity().transform.position, true);

            return(path.Count > 0 ? BehaviourTreeStatus.Success : BehaviourTreeStatus.Failure);
        }
Beispiel #5
0
        private void Close(BehaviourTreeContext context)
        {
            context.OpenedNodes.Remove(this);
            OnClose(context);

            LastStatus = BehaviourTreeStatus.Waiting;
        }
Beispiel #6
0
 protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
 {
     return(BoardNavigator.Instance
            .WithinCircle(context.Entity.transform.position, Properties.Range)
            .Any(cell => cell.GameObjectsInside.Corpses().Any())
         ? BehaviourTreeStatus.Success
         : BehaviourTreeStatus.Failure);
 }
Beispiel #7
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var cell = this.boardNavigator.WithinCircle(context.RequireTargetPoint(), 1).FirstOrDefault();

            return(cell == null || !cell.IsWalkable
                ? BehaviourTreeStatus.Failure
                : BehaviourTreeStatus.Success);
        }
Beispiel #8
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var health = context.Entity.GetComponent <HealthComponent>();

            return(health.HealthFraction <= Properties.HealthFraction
                ? BehaviourTreeStatus.Success
                : BehaviourTreeStatus.Failure);
        }
Beispiel #9
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            foreach (var child in Children)
            {
                child.Tick(context, delta);
            }

            return(BehaviourTreeStatus.Success);
        }
Beispiel #10
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            if (this.success == null)
            {
                return(BehaviourTreeStatus.Running);
            }

            return(this.success == true ? BehaviourTreeStatus.Success : BehaviourTreeStatus.Failure);
        }
Beispiel #11
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            if (context.TargetEntity == null)
            {
                return(BehaviourTreeStatus.Failure);
            }

            return(context.TargetEntity.IsAllyOf(context.Entity)
                ? BehaviourTreeStatus.Success : BehaviourTreeStatus.Failure);
        }
Beispiel #12
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            if (context.Combat == null)
            {
                return(BehaviourTreeStatus.Failure);
            }

            return(context.Combat.IsEntityTurn(context.Entity)
                ? BehaviourTreeStatus.Success
                : BehaviourTreeStatus.Failure);
        }
Beispiel #13
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            if (Children.Count == 0)
            {
                throw new ApplicationException($"{GetType().Name} must have a child node!");
            }

            return(Children.First().Tick(context, delta) == BehaviourTreeStatus.Running
                ? BehaviourTreeStatus.Running
                : BehaviourTreeStatus.Success);
        }
Beispiel #14
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var target = context.TargetEntity;
            var health = target.GetComponent <HealthComponent>();

            if (health == null)
            {
                return(BehaviourTreeStatus.Failure);
            }

            return(health.IsAlive ? BehaviourTreeStatus.Success : BehaviourTreeStatus.Failure);
        }
Beispiel #15
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var cell = this.boardNavigator.WithinCircle(context.Entity.transform.position, Properties.Range).Random();

            if (cell == null)
            {
                return(BehaviourTreeStatus.Failure);
            }

            context.TargetPoint = cell.transform.position;
            return(BehaviourTreeStatus.Success);
        }
Beispiel #16
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var cell = BoardNavigator.Instance.BehindTheBackOfOccupying(context.Entity.transform.position);

            if (cell == null)
            {
                return(BehaviourTreeStatus.Failure);
            }

            return(cell.OccupiedBy == context.RequireTargetEntity()
                ? BehaviourTreeStatus.Success
                : BehaviourTreeStatus.Failure);
        }
Beispiel #17
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var target = context.TargetEntity;
            var entity = context.Entity;

            if (target == null)
            {
                return(BehaviourTreeStatus.Failure);
            }

            return(this.boardNavigator.EntitiesInRadius(entity.transform.position, this.range).Contains(target)
                ? BehaviourTreeStatus.Success : BehaviourTreeStatus.Failure);
        }
Beispiel #18
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var entity = context.Entity;
            var target = context.RequireTargetEntity();

            var entitiesInSkillRange = this.boardNavigator
                                       .EntitiesInSkillRange(
                entity.transform.position,
                target.transform.position,
                entity.GetComponent <SpellbookComponent>().FindOnActionBar(this.skillId)
                );

            return(entitiesInSkillRange.Contains(target) ? BehaviourTreeStatus.Success : BehaviourTreeStatus.Failure);
        }
Beispiel #19
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var difference = context.RequireTargetEntity().transform.position - context.Entity.transform.position;

            var direction = difference.normalized;
            var magnitude = difference.magnitude;

            var onLineOfSight = Physics2D
                                .RaycastAll(context.Entity.transform.position + direction, direction, magnitude - 2.0f)
                                .ToCellsPrecise()
                                .All(hitCell => hitCell.IsWalkable && !hitCell.IsOccupied);

            return(onLineOfSight ? BehaviourTreeStatus.Success : BehaviourTreeStatus.Failure);
        }
Beispiel #20
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var cell = Board.Instance.Cells
                       .OrderBy(c => (c.transform.position - context.Entity.transform.position).sqrMagnitude)
                       .FirstOrDefault(c => c.GameObjectsInside.Corpses().Any());

            if (cell == null)
            {
                return(BehaviourTreeStatus.Failure);
            }

            context.TargetPoint = cell.transform.position;
            return(BehaviourTreeStatus.Success);
        }
Beispiel #21
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var skill = context.Entity.GetComponent <SpellbookComponent>().FindOnActionBar(this.skillId);

            if (context.Entity.GetComponent <BehavioursComponent>().IsUncontrollable)
            {
                Debug.LogWarning($"{GetType().Name}: entity is uncontrollable but still in combat queue.");
                return(BehaviourTreeStatus.Failure);
            }

            return(skill.IsDisabled() || skill.IsOnCooldown() || !skill.HasEnoughResources()
                ? BehaviourTreeStatus.Failure
                : BehaviourTreeStatus.Success);
        }
Beispiel #22
0
    /// <summary>
    /// Start the execution of the AI
    /// </summary>
    /// <param name="dependent">The behaviour the AI is attached to. The AI is disposed if the behaviour is destroyed</param>
    /// <param name="agent">The agent the AI is meant to control</param>
    public void Start(MonoBehaviour dependent, X agent)
    {
        if (_started)
        {
            return;
        }

        _started = true;

        _dependent = dependent;
        _ctx       = new BehaviourTreeContext <X>(agent);

        Resume();
    }
Beispiel #23
0
        protected override void OnOpen(BehaviourTreeContext context)
        {
            this.done    = false;
            this.failure = false;

            var movement = context.Entity.GetComponent <MovementComponent>();

            if (!movement.CanMove() || context.TargetEntity == null)
            {
                this.failure = true;
                return;
            }

            movement.Stopped += OnMovementStopped;
            movement.Move(context.TargetEntity.transform.position);
        }
Beispiel #24
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var closestEnemy = Scene.Active.Entities
                               .Alive(entity => entity.IsEnemyOf(context.Entity))
                               .OrderBy(entity => (context.Entity.transform.position - entity.transform.position).sqrMagnitude)
                               .FirstOrDefault();

            if (closestEnemy == null)
            {
                return(BehaviourTreeStatus.Failure);
            }

            context.TargetPoint = closestEnemy.transform.position;

            return(BehaviourTreeStatus.Success);
        }
Beispiel #25
0
        protected override object GetTarget(BehaviourTreeContext context)
        {
            var targetPoint = context.RequireTargetPoint();

            var cell   = BoardNavigator.Instance.WithinCircle(targetPoint, 0).First();
            var corpse = cell.GameObjectsInside.Corpses().FirstOrDefault();

            if (corpse == null)
            {
                throw new InvalidSkillTargetException();
            }

            corpse.Consume();

            return(targetPoint);
        }
Beispiel #26
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var closest = Scene.Active.Entities
                          .Alive(entity => entity.IsAllyOf(context.Entity))
                          .Where(entity => entity.GetComponent <HealthComponent>().HealthFraction <= this.fraction)
                          .OrderBy(entity => (context.Entity.transform.position - entity.transform.position).sqrMagnitude)
                          .FirstOrDefault();

            if (closest == null)
            {
                return(BehaviourTreeStatus.Failure);
            }

            context.TargetEntity = closest;
            return(BehaviourTreeStatus.Success);
        }
Beispiel #27
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var closest = Scene.Active.Entities
                          .Alive(entity => entity.IsEnemyOf(context.Entity) &&
                                 !entity.GetComponent <BehavioursComponent>().IsInvisible)
                          .OrderBy(entity => (context.Entity.transform.position - entity.transform.position).sqrMagnitude)
                          .FirstOrDefault();

            if (closest == null)
            {
                return(BehaviourTreeStatus.Failure);
            }

            context.TargetEntity = closest.gameObject;

            return(BehaviourTreeStatus.Success);
        }
Beispiel #28
0
        protected override void OnOpen(BehaviourTreeContext context)
        {
            var skill = context.Entity.GetComponent <SpellbookComponent>().FindOnActionBar(this.skillId);

            this.success = null;

            try
            {
                skill.Used += OnSkillUsed;
                skill.Use(GetTarget(context));
            }
            catch (GameplayException exception)
            {
                this.success = false;
                skill.Used  -= OnSkillUsed;
            }
        }
Beispiel #29
0
        public BehaviourTreeStatus Tick(BehaviourTreeContext context, float delta)
        {
            if (!context.OpenedNodes.Contains(this))
            {
                Open(context);
            }

            var status = OnTick(context, delta);

            if (status != BehaviourTreeStatus.Running)
            {
                Close(context);
            }

            LastStatus = status;

            return(status);
        }
Beispiel #30
0
        protected override BehaviourTreeStatus OnTick(BehaviourTreeContext context, float delta)
        {
            var numChildrenFailed = 0;

            foreach (var child in Children)
            {
                var childStatus = child.Tick(context, delta);

                if (childStatus == BehaviourTreeStatus.Success)
                {
                    return(childStatus);
                }

                if (childStatus == BehaviourTreeStatus.Failure)
                {
                    numChildrenFailed++;
                }
            }

            return(numChildrenFailed == Children.Count ? BehaviourTreeStatus.Failure : BehaviourTreeStatus.Running);
        }