Beispiel #1
0
    HealthEntityCombatObject SpawnEntity(HealthEntity entity, Transform entityHolder, PlayerHand hand = null, GameObject ui = null)
    {
        GameObject newHealthEntityGO = GameObject.Instantiate(entityPrefab, entityHolder);

        newHealthEntityGO.name = entity.Name;

        if (entity is Player)
        {
            PlayerCombatObject player = newHealthEntityGO.gameObject.AddComponent <PlayerCombatObject>();
            player.ui = GameObject.Instantiate(floatingPlayerUiPrefab, newHealthEntityGO.transform).GetComponent <PlayerUI>();
            player.ui.gameObject.name = "UI";
            player.ui.player          = player;
            player.Init((Player)entity, hand, ui, OnEntityDeath);

            return(player);
        }
        else if (entity is Enemy)
        {
            Enemy             enemyEntity = entity as Enemy;
            EnemyCombatObject enemy       = newHealthEntityGO.gameObject.AddComponent <EnemyCombatObject>();
            enemy.ui = GameObject.Instantiate(floatingEnemyUiPrefab, newHealthEntityGO.transform).GetComponent <EnemyUI>();
            enemy.ui.gameObject.name = "UI";
            enemy.ui.enemy           = enemy;
            enemy.Init(enemyEntity, 0, OnEntityDeath);

            return(enemy);
        }
        return(null);
    }
Beispiel #2
0
    /// <summary>
    /// Returns list with nearby enemies to the referenced enemy. Can only calculate for odd numbers.
    /// </summary>
    /// <param name="enemy">Referenced enemy</param>
    /// <param name="enemyNumber">Number of enemies</param>
    /// <returns></returns>
    public List <EnemyCombatObject> GetNearbyEnemies(EnemyCombatObject enemy, int enemyNumber)
    {
        if (enemyNumber % 2 == 0)
        {
            Debug.LogError("Only odd numbers for now.");
            return(null);
        }
        if (enemyNumber < 3)
        {
            Debug.LogError("No point calculating this for less than 3 enemies.");
            return(null);
        }

        List <EnemyCombatObject> nearbyEnemies  = new List <EnemyCombatObject>();
        List <EnemyCombatObject> enemiesAsEnemy = new List <EnemyCombatObject>();

        foreach (var entity in enemies)
        {
            enemiesAsEnemy.Add(entity as EnemyCombatObject);
        }

        int enemiesRemaining = enemies.Count;
        int enemyIndex       = enemy.enemyIndex;

        if (enemiesRemaining <= enemyNumber)
        {
            nearbyEnemies = new List <EnemyCombatObject>(enemiesAsEnemy);
        }
        else
        {
            if (enemyIndex < enemyNumber / 2 + 1)
            {
                for (int i = 0; i < enemyNumber; i++)
                {
                    nearbyEnemies.Add(enemiesAsEnemy[i]);
                }
            }
            else if (enemyIndex > (enemiesRemaining - enemyNumber))
            {
                for (int i = enemiesRemaining - enemyNumber; i < enemiesRemaining; i++)
                {
                    nearbyEnemies.Add(enemiesAsEnemy[i]);
                }
            }
            else
            {
                int startingIndex = enemyNumber / 2;
                for (int i = -startingIndex; i <= startingIndex; i++)
                {
                    nearbyEnemies.Add(enemiesAsEnemy[enemyIndex + i]);
                }
            }
        }

        nearbyEnemies.Remove(enemy);
        return(nearbyEnemies);
    }
Beispiel #3
0
    public List <EnemyCombatObject> SpawnEnemies(List <EnemyCombatObject> enemiesSO, System.Action <HealthEntityCombatObject> OnEnemyDeathCallback)
    {
        List <EnemyCombatObject> enemies = new List <EnemyCombatObject>();

        for (int i = 0; i < enemiesSO.Count; i++)
        {
            EnemyCombatObject enemy = enemiesSO[i];
            enemy.gameObject.name = "Enemy " + i;
            enemies.Add(enemy);
        }

        return(enemies);
    }
