public virtual void TakeBullet(Bullet bullet)
 {
     TakeDamage(bullet.damage, bullet.damageType);
     if (bullet.enemyBuff != null)
     {
         foreach (var eb in bullet.enemyBuff)
         {
             if (eb.bEnable)
             {
                 eb.startBuff?.Invoke(this);
                 if (!eb.bInstant)
                 {
                     EnemyBuff sameBuff = null;
                     foreach (var buff in enemyBuff)
                     {
                         if (buff.uniqueBuffName.Equals(eb.uniqueBuffName))
                         {
                             sameBuff = buff;
                         }
                     }
                     if (sameBuff == null)
                     {
                         enemyBuff.Add(eb);
                     }
                     else
                     {
                         enemyBuff.Remove(sameBuff);
                         enemyBuff.Add(eb);
                     }
                 }
             }
         }
     }
 }
        public virtual EnemyBuff Clone()
        {
            EnemyBuff ans = new EnemyBuff();

            ans.CloneValues(this);
            return(ans);
        }
 protected void CloneValues(EnemyBuff origin)
 {
     bEnable          = origin.bEnable;
     buffName         = origin.buffName;
     uniqueBuffName   = origin.uniqueBuffName;
     duration         = origin.duration;
     damageFactor     = origin.damageFactor;
     bInstant         = origin.bInstant;
     startBuff        = origin.startBuff;
     inBuff           = origin.inBuff;
     quitBuff         = origin.quitBuff;
     ignoreResistance = origin.ignoreResistance;
 }
 public EnemyBuff(EnemyBuff enemyBuff)
 {
     bEnable          = enemyBuff.bEnable;
     buffName         = enemyBuff.buffName;
     uniqueBuffName   = enemyBuff.uniqueBuffName;
     duration         = enemyBuff.duration;
     damageFactor     = enemyBuff.damageFactor;
     bInstant         = enemyBuff.bInstant;
     startBuff        = enemyBuff.startBuff;
     inBuff           = enemyBuff.inBuff;
     quitBuff         = enemyBuff.quitBuff;
     ignoreResistance = enemyBuff.ignoreResistance;
 }
        private void ReadTurretData()
        {
            string      fileName = Settings.GenerateStreamingPath("System/Turret/Turrets.xml");
            XmlDocument document = new XmlDocument();

            document.Load(fileName);
            var turretsInfo = document.SelectSingleNode("Turrets").ChildNodes;

            turrets = new List <List <TurretData> >();
            for (int i = 0; i < turretsInfo.Count; i++)
            {
                turrets.Add(new List <TurretData>());
                var levelCount = turretsInfo[i].ChildNodes.Count;
                for (int j = 0; j < levelCount; j++)
                {
                    var levelInfo     = turretsInfo[i].ChildNodes[j];
                    var basic         = levelInfo.ChildNodes[0] as XmlElement;
                    var attack        = levelInfo.ChildNodes[1] as XmlElement;
                    var newTurretData = new TurretData
                    {
                        uniqueTurretName = (turretsInfo[i] as XmlElement).GetAttribute("name"),
                        cost             = Int32.Parse(basic.GetAttribute("cost")),
                        minRange         = Int32.Parse(basic.GetAttribute("minRange")),
                        maxRange         = Int32.Parse(basic.GetAttribute("maxRange")),
                        targetFlyable    = Turret.GetTargetFlyable(basic.GetAttribute("targetFlyable")),
                        targetCount      = Turret.GetTargetCount(basic.GetAttribute("targetCount")),
                        attackSpeed      = Int32.Parse(basic.GetAttribute("attackSpeed")),
                        damage           = Int32.Parse(attack.GetAttribute("damage")),
                        damageType       = Turret.GetDamageType(attack.GetAttribute("damageType")),
                        ballVelocity     = Int32.Parse(attack.GetAttribute("ballVelocity"))
                    };
                    newTurretData.damageType   = Turret.GetDamageType(attack.GetAttribute("damageType"));
                    newTurretData.turretPrefab = Resources.Load <GameObject>($"Prefabs/Turrets/{newTurretData.uniqueTurretName}/Level{j + 1}/Turret");
                    newTurretData.bulletPrefab = Resources.Load <GameObject>($"Prefabs/Turrets/{newTurretData.uniqueTurretName}/Level{j + 1}/Bullet");

                    var       enemyBuff = levelInfo.ChildNodes[2] as XmlElement;
                    var       buffName  = enemyBuff.GetAttribute("name");
                    EnemyBuff buff      = null;
                    switch (buffName)
                    {
                    case "": break;

                    case "Explosive":
                        buff = new ExplosiveEffect
                        {
                            radius     = Int32.Parse(enemyBuff.GetAttribute("radius")),
                            damage     = Int32.Parse(enemyBuff.GetAttribute("damage")),
                            damageType = Turret.GetDamageType(enemyBuff.GetAttribute("damageType"))
                        };
                        break;

                    case "Decelerate":
                        buff = new DecelerateEffect
                        {
                            duration = Single.Parse(enemyBuff.GetAttribute("duration")),
                            ratio    = Single.Parse(enemyBuff.GetAttribute("ratio"))
                        };
                        break;

                    case "Stun":
                        buff = new StunEffect
                        {
                            duration = Single.Parse(enemyBuff.GetAttribute("duration"))
                        };
                        break;

                    case "ContinuousDamage":
                        buff = new ContinuousDamage
                        {
                            duration        = Single.Parse(enemyBuff.GetAttribute("duration")),
                            damagePerSecond = Int32.Parse(enemyBuff.GetAttribute("damagePerSecond")),
                            damageType      = Turret.GetDamageType(enemyBuff.GetAttribute("damageType"))
                        };
                        break;

                    default: throw new UnityException($"Cannot recognize EnemyBuff.buffName {buffName}");
                    }
                    if (buff != null)
                    {
                        newTurretData.enemyBuff = buff;
                    }
                    turrets[i].Add(newTurretData);
                }
            }
        }