Esempio n. 1
0
 private void Awake()
 {
     _stats = GetComponent <EnemyStatsController>();
     _brain = GetComponent <EnemyBrainController>();
     _anim  = GetComponentInChildren <Animator>();
     _agent = GetComponent <NavMeshAgent>();
 }
Esempio n. 2
0
    public IEnumerator FunctionalRequirements_PlayerShouldBeRemovedFromSceneWhenItDies()
    {
        GameObject            magePlayer      = Object.Instantiate(TestResourceManager.Instance.GetResource("Mage Player"), Vector3.zero, Quaternion.identity);
        PlayerStatsController magePlayerStats = magePlayer.GetComponent <PlayerStatsController>();
        GameObject            enemy           = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), Vector3.zero, Quaternion.identity);
        EnemyStatsController  enemyStats      = enemy.GetComponent <EnemyStatsController>();

        magePlayer.transform.position = new Vector3(0, 0, -2);
        enemy.transform.Rotate(new Vector3(0, 1, 0), 180);

        magePlayerStats.health.maxValue = 1;
        magePlayerStats.health.Init();
        yield return(new WaitForEndOfFrame());

        yield return(new WaitForEndOfFrame());


        // Wait for player to despawn
        float timer = 0;

        while (magePlayer.activeSelf)
        {
            if (timer > 15f)
            {
                break;
            }
            timer += Time.deltaTime;
            yield return(new WaitForEndOfFrame());
        }

        Assert.IsTrue(magePlayer.activeSelf == false, "Player was not removed from scene");

        yield return(null);
    }
    /// <summary>
    /// Set up the puzzle
    /// </summary>
    protected virtual void Setup()
    {
        loadedEnemies.Clear();
        numEnemiesDead = 0;
        if (autoDetermineNumEnemies)
        {
            // Base # enemies off number of players
            numEnemies = playerColours.Length * 2;
        }
        else
        {
            numEnemies = enemyPrefabs.Length;
        }
        // spawn enemies
        for (int i = 0; i < numEnemies; i++)
        {
            int        enemyIndex = UnityEngine.Random.Range(0, enemyPrefabs.Length);
            GameObject enemyObj   = Instantiate(enemyPrefabs[enemyIndex], transform);
            loadedEnemies.Add(enemyObj);

            // add any modifieres to the enemy
            EnemyStatsController enemyStats = enemyObj.GetComponent <EnemyStatsController>();
            enemyStats.damage.AddModifier(damageModifier);
            enemyStats.damage.AddModifier(defenseModifier);

            enemyStats.characterColour = CharacterColour.None;
            enemyStats.onDeath.AddListener(EnemyDied);
        }
        if (isBoss)
        {
            GameManager.Instance.SetBossState();
            MusicManager.Instance.PlayMusic();
        }
    }
