예제 #1
0
        private void Setup()
        {
            try
            {
                if (BoltNetwork.isRunning)
                {
                    if (entity == null)
                    {
                        entity = transform.root.GetComponentInChildren <BoltEntity>();
                    }
                    if (entity == null)
                    {
                        entity = HealthScript.entity;
                    }
                    if (entity == null)
                    {
                        entity = transform.root.GetComponent <BoltEntity>();
                    }
                    EnemyManager.AddHostEnemy(this);
                }
                if (!EnemyManager.enemyByTransform.ContainsKey(transform))
                {
                    EnemyManager.enemyByTransform.Add(this.transform, this);
                }
            }
            catch (Exception ex)
            {
                ModAPI.Log.Write(ex.ToString());
            }

            //Assiging base health, if new enemy
            if (baseHealth == 0)
            {
                baseHealth = HealthScript.Health;
            }
            else                //reverting health to base health if reused enemy (in case enemies are pooled)
            {
                HealthScript.Health = baseHealth;
            }

            StopAllCoroutines();

            Steadfast          = 100;
            slows              = new Dictionary <int, EnemyDebuff>();
            dmgTakenDebuffs    = new Dictionary <int, EnemyDebuff>();
            dmgDealtDebuffs    = new Dictionary <int, EnemyDebuff>();
            FireDamageDebuffs  = new Dictionary <int, EnemyDebuff>();
            DamageOverTimeList = new List <DoT>();
            abilities          = new List <Abilities>();

            SetType();


            //picking abilities
            if ((UnityEngine.Random.value < 0.1 || (AIScript.creepy_boss && !AIScript.girlFullyTransformed) || ModSettings.difficulty == ModSettings.Difficulty.Hell) && enemyType != Enemy.Baby && ModSettings.AllowElites)
            {
                int abilityAmount = (int)ModSettings.difficulty > (int)ModSettings.Difficulty.Veteran ? UnityEngine.Random.Range(3, 7) : 2;
                if (AIScript.creepy_boss)
                {
                    abilityAmount = 10;
                }                   //Megan boss always has abilities, a lot of them.

                int   i            = 0;
                Array abilityArray = Enum.GetValues(typeof(Abilities));

                //Determining if enemy is Elite, Miniboss or Boss type of enemy
                if (abilityAmount > 6 && Random.value < 0.3f)
                {
                    _rarity = EnemyRarity.Boss;
                    abilities.Add(Abilities.BossSteadfast);
                }
                else if (abilityAmount > 4 && Random.value < 0.3f)
                {
                    abilities.Add(Abilities.EliteSteadfast);
                    _rarity = EnemyRarity.Miniboss;
                }
                else
                {
                    _rarity = EnemyRarity.Elite;
                }

                if (AIScript.creepy_boss && !AIScript.girlFullyTransformed)                    //Force adding BossSteadfast to Megan
                {
                    abilities.Clear();
                    _rarity = EnemyRarity.Boss;
                    abilities.Add(Abilities.BossSteadfast);
                }

                //Trial and error method of picking abilities
                while (i < abilityAmount)
                {
                    bool      canAdd = true;
                    Abilities ab     = (Abilities)abilityArray.GetValue(UnityEngine.Random.Range(0, abilityArray.Length));
                    if (ab == Abilities.Steadfast || ab == Abilities.EliteSteadfast || ab == Abilities.BossSteadfast)
                    {
                        if (abilities.Contains(Abilities.Steadfast) || abilities.Contains(Abilities.EliteSteadfast) || abilities.Contains(Abilities.BossSteadfast))
                        {
                            canAdd = false;
                        }
                    }
                    else if (ab == Abilities.Tiny || ab == Abilities.Huge)
                    {
                        if (AIScript.creepy_boss && ab == Abilities.Tiny)
                        {
                            canAdd = false;
                        }
                        else if (abilities.Contains(Abilities.Huge) || abilities.Contains(Abilities.Tiny))
                        {
                            canAdd = false;
                        }
                    }
                    else if (ab == Abilities.Undead && !(AIScript.creepy || AIScript.creepy_fat))
                    {
                        canAdd = false;
                    }
                    else if (ab == Abilities.ArcaneCataclysm || ab == Abilities.BlackHole || ab == Abilities.FireCataclysm || ab == Abilities.Meteor)
                    {
                        if ((int)ModSettings.difficulty < (int)ModSettings.Difficulty.Master)
                        {
                            canAdd = false;
                        }
                    }
                    if (abilities.Contains(ab))
                    {
                        canAdd = false;
                    }
                    if (canAdd)
                    {
                        i++;
                        abilities.Add(ab);
                    }
                }
            }
            else
            {
                _rarity = EnemyRarity.Normal;
            }

            SetLevel();
            RollName();
            //Assigning rest of stats
            int dif = (int)ModSettings.difficulty;

            DamageMult  = Mathf.Pow(Level, 3.5f) / 100f + 0.4f;
            DamageMult *= dif * 2f + 1;

            Armor          = Mathf.FloorToInt(Random.Range(Mathf.Pow(Level, 2.4f) * 0.36f + 1, Mathf.Pow(Level, 2.45f) + 20) * ModSettings.EnemyArmorMultiplier);
            Armor         *= dif / 2 + 1;
            ArmorReduction = 0;
            extraHealth    = (HealthScript.Health * Mathf.Pow((float)Level, 2.215f + (dif * 0.19f)) / 16);
            extraHealth   *= dif / 2 + 1;
            AnimSpeed      = 0.94f + (float)Level / 190;

            extraHealth *= ModSettings.EnemyHealthMultiplier;
            DamageMult  *= ModSettings.EnemyDamageMultiplier;
            AnimSpeed   *= ModSettings.EnemySpeedMultiplier;

            if (_rarity != EnemyRarity.Normal)
            {
                Armor *= 2;
            }
            //Extra health for boss type enemies
            switch (_rarity)
            {
            case EnemyRarity.Elite:
                extraHealth *= 2;

                break;

            case EnemyRarity.Miniboss:
                extraHealth *= 5;

                break;

            case EnemyRarity.Boss:
                extraHealth *= 10;
                if (!abilities.Contains(Abilities.Tiny))
                {
                    gameObject.transform.localScale *= 1.1f;
                }

                break;
            }
            extraHealth *= (float)(dif * 0.25f + 0.75f);
            if (dif > 3)
            {
                extraHealth *= 2.15f;
            }
            if (dif > 6)
            {
                extraHealth *= 3.4f;
            }
            //Applying some abilities
            if (abilities.Contains(Abilities.Huge))
            {
                Armor *= 2;
                gameObject.transform.localScale *= 2;
                extraHealth *= 2;
                DamageMult  *= 2;
                AnimSpeed   /= 1.6f;
            }
            else if (abilities.Contains(Abilities.Tiny))
            {
                gameObject.transform.localScale *= 0.35f;
                AnimSpeed  *= 1.1f;
                DamageMult *= 1.2f;
                BroadcastMessage("SetTriggerScaleForTiny", SendMessageOptions.DontRequireReceiver);
            }
            if (abilities.Contains(Abilities.Steadfast))
            {
                Steadfast = 5;
            }
            if (abilities.Contains(Abilities.EliteSteadfast))
            {
                Steadfast = 2f;
            }
            if (abilities.Contains(Abilities.BossSteadfast))
            {
                Steadfast = 0.25f;
            }
            if (abilities.Contains(Abilities.ExtraHealth))
            {
                extraHealth *= 3;
            }
            if (abilities.Contains(Abilities.ExtraDamage))
            {
                DamageMult *= 4f;
            }
            if (abilities.Contains(Abilities.RainEmpowerement))
            {
                prerainDmg   = DamageMult;
                prerainArmor = Armor;
            }
            if (abilities.Contains(Abilities.Juggernaut))
            {
                CCimmune   = true;
                AnimSpeed /= 1.15f;
            }
            if (abilities.Contains(Abilities.Avenger))
            {
                if (avengerability == null)
                {
                    avengerability = gameObject.AddComponent <Avenger>();
                }
                avengerability.progression = this;
                avengerability.Stacks      = 0;
            }
            else if (avengerability != null)
            {
                Destroy(avengerability);
            }
            if (abilities.Contains(Abilities.FireAura))
            {
                float aurDmg = (5 * Level + 1) * ((int)ModSettings.difficulty + 1.3f);
                FireAura.Cast(gameObject, aurDmg);
                if (BoltNetwork.isRunning)
                {
                    using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                    {
                        using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                        {
                            w.Write(8);
                            w.Write(2);
                            w.Write(entity.networkId.PackedValue);
                            w.Write(aurDmg);
                        }
                        ChampionsOfForest.Network.NetworkManager.SendLine(answerStream.ToArray(), ChampionsOfForest.Network.NetworkManager.Target.Clients);
                        answerStream.Close();
                    }
                }

                InvokeRepeating("SendFireAura", 20, 30);
            }
            else
            {
                var aura = gameObject.GetComponent <FireAura>();
                if (aura != null)
                {
                    Destroy(aura);
                }
            }
            //Clamping Health
            try
            {
                maxHealth = extraHealth;
                HealthScript.maxHealthFloat = extraHealth;
                Armor = Mathf.Min(Armor, int.MaxValue - 5);
                if (Armor < 0)
                {
                    Armor = int.MaxValue;
                }
                //Setting other health variables
                HealthScript.maxHealth = Mathf.RoundToInt(Mathf.Min(extraHealth, int.MaxValue - 5));
                HealthScript.Health    = Mathf.RoundToInt(Mathf.Min(extraHealth, int.MaxValue - 5));
                extraHealth           -= HealthScript.Health;
                DebuffDmgMult          = DamageMult;
                DualLifeSpend          = false;
                setupComplete          = true;
                OnDieCalled            = false;
                BaseDamageMult         = DamageMult;
                BaseAnimSpeed          = AnimSpeed;
            }
            catch (Exception e)
            {
                ModAPI.Log.Write(e.ToString());
                CotfUtils.Log(e.Message);
            }

            AssignBounty();

            SteadfastCap = Mathf.Max(Steadfast * 0.01f * maxHealth, 1f);
            if (SteadfastCap < 1)             // Making sure the enemy can be killed
            {
                SteadfastCap = 1;
            }

            CreationTime = Time.time;

            if (BoltNetwork.isRunning)
            {
                ulong id = entity.networkId.PackedValue;
                using (System.IO.MemoryStream answerStream = new System.IO.MemoryStream())
                {
                    using (System.IO.BinaryWriter w = new System.IO.BinaryWriter(answerStream))
                    {
                        w.Write(30);
                        w.Write(id);
                        w.Write(BaseDamageMult);
                        foreach (Abilities ability in abilities)
                        {
                            w.Write((int)ability);
                        }
                        w.Close();
                    }
                    ChampionsOfForest.Network.NetworkManager.SendLine(answerStream.ToArray(), ChampionsOfForest.Network.NetworkManager.Target.Clients);
                    answerStream.Close();
                }
            }
        }