예제 #1
0
        public static EnemySystem Enemy(Data.EnemyEntity.Enemy data, Vector3 position, List <Vector3> waypoints, bool isOwnedByPlayer = true, GameObject prefab = null)
        {
            var enemy       = prefab ?? U.Instantiate(data.Prefab, position, Quaternion.identity, ReferenceHolder.Instance.EnemyParent);
            var enemySystem = new EnemySystem(enemy, waypoints, isOwnedByPlayer)
            {
                Data = data
            };

            enemySystem.SetSystem(GameData.Instance.Player);

            return(enemySystem);
        }
예제 #2
0
        static Data.EnemyEntity.Enemy CreateEnemyData(Data.EnemyEntity.Enemy choosedData, int waveNumber, List <Ability> abilities, List <Trait> traits, ArmorType armor)
        {
            var newData = U.Instantiate(choosedData);

            newData.Index = choosedData.Index;

            CalculateStats();

            newData.Traits    = traits;
            newData.Abilities = newData.IsBossOrCommander ? abilities : null;
            newData.ArmorType = armor;

            return(newData);

            void CalculateStats()
            {
                newData.CreateNewAttributes();

                SetGoldAndExp();

                newData.Get(Enums.Enemy.ArmorValue).Value += waveNumber;
                newData.Get(Numeral.ResourceCost).Value   += 1 + waveNumber;      // waveCount / 7;
                newData.Get(Enums.Enemy.Health).Value     += 500 + waveNumber * 10;

                if (waveNumber % 8 == 0)
                {
                    newData.Get(Enums.Enemy.ArmorValue).Value *= 2;
                    newData.Get(Enums.Enemy.Health).Value     *= 2;
                    newData.Get(Numeral.ResourceCost).Value    = 0;
                }

                newData.Get(Enums.Enemy.MoveSpeed).Value       += 120 + waveNumber * 5;
                newData.Get(Enums.Enemy.MaxHealth).Value        = newData.Get(Enums.Enemy.Health).Value;
                newData.Get(Enums.Enemy.DefaultMoveSpeed).Value = newData.Get(Enums.Enemy.MoveSpeed).Value;

                void SetGoldAndExp()
                {
                    var settings = ReferenceHolder.Instance.EnemySettings;
                    var gold     = 0d;
                    var exp      = 0d;

                    switch (newData.Type)
                    {
                    case EnemyType.Small:
                        gold = settings.SmallGold;
                        exp  = settings.SmallExp;
                        break;

                    case EnemyType.Normal:
                        gold = settings.NormalGold;
                        exp  = settings.NormalExp;
                        break;

                    case EnemyType.Commander:
                        gold = settings.CommanderGold;
                        exp  = settings.ChampionExp;
                        break;

                    case EnemyType.Boss:
                        gold = settings.BossGold;
                        exp  = settings.BossExp;
                        break;

                    case EnemyType.Flying:
                        gold = settings.FlyingGold;
                        exp  = settings.FlyingExp;
                        break;

                    default:
                        break;
                    }

                    newData.Get(Numeral.Exp).Value          = exp;
                    newData.Get(Numeral.ResourceCost).Value = gold;
                }
            }
        }
예제 #3
0
        static Wave CreateWave(Wave wave, int waveNumber)
        {
            var enemiesInDataBase = ReferenceHolder.Instance.EnemyDB.Data;
            var randomRace        = RaceType.Humanoid;
            var fittingEnemies    = ScriptableObject.CreateInstance <Wave>();
            var waveTraits        = GetRandomTraits();
            var waveAbilities     = GetRandomAbilities();
            var armor             = GetRandomArmor();

            if (waveNumber % 8 == 0)
            {
                randomRace    = RaceType.RiftCreature;
                waveTraits    = null;
                waveAbilities = null;
            }

            fittingEnemies.EnemyTypes = enemiesInDataBase.FindAll(enemy => enemy.Race == randomRace);

            return(GetFittingEnemies());

            List <Ability> GetRandomAbilities()
            {
                var randomAbilityCount = StaticRandom.Instance.Next(0, 2);
                var randomAbilities    = new HashSet <Ability>();

                for (int i = 0; i < randomAbilityCount; i++)
                {
                    var randomAbilityId = StaticRandom.Instance.Next(0, ReferenceHolder.Instance.AbilityDB.Data.Count);
                    var randomAbility   = ReferenceHolder.Instance.AbilityDB.Data[randomAbilityId];

                    randomAbilities.Add(randomAbility);
                }
                return(randomAbilities.Count > 0 ? new List <Ability>(randomAbilities) : null);
            }

            List <Trait> GetRandomTraits()
            {
                var randomTraitCount = StaticRandom.Instance.Next(0, 2);
                var randomTraits     = new HashSet <Trait>();

                for (int i = 0; i < randomTraitCount; i++)
                {
                    var randomTraitId = StaticRandom.Instance.Next(0, ReferenceHolder.Instance.TraitDB.Data.Count);
                    var randomTrait   = ReferenceHolder.Instance.TraitDB.Data[randomTraitId];

                    randomTraits.Add(randomTrait);
                }
                return(randomTraits.Count > 0 ? new List <Trait>(randomTraits) : null);
            }

            Wave GetFittingEnemies()
            {
                var sortedEnemies = ScriptableObject.CreateInstance <Wave>();

                sortedEnemies.EnemyTypes = new List <Data.EnemyEntity.Enemy>();

                var choosedEnemies = new Data.EnemyEntity.Enemy[]
                {
                    ChooseEnemyDataFrom(EnemyType.Small),
                    ChooseEnemyDataFrom(EnemyType.Boss),
                    ChooseEnemyDataFrom(EnemyType.Flying),
                    ChooseEnemyDataFrom(EnemyType.Commander),
                    ChooseEnemyDataFrom(EnemyType.Normal),
                };

                wave.EnemyTypes.ForEach(enemy =>
                                        sortedEnemies.EnemyTypes.Add(CreateEnemyData(GetEnemyDataOfType(enemy.Type), waveNumber, waveAbilities, waveTraits, armor))
                                        );

                return(sortedEnemies);

                Data.EnemyEntity.Enemy GetEnemyDataOfType(EnemyType type)
                {
                    for (int i = 0; i < choosedEnemies.Length; i++)
                    {
                        if (choosedEnemies[i].Type == type)
                        {
                            return(choosedEnemies[i]);
                        }
                    }
                    return(null);
                }

                Data.EnemyEntity.Enemy ChooseEnemyDataFrom(EnemyType enemyType)
                {
                    var tempChoosedEnemies = new List <Data.EnemyEntity.Enemy>();

                    for (int i = 0; i < fittingEnemies.EnemyTypes.Count; i++)
                    {
                        if (fittingEnemies.EnemyTypes[i].Type == enemyType)
                        {
                            tempChoosedEnemies.Add(fittingEnemies.EnemyTypes[i]);
                        }
                    }

                    var random = StaticRandom.Instance.Next(0, tempChoosedEnemies.Count);

                    return(tempChoosedEnemies.Count > 0 ? tempChoosedEnemies[random] : null);
                }
            }
        }