Esempio n. 1
0
        public override void DoActionMoving()
        {
            SceneGaming scene = Scene as SceneGaming;

            if (scene == null)
            {
                return;
            }

            if (_SkipTime.IsFull)
            {
                Rectangle checkRect = new Rectangle(Owner.Layout.Rectangle.X - 2, Owner.Layout.Rectangle.Y - 2, Owner.Layout.Rectangle.Width + 4, Owner.Layout.Rectangle.Height + 4);

                if (Owner.Status == ObjectStatus.Alive && Status == PropertyStatus.Enabled &&
                    (Owner.Propertys.Affix & SpecialStatus.Ghost) != SpecialStatus.Ghost)
                {
                    for (int i = 0; i < Owner.Container.Count; i++)
                    {
                        ObjectBase objectActive = Owner.Container[i];
                        if (objectActive.Status != ObjectStatus.Alive || Function.IsFriendly(objectActive.League, Owner.League))
                        {
                            continue;
                        }

                        // 特殊狀態判定 具碰撞 非鬼魂
                        if ((objectActive.Propertys.Affix & SpecialStatus.Collision) != SpecialStatus.Collision ||
                            (objectActive.Propertys.Affix & SpecialStatus.Ghost) == SpecialStatus.Ghost)
                        {
                            continue;
                        }

                        // 碰撞判定
                        if (!Function.IsCollison(Owner.Layout.CollisonShape, checkRect, objectActive.Layout.CollisonShape, objectActive.Layout.Rectangle))
                        {
                            continue;
                        }

                        scene.AddScoreToPlayer("擦身而過", 1000);
                        _SkipTime.Value = 0;
                        break;
                    }
                }
            }
            else
            {
                _SkipTime.Value += Scene.IntervalOfRound;
            }
            base.DoActionMoving();
        }
Esempio n. 2
0
 public override void Release(ITargetability target)
 {
     if (Status == SkillStatus.Channeled)
     {
         PointF targetPoint = Scene.GetTargetPoint(DirectionType.Center);
         double angle = Function.GetAngle(Owner.Layout.CenterX, Owner.Layout.CenterY, targetPoint.X, targetPoint.Y);
         float partAngle = Radiation / (float)BulletCount;
         float shotAngle = (float)angle - (partAngle * BulletCount / 2);
         for (int i = 0; i < BulletCount; i++)
         {
             MoveStraight bulletMove = new MoveStraight(null, 1, 600, 1, 0, 1);
             ObjectActive bullet = new ObjectActive(Owner.Layout.CenterX, Owner.Layout.CenterY, 5, 5, Scene.Sec(0.5F), Owner.League, ShapeType.Ellipse, new DrawBrush(Owner.DrawObject.MainColor, ShapeType.Ellipse), bulletMove);
             bullet.Propertys.Add(new PropertyCollision(AttackPower));
             bullet.Propertys.Add(new PropertyDeadBroken(5, 2, 2, ObjectDeadType.All, 360, 40, 100, Scene.Sec(0.2F), Scene.Sec(0.3F)));
             bulletMove.Target.SetOffsetByAngle(shotAngle, 1000);
             bulletMove.Target.SetObject(bullet);
             bullet.Dead += (s, k, t) =>
             {
                 if (t == ObjectDeadType.Collision)
                 {
                     SceneGaming scene = Scene as SceneGaming;
                     if (scene != null)
                     {
                         scene.AddScoreToPlayer("擊中", 150);
                     }
                 }
             };
             Owner.Container.Add(bullet);
             shotAngle += partAngle;
         }
         Owner.MoveObject.AddToNextOffset(Function.GetOffsetPoint(0, 0, angle + 180, 500));
         Cursor.Position = Scene.PointToScreen(new Point((int)Owner.Layout.CenterX, (int)Owner.Layout.CenterY));
         Status = SkillStatus.Cooldown;
         OnEnd(SkillEndType.Finish);
     }
     base.Release(target);
 }