Esempio n. 4
0
    public IEnumerator FunctionalRequirements_EnemyShouldOnlyBeDamagedByPlayersOfSameColour()
    {
        GameObject            magePlayer       = Object.Instantiate(TestResourceManager.Instance.GetResource("Mage Player"), Vector3.zero, Quaternion.identity);
        PlayerStatsController magePlayerStats  = magePlayer.GetComponent <PlayerStatsController>();
        GameObject            meleePlayer      = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), Vector3.zero, Quaternion.identity);
        PlayerStatsController meleePlayerStats = meleePlayer.GetComponent <PlayerStatsController>();
        GameObject            enemy            = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), Vector3.zero, Quaternion.identity);
        EnemyStatsController  enemyStats       = enemy.GetComponent <EnemyStatsController>();

        magePlayer.transform.position = new Vector3(0, 0, -2);
        enemy.transform.Rotate(new Vector3(0, 1, 0), 180);

        magePlayerStats.characterColour  = CharacterColour.Green;
        meleePlayerStats.characterColour = CharacterColour.Red;

        yield return(new WaitForEndOfFrame());

        yield return(new WaitForEndOfFrame());

        enemyStats.characterColour = CharacterColour.Red;
        float initialHp = enemyStats.health.CurrentValue;

        enemyStats.TakeDamage(magePlayerStats, 10f);
        yield return(new WaitForSeconds(timeToWait));

        Assert.AreEqual(enemyStats.health.CurrentValue, initialHp, "Enemy lost health when player colour was different");

        enemyStats.TakeDamage(meleePlayerStats, 10f);
        yield return(new WaitForSeconds(timeToWait));

        Assert.Less(enemyStats.health.CurrentValue, initialHp, "Enemy did not lose health when player colour was same");

        yield return(null);
    }
 public void RemoveEnemyInvincibility()
 {
     foreach (GameObject enemy in enemyPrefabs)
     {
         EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>();
         enemyStats.invincible = false;
     }
 }
    /// <summary>
    /// Registers a newly spawned plant to be known by the boss
    /// </summary>
    /// <param name="plant">The newly spawned plant</param>
    public void AddPlantToSpawnList(GameObject plant)
    {
        EnemyStatsController plantStats = plant.GetComponent <EnemyStatsController>();

        if (plantStats)
        {
            _spawnedPlants.Add(plantStats);
        }
    }
 protected override void Start()
 {
     numEnemiesDead = 0;
     numEnemies     = enemyPrefabs.Length;
     foreach (GameObject enemy in enemyPrefabs)
     {
         EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>();
         enemyStats.invincible = true;
         enemyStats.onDeath.AddListener(EnemyDied);
     }
 }
    private void Awake()
    {
        _stats = GetComponent <EnemyStatsController>();
        _brain = GetComponent <EnemyBrainController>();
        _agent = GetComponent <NavMeshAgent>();

        // Set avoidance priority to random number (0-99) to prevent enemy clustering
        if (_agent)
        {
            _agent.avoidancePriority = Random.Range(0, 100);
        }
    }
Esempio n. 9
0
    protected override void OnTriggerEnter(Collider other)
    {
        GameObject col = other.gameObject;

        // if other object is an enemy, deal damage
        if (col.CompareTag("Enemy"))
        {
            EnemyStatsController enemy = col.GetComponent <EnemyStatsController>();
            enemy.TakeDamage(LauncherStats, _damage); // TODO may need to calculate damage differently?
        }

        gameObject.SetActive(false);
    }
    protected virtual void Start()
    {
        rigid            = GetComponent <Rigidbody2D>();
        enemyAnim        = GetComponent <Animator>();
        animationTrigger = GetComponent <EnemyAnimationTrigger>();
        statsController  = GetComponent <EnemyStatsController>();
        attackController = GetComponent <EnemyAttackController>();

        facingDirection = 1;
        statsController.OnAttackedEvent.AddListener(HandleOnAttackedEvent);
        statsController.OnDeathEvent.AddListener(HandleOnDeathEvent);
        attackController.OnAttackedDirectionEvent.AddListener(HandleOnAttackedDirectionEvent);
    }
    public Attack PlayerCreateAttack(PlayerStatsController attackerStats, EnemyStatsController defenderStats, Vector2 hitBackForce)
    {
        float coreDamage = attackerStats.GetAttackStat();

        coreDamage += Random.Range(plusDamage.x, plusDamage.y);

        bool isCritical = Random.value < criticalChange;

        if (isCritical)
        {
            coreDamage += criticalMultiplier;
        }

        return(new Attack((int)coreDamage, isCritical, hitBackForce));
    }