Beispiel #4
0
    public void StartCombat(EncounterScriptableObject encounterSO, List <Player> players, System.Action <bool> callback)
    {
        //List<EnemyScriptableObject> enemyList = new List<EnemyScriptableObject>();
        int i = 0;

        foreach (var enemy in encounterSO.enemies)
        {
            EnemyCombatObject newEnemy = SpawnEntity(enemy, enemyManager.enemyPanel) as EnemyCombatObject;
            newEnemy.enemyIndex = this.enemies.Count;
            newEnemy.transform.localPosition    = new Vector3(-encounterSO.enemies.Length / 2 + i, 0f, 0f);
            newEnemy.transform.localEulerAngles = new Vector3(0, 180f, 0);
            this.enemies.Add(newEnemy);
            i++;
        }
        enemyManager.SpawnEnemies(this.enemies, OnEnemyDeath);

        currentEncounter = encounterSO;

        combatOver = false;

        i = 0;
        foreach (var p in players)
        {
            if (p.Health < 1)
            {
                p.Health = 1;
            }

            PlayerCombatObject newPlayer = SpawnEntity(p, playersLocation.transform, hands[i], uis[i]) as PlayerCombatObject;
            newPlayer.transform.localPosition = new Vector3(-1 + i * 2, 0, 0);
            this.players.Add(newPlayer);
            i++;
        }

        foreach (var p in this.players)
        {
            p.RefreshUI();
        }

        OnCombatEnd += callback;

        turn = TurnSelection.Players;

        StartTurn();
    }
Beispiel #5
0
    void OnEnemyDeath(HealthEntityCombatObject entity)
    {
        EnemyCombatObject enemy = entity as EnemyCombatObject;

        FindObjectOfType <AudioManager>().PlayRandomClip(enemy.deathSounds);

        enemies.Remove(enemy);
        int i = 0;

        foreach (var e in enemies)
        {
            e.enemyIndex = i;
            i++;
        }
        if (enemies.Count == 0)
        {
            FindObjectOfType <AudioManager>().PlayClip(VictorySound);
            combatOver = true;
            StartCoroutine(EndBattleCoroutine(false));
        }
    }
Beispiel #6
0
    IEnumerator SelectTargets_Power(NativePowerScriptableObject nativePower)
    {
        PlayerCombatObject       playerOnTurn = currentCardOwner;
        HealthEntityCombatObject caster       = playerOnTurn;

        stepNumber = 0;

        targetsPerAbilityStep = new List <List <HealthEntityCombatObject> >();

        AbilityStepsWithTargetingData_Player[] abilities = nativePower.abilityStepsWithTargetingData;

        // Let's cycle through all ability steps in order to determine targets.
        foreach (var abilityStepWithTargetingData in abilities)
        {
            chosenTargets = new List <HealthEntityCombatObject>();
            targetFound   = false;

            TargetData targetData = GetValidTargets(caster, abilityStepWithTargetingData.targetingData);
            if (targetData.multipleSpecificMode)
            {
                multipleSpecificMode     = true;
                numberOfSpecificTargets  = targetData.multipleSpecificNumber;
                multipleSpecificModeList = new List <HealthEntityCombatObject>();
            }
            else
            {
                multipleSpecificMode = false;
            }

            if (targetData.previousStepTargets > -1)
            {
                targetFound = true;
                foreach (var entity in targetsPerAbilityStep[targetData.previousStepTargets])
                {
                    chosenTargets.Add(entity);
                }
            }
            else if (targetData.targetDecided)
            {
                targetFound = true;
                foreach (var e in targetData.entities)
                {
                    chosenTargets.Add(e);
                }
            }
            else
            {
                if (targetData.entities.Count == 1 && targetData.entities[0] is PlayerCombatObject)
                {
                    targetFound = true;
                    chosenTargets.Add(targetData.entities[0]);
                }
                else
                {
                    infoText.text = abilityStepWithTargetingData.targetingData.textForChoosing;
                    ShowTargetingButton(targetData.entities);
                }
            }

            while (targetFound == false)
            {
                yield return(null);
            }

            stepNumber++;
            targetsPerAbilityStep.Add(chosenTargets);
        }

        // We have all chosen targets.
        // We now have to check whether any of those are multiple hits.

        for (int i = 0; i < targetsPerAbilityStep.Count; i++)
        {
            TargetingData_Base targetingData = nativePower.abilityStepsWithTargetingData[i].targetingData;

            if (targetingData.targetAlignment == TargetingData_Base.TargetAlignment.Hostile)
            {
                if (targetingData.targets == TargetingData_Base.Target.Multiple)
                {
                    EnemyCombatObject        chosenTarget  = (EnemyCombatObject)targetsPerAbilityStep[i][0];
                    List <EnemyCombatObject> nearbyEnemies = GetNearbyEnemies(chosenTarget, targetingData.numberOfTargets);
                    foreach (var e in nearbyEnemies)
                    {
                        targetsPerAbilityStep[i].Add(e);
                    }
                }
            }
        }

        // Now we have full lists of all targets for each attribute.
        // Let's do the card trick.

        DoPowerTrick();

        yield return(null);
    }