Esempio n. 3
0
        /// <summary>
        /// 技能生效
        /// </summary>
        public override void DoBeforeAction()
        {
            switch (Status)
            {
            case SkillStatus.Enabled:
            {
                if (Owner == null || Owner.MoveObject.Target.TargetType == TargetType.None)
                {
                    Break();
                    return;
                }

                // 新增誘餌物件
                double angle = Function.GetAngle(Owner.Layout.CenterX, Owner.Layout.CenterY, Owner.MoveObject.Target.X, Owner.MoveObject.Target.Y);

                MoveStraight move = new MoveStraight(null, Owner.MoveObject.Resistance, BaitSpeed, 1, 0, 1F);
                move.Target.SetOffsetByAngle(angle, 1000);

                DrawBase draw = Owner.DrawObject.Copy();
                draw.Colors.Opacity = 0.6F;

                ObjectActive bait = new ObjectActive(Owner.Layout, BaitLife, Owner.League, draw, move);
                move.Target.SetObject(bait);

                bait.Propertys.Add(new PropertySpeeded(-1, -(BaitSpeed / (float)BaitLife * 800)));
                bait.Propertys.Add(new PropertyCollision(0));         // 強度碰撞

                // 新增雜訊物件
                int        noiseWidth  = Owner.Layout.Width + 2;
                int        noiseHeight = (int)(Owner.Layout.Height * 1.3F + 0.5F) + 5;
                DrawNoise  drawNoise   = new DrawNoise(Owner.DrawObject.MainColor, Color.White, 1);
                ObjectWave noise       = new ObjectWave(0, 0, noiseWidth, noiseHeight, noiseWidth * 3, noiseHeight * 3, -1, 0, drawNoise, MoveNull.Value);
                noise.DiffusionOpacity = 0;
                noise.Layout.Depend.SetObject(bait);
                Owner.Container.Add(bait);
                Owner.Container.Add(noise);

                // 將目標設為誘餌
                for (int i = 0; i < Owner.Container.Count; i++)
                {
                    ObjectBase objectBase = Owner.Container[i];
                    if (objectBase.Status != ObjectStatus.Alive || Function.IsFriendly(objectBase.League, Owner.League))
                    {
                        continue;
                    }
                    if (objectBase.MoveObject.Target.Object == Owner)
                    {
                        objectBase.MoveObject.Target.SetObject(bait);
                    }
                }

                bait.Dead += (s, e, t) =>
                {
                    noise.DiffusionTime.Limit = Scene.Sec(0.2F);
                    noise.DiffusionTime.Value = 0;

                    if (Owner == null)
                    {
                        return;
                    }
                    for (int i = 0; i < Owner.Container.Count; i++)
                    {
                        ObjectBase objectBase = Owner.Container[i];
                        if (objectBase.Status != ObjectStatus.Alive)
                        {
                            continue;
                        }
                        if (objectBase.MoveObject.Target.Object == s)
                        {
                            objectBase.MoveObject.Target.SetObject(Owner);
                        }
                    }

                    SceneGaming scene = Scene as SceneGaming;
                    if (t == ObjectDeadType.LifeEnd && scene != null)
                    {
                        scene.AddScoreToPlayer("誘餌生還", 300);
                    }
                };
                Status = SkillStatus.Cooldown;
            }
            break;
            }

            base.DoBeforeAction();
        }
Esempio n. 4
0
        /// <summary>
        /// 技能生效
        /// </summary>
        public override void DoBeforeAction()
        {
            switch (Status)
            {
            case SkillStatus.Enabled:
            {
                if (Owner == null)
                {
                    Break();
                    return;
                }

                int effectWidth  = Owner.Layout.RectWidth + 12;
                int effectHeight = Owner.Layout.RectHeight + 12;
                effectWidth  += effectWidth % 2;
                effectHeight += effectHeight % 2;

                Color       color      = Owner.DrawObject.MainColor;
                Color       colorBack  = Color.FromArgb(50, color);
                DrawPolygon drawShield = new DrawPolygon(colorBack, color, 6, 1, 0)
                {
                    RotateEnabled = true
                };
                DrawPolygon drawScrap = new DrawPolygon(Color.Empty, color, 2, 1, 0)
                {
                    RotateEnabled = true
                };
                _ShieldObject = new ObjectActive(0, 0, effectWidth, effectHeight, -1, Owner.League, ShapeType.Ellipse, drawShield, MoveNull.Value);

                _ShieldObject.Propertys.Add(new PropertyRotate(-1, Global.Rand.Next(-360, 360), false, true));
                _ShieldObject.Propertys.Add(new PropertyDeadBroken(drawScrap, 6, 10, 10, ObjectDeadType.Collision, 360, 100, 150, Scene.Sec(0.4F), Scene.Sec(0.6F)));
                _ShieldObject.Propertys.Add(new PropertyDeadCollapse(drawScrap, 3, Scene.Sec(0.2F), Scene.Sec(0.05F), 10, 10, ObjectDeadType.LifeEnd, 100, 200, Scene.Sec(0.2F), Scene.Sec(0.3F)));
                _ShieldObject.Propertys.Add(new PropertyCollision(1));
                _ShieldObject.Layout.Depend.SetObject(Owner);
                Owner.Container.Add(_ShieldObject);

                _MiniBar       = new PropertyUI(-1, new Size(30, 6), new DrawUICounterBar(_BarColor, Color.Black, Color.White, 1, true, Channeled));
                _MiniBar.Affix = SpecialStatus.Ghost;           // 增加幽靈屬性

                Owner.Propertys.Add(_MiniBar);
                Status = SkillStatus.Channeled;
            }
            break;

            case SkillStatus.Channeled:
                if (_ShieldObject.Status != ObjectStatus.Alive)
                {
                    if (_ShieldObject.Life.Value < Scene.Sec(0.3F))
                    {
                        SceneGaming scene = Scene as SceneGaming;
                        if (scene != null)
                        {
                            scene.AddScoreToPlayer("千鈞一髮", 800);
                        }
                    }
                    this.Break();
                }
                break;
            }
            base.DoBeforeAction();
        }