Esempio n. 12
0
    public override void TriggerAttack()
    {
        base.TriggerAttack();

        Collider2D[] hittedEnemies = Physics2D.OverlapCircleAll(playerData.attack1Position.position, playerController.meleeAttack1.radiusRange, playerData.whatIsEnemy);
        foreach (Collider2D enemy in hittedEnemies)
        {
            EnemyStatsController  enemyStatsController = enemy.gameObject.GetComponent <EnemyStatsController>();
            EnemyAttackController enemyAttackHandler   = enemy.gameObject.GetComponent <EnemyAttackController>();

            if (enemyAttackHandler != null && enemyStatsController != null)
            {
                Attack attack = playerController.meleeAttack1.PlayerCreateAttack(playerController.statsController, enemyStatsController, playerController.meleeAttack1.hitBackForce);
                enemyAttackHandler.OnAttacked(playerController.gameObject, attack);
            }
        }
    }
    public IEnumerator PlayerCombat_MeleePlayerCanDamageEnemyWithPrimaryAndSecondaryAttacks()
    {
        GameObject            meleePlayer      = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), Vector3.zero, Quaternion.identity);
        PlayerStatsController meleePlayerStats = meleePlayer.GetComponent <PlayerStatsController>();
        GameObject            enemy            = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), Vector3.zero, Quaternion.identity);
        EnemyStatsController  enemyStats       = enemy.GetComponent <EnemyStatsController>();

        Vector3 attackPos = new Vector3(0, 0, -2.5f);

        meleePlayer.SetActive(true);
        enemy.SetActive(true);

        var input = meleePlayer.GetComponent <PlayerInput>();

        input.enabled = true;

        _inputMock.SetInputToMockGamepad(input);

        meleePlayer.transform.position = attackPos;

        float initialHealth = enemyStats.health.CurrentValue;

        enemyStats.characterColour = meleePlayerStats.characterColour;

        yield return(new WaitForSeconds(0.5f));

        // Player attacks with primary attack
        _inputMock.Press(_inputMock.Gamepad.rightShoulder);
        yield return(new WaitForSeconds(1f));

        _inputMock.Release(_inputMock.Gamepad.rightShoulder);
        yield return(new WaitForSeconds(1f));

        Assert.Less(enemyStats.health.CurrentValue, initialHealth, "Melee player was unable to damage the enemy with primary attack!");

        initialHealth = enemyStats.health.CurrentValue;

        // Player attacks with secondary attack
        _inputMock.Press(_inputMock.Gamepad.rightTrigger);
        yield return(new WaitForSeconds(1f));

        _inputMock.Release(_inputMock.Gamepad.rightTrigger);
        yield return(new WaitForSeconds(1f));

        Assert.Less(enemyStats.health.CurrentValue, initialHealth, "Melee player was unable to damage the enemy with secondary attack!");
    }
    /// <summary>
    /// Set up the puzzle
    /// </summary>
    protected override void Setup()
    {
        numEnemiesDead = 0;
        numEnemies     = enemies.Length;
        for (int i = 0; i < numEnemies; i++)
        {
            // add any modifieres to the enemy
            EnemyStatsController enemyStats = enemies[i].GetComponent <EnemyStatsController>();
            enemyStats.damage.AddModifier(damageModifier);
            enemyStats.damage.AddModifier(defenseModifier);

            enemyStats.characterColour = CharacterColour.None;
            enemyStats.onDeath.AddListener(EnemyDied);
        }
        if (isBoss)
        {
            GameManager.Instance.SetBossState();
        }
    }
Esempio n. 15
0
    private void Awake()
    {
        if (barType == BarType.Player)
        {
            PlayerStatsController stats = transform.parent.GetComponent <PlayerStatsController>();
            _healthStat = stats.health;
            _manaStat   = stats.mana;
        }
        else if (barType == BarType.Enemy)
        {
            EnemyStatsController stats = transform.parent.GetComponent <EnemyStatsController>();
            _healthStat = stats.health;

            // apply enemy name as label
            string label     = gameObject.GetComponentInParent <EntityStatsController>().gameObject.name;
            Text   labelText = gameObject.GetComponentInChildren <Text>();
            labelText.text = label;
        }
    }
    protected override void Start()
    {
        CombinationLeverPuzzle combinationPuzzle = GetComponent <CombinationLeverPuzzle>();
        EnemyPuzzle            enemyPuzzle       = GetComponent <EnemyPuzzle>();

        // Set colours of all enemies in the task based on combination
        CharacterColour[] combination = combinationPuzzle.SetColourCombination();
        for (int i = 0; i < combination.Length; i++)
        {
            EnemyStatsController enemy = enemyPuzzle.enemyPrefabs[i].GetComponent <EnemyStatsController>();
            enemy.AssignEnemyColour(combination[i]);
        }

        // Hide all platforms
        RockPuzzle rockPuzzle = GetComponent <RockPuzzle>();

        foreach (Platform platform in rockPuzzle.platforms)
        {
            platform.Hide();
        }
    }