Beispiel #7
0
    List <List <HealthEntityCombatObject> > SelectAbilityTargetEnemy(EnemyCombatObject enemy)
    {
        List <List <HealthEntityCombatObject> > targetsPerAbilityStep = new List <List <HealthEntityCombatObject> >();

        AbilityStepsWithTargetingData_Enemy[] abilityStepsWithTargetingData = enemy.NextAbility.abilityStepsWithTargetingData;

        // Let's cycle through all ability steps in order to determine targets.
        foreach (var abilityStepWithTargetingData in abilityStepsWithTargetingData)
        {
            List <HealthEntityCombatObject> selectedTargets = new List <HealthEntityCombatObject>();

            TargetData targetData = GetValidTargets(enemy, abilityStepWithTargetingData.targetingData);

            if (targetData.previousStepTargets > -1)
            {
                foreach (var entity in targetsPerAbilityStep[targetData.previousStepTargets])
                {
                    selectedTargets.Add(entity);
                }
            }
            else if (targetData.targetDecided)
            {
                foreach (var e in targetData.entities)
                {
                    selectedTargets.Add(e);
                }
            }
            else
            {
                switch (abilityStepWithTargetingData.targetingData.targets)
                {
                case TargetingData_Base.Target.One:
                    // Choose a random target for now
                    selectedTargets.Add(targetData.entities[Random.Range(0, targetData.entities.Count)]);
                    break;

                case TargetingData_Base.Target.Multiple:
                    // Choose a random target for now
                    selectedTargets.Add(targetData.entities[Random.Range(0, targetData.entities.Count)]);
                    break;

                case TargetingData_Base.Target.MultipleSpecific:
                    // Choose a random target for now

                    // If it happens that there are less available targets than our ability wants us to target,
                    // add them all.
                    if (abilityStepWithTargetingData.targetingData.numberOfTargets < targetData.entities.Count)
                    {
                        foreach (var entity in targetData.entities)
                        {
                            selectedTargets.Add(entity);
                        }
                    }
                    else
                    {
                        List <HealthEntityCombatObject> st = new List <HealthEntityCombatObject>(selectedTargets);
                        for (int i = 0; i < abilityStepWithTargetingData.targetingData.numberOfTargets; i++)
                        {
                            HealthEntityCombatObject entity = targetData.entities[Random.Range(0, targetData.entities.Count)];
                            selectedTargets.Add(entity);
                            st.Remove(entity);
                        }
                    }
                    break;
                }
            }

            targetsPerAbilityStep.Add(selectedTargets);
        }

        // We have all chosen targets.
        // We now have to check whether any of those are multiple hits.
        for (int i = 0; i < targetsPerAbilityStep.Count; i++)
        {
            TargetingData_Base targetingData = enemy.NextAbility.abilityStepsWithTargetingData[i].targetingData;

            if (targetingData.targetAlignment == TargetingData_Base.TargetAlignment.Friendly)
            {
                if (targetingData.targets == TargetingData_Base.Target.Multiple)
                {
                    EnemyCombatObject        chosenTarget  = (EnemyCombatObject)targetsPerAbilityStep[i][0];
                    List <EnemyCombatObject> nearbyEnemies = GetNearbyEnemies(chosenTarget, targetingData.numberOfTargets);
                    foreach (var e in nearbyEnemies)
                    {
                        targetsPerAbilityStep[i].Add(e);
                    }
                }
            }
        }

        return(targetsPerAbilityStep);
    }