Esempio n. 5
0
        public override void DoBeforeActionMove()
        {
            switch (Status)
            {
            case SkillStatus.Enabled:
            {
                if (Owner == null)
                {
                    Break();
                    return;
                }
                Status   = SkillStatus.Channeled;
                _MiniBar = new PropertyUI(-1, new Size(30, 6), new DrawUICounterBar(Color.FromArgb(160, 210, 100), Color.Black, Color.White, 1, true, Channeled));
                Owner.Propertys.Add(_MiniBar);
                PushSycle.Value = Scene.SceneIntervalOfRound;
                break;
            }

            case SkillStatus.Channeled:
                if (PushSycle.IsFull)
                {
                    LayoutSet checkRange = new LayoutSet()
                    {
                        CollisonShape = ShapeType.Ellipse,
                        Anchor        = DirectionType.Center,
                        X             = Owner.Layout.X,
                        Y             = Owner.Layout.Y,
                        Width         = Range,
                        Height        = Range
                    };

                    int hitCount = 0;
                    for (int i = 0; i < Owner.Container.Count; i++)
                    {
                        ObjectBase objectActive = Owner.Container[i];
                        if (objectActive == Owner)
                        {
                            continue;
                        }

                        // 範圍判定
                        if (!Function.IsCollison(objectActive.Layout, checkRange))
                        {
                            continue;
                        }

                        double angle     = Function.GetAngle(checkRange.CenterX, checkRange.CenterY, objectActive.Layout.CenterX, objectActive.Layout.CenterY);
                        double pushPower = PushPower * Function.GetDistance(checkRange.CenterX, checkRange.CenterY, objectActive.Layout.CenterX, objectActive.Layout.CenterY) / Range;
                        objectActive.MoveObject.AddToNextOffset(objectActive.MoveObject.GetOffsetByAngle(angle, PushPower));
                        hitCount++;
                    }

                    if (hitCount > 0)
                    {
                        if (hitCount > 4)
                        {
                            hitCount = 4;
                        }
                        SceneGaming scene = Scene as SceneGaming;
                        if (scene != null)
                        {
                            scene.AddScoreToPlayer("震盪衝擊", hitCount * 15);
                        }
                    }

                    Color      waveColor = Color.FromArgb(150, Owner.DrawObject.MainColor);
                    ObjectWave wave      = new ObjectWave(0, 0, 0, 0, Range, Range, Scene.Sec(0.15F), Scene.Sec(0.1F), new DrawPen(waveColor, ShapeType.Ellipse, 1), MoveNull.Value);
                    wave.Layout.Depend.SetObject(Owner);
                    wave.DiffusionOpacity = 0.1F;
                    wave.FadeOpacity      = 0.5F;
                    Owner.Container.Add(wave);
                    PushSycle.Value = 0;
                }
                else
                {
                    PushSycle.Value += Scene.SceneIntervalOfRound;
                }
                break;
            }

            base.DoBeforeActionMove();
        }