public virtual void ProcessFrames() { if (Frame == null) return; //thedeath2 //slow frame speed //if (Poison == PoisonType.Slow) //{ // if (CurrentAction != MirAction.Standing) // { // if (SlowFrameIndex >= 3) // { // SlowFrameIndex = 0; // } // else // { // SlowFrameIndex++; // return; // } // } //} //else //{ // SlowFrameIndex = 0; //} switch (CurrentAction) { case MirAction.Walking: case MirAction.Running: case MirAction.MountWalking: case MirAction.MountRunning: case MirAction.Sneek: case MirAction.DashAttack: if (!GameScene.CanMove) return; GameScene.Scene.MapControl.TextureValid = false; if (this == User) GameScene.Scene.MapControl.FloorValid = false; //if (CMain.Time < NextMotion) return; if (SkipFrames) UpdateFrame(); if (UpdateFrame(false) >= Frame.Count) { FrameIndex = Frame.Count - 1; SetAction(); } else { if (this == User) { if (FrameIndex == 1 || FrameIndex == 4) PlayStepSound(); } //NextMotion += FrameInterval; } if (WingEffect > 0 && CMain.Time >= NextMotion2) { if (this == User) GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Jump: if (!GameScene.CanMove) return; GameScene.Scene.MapControl.TextureValid = false; if (this == User) GameScene.Scene.MapControl.FloorValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; SetAction(); } else { if (FrameIndex == 1) SoundManager.PlaySound(20000 + 127 * 10 + (Gender == MirGender.Male ? 5 : 6)); if (FrameIndex == 7) SoundManager.PlaySound(20000 + 127 * 10 + 7); } //Backstep wingeffect if (WingEffect > 0 && CMain.Time >= NextMotion2) { if (this == User) GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.DashL: if (!GameScene.CanMove) return; GameScene.Scene.MapControl.TextureValid = false; if (this == User) GameScene.Scene.MapControl.FloorValid = false; if (UpdateFrame() >= 3) { FrameIndex = 2; SetAction(); } if (UpdateFrame2() >= 3) EffectFrameIndex = 2; break; case MirAction.DashR: if (!GameScene.CanMove) return; GameScene.Scene.MapControl.TextureValid = false; if (this == User) GameScene.Scene.MapControl.FloorValid = false; if (UpdateFrame() >= 6) { FrameIndex = 5; SetAction(); } if (UpdateFrame2() >= 6) EffectFrameIndex = 5; break; case MirAction.Pushed: if (!GameScene.CanMove) return; GameScene.Scene.MapControl.TextureValid = false; if (this == User) GameScene.Scene.MapControl.FloorValid = false; FrameIndex -= 2; EffectFrameIndex -= 2; if (FrameIndex < 0) { FrameIndex = 0; SetAction(); } if (FrameIndex < 0) EffectFrameIndex = 0; break; case MirAction.Standing: case MirAction.MountStanding: case MirAction.DashFail: case MirAction.Harvest: case MirAction.Stance: case MirAction.Stance2: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; SetAction(); } else { NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.FishingCast: case MirAction.FishingReel: case MirAction.FishingWait: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; SetAction(); } else { switch (FrameIndex) { case 1: switch (CurrentAction) { case MirAction.FishingCast: SoundManager.PlaySound(SoundList.FishingThrow); ((MirAnimatedButton)GameScene.Scene.FishingStatusDialog.FishButton).Visible = false; break; case MirAction.FishingReel: SoundManager.PlaySound(SoundList.FishingPull); break; case MirAction.FishingWait: if (FoundFish) { MapControl.Effects.Add(new Effect(Libraries.Effect, 671, 6, 720, FishingPoint) { Light = 0 }); MapControl.Effects.Add(new Effect(Libraries.Effect, 665, 6, 720, FishingPoint) { Light = 0 }); SoundManager.PlaySound(SoundList.Fishing); Effects.Add(new Effect(Libraries.Prguse, 1350, 2, 720, this) { Light = 0 }); ((MirAnimatedButton)GameScene.Scene.FishingStatusDialog.FishButton).Visible = true; } else { MapControl.Effects.Add(new Effect(Libraries.Effect, 650, 6, 720, FishingPoint) { Light = 0 }); MapControl.Effects.Add(new Effect(Libraries.Effect, 640, 6, 720, FishingPoint) { Light = 0 }); } ((MirAnimatedButton)GameScene.Scene.FishingStatusDialog.FishButton).AnimationCount = FoundFish ? 10 : 1; break; } break; } NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Attack1: case MirAction.Attack2: case MirAction.Attack3: case MirAction.Attack4: case MirAction.MountAttack: case MirAction.Mine: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { //if (ActionFeed.Count == 0) // ActionFeed.Add(new QueuedAction { Action = MirAction.Stance, Direction = Direction, Location = CurrentLocation }); StanceTime = CMain.Time + StanceDelay; FrameIndex = Frame.Count - 1; SetAction(); } else { if (FrameIndex == 1) PlayAttackSound(); NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.AttackRange1: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; SetAction(); } else { if (FrameIndex == 1) PlayAttackSound(); Missile missile; switch (FrameIndex) { case 6: switch (Spell) { case Spell.Focus: Effects.Add(new Effect(Libraries.Magic3, 2730, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + 121 * 10 + 5); break; } break; case 5: missile = CreateProjectile(1030, Libraries.Magic3, true, 5, 30, 5); StanceTime = CMain.Time + StanceDelay; SoundManager.PlaySound(20000 + 121 * 10); if (missile.Target != null) { missile.Complete += (o, e) => { SoundManager.PlaySound(20000 + 121 * 10 + 2); }; } break; } NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.AttackRange2: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { if (Cast) { MapObject ob = MapControl.GetObject(TargetID); Missile missile; switch (Spell) { case Spell.StraightShot: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 0); missile = CreateProjectile(1210, Libraries.Magic3, true, 5, 30, 5); if (missile.Target != null) { missile.Complete += (o, e) => { if (missile.Target.CurrentAction == MirAction.Dead) return; missile.Target.Effects.Add(new Effect(Libraries.Magic3, 1370, 7, 600, missile.Target)); SoundManager.PlaySound(20000 + (ushort)Spell.StraightShot * 10 + 2); }; } break; } Cast = false; } StanceTime = CMain.Time + StanceDelay; FrameIndex = Frame.Count - 1; SetAction(); } else { NextMotion += FrameInterval; Missile missile; switch(Spell) { case Spell.DoubleShot: switch (FrameIndex) { case 7: case 5: missile = CreateProjectile(1030, Libraries.Magic3, true, 5, 30, 5);//normal arrow StanceTime = CMain.Time + StanceDelay; SoundManager.PlaySound(20000 + 121 * 10); if (missile.Target != null) { missile.Complete += (o, e) => { SoundManager.PlaySound(20000 + 121 * 10 + 2); }; } break; } break; case Spell.ElementalShot: if (HasElements && !ElementCasted) switch (FrameIndex) { case 7: missile = CreateProjectile(1690, Libraries.Magic3, true, 6, 30, 4);//elemental arrow StanceTime = CMain.Time + StanceDelay; if (missile.Target != null) { missile.Complete += (o, e) => { SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 2);//sound M128-2 }; } break; case 1: Effects.Add(new Effect(Libraries.Magic3, 1681, 5, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 0);//sound M128-0 break; } break; case Spell.BindingShot: case Spell.SummonVampire: case Spell.SummonToad: case Spell.SummonSnakes: switch (FrameIndex) { case 7: SoundManager.PlaySound(20000 + 121 * 10); missile = CreateProjectile(2750, Libraries.Magic3, true, 5, 10, 5); StanceTime = CMain.Time + StanceDelay; if (missile.Target != null) { missile.Complete += (o, e) => { SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 7);//sound M130-7 }; } break; } break; case Spell.DelayedExplosion: switch (FrameIndex) { case 5: missile = CreateProjectile(1030, Libraries.Magic3, true, 5, 30, 5);//normal arrow StanceTime = CMain.Time + StanceDelay; SoundManager.PlaySound(20000 + 121 * 10); if (missile.Target != null) { missile.Complete += (o, e) => { SoundManager.PlaySound(20000 + 121 * 10 + 2); }; } break; } break; case Spell.VampireShot: case Spell.PoisonShot: case Spell.CrippleShot: MapObject ob = MapControl.GetObject(TargetID); Effect eff; int exFrameStart = 0; if (Spell == Spell.PoisonShot) exFrameStart = 200; if (Spell == Spell.CrippleShot) exFrameStart = 400; switch (FrameIndex) { case 7: SoundManager.PlaySound(20000 + ((Spell == Spell.CrippleShot) ? 136 : 121) * 10);//M136-0 missile = CreateProjectile(1930 + exFrameStart, Libraries.Magic3, true, 5, 10, 5); StanceTime = CMain.Time + StanceDelay; if (missile.Target != null) { missile.Complete += (o, e) => { if (ob != null) { if (Spell == Spell.CrippleShot) { int exIdx = 0; if (this == User) { // if (GameScene.Scene.Buffs.Where(x => x.Type == BuffType.VampireShot).Any()) exIdx = 20; if (GameScene.Scene.Buffs.Where(x => x.Type == BuffType.PoisonShot).Any()) exIdx = 10; } else { if (Buffs.Where(x => x == BuffType.VampireShot).Any()) exIdx = 20; if (Buffs.Where(x => x == BuffType.PoisonShot).Any()) exIdx = 10; } //GameScene.Scene.ChatDialog.ReceiveChat("Debug: "+exIdx.ToString(),ChatType.System); ob.Effects.Add(eff = new Effect(Libraries.Magic3, 2490 + exIdx, 7, 1000, ob)); SoundManager.PlaySound(20000 + 136 * 10 + 5 + (exIdx / 10));//sound M136-5/7 if (exIdx == 20) eff.Complete += (o1, e1) => { SoundManager.PlaySound(20000 + 45 * 10 + 2);//sound M45-2 Effects.Add(new Effect(Libraries.Magic3, 2100, 8, 1000, this)); }; } if (Spell == Spell.VampireShot || Spell == Spell.PoisonShot) { ob.Effects.Add(eff = new Effect(Libraries.Magic3, 2090 + exFrameStart, 6, 1000, ob)); SoundManager.PlaySound(20000 + (133 + (exFrameStart / 100)) * 10 + 2);//sound M133-2 or M135-2 if (Spell == Spell.VampireShot) eff.Complete += (o1, e1) => { SoundManager.PlaySound(20000 + 45 * 10 + 2);//sound M45-2 Effects.Add(new Effect(Libraries.Magic3, 2100 + exFrameStart, 8, 1000, this)); }; } } //SoundManager.PlaySound(20000 + 121 * 10 + 2);//sound M121-2 }; } break; } break; case Spell.NapalmShot: switch (FrameIndex) { case 7: SoundManager.PlaySound(20000 + 138 * 10);//M138-0 missile = CreateProjectile(2530, Libraries.Magic3, true, 6, 50, 4); StanceTime = CMain.Time + StanceDelay; if (missile.Target != null) { missile.Complete += (o, e) => { SoundManager.PlaySound(20000 + 138 * 10 + 2);//M138-2 MapControl.Effects.Add(new Effect(Libraries.Magic3, 2690, 10, 1000, TargetPoint)); }; } break; } break; } } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Struck: case MirAction.MountStruck: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; SetAction(); } else { NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Spell: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { if (Cast) { MapObject ob = MapControl.GetObject(TargetID); Missile missile; Effect effect; switch (Spell) { #region FireBall case Spell.FireBall: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); missile = CreateProjectile(10, Libraries.Magic, true, 6, 30, 4); if (missile.Target != null) { missile.Complete += (o, e) => { if (missile.Target.CurrentAction == MirAction.Dead) return; missile.Target.Effects.Add(new Effect(Libraries.Magic, 170, 10, 600, missile.Target)); SoundManager.PlaySound(20000 + (ushort)Spell.FireBall * 10 + 2); }; } break; #endregion #region GreatFireBall case Spell.GreatFireBall: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); missile = CreateProjectile(410, Libraries.Magic, true, 6, 30, 4); if (missile.Target != null) { missile.Complete += (o, e) => { if (missile.Target.CurrentAction == MirAction.Dead) return; missile.Target.Effects.Add(new Effect(Libraries.Magic, 570, 10, 600, missile.Target)); SoundManager.PlaySound(20000 + (ushort)Spell.GreatFireBall * 10 + 2); }; } break; #endregion #region Healing case Spell.Healing: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic, 370, 10, 800, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic, 370, 10, 800, ob)); break; #endregion #region ElectricShock case Spell.ElectricShock: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic, 1570, 10, 1000, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic, 1570, 10, 1000, ob)); break; #endregion #region Poisoning case Spell.Poisoning: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob != null) ob.Effects.Add(new Effect(Libraries.Magic, 770, 10, 1000, ob)); break; #endregion #region HellFire case Spell.HellFire: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); Point dest = CurrentLocation; for (int i = 0; i < 4; i++) { dest = Functions.PointMove(dest, Direction, 1); if (!GameScene.Scene.MapControl.ValidPoint(dest)) break; effect = new Effect(Libraries.Magic, 930, 6, 500, dest) { Rate = 0.7F }; effect.SetStart(CMain.Time + i * 50); MapControl.Effects.Add(effect); } if (SpellLevel == 3) { MirDirection dir = (MirDirection)(((int)Direction + 1) % 8); dest = CurrentLocation; for (int r = 0; r < 4; r++) { dest = Functions.PointMove(dest, dir, 1); if (!GameScene.Scene.MapControl.ValidPoint(dest)) break; effect = new Effect(Libraries.Magic, 930, 6, 500, dest) { Rate = 0.7F }; effect.SetStart(CMain.Time + r * 50); MapControl.Effects.Add(effect); } dir = (MirDirection)(((int)Direction - 1 + 8) % 8); dest = CurrentLocation; for (int r = 0; r < 4; r++) { dest = Functions.PointMove(dest, dir, 1); if (!GameScene.Scene.MapControl.ValidPoint(dest)) break; effect = new Effect(Libraries.Magic, 930, 6, 500, dest) { Rate = 0.7F }; effect.SetStart(CMain.Time + r * 50); MapControl.Effects.Add(effect); } } break; #endregion #region ThunderBolt case Spell.ThunderBolt: SoundManager.PlaySound(20000 + (ushort)Spell * 10); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic2, 10, 5, 400, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic2, 10, 5, 400, ob)); break; #endregion #region SoulFireBall case Spell.SoulFireBall: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); if (missile.Target != null) { missile.Complete += (o, e) => { if (missile.Target.CurrentAction == MirAction.Dead) return; missile.Target.Effects.Add(new Effect(Libraries.Magic, 1360, 10, 600, missile.Target)); SoundManager.PlaySound(20000 + (ushort)Spell.SoulFireBall * 10 + 2); }; } break; #endregion #region EnergyShield case Spell.EnergyShield: //Effects.Add(new Effect(Libraries.Magic2, 1880, 9, Frame.Count * FrameInterval, this)); //SoundManager.PlaySound(20000 + (ushort)Spell * 9); break; #endregion #region FireBang case Spell.FireBang: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); MapControl.Effects.Add(new Effect(Libraries.Magic, 1660, 10, 1000, TargetPoint)); break; #endregion #region MassHiding case Spell.MassHiding: SoundManager.PlaySound(20000 + (ushort)Spell * 10); missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); missile.Explode = true; missile.Complete += (o, e) => { MapControl.Effects.Add(new Effect(Libraries.Magic, 1540, 10, 800, TargetPoint)); SoundManager.PlaySound(20000 + (ushort)Spell.MassHiding * 10 + 1); }; break; #endregion #region SoulShield case Spell.SoulShield: SoundManager.PlaySound(20000 + (ushort)Spell * 10); missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); missile.Explode = true; missile.Complete += (o, e) => { MapControl.Effects.Add(new Effect(Libraries.Magic, 1320, 15, 1200, TargetPoint)); SoundManager.PlaySound(20000 + (ushort)Spell.SoulShield * 10 + 1); }; break; #endregion #region BlessedArmour case Spell.BlessedArmour: SoundManager.PlaySound(20000 + (ushort)Spell * 10); missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); missile.Explode = true; missile.Complete += (o, e) => { MapControl.Effects.Add(new Effect(Libraries.Magic, 1340, 15, 1200, TargetPoint)); SoundManager.PlaySound(20000 + (ushort)Spell.BlessedArmour * 10 + 1); }; break; #endregion #region FireWall case Spell.FireWall: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); break; #endregion #region MassHealing case Spell.MassHealing: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); MapControl.Effects.Add(new Effect(Libraries.Magic, 1800, 10, 1000, TargetPoint)); break; #endregion #region IceStorm case Spell.IceStorm: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); MapControl.Effects.Add(new Effect(Libraries.Magic, 3850, 20, 1300, TargetPoint)); break; #endregion #region TurnUndead case Spell.TurnUndead: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic, 3930, 15, 1000, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic, 3930, 15, 1000, ob)); break; #endregion #region IceThrust case Spell.IceThrust: Point location = Functions.PointMove(CurrentLocation, Direction, 1); MapControl.Effects.Add(new Effect(Libraries.Magic2, 1790 + (int)Direction * 10, 10, 10 * FrameInterval, location)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Revelation case Spell.Revelation: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic, 3990, 10, 1000, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic, 3990, 10, 1000, ob)); break; #endregion #region FlameDisruptor case Spell.FlameDisruptor: SoundManager.PlaySound(20000 + (ushort)Spell * 10); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic2, 140, 10, 600, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic2, 140, 10, 600, ob)); break; #endregion #region FrostCrunch case Spell.FrostCrunch: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); missile = CreateProjectile(410, Libraries.Magic2, true, 4, 30, 6); if (missile.Target != null) { missile.Complete += (o, e) => { if (missile.Target.CurrentAction == MirAction.Dead) return; missile.Target.Effects.Add(new Effect(Libraries.Magic2, 570, 8, 600, missile.Target)); SoundManager.PlaySound(20000 + (ushort)Spell.FrostCrunch * 10 + 2); }; } break; #endregion #region Purification case Spell.Purification: if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic2, 620, 10, 800, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic2, 620, 10, 800, ob)); break; #endregion #region Curse case Spell.Curse: missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); missile.Explode = true; missile.Complete += (o, e) => { MapControl.Effects.Add(new Effect(Libraries.Magic2, 950, 24, 2000, TargetPoint)); SoundManager.PlaySound(20000 + (ushort)Spell.Curse * 10); }; break; #endregion #region Hallucination case Spell.Hallucination: missile = CreateProjectile(1160, Libraries.Magic, true, 3, 48, 7); if (missile.Target != null) { missile.Complete += (o, e) => { if (missile.Target.CurrentAction == MirAction.Dead) return; missile.Target.Effects.Add(new Effect(Libraries.Magic2, 1110, 10, 1000, missile.Target)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); }; } break; #endregion #region Lightning case Spell.Lightning: Effects.Add(new Effect(Libraries.Magic, 970 + (int)Direction * 20, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Vampirism case Spell.Vampirism: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic2, 1060, 20, 1000, TargetPoint)); else { ob.Effects.Add(effect = new Effect(Libraries.Magic2, 1060, 20, 1000, ob)); effect.Complete += (o, e) => { SoundManager.PlaySound(20000 + (ushort)Spell.Vampirism * 10 + 2); Effects.Add(new Effect(Libraries.Magic2, 1090, 10, 500, this)); }; } break; #endregion #region PoisonCloud case Spell.PoisonCloud: missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); missile.Explode = true; missile.Complete += (o, e) => { SoundManager.PlaySound(20000 + (ushort)Spell * 10); }; break; #endregion #region Blizzard case Spell.Blizzard: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); //BlizzardFreezeTime = CMain.Time + 3000; break; #endregion #region MeteorStrike case Spell.MeteorStrike: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 2); //BlizzardFreezeTime = CMain.Time + 3000; break; #endregion #region Reincarnation case Spell.Reincarnation: ReincarnationStopTime = 0; break; #endregion #region SummonHolyDeva case Spell.SummonHolyDeva: Effects.Add(new Effect(Libraries.Magic, 1500, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region UltimateEnhancer case Spell.UltimateEnhancer: if (ob != null && ob != User) ob.Effects.Add(new Effect(Libraries.Magic2, 160, 15, 1000, ob)); break; #endregion #region Plague case Spell.Plague: //SoundManager.PlaySound(20000 + (ushort)Spell.SoulShield * 10); missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); missile.Explode = true; missile.Complete += (o, e) => { MapControl.Effects.Add(new Effect(Libraries.Magic3, 110, 10, 1200, TargetPoint)); SoundManager.PlaySound(20000 + (ushort)Spell.Plague * 10 + 3); }; break; #endregion #region TrapHexagon case Spell.TrapHexagon: if (ob != null) SoundManager.PlaySound(20000 + (ushort)Spell.TrapHexagon * 10 + 1); break; #endregion #region Trap case Spell.Trap: if (ob != null) SoundManager.PlaySound(20000 + (ushort)Spell.Trap * 10 + 1); break; #endregion #region CrescentSlash case Spell.CrescentSlash: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 2); break; #endregion #region NapalmShot case Spell.NapalmShot: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); MapControl.Effects.Add(new Effect(Libraries.Magic3, 1660, 10, 1000, TargetPoint)); break; #endregion } Cast = false; } //if (ActionFeed.Count == 0) // ActionFeed.Add(new QueuedAction { Action = MirAction.Stance, Direction = Direction, Location = CurrentLocation }); StanceTime = CMain.Time + StanceDelay; FrameIndex = Frame.Count - 1; SetAction(); } else { NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Die: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; ActionFeed.Clear(); ActionFeed.Add(new QueuedAction { Action = MirAction.Dead, Direction = Direction, Location = CurrentLocation }); SetAction(); } else { if (FrameIndex == 1) PlayDieSound(); NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Dead: break; case MirAction.Revive: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; ActionFeed.Clear(); ActionFeed.Add(new QueuedAction { Action = MirAction.Standing, Direction = Direction, Location = CurrentLocation }); SetAction(); } else { NextMotion += FrameInterval; } } break; } if (this == User) return; if ((CurrentAction == MirAction.Standing || CurrentAction == MirAction.MountStanding || CurrentAction == MirAction.Stance || CurrentAction == MirAction.Stance2 || CurrentAction == MirAction.DashFail) && NextAction != null) SetAction(); //if Revive and dead set action }
public virtual void ProcessFrames() { if (Frame == null) return; switch (CurrentAction) { case MirAction.Walking: case MirAction.Running: if (!GameScene.CanMove) return; GameScene.Scene.MapControl.TextureValid = false; if (this == User) GameScene.Scene.MapControl.FloorValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; SetAction(); } else { if (this == User) { if (FrameIndex == 1 || FrameIndex == 4) PlayStepSound(); } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { if (this == User) GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.DashL: if (!GameScene.CanMove) return; GameScene.Scene.MapControl.TextureValid = false; if (this == User) GameScene.Scene.MapControl.FloorValid = false; if (UpdateFrame() >= 3) { FrameIndex = 2; SetAction(); } if (UpdateFrame2() >= 3) EffectFrameIndex = 2; break; case MirAction.DashR: if (!GameScene.CanMove) return; GameScene.Scene.MapControl.TextureValid = false; if (this == User) GameScene.Scene.MapControl.FloorValid = false; if (UpdateFrame() >= 6) { FrameIndex = 5; SetAction(); } if (UpdateFrame2() >= 6) EffectFrameIndex = 5; break; case MirAction.Pushed: if (!GameScene.CanMove) return; GameScene.Scene.MapControl.TextureValid = false; if (this == User) GameScene.Scene.MapControl.FloorValid = false; FrameIndex -= 2; EffectFrameIndex -= 2; if (FrameIndex < 0) { FrameIndex = 0; SetAction(); } if (FrameIndex < 0) EffectFrameIndex = 0; break; case MirAction.Standing: case MirAction.DashFail: case MirAction.Harvest: case MirAction.Stance: case MirAction.Stance2: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; SetAction(); } else { NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Attack1: case MirAction.Attack2: case MirAction.Attack3: case MirAction.Attack4: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { //if (ActionFeed.Count == 0) // ActionFeed.Add(new QueuedAction { Action = MirAction.Stance, Direction = Direction, Location = CurrentLocation }); StanceTime = CMain.Time + StanceDelay; FrameIndex = Frame.Count - 1; SetAction(); } else { if (FrameIndex == 1) PlayAttackSound(); NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Struck: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; SetAction(); } else { NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Spell: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { if (Cast) { MapObject ob = MapControl.GetObject(TargetID); Missile missile; Effect effect; switch (Spell) { #region FireBall case Spell.FireBall: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); missile = CreateProjectile(10, Libraries.Magic, true, 6, 30, 4); if (missile.Target != null) { missile.Complete += (o, e) => { if (missile.Target.CurrentAction == MirAction.Dead) return; missile.Target.Effects.Add(new Effect(Libraries.Magic, 170, 10, 600, missile.Target)); SoundManager.PlaySound(20000 + (ushort)Spell.FireBall * 10 + 2); }; } break; #endregion #region GreatFireBall case Spell.GreatFireBall: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); missile = CreateProjectile(410, Libraries.Magic, true, 6, 30, 4); if (missile.Target != null) { missile.Complete += (o, e) => { if (missile.Target.CurrentAction == MirAction.Dead) return; missile.Target.Effects.Add(new Effect(Libraries.Magic, 570, 10, 600, missile.Target)); SoundManager.PlaySound(20000 + (ushort) Spell.GreatFireBall*10 + 2); }; } break; #endregion #region Healing case Spell.Healing: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic, 370, 10, 800, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic, 370, 10, 800, ob)); break; #endregion #region ElectricShock case Spell.ElectricShock: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic, 1570, 10, 1000, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic, 1570, 10, 1000, ob)); break; #endregion #region Poisoning case Spell.Poisoning: SoundManager.PlaySound(20000 + (ushort) Spell*10 + 1); if (ob != null) ob.Effects.Add(new Effect(Libraries.Magic, 770, 10, 1000, ob)); break; #endregion #region HellFire case Spell.HellFire: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); Point dest = CurrentLocation; for (int i = 0; i < 4; i++) { dest = Functions.PointMove(dest, Direction, 1); if (!GameScene.Scene.MapControl.ValidPoint(dest)) break; effect = new Effect(Libraries.Magic, 930, 6, 500, dest) { Rate = 0.7F }; effect.SetStart(CMain.Time + i * 50); MapControl.Effects.Add(effect); } if (SpellLevel == 3) { MirDirection dir = (MirDirection)(((int)Direction + 1) % 8); dest = CurrentLocation; for (int r = 0; r < 4; r++) { dest = Functions.PointMove(dest, dir, 1); if (!GameScene.Scene.MapControl.ValidPoint(dest)) break; effect = new Effect(Libraries.Magic, 930, 6, 500, dest) { Rate = 0.7F }; effect.SetStart(CMain.Time + r * 50); MapControl.Effects.Add(effect); } dir = (MirDirection)(((int)Direction - 1 + 8) % 8); dest = CurrentLocation; for (int r = 0; r < 4; r++) { dest = Functions.PointMove(dest, dir, 1); if (!GameScene.Scene.MapControl.ValidPoint(dest)) break; effect = new Effect(Libraries.Magic, 930, 6, 500, dest) { Rate = 0.7F }; effect.SetStart(CMain.Time + r * 50); MapControl.Effects.Add(effect); } } break; #endregion #region ThunderBolt case Spell.ThunderBolt: SoundManager.PlaySound(20000 + (ushort)Spell * 10); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic2, 10, 5, 400, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic2, 10, 5, 400, ob)); break; #endregion #region SoulFireBall case Spell.SoulFireBall: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); if (missile.Target != null) { missile.Complete += (o, e) => { if (missile.Target.CurrentAction == MirAction.Dead) return; missile.Target.Effects.Add(new Effect(Libraries.Magic, 1360, 10, 600, missile.Target)); SoundManager.PlaySound(20000 + (ushort)Spell.SoulFireBall * 10 + 2); }; } break; #endregion #region FireBang case Spell.FireBang: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); MapControl.Effects.Add(new Effect(Libraries.Magic, 1660, 10, 1000, TargetPoint)); break; #endregion #region MassHiding case Spell.MassHiding: SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); missile.Explode = true; missile.Complete += (o, e) => { MapControl.Effects.Add(new Effect(Libraries.Magic, 1540, 10, 800, TargetPoint)); SoundManager.PlaySound(20000 + (ushort)Spell.MassHiding * 10 + 1); }; break; #endregion #region SoulShield case Spell.SoulShield: SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); missile.Explode = true; missile.Complete += (o, e) => { MapControl.Effects.Add(new Effect(Libraries.Magic, 1320, 15, 1200, TargetPoint)); SoundManager.PlaySound(20000 + (ushort)Spell.SoulShield * 10 + 1); }; break; #endregion #region BlessedArmour case Spell.BlessedArmour: SoundManager.PlaySound(20000 + (ushort)Spell * 10); missile = CreateProjectile(1160, Libraries.Magic, true, 3, 30, 7); missile.Explode = true; missile.Complete += (o, e) => { MapControl.Effects.Add(new Effect(Libraries.Magic, 1340, 15, 1200, TargetPoint)); SoundManager.PlaySound(20000 + (ushort) Spell.BlessedArmour*10 + 1); }; break; #endregion #region FireWall case Spell.FireWall: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); break; #endregion #region MassHealing case Spell.MassHealing: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); MapControl.Effects.Add(new Effect(Libraries.Magic, 1800, 10, 1000, TargetPoint)); break; #endregion #region IceStorm case Spell.IceStorm: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); MapControl.Effects.Add(new Effect(Libraries.Magic, 3850, 20, 1300, TargetPoint)); break; #endregion #region TurnUndead case Spell.TurnUndead: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic, 3930, 15, 1000, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic, 3930, 15, 1000, ob)); break; #endregion #region Revelation case Spell.Revelation: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic, 3990, 10, 1000, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic, 3990, 10, 1000, ob)); break; #endregion #region FlameDisruptor case Spell.FlameDisruptor: SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic2, 140, 10, 600, TargetPoint)); else ob.Effects.Add(new Effect(Libraries.Magic2, 140, 10, 600, ob)); break; #endregion #region FrostCrunch case Spell.FrostCrunch: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); missile = CreateProjectile(410, Libraries.Magic2, true, 4, 30, 6); if (missile.Target != null) { missile.Complete += (o, e) => { if (missile.Target.CurrentAction == MirAction.Dead) return; missile.Target.Effects.Add(new Effect(Libraries.Magic2, 570, 8, 600, missile.Target)); SoundManager.PlaySound(20000 + (ushort)Spell.FrostCrunch * 10 + 2); }; } break; #endregion #region Purification case Spell.Purification: if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic2, 620, 10, 800, TargetPoint)); break; #endregion #region Curse case Spell.Curse: missile = CreateProjectile(1160, Libraries.Magic2, true, 3, 30, 7); missile.Explode = true; missile.Complete += (o, e) => { MapControl.Effects.Add(new Effect(Libraries.Magic2, 1320, 24, 2000, TargetPoint)); SoundManager.PlaySound(20000 + (ushort)Spell.Curse * 10); }; break; #endregion #region Hallucination case Spell.Hallucination: SoundManager.PlaySound(20000 + (ushort)Spell * 10); if (ob != null) ob.Effects.Add(new Effect(Libraries.Magic2, 1110, 10, 1000, ob)); break; #endregion #region Lightning case Spell.Lightning: Effects.Add(new Effect(Libraries.Magic, 970 + (int)Direction * 20, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Vampirism case Spell.Vampirism: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); if (ob == null) MapControl.Effects.Add(new Effect(Libraries.Magic2, 1060, 20, 1000, TargetPoint)); else { ob.Effects.Add(effect = new Effect(Libraries.Magic2, 1060, 20, 1000, ob)); effect.Complete += (o, e) => { SoundManager.PlaySound(20000 + (ushort)Spell.Vampirism * 10 + 2); Effects.Add(new Effect(Libraries.Magic2, 1090, 10, 500, this)); }; } break; #endregion #region PoisonField case Spell.PoisonField: SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Blizzard case Spell.Blizzard: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); BlizzardFreezeTime = CMain.Time + 3000; break; #endregion #region MeteorStrike case Spell.MeteorStrike: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 2); BlizzardFreezeTime = CMain.Time + 3000; break; #endregion } Cast = false; } //if (ActionFeed.Count == 0) // ActionFeed.Add(new QueuedAction { Action = MirAction.Stance, Direction = Direction, Location = CurrentLocation }); StanceTime = CMain.Time + StanceDelay; FrameIndex = Frame.Count - 1; SetAction(); } else { NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Die: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; ActionFeed.Clear(); ActionFeed.Add(new QueuedAction { Action = MirAction.Dead, Direction = Direction, Location = CurrentLocation }); SetAction(); } else { if (FrameIndex == 1) PlayDieSound(); NextMotion += FrameInterval; } } if (WingEffect > 0 && CMain.Time >= NextMotion2) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame2(); if (UpdateFrame2() >= Frame.EffectCount) EffectFrameIndex = Frame.EffectCount - 1; else NextMotion2 += EffectFrameInterval; } break; case MirAction.Dead: break; case MirAction.Revive: if (CMain.Time >= NextMotion) { GameScene.Scene.MapControl.TextureValid = false; if (SkipFrames) UpdateFrame(); if (UpdateFrame() >= Frame.Count) { FrameIndex = Frame.Count - 1; ActionFeed.Clear(); ActionFeed.Add(new QueuedAction { Action = MirAction.Standing, Direction = Direction, Location = CurrentLocation }); SetAction(); } else { NextMotion += FrameInterval; } } break; } if (this == User) return; if ((CurrentAction == MirAction.Standing || CurrentAction == MirAction.Stance || CurrentAction == MirAction.Stance2 || CurrentAction == MirAction.DashFail) && NextAction != null) SetAction(); //if Revive and dead set action }