Beispiel #1
0
 public virtual void ReleaseTrigger()
 {
     if (CurrentAbility)
     {
         CurrentAbility.ReleaseTrigger();
     }
 }
Beispiel #2
0
 public virtual void PullTrigger()
 {
     if (CurrentAbility)
     {
         CurrentAbility.PullTrigger();
     }
 }
 private void AbortAbilityInternal(Ability abs)
 {
     if (CurrentAbility != null && CurrentAbility == abs)
     {
         CurrentAbility.End();
         CurrentAbility = null;
     }
 }
    public Vector3 ProcessAbilities(Vector3 direction)
    {
        if (CurrentAbility)
        {
            CurrentAbility.Tick();
            direction = CurrentAbility.ProcessMovement(direction);
        }

        return(direction);
    }
 /// <summary>
 /// 切換能力
 /// </summary>
 /// <param name="nextAbility">下一個能力</param>
 private void SwitchAbility(AbilityBase nextAbility)
 {
     CurrentAbility.Exit();
     CurrentAbility = nextAbility;
     CurrentAbility.Enter();
     if (_animatorManager != null)
     {
         _animatorManager.AnimClip = (int)nextAbility.AnimClip;
     }
 }
        public void Use()
        {
            if (!CurrentAbility)
            {
                return;
            }

            if (timeSinceEnergyUse >= CurrentAbility.CooldownTime)
            {
                CurrentAbility.Use();
            }
        }
        private void EquipAbility()
        {
            var currentBehaviour = GetComponent <AbilityBehaviour>();

            if (currentBehaviour != null)
            {
                Destroy((currentBehaviour as Component));
            }

            CurrentAbility.AttachBehaviourTo(gameObject);

            onChangedAbility?.Invoke(CurrentAbility.Sprite);
        }
    /// <summary>
    /// 自動處理能力
    /// </summary>
    public void ProcessAbility()
    {
        EveryFrameAll();
        AbilityBase nextAbility = ReTriggerAll();

        //
        if (CurrentAbility != nextAbility)
        {
            SwitchAbility(nextAbility);
        }
        else
        {
            CurrentAbility.Stay();
        }
    }
Beispiel #9
0
        public override bool TryToAddTarget(object c)
        {
            if (CurrentAbility == null)
            {
                return(false);
            }

            if (CurrentAbility.TryToAddTarget(c))
            {
                //trick to force update of current ability
                //should simplify currentAbilityActivation update
                MagicAction tmp = CurrentAbility;
                return(true);
            }
            return(false);
        }
Beispiel #10
0
        public override void Update()
        {
            if (!IsControlled && CharacterState == CharacterState.Active)
            {
                #region AI Behavior
                switch (AIState)
                {
                case AIState.Attack:
                    if (mainMan.GameMan.Players[0].CharacterState != CharacterState.Dead && PlayerInArea())
                    {
                        //Move close to attack
                        if (DistanceToPlayer(0) > AttackRange)
                        {
                            if (mainMan.GameMan.Players[0].Character.Type == Faction.Thief && mainMan.GameMan.Players[0].Character.CurrentAbility.InUse)
                            {
                                MoveToPoint((mainMan.GameMan.Players[0].Character.CurrentAbility as Decoy).Position.X, (mainMan.GameMan.Players[0].Character.CurrentAbility as Decoy).Position.Y);
                            }
                            else
                            {
                                MoveToPoint(mainMan.GameMan.Players[0].X, mainMan.GameMan.Players[0].Y);
                            }
                        }
                        else
                        {
                            //Fight them suckers
                            SwitchAIState(AIState.Swing);
                        }
                    }
                    else
                    {
                        SwitchAIState(AIState.Idle);
                    }

                    AIStateTimer -= (float)mainMan.GameTime.ElapsedGameTime.TotalSeconds;
                    if (AIStateTimer <= 0f)
                    {
                        SwitchAIState(AIState.Idle);
                    }
                    break;

                case AIState.Swing:
                    AIStateTimer -= (float)mainMan.GameTime.ElapsedGameTime.TotalSeconds;

                    if (AIStateTimer <= 0f)
                    {
                        SwitchAIState(AIState.Idle);
                    }
                    break;

                case AIState.Defend:
                    if (mainMan.GameMan.Players[0].CharacterState != CharacterState.Dead && PlayerInArea())
                    {
                        //Check if player is too close and move back
                        if (DistanceToPlayer(0) < SightRange / 1.5)
                        {
                            SetDirectionToPoint(mainMan.GameMan.Players[0].X, mainMan.GameMan.Players[0].Y);
                            MoveToPoint(X + (float)(MovementSpeed * Math.Cos((270f - Direction) * Math.PI / 180f)), Y + (float)(MovementSpeed * Math.Sin((270f - Direction) * Math.PI / 180f)));
                        }
                        else
                        {
                            SwitchAIState(AIState.Idle);
                        }
                    }
                    else
                    {
                        SwitchAIState(AIState.Idle);
                    }

                    AIStateTimer -= (float)mainMan.GameTime.ElapsedGameTime.TotalSeconds;
                    if (AIStateTimer <= 0f)
                    {
                        SwitchAIState(AIState.Idle);
                    }
                    break;

                case AIState.Idle:
                    AIStateTimer -= (float)mainMan.GameTime.ElapsedGameTime.TotalSeconds;

                    if (AIStateTimer <= 0f)
                    {
                        //random movement?
                        if (!mainMan.GameMan.Players[0].NoCharacter && PlayerInArea() && mainMan.GameMan.Players[0].Character.Type != Type && mainMan.GameMan.Players[0].CharacterState == CharacterState.Active)
                        {
                            if (DistanceToPlayer(0) < SightRange)
                            {
                                //Get random
                                SwitchAIState(GetRandomAIState(EncounterAIStates));
                            }
                        }
                        else
                        {
                            AIStateTimer = AITimers[AIState];
                        }
                    }
                    break;

                case AIState.Switch:
                    //Move to sword
                    MoveToPoint(mainMan.GameMan.Players[0].X, mainMan.GameMan.Players[0].Y);

                    //Check if picked up
                    if (HitBox.Contains(mainMan.GameMan.Players[0].Position))
                    {
                        //Pick it up!!!
                        mainMan.GameMan.Players[0].SwitchBlade(this);
                    }
                    break;

                case AIState.Ability:
                    //Warp to player
                    CurrentAbility.AIUse();
                    SwitchAIState(AIState.Idle);
                    break;

                case AIState.Cower:

                    break;

                case AIState.Ready:

                    break;
                }
                #endregion
            }

            base.Update();
        }
Beispiel #11
0
 public void Ability()
 {
     CurrentAbility.TriggerAbility(transform);
 }