Esempio n. 17
0
    private void Awake()
    {
        switch (barType)
        {
        case BarType.Player:
        {
            PlayerStatsController stats = transform.parent.GetComponent <PlayerStatsController>();
            _healthStat = stats.health;
            _manaStat   = stats.mana;
            break;
        }

        case BarType.Enemy:
        case BarType.Boss:
        {
            EnemyStatsController stats = transform.parent.GetComponent <EnemyStatsController>();
            _healthStat = stats.health;

            // Handle boss specific setup
            if (barType == BarType.Boss)
            {
                // Use the boss' gameObject name for the label
                string label     = stats.gameObject.name;
                Text   labelText = gameObject.GetComponentInChildren <Text>();
                labelText.text = label;
            }

            break;
        }
        }

        _canvas = GetComponent <Canvas>();

        // Start the bars hidden if not set to always show them
        if (!alwaysShow)
        {
            Hide();
        }
    }
Esempio n. 18
0
    protected override void OnTriggerEnter(Collider other)
    {
        GameObject col = other.gameObject;

        if (col.CompareTag("Enemy"))
        {
            EnemyStatsController enemy = col.GetComponent <EnemyStatsController>();
            enemy.TakeDamage(LauncherStats, LauncherStats.ComputeDamageModifer()); // TODO may need to calculate damage differently?
        }
        else if (col.CompareTag("Player"))
        {
            PlayerStatsController player = col.GetComponent <PlayerStatsController>();
            int healAmount = Random.Range(5, 10);

            ShowHealing(healAmount, player.transform);
            player.health.Add(healAmount); // TODO may need to calculate health differently?
        }
        else
        {
            gameObject.SetActive(false);
        }
    }
Esempio n. 19
0
    public override void TriggerAttack()
    {
        base.TriggerAttack();

        Collider2D[] hittedEnemies = Physics2D.OverlapBoxAll(playerData.attack2Position.position,
                                                             new Vector2(playerController.meleeAttack2.rangeX, playerController.meleeAttack2.rangeX), 0, playerData.whatIsEnemy);

        foreach (Collider2D enemy in hittedEnemies)
        {
            EnemyStatsController  enemyStatsController  = enemy.gameObject.GetComponent <EnemyStatsController>();
            EnemyAttackController enemyAttackController = enemy.gameObject.GetComponent <EnemyAttackController>();

            if (enemyAttackController != null && enemyStatsController != null)
            {
                Attack attack = playerController.meleeAttack2.PlayerCreateAttack(playerController.statsController, enemyStatsController, playerController.meleeAttack2.hitBackForce);
                enemyAttackController.OnAttacked(playerController.gameObject, attack);
            }

            //Attack attack = playerController.meleeAttack2.CreateAttack(playerController.statsController,
            //    enemy.gameObject.GetComponent<CharacterStatsController>(), playerController.meleeAttack2.hitBackForce);
            //enemy.gameObject.GetComponent<AttackHandler>().OnAttacked(playerController.gameObject, attack);
        }
    }
