public CRT_State(CRT_StateManager myStateManager, CRT_Boss thisBoss, string name, CRT_State previous)
 {
     SM       = myStateManager;
     Boss     = thisBoss;
     Name     = name;
     Previous = previous;
 }
    IEnumerator Combo(CRT_State[] attacks)
    {
        comboStep   = 0;
        comboLength = attacks.Length;
        comboActive = true;

        foreach (CRT_State state in attacks)
        {
            CRT_State S = attacks[comboStep];
            //PlayAnimation(AnimationState.CRT_Single_Back);
            comboNextState = S;
            ChangeState(PrepareAttack); // Take Aim
            yield return(new WaitForSeconds(S.GetPrepDuration()));

            //Boss.PlaySound();
            ChangeState(S); // Attack!!
            yield return(new WaitForSeconds(S.GetDuration()));

            ComboState.SetPrevious(S);
            //ChangeState(ComboState);
            yield return(new WaitForSeconds(ComboState.GetPrevious().GetCooldown()));

            comboStep++;

            //

            //Prepare, S, BackToIdle
        }
        //ChangeState(Idle);
        comboActive = false;
    }
 public void ChangeState(CRT_State newState)
 {
     if (currentState != null)
     {
         currentState.Leave();
     }
     currentState = newState;
     currentState.Enter();
 }
    private void Start()
    {
        Main_SM = this;
        Boss    = this.GetComponent <CRT_Boss>();
        player  = FindObjectOfType <Player>();

        Idle          = new CRT_State_Idle(Main_SM, Boss, "Idle", Boss.TimeBetweenAttacks_P1);
        PrepareAttack = new CRT_State_PrepareAttack(Main_SM, Boss, "Prepare", 0);
        Stunned       = new CRT_State_Stunned(Main_SM, Boss, "Stunned", Boss.StunnedDuration);
        Dead          = new CRT_State_Dead(Main_SM, Boss, "Dead", 0);

        SingleAttack_normal = new CRT_State_Attack(Main_SM, Boss, "Single", Boss.SingleDuration_norm, Boss.SingleDuration_normPrep, Boss.SingleCooldown_norm, true);
        SingleAttack_quick  = new CRT_State_Attack(Main_SM, Boss, "Single", Boss.SingleDuration_quick, Boss.SingleDuration_quickPrep, Boss.SingleCooldown_quick, true);
        SingleAttack_long   = new CRT_State_Attack(Main_SM, Boss, "Single", Boss.SingleDuration_long, Boss.SingleDuration_longPrep, Boss.SingleCooldown_long, true);
        DoubleAttack_hoz    = new CRT_State_Attack(Main_SM, Boss, "DoubleHoz", Boss.DoubleDuration_norm, Boss.DoubleDuration_normPrep, Boss.DoubleCooldown_norm, true);
        DoubleAttack_ver    = new CRT_State_Attack(Main_SM, Boss, "DoubleVer", Boss.DoubleDuration_norm, Boss.DoubleDuration_normPrep, Boss.DoubleCooldown_norm, true);
        AllAttack_simul     = new CRT_State_Attack(Main_SM, Boss, "AllSimul", Boss.AllDuration_norm, Boss.AllDuration_normPrep, Boss.AllCooldown_norm, true);

        attackStateList = new CRT_State[] { SingleAttack_normal, DoubleAttack_hoz, DoubleAttack_ver, AllAttack_simul };

        ComboState = new CRT_State_Combo(Main_SM, Boss, "Combo", Idle);

        Attack_1   = new CRT_State[] { SingleAttack_normal };
        Attack_2_h = new CRT_State[] { DoubleAttack_hoz };
        Attack_2_v = new CRT_State[] { DoubleAttack_ver };
        Attack_3   = new CRT_State[] { AllAttack_simul };

        Combo_1 = new CRT_State[] { SingleAttack_normal, SingleAttack_normal, DoubleAttack_hoz };
        Combo_2 = new CRT_State[] { SingleAttack_normal, SingleAttack_normal, SingleAttack_normal };
        Combo_3 = new CRT_State[] { SingleAttack_normal, SingleAttack_normal, SingleAttack_normal, SingleAttack_normal };
        Combo_4 = new CRT_State[] { DoubleAttack_hoz, DoubleAttack_hoz, AllAttack_simul };
        Combo_5 = new CRT_State[] { DoubleAttack_hoz, SingleAttack_normal, SingleAttack_normal, DoubleAttack_hoz, SingleAttack_normal };
        Combo_6 = new CRT_State[] { DoubleAttack_ver, DoubleAttack_ver, DoubleAttack_hoz, DoubleAttack_hoz, AllAttack_simul };
        Combo_7 = new CRT_State[] { DoubleAttack_ver, SingleAttack_normal, SingleAttack_normal, DoubleAttack_hoz, SingleAttack_normal, SingleAttack_normal };
        Combo_8 = new CRT_State[] { AllAttack_simul, SingleAttack_normal, SingleAttack_normal, SingleAttack_normal, DoubleAttack_hoz };


        // PHASE 1: MOVE LIST
        MovesList_1 = new CRT_State[][] { Attack_1, Attack_2_v, Combo_1, Combo_2 };
        // PHASE 2: MOVE LIST
        MovesList_2 = new CRT_State[][] { Attack_3, Combo_1, Combo_2, Combo_3, Combo_4 };
        // PHASE 2: MOVE LIST
        MovesList_3 = new CRT_State[][] { Combo_4, Combo_5, Combo_6, Combo_7, Combo_8 };

        /*MovesList_1 = new CRT_State[][] { Attack_1 };
        *  // PHASE 2: MOVE LIST
        *  MovesList_2 = new CRT_State[][] { Attack_1 };
        *  // PHASE 2: MOVE LIST
        *  MovesList_3 = new CRT_State[][] { Attack_1 };*/

        ChangeState(Idle); // Starting state is idle
        currentAnimationState = AnimationState.CRT_Idle;
    }
    /*private float DetermineDuration(CRT_State attack) // Set respective duration for the attack
     * {
     *  switch (attack.GetName())
     *  {
     *      case "Single":
     *          if (SM.comboActive)
     *              return Boss.PrepDur_Combo_fast;
     *          else
     *              return Boss.PrepDuration_Single;
     *      case "DoubleHoz":
     *          if (SM.comboActive)
     *              return Boss.PrepDur_Combo_medium;
     *          else
     *              return Boss.PrepDuration_Double;
     *      case "DoubleVer":
     *          if (SM.comboActive)
     *              return Boss.PrepDur_Combo_medium;
     *          else
     *              return Boss.PrepDuration_Double;
     *      default:
     *          return 0;
     *  }
     * }*/

    public override void Enter()
    {
        Boss.sp.color = Color.yellow;

        Location playerLoc = FindPlayer();                           // Find the location the player is occupying

        AttackToPerform = GetNextComboStep();                        // Determine which attack to perform (random, currently)
        //Duration = DetermineDuration(AttackToPerform); // Determine duration of the current attack
        Boss.targets = DetermineTargets(AttackToPerform, playerLoc); // Determine the target locations based on the current attack
        Boss.TargetLocations();                                      // Target (visually indicate - yellow) those locations
        SM.DetermineAnimation(AttackToPerform.GetName());
    }
 public CRT_State_Combo(CRT_StateManager myStateManager, CRT_Boss myBoss, string myName, CRT_State myPrev) : base(myStateManager, myBoss, myName, myPrev)
 {
 }
    private List <Location> DetermineTargets(CRT_State attack, Location player) // aquire targets according to attack
    {
        List <Location> targets = new List <Location>();

        switch (attack.GetName())
        {
        case "Single":
            targets.Add(player);
            Boss.SetSound(0);
            return(targets);

        case "DoubleHoz":
            if (player.isUp)     // if up
            {
                for (int i = 0; i < Boss.locations.Length; i++)
                {
                    if (Boss.locations[i].isUp)
                    {
                        targets.Add(Boss.locations[i]);
                    }
                }
            }
            else     // if down
            {
                for (int i = 0; i < Boss.locations.Length; i++)
                {
                    if (!Boss.locations[i].isUp)
                    {
                        targets.Add(Boss.locations[i]);
                    }
                }
            }
            Boss.SetSound(0);
            return(targets);

        case "DoubleVer":
            if (player.isRight)     // if right
            {
                for (int i = 0; i < Boss.locations.Length; i++)
                {
                    if (Boss.locations[i].isRight)
                    {
                        targets.Add(Boss.locations[i]);
                    }
                }
            }
            else     // if left
            {
                for (int i = 0; i < Boss.locations.Length; i++)
                {
                    if (!Boss.locations[i].isRight)
                    {
                        targets.Add(Boss.locations[i]);
                    }
                }
            }
            Boss.SetSound(0);
            return(targets);

        case "AllSimul":
            foreach (Location t in Boss.locations)
            {
                targets.Add(t);
            }
            Boss.SetSound(2);
            return(targets);

        default:
            return(targets);
        }
    }
 public void SetPrevious(CRT_State state)
 {
     Previous = state;
 }