예제 #1
0
        private AoeFieldAction LoadAoeFieldAction(XmlElement node)
        {
            AoeFieldAction action = new AoeFieldAction();

            action.duration = float.Parse(node.GetAttribute("duration"));
            action.interval = float.Parse(node.GetAttribute("interval"));
            action.emitters = new List <BuffEmitter>();
            bool initRegion = false;

            for (int i = 0; i < node.ChildNodes.Count; ++i)
            {
                XmlElement child = (XmlElement)node.ChildNodes[i];
                switch (node.ChildNodes[i].Name)
                {
                case "CircleRegion":
                    action.type   = RegionType.kCircle;
                    action.radius = float.Parse(child.GetAttribute("radius"));
                    initRegion    = true;
                    break;

                case "RectRegion":
                    action.type   = RegionType.kRect;
                    action.width  = float.Parse(child.GetAttribute("width"));
                    action.height = float.Parse(child.GetAttribute("height"));
                    initRegion    = true;
                    break;

                case "SectorRegion":
                    action.type   = RegionType.kSector;
                    action.radius = float.Parse(child.GetAttribute("radius"));
                    action.theta  = float.Parse(child.GetAttribute("theta"));
                    initRegion    = true;
                    break;

                case "BuffEmitter":
                    BuffEmitter emitter = new BuffEmitter();
                    emitter.filter = (AoeFilter)Enum.Parse(typeof(AoeFilter), child.GetAttribute("filter"));
                    string[] buffs = child.GetAttribute("buffs").Split('|');
                    emitter.buffs = new int[buffs.Length];
                    for (int n = 0; n < buffs.Length; ++n)
                    {
                        emitter.buffs[n] = int.Parse(buffs[n]);
                    }
                    action.emitters.Add(emitter);
                    break;
                }
            }
            if (action.emitters.Count == 0)
            {
                throw new Exception("AoeFieldAction miss emitter!");
            }
            if (!initRegion)
            {
                throw new Exception("AoeFieldAction miss region!");
            }
            return(action);
        }
예제 #2
0
        public BuffEmitter Copy()
        {
            BuffEmitter emitter = new BuffEmitter();

            emitter.buffs = new int[buffs.Length];
            for (int i = 0; i < buffs.Length; ++i)
            {
                emitter.buffs[i] = buffs[i];
            }
            emitter.filter = filter;
            return(emitter);
        }
예제 #3
0
        public BulletBase ShootBullet(int templateID, UnitBase shooter, UnitBase target, bool isAttack)
        {
            var        config = ConfigManager.Bullet.getRow(templateID);
            BulletBase bullet = null;

            switch (config.BulletType)
            {
            case BulletType.kCoordBullet:
                bullet = new CoordBullet(shooter, target.position);
                break;

            case BulletType.kLineBullet:
                if (config.FixRange > 0)
                {
                    var offset = (target.position - shooter.position).normalized * config.FixRange;
                    bullet = new LineBullet(shooter, shooter.position + offset);
                }
                else
                {
                    bullet = new LineBullet(shooter, target.position);
                }
                break;

            case BulletType.kPenteralBullet:
                if (config.FixRange > 0)
                {
                    var offset = (target.position - shooter.position).normalized * config.FixRange;
                    bullet = new PenetraBullet(shooter, config.DecayScale, shooter.position + offset);
                }
                else
                {
                    bullet = new PenetraBullet(shooter, config.DecayScale, target.position);
                }
                break;

            case BulletType.kReturnBullet:
                if (config.FixRange > 0)
                {
                    var offset = (target.position - shooter.position).normalized * config.FixRange;
                    bullet = new ReturnBullet(shooter, config.DecayScale, shooter.position + offset);
                }
                else
                {
                    bullet = new ReturnBullet(shooter, config.DecayScale, target.position);
                }
                break;

            case BulletType.kTrackBullet:
                bullet = new TrackBullet(shooter, target);
                break;

            default:
                throw new NotImplementedException("not implemented type " + config.BulletType.ToString());
            }
            bullet.radius       = config.Radius;
            bullet.speed        = config.Speed;
            bullet.acceleration = config.Acceleration;
            if (isAttack)
            {
                bullet.InitDamage((int)shooter.ATK.value, config.DamageType, isAttack);
            }
            else if (config.Damage > 0)
            {
                bullet.InitDamage(config.Damage, config.DamageType, isAttack);
            }
            if (config.AoeRadius > 0)
            {
                List <SkillModule.BuffEmitter> emitters = new List <SkillModule.BuffEmitter>(config.BuffEmitter.Length);
                for (int i = 0; i < config.BuffEmitter.Length; ++i)
                {
                    var emitter        = new SkillModule.BuffEmitter();
                    var emitter_config = ConfigManager.BuffEmitter.getRow(config.BuffEmitter[i]);
                    emitter.buffs = new int[emitter_config.Buffs.Length];
                    for (int n = 0; n < emitter_config.Buffs.Length; ++n)
                    {
                        emitter.buffs[n] = emitter_config.Buffs[n];
                    }
                    emitter.Caster = shooter;
                    emitter.filter = emitter_config.AoeFilter;
                    emitters[i]    = emitter;
                }
                bullet.InitAoeFile(config.AoeRadius, config.AoeDuration, config.AoeInterval, emitters);
            }
            if (config.Buffs != null && config.Buffs.Length > 0)
            {
                int[] buffs = new int[config.Buffs.Length];
                for (int n = 0; n < config.Buffs.Length; ++n)
                {
                    buffs[n] = config.Buffs[n];
                }
                bullet.InitBuff(buffs);
            }
            bullet.position = shooter.position;
            AddBullet(bullet);
            return(bullet);
        }