Esempio n. 20
0
    public IEnumerator FunctionalRequirements_EnemyShouldTakeDamageFromPlayer()
    {
        GameObject            magePlayer      = Object.Instantiate(TestResourceManager.Instance.GetResource("Mage Player"), Vector3.zero, Quaternion.identity);
        PlayerStatsController magePlayerStats = magePlayer.GetComponent <PlayerStatsController>();
        GameObject            enemy           = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), Vector3.zero, Quaternion.identity);
        EnemyStatsController  enemyStats      = enemy.GetComponent <EnemyStatsController>();

        magePlayer.transform.position = new Vector3(0, 0, -2);
        enemy.transform.Rotate(new Vector3(0, 1, 0), 180);

        yield return(new WaitForEndOfFrame());

        yield return(new WaitForEndOfFrame());

        float initialHp = enemyStats.health.CurrentValue;

        enemyStats.TakeDamage(magePlayerStats, 10f);
        yield return(new WaitForSeconds(timeToWait));

        Assert.Less(enemyStats.health.CurrentValue, initialHp, "Enemy did not lose health");

        yield return(null);
    }
    protected override void OnTriggerEnter(Collider other)
    {
        GameObject col = other.gameObject;

        if (col.CompareTag("Enemy"))
        {
            EnemyStatsController enemy = col.GetComponent <EnemyStatsController>();
            enemy.TakeDamage(LauncherStats, _damageAmount);
        }
        else if (col.CompareTag("Player"))
        {
            PlayerStatsController player = col.GetComponent <PlayerStatsController>();

            ShowHealingText(_healAmount, player.transform);
            player.health.Add(_healAmount);
        }
        else
        {
            if (!other.isTrigger)
            {
                gameObject.SetActive(false);
            }
        }
    }
    public IEnumerator CombatScenario_TwoPlayersFightingTwoEnemiesIndividually()
    {
        // Set up entities
        GameObject            meleePlayer1      = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(-2f, 0, 0), Quaternion.identity);
        PlayerStatsController meleePlayerStats1 = meleePlayer1.GetComponent <PlayerStatsController>();

        meleePlayerStats1.characterColour = CharacterColour.Green;

        GameObject            meleePlayer2      = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(2f, 0, 0), Quaternion.identity);
        PlayerStatsController meleePlayerStats2 = meleePlayer2.GetComponent <PlayerStatsController>();

        meleePlayerStats2.characterColour = CharacterColour.Red;

        GameObject           enemy1      = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), new Vector3(-6f, 0, 6f), Quaternion.identity);
        EnemyStatsController enemyStats1 = enemy1.GetComponent <EnemyStatsController>();

        enemyStats1.characterColour = CharacterColour.Green;
        enemyStats1.health.maxValue = 10f;

        GameObject           enemy2      = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), new Vector3(6f, 0, 6f), Quaternion.identity);
        EnemyStatsController enemyStats2 = enemy2.GetComponent <EnemyStatsController>();

        enemyStats2.characterColour = CharacterColour.Red;
        enemyStats2.health.maxValue = 10f;

        meleePlayer1.SetActive(true);
        meleePlayer2.SetActive(true);
        enemy1.SetActive(true);
        enemy2.SetActive(true);

        // Setup inputs
        PlayerInput input1 = meleePlayer1.GetComponent <PlayerInput>();

        input1.enabled = true;
        _inputMocks[0].SetInputToMockGamepad(input1);

        PlayerInput input2 = meleePlayer2.GetComponent <PlayerInput>();

        input1.enabled = true;
        _inputMocks[1].SetInputToMockGamepad(input2);

        // Wait for enemies to approach the players
        yield return(new WaitForSeconds(1.5f));

        // Players each face their enemy
        _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, (new Vector2(enemy1.transform.position.x, enemy1.transform.position.z) -
                                                                 new Vector2(meleePlayer1.transform.position.x, meleePlayer1.transform.position.z)).normalized);
        yield return(new WaitForSeconds(0.1f));

        _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, (new Vector2(enemy2.transform.position.x, enemy2.transform.position.z) -
                                                                 new Vector2(meleePlayer2.transform.position.x, meleePlayer2.transform.position.z)).normalized);

        // Players attack with both their attacks
        float timer            = 0f;
        bool  usePrimaryAttack = true;

        while (!enemyStats1.isDead || !enemyStats2.isDead)
        {
            if (usePrimaryAttack)
            {
                _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, (new Vector2(enemy1.transform.position.x, enemy1.transform.position.z) -
                                                                         new Vector2(meleePlayer1.transform.position.x, meleePlayer1.transform.position.z)).normalized);
                yield return(new WaitForSeconds(0.1f));

                _inputMocks[0].Press(_inputMocks[0].Gamepad.rightShoulder);
                yield return(new WaitForSeconds(0.1f));

                _inputMocks[0].Release(_inputMocks[0].Gamepad.rightShoulder);

                yield return(new WaitForSeconds(0.3f));

                _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, (new Vector2(enemy2.transform.position.x, enemy2.transform.position.z) -
                                                                         new Vector2(meleePlayer2.transform.position.x, meleePlayer2.transform.position.z)).normalized);
                yield return(new WaitForSeconds(0.1f));

                _inputMocks[1].Press(_inputMocks[1].Gamepad.rightShoulder);
                yield return(new WaitForSeconds(0.1f));

                _inputMocks[1].Release(_inputMocks[1].Gamepad.rightShoulder);

                yield return(new WaitForSeconds(1f));
            }
            else
            {
                _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, (new Vector2(enemy1.transform.position.x, enemy1.transform.position.z) -
                                                                         new Vector2(meleePlayer1.transform.position.x, meleePlayer1.transform.position.z)).normalized);
                yield return(new WaitForSeconds(0.1f));

                _inputMocks[0].Press(_inputMocks[0].Gamepad.rightTrigger);
                yield return(new WaitForSeconds(0.2f));

                _inputMocks[0].Release(_inputMocks[0].Gamepad.rightTrigger);

                yield return(new WaitForSeconds(0.3f));

                _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, (new Vector2(enemy2.transform.position.x, enemy2.transform.position.z) -
                                                                         new Vector2(meleePlayer2.transform.position.x, meleePlayer2.transform.position.z)).normalized);
                yield return(new WaitForSeconds(0.1f));

                _inputMocks[1].Press(_inputMocks[1].Gamepad.rightTrigger);
                yield return(new WaitForSeconds(0.2f));

                _inputMocks[1].Release(_inputMocks[1].Gamepad.rightTrigger);

                yield return(new WaitForSeconds(2f));
            }

            // Alternate attack style
            usePrimaryAttack = !usePrimaryAttack;

            // Ensure that the test does not run longer than 15 seconds
            if (timer > 15f)
            {
                break;
            }
            timer += usePrimaryAttack ? 1.7f : 2.9f;
        }

        Assert.True(enemyStats1.isDead, "Melee player 1 failed to kill the enemy");
        Assert.True(enemyStats2.isDead, "Melee player 2 failed to kill the enemy");
        Assert.False(meleePlayerStats1.isDead, "Melee Player 1 should not have died in this scenario");
        Assert.False(meleePlayerStats2.isDead, "Melee Player 2 should not have died in this scenario");
    }
 protected override void Start()
 {
     base.Start();
     statsController = GetComponent <EnemyStatsController>();
 }
Esempio n. 24
0
 private void Awake()
 {
     _stats  = GetComponent <EnemyStatsController>();
     _combat = GetComponent <EnemyCombatController>();
 }
    public IEnumerator CombatScenario_TwoPlayersFightingOneEnemy()
    {
        // Set up entities
        GameObject            meleePlayer1      = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(-2.5f, 0, 0), Quaternion.identity);
        PlayerStatsController meleePlayerStats1 = meleePlayer1.GetComponent <PlayerStatsController>();

        GameObject            meleePlayer2      = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(2.5f, 0, 0), Quaternion.identity);
        PlayerStatsController meleePlayerStats2 = meleePlayer2.GetComponent <PlayerStatsController>();

        GameObject           enemy      = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), Vector3.zero, Quaternion.identity);
        EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>();

        meleePlayer1.SetActive(true);
        meleePlayer2.SetActive(true);
        enemy.SetActive(true);

        // Setup inputs
        PlayerInput input1 = meleePlayer1.GetComponent <PlayerInput>();

        input1.enabled = true;
        _inputMocks[0].SetInputToMockGamepad(input1);

        PlayerInput input2 = meleePlayer2.GetComponent <PlayerInput>();

        input1.enabled = true;
        _inputMocks[1].SetInputToMockGamepad(input2);

        // Setup enemy
        float initialHealth = enemyStats.health.CurrentValue;

        enemyStats.characterColour = CharacterColour.All;

        yield return(new WaitForSeconds(0.5f));

        // Players face the enemy
        _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, Vector2.right);
        yield return(new WaitForSeconds(0.2f));

        _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, Vector2.left);

        // Players attack with their primary attacks
        float timer = 0f;

        while (!enemyStats.isDead)
        {
            _inputMocks[0].Press(_inputMocks[0].Gamepad.rightShoulder);
            yield return(new WaitForSeconds(0.1f));

            _inputMocks[0].Release(_inputMocks[0].Gamepad.rightShoulder);

            yield return(new WaitForSeconds(0.3f));

            _inputMocks[1].Press(_inputMocks[1].Gamepad.rightShoulder);
            yield return(new WaitForSeconds(0.1f));

            _inputMocks[1].Release(_inputMocks[1].Gamepad.rightShoulder);

            yield return(new WaitForSeconds(1f));

            // Ensure that the test does not run longer than 15 seconds
            if (timer > 15f)
            {
                break;
            }
            timer += 1.5f;
        }

        Assert.True(enemyStats.isDead || enemyStats.health.CurrentValue < initialHealth, "Melee players failed to do any damage to the enemy");
        Assert.False(meleePlayerStats1.isDead, "Melee Player 1 should not have died in this scenario");
        Assert.False(meleePlayerStats2.isDead, "Melee Player 2 should not have died in this scenario");
    }
    public IEnumerator CombatScenario_TwoPlayersDieToVeryStrongEnemy()
    {
        // Set up entities
        GameObject            meleePlayer1      = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(-2f, 0, 0), Quaternion.identity);
        PlayerStatsController meleePlayerStats1 = meleePlayer1.GetComponent <PlayerStatsController>();

        meleePlayerStats1.health.maxValue = 30f;
        meleePlayerStats1.characterColour = CharacterColour.Green;

        GameObject            meleePlayer2      = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(2f, 0, 0), Quaternion.identity);
        PlayerStatsController meleePlayerStats2 = meleePlayer2.GetComponent <PlayerStatsController>();

        meleePlayerStats2.health.maxValue = 30f;
        meleePlayerStats2.characterColour = CharacterColour.Red;

        GameObject           enemy      = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), new Vector3(0, 0, 6f), Quaternion.identity);
        EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>();

        enemyStats.characterColour  = CharacterColour.Green;
        enemyStats.health.maxValue  = 100f;
        enemyStats.damage.BaseValue = 20;

        meleePlayer1.SetActive(true);
        meleePlayer2.SetActive(true);
        enemy.SetActive(true);

        // Setup inputs
        PlayerInput input1 = meleePlayer1.GetComponent <PlayerInput>();

        input1.enabled = true;
        _inputMocks[0].SetInputToMockGamepad(input1);

        PlayerInput input2 = meleePlayer2.GetComponent <PlayerInput>();

        input1.enabled = true;
        _inputMocks[1].SetInputToMockGamepad(input2);

        // Wait for enemy to approach the players
        yield return(new WaitForSeconds(0.5f));

        // Players each face the enemy
        _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, (new Vector2(enemy.transform.position.x, enemy.transform.position.z) -
                                                                 new Vector2(meleePlayer1.transform.position.x, meleePlayer1.transform.position.z)).normalized);
        yield return(new WaitForSeconds(0.1f));

        _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, (new Vector2(enemy.transform.position.x, enemy.transform.position.z) -
                                                                 new Vector2(meleePlayer2.transform.position.x, meleePlayer2.transform.position.z)).normalized);

        // Players attack with their primary attack
        float timer = 0f;

        while (!meleePlayerStats1.isDead || !meleePlayerStats2.isDead)
        {
            if (enemyStats.isDead)
            {
                break;
            }

            _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, (new Vector2(enemy.transform.position.x, enemy.transform.position.z) -
                                                                     new Vector2(meleePlayer1.transform.position.x, meleePlayer1.transform.position.z)).normalized);
            yield return(new WaitForSeconds(0.1f));

            _inputMocks[0].Press(_inputMocks[0].Gamepad.rightShoulder);
            yield return(new WaitForSeconds(0.1f));

            _inputMocks[0].Release(_inputMocks[0].Gamepad.rightShoulder);

            yield return(new WaitForSeconds(0.3f));

            _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, (new Vector2(enemy.transform.position.x, enemy.transform.position.z) -
                                                                     new Vector2(meleePlayer2.transform.position.x, meleePlayer2.transform.position.z)).normalized);
            yield return(new WaitForSeconds(0.1f));

            _inputMocks[1].Press(_inputMocks[1].Gamepad.rightShoulder);
            yield return(new WaitForSeconds(0.1f));

            _inputMocks[1].Release(_inputMocks[1].Gamepad.rightShoulder);

            yield return(new WaitForSeconds(1f));

            // Ensure that the test does not run longer than 15 seconds
            if (timer > 15f)
            {
                break;
            }
            timer += 1.7f;
        }

        Assert.False(enemyStats.isDead, "Enemy should have not died to the players in this scenario");
        Assert.True(meleePlayerStats1.isDead, "Melee Player 1 should have died in this scenario");
        Assert.True(meleePlayerStats2.isDead, "Melee Player 2 should have died in this scenario");
    }