public virtual void SetAction() { if (NextAction != null && !GameScene.CanMove) { switch (NextAction.Action) { case MirAction.Walking: case MirAction.Running: case MirAction.MountWalking: case MirAction.MountRunning: case MirAction.Pushed: case MirAction.DashL: case MirAction.DashR: case MirAction.Sneek: case MirAction.Jump: case MirAction.DashAttack: return; } } if (User == this && CMain.Time < MapControl.NextAction)// && CanSetAction) { //NextMagic = null; return; } if (ActionFeed.Any()) if (User.RidingMount) switch (ActionFeed.First().Action) { case MirAction.Spell: //case MirAction.Attack1: case MirAction.Attack2: case MirAction.Attack3: case MirAction.Attack4: case MirAction.AttackRange1: case MirAction.AttackRange2: case MirAction.Mine: case MirAction.Harvest: ActionFeed.RemoveAt(0); return; } if (ActionFeed.Count == 0) { CurrentAction = MirAction.Standing; CurrentAction = CMain.Time > BlizzardStopTime ? CurrentAction : MirAction.Stance2; //CurrentAction = CMain.Time > SlashingBurstTime ? CurrentAction : MirAction.Lunge; if (RidingMount) { switch (CurrentAction) { case MirAction.Standing: CurrentAction = MirAction.MountStanding; break; case MirAction.Walking: CurrentAction = MirAction.MountWalking; break; case MirAction.Running: CurrentAction = MirAction.MountRunning; break; case MirAction.Struck: CurrentAction = MirAction.MountStruck; break; case MirAction.Attack1: CurrentAction = MirAction.MountAttack; break; } } if (CurrentAction == MirAction.Standing) { if (Class == MirClass.Archer && HasClassWeapon) CurrentAction = MirAction.Standing; else CurrentAction = CMain.Time > StanceTime ? MirAction.Standing : MirAction.Stance; if (Concentrating && ConcentrateInterrupted) Network.Enqueue(new C.SetConcentration { ObjectID = User.ObjectID, Enabled = Concentrating, Interrupted = false }); } if (Fishing) CurrentAction = MirAction.FishingWait; Frames.Frames.TryGetValue(CurrentAction, out Frame); FrameIndex = 0; EffectFrameIndex = 0; if (MapLocation != CurrentLocation) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = CurrentLocation; GameScene.Scene.MapControl.AddObject(this); } if (Frame == null) return; FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; SetLibraries(); } else { QueuedAction action = ActionFeed[0]; ActionFeed.RemoveAt(0); CurrentAction = action.Action; if (RidingMount) { switch (CurrentAction) { case MirAction.Standing: CurrentAction = MirAction.MountStanding; break; case MirAction.Walking: CurrentAction = MirAction.MountWalking; break; case MirAction.Running: CurrentAction = MirAction.MountRunning; break; case MirAction.Struck: CurrentAction = MirAction.MountStruck; break; case MirAction.Attack1: CurrentAction = MirAction.MountAttack; break; } } CurrentLocation = action.Location; MirDirection olddirection = Direction; Direction = action.Direction; Point temp; switch (CurrentAction) { case MirAction.Walking: case MirAction.Running: case MirAction.MountWalking: case MirAction.MountRunning: case MirAction.Pushed: case MirAction.DashL: case MirAction.DashR: case MirAction.Sneek: var steps = 0; if (CurrentAction == MirAction.MountRunning) steps = 3; else if (CurrentAction == MirAction.Running) steps = (Sprint && !Sneaking ? 3 : 2); else steps = 1; temp = Functions.PointMove(CurrentLocation, Direction, CurrentAction == MirAction.Pushed ? 0 : -steps); break; case MirAction.Jump: case MirAction.DashAttack: temp = Functions.PointMove(CurrentLocation, Direction, JumpDistance); break; default: temp = CurrentLocation; break; } temp = new Point(action.Location.X, temp.Y > CurrentLocation.Y ? temp.Y : CurrentLocation.Y); if (MapLocation != temp) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = temp; GameScene.Scene.MapControl.AddObject(this); } bool ArcherLayTrap = false; switch (CurrentAction) { case MirAction.Pushed: if (this == User) MapControl.InputDelay = CMain.Time + 500; Frames.Frames.TryGetValue(MirAction.Walking, out Frame); break; case MirAction.DashL: case MirAction.DashR: Frames.Frames.TryGetValue(MirAction.Running, out Frame); break; case MirAction.DashAttack: Frames.Frames.TryGetValue(MirAction.DashAttack, out Frame); break; case MirAction.DashFail: Frames.Frames.TryGetValue(RidingMount ? MirAction.MountStanding : MirAction.Standing, out Frame); //Frames.Frames.TryGetValue(MirAction.Standing, out Frame); //CanSetAction = false; break; case MirAction.Jump: Frames.Frames.TryGetValue(MirAction.Jump, out Frame); break; case MirAction.Attack1: switch (Class) { case MirClass.Archer: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; case MirClass.Assassin: if(GameScene.DoubleSlash) Frames.Frames.TryGetValue(MirAction.Attack1, out Frame); else if (CMain.Shift) Frames.Frames.TryGetValue(CMain.Random.Next(100) >= 20 ? (CMain.Random.Next(100) > 40 ? MirAction.Attack1 : MirAction.Attack4) : (CMain.Random.Next(100) > 10 ? MirAction.Attack2 : MirAction.Attack3), out Frame); else Frames.Frames.TryGetValue(CMain.Random.Next(100) >= 40 ? MirAction.Attack1 : MirAction.Attack4, out Frame); break; default: if (CMain.Shift) Frames.Frames.TryGetValue(CMain.Random.Next(100) >= 20 ? MirAction.Attack1 : MirAction.Attack3, out Frame); else Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } break; case MirAction.Attack4: Spell = (Spell)action.Params[0]; Frames.Frames.TryGetValue(Spell == Spell.TwinDrakeBlade || Spell == Spell.FlamingSword ? MirAction.Attack1 : CurrentAction, out Frame); break; case MirAction.Spell: Spell = (Spell)action.Params[0]; switch (Spell) { case Spell.ShoulderDash: Frames.Frames.TryGetValue(MirAction.Running, out Frame); CurrentAction = MirAction.DashL; Direction = olddirection; CurrentLocation = Functions.PointMove(CurrentLocation, Direction, 1); if (this == User) { MapControl.NextAction = CMain.Time + 2500; GameScene.SpellTime = CMain.Time + 2500; //Spell Delay Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction, }); } break; case Spell.BladeAvalanche: Frames.Frames.TryGetValue(MirAction.Attack3, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 2500; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.SlashingBurst: Frames.Frames.TryGetValue(MirAction.Attack1, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 2000; // 80% GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.CounterAttack: Frames.Frames.TryGetValue(MirAction.Attack1, out Frame); if (this == User) { GameScene.AttackTime = CMain.Time + User.AttackSpeed; MapControl.NextAction = CMain.Time + 100; // 80% GameScene.SpellTime = CMain.Time + 100; //Spell Delay } break; case Spell.PoisonSword: Frames.Frames.TryGetValue(MirAction.Attack1, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 2000; // 80% GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.HeavenlySword: Frames.Frames.TryGetValue(MirAction.Attack2, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 1200; GameScene.SpellTime = CMain.Time + 1200; //Spell Delay } break; case Spell.CrescentSlash: Frames.Frames.TryGetValue(MirAction.Attack3, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 2500; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.FlashDash: { int sLevel = (byte)action.Params[3]; GetFlashDashDistance(sLevel); if (JumpDistance != 0) { Frames.Frames.TryGetValue(MirAction.DashAttack, out Frame); CurrentAction = MirAction.DashAttack; CurrentLocation = Functions.PointMove(CurrentLocation, Direction, JumpDistance); } else { Frames.Frames.TryGetValue(CMain.Random.Next(100) >= 40 ? MirAction.Attack1 : MirAction.Attack4, out Frame); } if (this == User) { MapControl.NextAction = CMain.Time; GameScene.SpellTime = CMain.Time + 250; //Spell Delay if (JumpDistance != 0) Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction }); } } break; case Spell.StraightShot: Frames.Frames.TryGetValue(MirAction.AttackRange2, out Frame); CurrentAction = MirAction.AttackRange2; if (this == User) { MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.DoubleShot: Frames.Frames.TryGetValue(MirAction.AttackRange2, out Frame); CurrentAction = MirAction.AttackRange2; if (this == User) { MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 500; //Spell Delay } break; case Spell.ExplosiveTrap: Frames.Frames.TryGetValue(MirAction.Harvest, out Frame); CurrentAction = MirAction.Harvest; ArcherLayTrap = true; if (this == User) { uint targetID = (uint)action.Params[1]; Point location = (Point)action.Params[2]; Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction, TargetID = targetID, Location = location }); MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.DelayedExplosion: Frames.Frames.TryGetValue(MirAction.AttackRange2, out Frame); CurrentAction = MirAction.AttackRange2; if (this == User) { MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; case Spell.BackStep: { int sLevel = (byte)action.Params[3]; GetBackStepDistance(sLevel); Frames.Frames.TryGetValue(MirAction.Jump, out Frame); CurrentAction = MirAction.Jump; CurrentLocation = Functions.PointMove(CurrentLocation, Functions.ReverseDirection(Direction), JumpDistance); if (this == User) { MapControl.NextAction = CMain.Time + 800; GameScene.SpellTime = CMain.Time + 2500; //Spell Delay Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction }); } break; } case Spell.ElementalShot: if (HasElements && !ElementCasted) { Frames.Frames.TryGetValue(MirAction.AttackRange2, out Frame); CurrentAction = MirAction.AttackRange2; if (this == User) { MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } } else Frames.Frames.TryGetValue(CurrentAction, out Frame); if (ElementCasted) ElementCasted = false; break; case Spell.BindingShot: case Spell.VampireShot: case Spell.PoisonShot: case Spell.CrippleShot: case Spell.NapalmShot: case Spell.SummonVampire: case Spell.SummonToad: case Spell.SummonSnakes: Frames.Frames.TryGetValue(MirAction.AttackRange2, out Frame); CurrentAction = MirAction.AttackRange2; if (this == User) { MapControl.NextAction = CMain.Time + 1000; GameScene.SpellTime = CMain.Time + 1000; //Spell Delay } break; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } break; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } //ArcherTest - Need to check for bow weapon only if (Class == MirClass.Archer && HasClassWeapon) { switch (CurrentAction) { case MirAction.Walking: Frames.Frames.TryGetValue(MirAction.WalkingBow, out Frame); break; case MirAction.Running: Frames.Frames.TryGetValue(MirAction.RunningBow, out Frame); break; } } //Assassin sneekyness if (Class == MirClass.Assassin && Sneaking && (CurrentAction == MirAction.Walking || CurrentAction == MirAction.Running)) { Frames.Frames.TryGetValue(MirAction.Sneek, out Frame); } SetLibraries(); FrameIndex = 0; EffectFrameIndex = 0; Spell = Spell.None; SpellLevel = 0; //NextMagic = null; ClientMagic magic; if (Frame == null) return; FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; if (this == User) { switch (CurrentAction) { case MirAction.DashFail: //CanSetAction = false; break; case MirAction.Standing: case MirAction.MountStanding: Network.Enqueue(new C.Turn { Direction = Direction }); MapControl.NextAction = CMain.Time + 2500; GameScene.CanRun = false; break; case MirAction.Walking: case MirAction.MountWalking: case MirAction.Sneek: Network.Enqueue(new C.Walk { Direction = Direction }); GameScene.Scene.MapControl.FloorValid = false; GameScene.CanRun = true; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Running: case MirAction.MountRunning: Network.Enqueue(new C.Run { Direction = Direction }); GameScene.Scene.MapControl.FloorValid = false; MapControl.NextAction = CMain.Time + (Sprint ? 1000 : 2500); break; case MirAction.Pushed: GameScene.Scene.MapControl.FloorValid = false; MapControl.InputDelay = CMain.Time + 500; break; case MirAction.DashL: case MirAction.DashR: case MirAction.Jump: case MirAction.DashAttack: GameScene.Scene.MapControl.FloorValid = false; //CanSetAction = false; break; case MirAction.Mine: Network.Enqueue(new C.Attack { Direction = Direction, Spell = Spell.None }); GameScene.AttackTime = CMain.Time + (1400 - Math.Min(370, (User.Level * 14))); MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Attack1: case MirAction.MountAttack: if (!RidingMount) { if (GameScene.Slaying && TargetObject != null) Spell = Spell.Slaying; if (GameScene.Thrusting && GameScene.Scene.MapControl.HasTarget(Functions.PointMove(CurrentLocation, Direction, 2))) Spell = Spell.Thrusting; if (GameScene.HalfMoon) { if (TargetObject != null || GameScene.Scene.MapControl.CanHalfMoon(CurrentLocation, Direction)) { magic = User.GetMagic(Spell.HalfMoon); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.HalfMoon; } } if (GameScene.CrossHalfMoon) { if (TargetObject != null || GameScene.Scene.MapControl.CanCrossHalfMoon(CurrentLocation)) { magic = User.GetMagic(Spell.CrossHalfMoon); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.CrossHalfMoon; } } if (GameScene.DoubleSlash) { magic = User.GetMagic(Spell.DoubleSlash); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.DoubleSlash; } if (GameScene.TwinDrakeBlade && TargetObject != null) { magic = User.GetMagic(Spell.TwinDrakeBlade); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.TwinDrakeBlade; } if (GameScene.FlamingSword) { if (TargetObject != null) { magic = User.GetMagic(Spell.FlamingSword); if (magic != null) Spell = Spell.FlamingSword; } } } Network.Enqueue(new C.Attack { Direction = Direction, Spell = Spell }); if (Spell == Spell.Slaying) GameScene.Slaying = false; if (Spell == Spell.TwinDrakeBlade) GameScene.TwinDrakeBlade = false; if (Spell == Spell.FlamingSword) GameScene.FlamingSword = false; magic = User.GetMagic(Spell); if (magic != null) SpellLevel = magic.Level; GameScene.AttackTime = CMain.Time + User.AttackSpeed; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Attack2: //Network.Enqueue(new C.Attack2 { Direction = Direction }); break; case MirAction.Attack3: //Network.Enqueue(new C.Attack3 { Direction = Direction }); break; //case MirAction.Attack4: // GameScene.AttackTime = CMain.Time;// + User.AttackSpeed; // MapControl.NextAction = CMain.Time; // break; case MirAction.AttackRange1: //ArcherTest GameScene.AttackTime = CMain.Time + User.AttackSpeed + 200; uint targetID = (uint)action.Params[0]; Point location = (Point)action.Params[1]; Network.Enqueue(new C.RangeAttack { Direction = Direction, Location = CurrentLocation, TargetID = targetID, TargetLocation = location }); break; case MirAction.AttackRange2: case MirAction.Spell: Spell = (Spell)action.Params[0]; targetID = (uint)action.Params[1]; location = (Point)action.Params[2]; //magic = User.GetMagic(Spell); //magic.LastCast = CMain.Time; Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction, TargetID = targetID, Location = location }); if (Spell == Spell.FlashDash) { GameScene.SpellTime = CMain.Time + 250; MapControl.NextAction = CMain.Time; } else { GameScene.SpellTime = Spell == Spell.FlameField ? CMain.Time + 2500 : CMain.Time + 1800; MapControl.NextAction = CMain.Time + 2500; } break; case MirAction.Harvest: if (ArcherLayTrap) { ArcherLayTrap = false; SoundManager.PlaySound(20000 + 124 * 10); } else { Network.Enqueue(new C.Harvest { Direction = Direction }); MapControl.NextAction = CMain.Time + 2500; } break; } } switch (CurrentAction) { case MirAction.Pushed: FrameIndex = Frame.Count - 1; EffectFrameIndex = Frame.EffectCount - 1; GameScene.Scene.Redraw(); break; case MirAction.DashL: case MirAction.Jump: FrameIndex = 0; EffectFrameIndex = 0; GameScene.Scene.Redraw(); break; case MirAction.DashR: FrameIndex = 3; EffectFrameIndex = 3; GameScene.Scene.Redraw(); break; case MirAction.Walking: case MirAction.Running: case MirAction.MountWalking: case MirAction.MountRunning: case MirAction.Sneek: GameScene.Scene.Redraw(); break; case MirAction.DashAttack: //FrameIndex = 0; //EffectFrameIndex = 0; GameScene.Scene.Redraw(); if (IsDashAttack()) { action = new QueuedAction { Action = MirAction.Attack4, Direction = Direction, Location = CurrentLocation, Params = new List<object>() }; action.Params.Add(Spell.FlashDash); ActionFeed.Insert(0, action); } break; case MirAction.Attack1: if (this != User) { Spell = (Spell)action.Params[0]; SpellLevel = (byte)action.Params[1]; } switch (Spell) { case Spell.Slaying: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + (Gender == MirGender.Male ? 0 : 1)); break; case Spell.DoubleSlash: FrameInterval = (FrameInterval * 7 / 10); //50% Faster Animation EffectFrameInterval = (EffectFrameInterval * 7 / 10); action = new QueuedAction { Action = MirAction.Attack4, Direction = Direction, Location = CurrentLocation, Params = new List<object>() }; action.Params.Add(Spell); ActionFeed.Insert(0, action); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.Thrusting: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.HalfMoon: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.TwinDrakeBlade: //FrameInterval = FrameInterval * 9 / 10; //70% Faster Animation //EffectFrameInterval = EffectFrameInterval * 9 / 10; //action = new QueuedAction { Action = MirAction.Attack4, Direction = Direction, Location = CurrentLocation, Params = new List<object>() }; //action.Params.Add(Spell); //ActionFeed.Insert(0, action); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.CrossHalfMoon: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.FlamingSword: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); break; } break; case MirAction.Attack4: Spell = (Spell)action.Params[0]; switch (Spell) { case Spell.DoubleSlash: FrameInterval = FrameInterval * 7 / 10; //50% Animation Speed EffectFrameInterval = EffectFrameInterval * 7 / 10; SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); break; case Spell.TwinDrakeBlade: FrameInterval = FrameInterval * 9 / 10; //80% Animation Speed EffectFrameInterval = EffectFrameInterval * 9 / 10; break; case Spell.FlashDash: int attackDelay = (User.AttackSpeed - 120) <= 300 ? 300 : (User.AttackSpeed - 120); float attackRate = (float)(attackDelay / 300F * 10F); FrameInterval = FrameInterval * (int)attackRate / 20; EffectFrameInterval = EffectFrameInterval * (int)attackRate / 20; break; } break; case MirAction.Struck: case MirAction.MountStruck: uint attackerID = (uint)action.Params[0]; StruckWeapon = -2; for (int i = 0; i < MapControl.Objects.Count; i++) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != attackerID) continue; if (ob.Race != ObjectType.Player) break; PlayerObject player = ((PlayerObject)ob); StruckWeapon = player.Weapon; if (player.Class != MirClass.Assassin || StruckWeapon == -1) break; StruckWeapon = 1; break; } PlayStruckSound(); PlayFlinchSound(); break; case MirAction.AttackRange1: //ArcherTest - Assign Target for other users if (this != User) { TargetID = (uint)action.Params[0]; TargetPoint = (Point)action.Params[1]; Spell = (Spell)action.Params[2]; } break; case MirAction.AttackRange2: case MirAction.Spell: if (this != User) { Spell = (Spell)action.Params[0]; TargetID = (uint)action.Params[1]; TargetPoint = (Point)action.Params[2]; Cast = (bool)action.Params[3]; SpellLevel = (byte)action.Params[4]; } switch (Spell) { #region FireBall case Spell.FireBall: Effects.Add(new Effect(Libraries.Magic, 0, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Healing case Spell.Healing: Effects.Add(new Effect(Libraries.Magic, 200, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Repulsion case Spell.Repulsion: Effects.Add(new Effect(Libraries.Magic, 900, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region ElectricShock case Spell.ElectricShock: Effects.Add(new Effect(Libraries.Magic, 1560, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Poisoning case Spell.Poisoning: Effects.Add(new Effect(Libraries.Magic, 600, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region GreatFireBall case Spell.GreatFireBall: Effects.Add(new Effect(Libraries.Magic, 400, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region HellFire case Spell.HellFire: Effects.Add(new Effect(Libraries.Magic, 920, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region ThunderBolt case Spell.ThunderBolt: Effects.Add(new Effect(Libraries.Magic2, 20, 3, 300, this)); break; #endregion #region SoulFireBall case Spell.SoulFireBall: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region SummonSkeleton case Spell.SummonSkeleton: Effects.Add(new Effect(Libraries.Magic, 1500, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Teleport case Spell.Teleport: Effects.Add(new Effect(Libraries.Magic, 1590, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Blink case Spell.Blink: Effects.Add(new Effect(Libraries.Magic, 1590, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Hiding case Spell.Hiding: Effects.Add(new Effect(Libraries.Magic, 1520, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Haste case Spell.Haste: Effects.Add(new Effect(Libraries.Magic2, 2140 + (int)Direction * 10, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Fury case Spell.Fury: Effects.Add(new Effect(Libraries.Magic3, 200, 8, 8 * FrameInterval, this)); Effects.Add(new Effect(Libraries.Magic3, 187, 10, 10 * FrameInterval, this)); //i don't know sound SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FireBang case Spell.FireBang: Effects.Add(new Effect(Libraries.Magic, 1650, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FireWall case Spell.FireWall: Effects.Add(new Effect(Libraries.Magic, 1620, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region TrapHexagon case Spell.TrapHexagon: Effects.Add(new Effect(Libraries.Magic, 1380, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region EnergyRepulsor case Spell.EnergyRepulsor: Effects.Add(new Effect(Libraries.Magic2, 190, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FireBurst case Spell.FireBurst: Effects.Add(new Effect(Libraries.Magic2, 2320, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FlameDisruptor case Spell.FlameDisruptor: Effects.Add(new Effect(Libraries.Magic2, 130, 6, Frame.Count * FrameInterval, this)); break; #endregion #region SummonShinsu case Spell.SummonShinsu: Effects.Add(new Effect(Libraries.Magic2, 0, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region UltimateEnchancer case Spell.UltimateEnhancer: Effects.Add(new Effect(Libraries.Magic2, 160, 15, 1000, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FrostCrunch case Spell.FrostCrunch: Effects.Add(new Effect(Libraries.Magic2, 400, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Purification case Spell.Purification: Effects.Add(new Effect(Libraries.Magic2, 600, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FlameField case Spell.FlameField: MapControl.Effects.Add(new Effect(Libraries.Magic2, 910, 23, 1800, CurrentLocation)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Trap case Spell.Trap: Effects.Add(new Effect(Libraries.Magic2, 2340, 11, 11 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MoonLight case Spell.MoonLight: Effects.Add(new Effect(Libraries.Magic2, 2380, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region SwiftFeet case Spell.SwiftFeet: Effects.Add(new Effect(Libraries.Magic2, 2440, 16, 16 * EffectFrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region LightBody case Spell.LightBody: Effects.Add(new Effect(Libraries.Magic2, 2470, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region PoisonSword case Spell.PoisonSword: Effects.Add(new Effect(Libraries.Magic2, 2490 + ((int)Direction * 10), 10, Frame.Count * FrameInterval + 500, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region DarkBody case Spell.DarkBody: Effects.Add(new Effect(Libraries.Magic2, 2580, 10, 10 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region ThunderStorm case Spell.ThunderStorm: MapControl.Effects.Add(new Effect(Libraries.Magic, 1680, 10, Frame.Count * FrameInterval, CurrentLocation)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MassHealing case Spell.MassHealing: Effects.Add(new Effect(Libraries.Magic, 1790, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region IceStorm case Spell.IceStorm: Effects.Add(new Effect(Libraries.Magic, 3840, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MagicShield case Spell.MagicShield: Effects.Add(new Effect(Libraries.Magic, 3880, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region TurnUndead case Spell.TurnUndead: Effects.Add(new Effect(Libraries.Magic, 3920, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MagicBooster case Spell.MagicBooster: Effects.Add(new Effect(Libraries.Magic3, 80, 9, 9 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region PetEnhancer case Spell.PetEnhancer: Effects.Add(new Effect(Libraries.Magic3, 200, 8, 8 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Revelation case Spell.Revelation: Effects.Add(new Effect(Libraries.Magic, 3960, 20, 1200, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region ProtectionField case Spell.ProtectionField: Effects.Add(new Effect(Libraries.Magic2, 1520, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Rage case Spell.Rage: Effects.Add(new Effect(Libraries.Magic2, 1510, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Vampirism case Spell.Vampirism: Effects.Add(new Effect(Libraries.Magic2, 1040, 7, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region LionRoar case Spell.LionRoar: Effects.Add(new Effect(Libraries.Magic2, 710, 20, 1200, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 + (Gender == MirGender.Male ? 0 : 1)); break; #endregion #region TwinDrakeBlade case Spell.TwinDrakeBlade: Effects.Add(new Effect(Libraries.Magic2, 210, 6, 500, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Entrapment case Spell.Entrapment: Effects.Add(new Effect(Libraries.Magic2, 990, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region BladeAvalanche case Spell.BladeAvalanche: Effects.Add(new Effect(Libraries.Magic2, 740 + (int)Direction * 20, 15, 15 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region SlashingBurst case Spell.SlashingBurst: //MapControl.Effects.Add(new Effect(Libraries.Magic2, 1700 + (int)Direction * 10, 9, 9 * FrameInterval, CurrentLocation)); Effects.Add(new Effect(Libraries.Magic2, 1700 + (int)Direction * 10, 9, 9 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); SlashingBurstTime = CMain.Time + 2000; break; #endregion #region CounterAttack case Spell.CounterAttack: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 5); Effects.Add(new Effect(Libraries.Magic, 3480 + (int)Direction * 10, 10, 10 * FrameInterval, this)); Effects.Add(new Effect(Libraries.Magic3, 140, 2, 2 * FrameInterval, this)); break; #endregion #region CrescentSlash case Spell.CrescentSlash: Effects.Add(new Effect(Libraries.Magic2, 2620 + (int)Direction * 20, 20, 20 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 + (Gender == MirGender.Male ? 0 : 1)); break; #endregion #region FlashDash case Spell.FlashDash: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + (Gender == MirGender.Male ? 0 : 1)); int attackDelay = (User.AttackSpeed - 120) <= 300 ? 300 : (User.AttackSpeed - 120); float attackRate = (float)(attackDelay / 300F * 10F); FrameInterval = FrameInterval * (int)attackRate / 20; EffectFrameInterval = EffectFrameInterval * (int)attackRate / 20; break; #endregion #region Mirroring case Spell.Mirroring: Effects.Add(new Effect(Libraries.Magic2, 650, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Blizzard case Spell.Blizzard: Effects.Add(new Effect(Libraries.Magic2, 1540, 8, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); BlizzardStopTime = CMain.Time + 3000; break; #endregion #region MeteorStrike case Spell.MeteorStrike: Effects.Add(new Effect(Libraries.Magic2, 1590, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); BlizzardStopTime = CMain.Time + 3000; break; #endregion #region Reincarnation case Spell.Reincarnation: ReincarnationStopTime = CMain.Time + 6000; break; #endregion #region HeavenlySword case Spell.HeavenlySword: Effects.Add(new Effect(Libraries.Magic2, 2230 + ((int)Direction * 10), 8, 800, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region ElementalBarrier case Spell.ElementalBarrier: if (HasElements && !ElementalBarrier) { Effects.Add(new Effect(Libraries.Magic3, 1880, 8, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); } break; #endregion #region PoisonShot case Spell.PoisonShot: Effects.Add(new Effect(Libraries.Magic3, 2300, 8, 1000, this)); break; #endregion #region OneWithNature case Spell.OneWithNature: MapControl.Effects.Add(new Effect(Libraries.Magic3, 2710, 8, 1200, CurrentLocation)); SoundManager.PlaySound(20000 + 139 * 10); break; #endregion } break; case MirAction.Dead: GameScene.Scene.Redraw(); GameScene.Scene.MapControl.SortObject(this); if (MouseObject == this) MouseObject = null; if (TargetObject == this) TargetObject = null; if (MagicObject == this) MagicObject = null; DeadTime = CMain.Time; break; } } GameScene.Scene.MapControl.TextureValid = false; NextMotion = CMain.Time + FrameInterval; NextMotion2 = CMain.Time + EffectFrameInterval; if (ElementalBarrier) { switch (CurrentAction) { case MirAction.Struck: case MirAction.MountStruck: if (ElementalBarrierEffect != null) { ElementalBarrierEffect.Clear(); ElementalBarrierEffect.Remove(); } Effects.Add(ElementalBarrierEffect = new Effect(Libraries.Magic3, 1910, 5, 600, this)); ElementalBarrierEffect.Complete += (o, e) => Effects.Add(ElementalBarrierEffect = new Effect(Libraries.Magic3, 1890, 16, 3200, this) { Repeat = true }); break; default: if (ElementalBarrierEffect == null) Effects.Add(ElementalBarrierEffect = new Effect(Libraries.Magic3, 1890, 16, 3200, this) { Repeat = true }); break; } } if (MagicShield) { switch (CurrentAction) { case MirAction.Struck: case MirAction.MountStruck: if (ShieldEffect != null) { ShieldEffect.Clear(); ShieldEffect.Remove(); } Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3900, 3, 600, this)); ShieldEffect.Complete += (o, e) => Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3890, 3, 600, this) { Repeat = true }); break; default: if (ShieldEffect == null) Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3890, 3, 600, this) { Repeat = true }); break; } } }
public void DrawCurrentEffects() { if (CurrentEffect == SpellEffect.MagicShieldUp && !MagicShield) { MagicShield = true; Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3890, 3, 600, this) { Repeat = true }); CurrentEffect = SpellEffect.None; } if (CurrentEffect == SpellEffect.ElementalBarrierUp && !ElementalBarrier) { ElementalBarrier = true; Effects.Add(ElementalBarrierEffect = new Effect(Libraries.Magic3, 1890, 16, 3200, this) { Repeat = true }); CurrentEffect = SpellEffect.None; } if (ElementEffect > 0 && !HasElements) { HasElements = true; if (ElementEffect == 4) Effects.Add(new ElementsEffect(Libraries.Magic3, 1660, 10, 10 * 100, this, true, 4, ElementOrbMax)); else { if (ElementEffect >= 1) Effects.Add(new ElementsEffect(Libraries.Magic3, 1630, 10, 10 * 100, this, true, 1, ElementOrbMax)); if (ElementEffect >= 2) Effects.Add(new ElementsEffect(Libraries.Magic3, 1640, 10, 10 * 100, this, true, 2, ElementOrbMax)); if (ElementEffect == 3) Effects.Add(new ElementsEffect(Libraries.Magic3, 1650, 10, 10 * 100, this, true, 3, ElementOrbMax)); } ElementEffect = 0; } }
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 }
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 }
private void MapEffect(S.MapEffect p) { switch (p.Effect) { case SpellEffect.Mine: SoundManager.PlaySound(10091); Effect HitWall = new Effect(Libraries.Effect, 8 * p.Value, 3, 240, p.Location) { Light = 0 }; MapControl.Effects.Add(HitWall); break; } }
public virtual void SetAction() { if (NextAction != null && !GameScene.CanMove) { switch (NextAction.Action) { case MirAction.Walking: case MirAction.Running: case MirAction.Pushed: case MirAction.DashL: case MirAction.DashR: return; } } if (User == this && CMain.Time < MapControl.NextAction)// && CanSetAction) { //NextMagic = null; return; } if (ActionFeed.Count == 0) { CurrentAction = CMain.Time > BlizzardFreezeTime ? MirAction.Standing : MirAction.Stance2; if (CurrentAction == MirAction.Standing) CurrentAction = CMain.Time > StanceTime ? MirAction.Standing : MirAction.Stance; Frames.Frames.TryGetValue(CurrentAction, out Frame); FrameIndex = 0; EffectFrameIndex = 0; if (MapLocation != CurrentLocation) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = CurrentLocation; GameScene.Scene.MapControl.AddObject(this); } if (Frame == null) return; FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; } else { QueuedAction action = ActionFeed[0]; ActionFeed.RemoveAt(0); CurrentAction = action.Action; CurrentLocation = action.Location; MirDirection olddirection = Direction; Direction = action.Direction; Point temp; switch (CurrentAction) { case MirAction.Walking: case MirAction.Running: case MirAction.Pushed: case MirAction.DashL: case MirAction.DashR: int i = CurrentAction == MirAction.Running ? 2 : 1; temp = Functions.PointMove(CurrentLocation, Direction, CurrentAction == MirAction.Pushed ? 0 : -i); break; default: temp = CurrentLocation; break; } temp = new Point(action.Location.X, temp.Y > CurrentLocation.Y ? temp.Y : CurrentLocation.Y); if (MapLocation != temp) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = temp; GameScene.Scene.MapControl.AddObject(this); } switch (CurrentAction) { case MirAction.Pushed: if (this == User) MapControl.InputDelay = CMain.Time + 500; Frames.Frames.TryGetValue(MirAction.Walking, out Frame); break; case MirAction.DashL: case MirAction.DashR: Frames.Frames.TryGetValue(MirAction.Running, out Frame); break; case MirAction.DashFail: Frames.Frames.TryGetValue(MirAction.Standing, out Frame); //CanSetAction = false; break; case MirAction.Attack4: Spell = (Spell)action.Params[0]; Frames.Frames.TryGetValue(Spell == Spell.TwinDrakeBlade || Spell == Spell.FlamingSword ? MirAction.Attack1 : CurrentAction, out Frame); break; case MirAction.Spell: Spell = (Spell)action.Params[0]; switch (Spell) { case Spell.ShoulderDash: Frames.Frames.TryGetValue(MirAction.Running, out Frame); CurrentAction = MirAction.DashL; Direction = olddirection; CurrentLocation = Functions.PointMove(CurrentLocation, Direction, 1); if (this == User) { MapControl.NextAction = CMain.Time + 2500; GameScene.SpellTime = CMain.Time + 2500; //Spell Delay Network.Enqueue(new C.Magic { Spell = Spell, Direction = Direction, }); } break; case Spell.BladeAvalanche: Frames.Frames.TryGetValue(MirAction.Attack3, out Frame); if (this == User) { MapControl.NextAction = CMain.Time + 2500; GameScene.SpellTime = CMain.Time + 1500; //Spell Delay } break; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } break; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } FrameIndex = 0; EffectFrameIndex = 0; Spell = Spell.None; SpellLevel = 0; //NextMagic = null; if (Frame == null) return; FrameInterval = Frame.Interval; EffectFrameInterval = Frame.EffectInterval; if (this == User) { switch (CurrentAction) { case MirAction.DashFail: //CanSetAction = false; break; case MirAction.Standing: Network.Enqueue(new C.Turn {Direction = Direction}); MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Walking: Network.Enqueue(new C.Walk {Direction = Direction}); GameScene.Scene.MapControl.FloorValid = false; GameScene.CanRun = true; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Running: Network.Enqueue(new C.Run {Direction = Direction}); GameScene.Scene.MapControl.FloorValid = false; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Pushed: GameScene.Scene.MapControl.FloorValid = false; MapControl.InputDelay = CMain.Time + 500; break; case MirAction.DashL: case MirAction.DashR: GameScene.Scene.MapControl.FloorValid = false; //CanSetAction = false; break; case MirAction.Attack1: ClientMagic magic; if (GameScene.Slaying && TargetObject != null) Spell = Spell.Slaying; if (GameScene.Thrusting && GameScene.Scene.MapControl.HasTarget(Functions.PointMove(CurrentLocation, Direction, 2))) Spell = Spell.Thrusting; if (GameScene.HalfMoon) { if (TargetObject != null || GameScene.Scene.MapControl.CanHalfMoon(CurrentLocation, Direction)) { magic = User.GetMagic(Spell.HalfMoon); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.HalfMoon; } } if (GameScene.CrossHalfMoon) { if (TargetObject != null || GameScene.Scene.MapControl.CanCrossHalfMoon(CurrentLocation)) { magic = User.GetMagic(Spell.CrossHalfMoon); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.CrossHalfMoon; } } if (GameScene.DoubleSlash) { magic = User.GetMagic(Spell.DoubleSlash); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.DoubleSlash; } if (GameScene.TwinDrakeBlade) { magic = User.GetMagic(Spell.TwinDrakeBlade); if (magic != null && magic.BaseCost + magic.LevelCost * magic.Level <= User.MP) Spell = Spell.TwinDrakeBlade; } if (GameScene.FlamingSword) { if (TargetObject != null) { magic = User.GetMagic(Spell.FlamingSword); if (magic != null) Spell = Spell.FlamingSword; } } Network.Enqueue(new C.Attack { Direction = Direction, Spell = Spell }); if (Spell == Spell.Slaying) GameScene.Slaying = false; if (Spell == Spell.TwinDrakeBlade) GameScene.TwinDrakeBlade = false; if (Spell == Spell.FlamingSword) GameScene.FlamingSword = false; magic = User.GetMagic(Spell); if (magic != null) SpellLevel = magic.Level; GameScene.AttackTime = CMain.Time + User.AttackSpeed; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Attack2: //Network.Enqueue(new C.Attack2 { Direction = Direction }); break; case MirAction.Attack3: //Network.Enqueue(new C.Attack3 { Direction = Direction }); break; case MirAction.Spell: Spell = (Spell) action.Params[0]; uint targetID = (uint) action.Params[1]; Point location = (Point) action.Params[2]; Network.Enqueue(new C.Magic {Spell = Spell, Direction = Direction, TargetID = targetID, Location = location}); GameScene.SpellTime = Spell == Spell.FlameField ? CMain.Time + 2500 : CMain.Time + 1800; MapControl.NextAction = CMain.Time + 2500; break; case MirAction.Harvest: Network.Enqueue(new C.Harvest {Direction = Direction}); MapControl.NextAction = CMain.Time + 2500; break; } } switch (CurrentAction) { case MirAction.Pushed: FrameIndex = Frame.Count - 1; EffectFrameIndex = Frame.EffectCount - 1; GameScene.Scene.Redraw(); break; case MirAction.DashL: FrameIndex = 0; EffectFrameIndex = 0; GameScene.Scene.Redraw(); break; case MirAction.DashR: FrameIndex = 3; EffectFrameIndex = 3; GameScene.Scene.Redraw(); break; case MirAction.Walking: case MirAction.Running: GameScene.Scene.Redraw(); break; case MirAction.Attack1: if (this != User) { Spell = (Spell)action.Params[0]; SpellLevel = (byte)action.Params[1]; } switch (Spell) { case Spell.Slaying: SoundManager.PlaySound(20000 + (ushort) Spell*10 + (Gender == MirGender.Male ? 0 : 1)); break; case Spell.DoubleSlash: FrameInterval = FrameInterval*5/10; //50% Faster Animation EffectFrameInterval = EffectFrameInterval * 5 / 10; action = new QueuedAction {Action = MirAction.Attack4, Direction = Direction, Location = CurrentLocation, Params = new List<object>()}; action.Params.Add(Spell); ActionFeed.Insert(0, action); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.Thrusting: SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; case Spell.HalfMoon: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.TwinDrakeBlade: FrameInterval = FrameInterval*7/10; //70% Faster Animation EffectFrameInterval = EffectFrameInterval * 7 / 10; action = new QueuedAction {Action = MirAction.Attack4, Direction = Direction, Location = CurrentLocation, Params = new List<object>()}; action.Params.Add(Spell); ActionFeed.Insert(0, action); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; case Spell.CrossHalfMoon: SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; case Spell.FlamingSword: SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); break; } break; case MirAction.Attack4: Spell = (Spell) action.Params[0]; switch (Spell) { case Spell.DoubleSlash: FrameInterval = FrameInterval * 5 / 10; //50% Animation Speed EffectFrameInterval = EffectFrameInterval * 5 / 10; SoundManager.PlaySound(20000 + (ushort)Spell * 10 + 1); break; case Spell.TwinDrakeBlade: FrameInterval = FrameInterval * 8 / 10; //80% Animation Speed EffectFrameInterval = EffectFrameInterval * 8 / 10; break; } break; case MirAction.Struck: uint attackerID = (uint)action.Params[0]; StruckWeapon = -2; for (int i = 0; i < MapControl.Objects.Count; i++) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != attackerID) continue; if (ob.Race != ObjectType.Player) break; PlayerObject player = ((PlayerObject) ob); StruckWeapon = player.Weapon; if (player.Class != MirClass.Assassin || StruckWeapon == -1) break; StruckWeapon = 1; break; } PlayStruckSound(); PlayFlinchSound(); break; case MirAction.Spell: if (this != User) { Spell = (Spell)action.Params[0]; TargetID = (uint)action.Params[1]; TargetPoint = (Point)action.Params[2]; Cast = (bool)action.Params[3]; SpellLevel = (byte)action.Params[4]; } switch (Spell) { #region FireBall case Spell.FireBall: Effects.Add(new Effect(Libraries.Magic, 0, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Healing case Spell.Healing: Effects.Add(new Effect(Libraries.Magic, 200, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Repulsion case Spell.Repulsion: Effects.Add(new Effect(Libraries.Magic, 900, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region ElectricShock case Spell.ElectricShock: Effects.Add(new Effect(Libraries.Magic, 1560, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Poisoning case Spell.Poisoning: Effects.Add(new Effect(Libraries.Magic, 600, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort) Spell*10 ); break; #endregion #region GreatFireBall case Spell.GreatFireBall: Effects.Add(new Effect(Libraries.Magic, 400, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region HellFire case Spell.HellFire: Effects.Add(new Effect(Libraries.Magic, 920, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region ThunderBolt case Spell.ThunderBolt: Effects.Add(new Effect(Libraries.Magic2, 20, 3, 300, this)); break; #endregion #region SoulFireBall case Spell.SoulFireBall: SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region SummonSkeleton case Spell.SummonSkeleton: Effects.Add(new Effect(Libraries.Magic, 1500, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Teleport case Spell.Teleport: Effects.Add(new Effect(Libraries.Magic, 1590, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Hiding case Spell.Hiding: Effects.Add(new Effect(Libraries.Magic, 1520, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Haste case Spell.Haste: Effects.Add(new Effect(Libraries.Magic2, 2140 + (int)Direction * 10, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FireBang case Spell.FireBang: Effects.Add(new Effect(Libraries.Magic, 1650, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region FireWall case Spell.FireWall: Effects.Add(new Effect(Libraries.Magic, 1620, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region TrapHexagon case Spell.TrapHexagon: Effects.Add(new Effect(Libraries.Magic, 1380, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region EnergyRepulsor case Spell.EnergyRepulsor: Effects.Add(new Effect(Libraries.Magic2, 190, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FireBurst case Spell.FireBurst: Effects.Add(new Effect(Libraries.Magic2, 2320, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region FlameDisruptor case Spell.FlameDisruptor: Effects.Add(new Effect(Libraries.Magic2, 130, 6, Frame.Count * FrameInterval, this)); break; #endregion #region SummonShinsu case Spell.SummonShinsu: Effects.Add(new Effect(Libraries.Magic2, 0, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region UltimateEnchancer case Spell.UltimateEnhancer: Effects.Add(new Effect(Libraries.Magic2, 160, 15, 1000, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region FrostCrunch case Spell.FrostCrunch: Effects.Add(new Effect(Libraries.Magic2, 400, 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Purification case Spell.Purification: Effects.Add(new Effect(Libraries.Magic2, 600, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region FlameField case Spell.FlameField: MapControl.Effects.Add(new Effect(Libraries.Magic2, 910, 20, 1800, CurrentLocation)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region HeavenlySword case Spell.HeavenlySword: Effects.Add(new Effect(Libraries.Magic2, 2230 + ((int)Direction * 10), 8, 800, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Trap case Spell.Trap: Effects.Add(new Effect(Libraries.Magic2, 2230 + ((int)Direction * 10), 6, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region MoonLight case Spell.MoonLight: Effects.Add(new Effect(Libraries.Magic2, 2380, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region SwiftFeet case Spell.SwiftFeet: Effects.Add(new Effect(Libraries.Magic2, 2230, 15, 1000, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region LightBody case Spell.LightBody: Effects.Add(new Effect(Libraries.Magic2, 2470, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region PoisonSword case Spell.PoisonSword: Effects.Add(new Effect(Libraries.Magic2, 2490 + ((int)Direction * 10), 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region ThunderStorm case Spell.ThunderStorm: MapControl.Effects.Add(new Effect(Libraries.Magic, 1680, 10, Frame.Count * FrameInterval, CurrentLocation)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MassHealing case Spell.MassHealing: Effects.Add(new Effect(Libraries.Magic, 1790, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region IceStorm case Spell.IceStorm: Effects.Add(new Effect(Libraries.Magic, 3840, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region MagicShield case Spell.MagicShield: Effects.Add(new Effect(Libraries.Magic, 3880, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region TurnUndead case Spell.TurnUndead: Effects.Add(new Effect(Libraries.Magic, 3920, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Revelation case Spell.Revelation: Effects.Add(new Effect(Libraries.Magic, 3960, 20, 1200, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region ProtectionField case Spell.ProtectionField: Effects.Add(new Effect(Libraries.Magic2, 1520, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Rage case Spell.Rage: Effects.Add(new Effect(Libraries.Magic2, 1510, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region Vampirism case Spell.Vampirism: Effects.Add(new Effect(Libraries.Magic2, 1040, 7, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10 ); break; #endregion #region LionRoar case Spell.LionRoar: Effects.Add(new Effect(Libraries.Magic2, 710, 20, 1200, this)); SoundManager.PlaySound(20000 + (ushort) Spell*10 + (Gender == MirGender.Male ? 0 : 1)); break; #endregion #region Entrapment case Spell.Entrapment: Effects.Add(new Effect(Libraries.Magic2, 990, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region BladeAvalanche case Spell.BladeAvalanche: Effects.Add(new Effect(Libraries.Magic2, 740 + (int)Direction * 20, 15, 15 * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Mirroring case Spell.Mirroring: Effects.Add(new Effect(Libraries.Magic2, 650, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region Blizzard case Spell.Blizzard: Effects.Add(new Effect(Libraries.Magic2, 1540, 8, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion #region MeteorStrike case Spell.MeteorStrike: Effects.Add(new Effect(Libraries.Magic2, 1590, 10, Frame.Count * FrameInterval, this)); SoundManager.PlaySound(20000 + (ushort)Spell * 10); break; #endregion } break; case MirAction.Dead: GameScene.Scene.Redraw(); GameScene.Scene.MapControl.SortObject(this); if (MouseObject == this) MouseObject = null; if (TargetObject == this) TargetObject = null; if (MagicObject == this) MagicObject = null; DeadTime = CMain.Time; break; } } GameScene.Scene.MapControl.TextureValid = false; NextMotion = CMain.Time + FrameInterval; NextMotion2 = CMain.Time + EffectFrameInterval; if (!MagicShield) return; switch (CurrentAction) { case MirAction.Struck: if (ShieldEffect != null) { ShieldEffect.Clear(); ShieldEffect.Remove(); } Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3900, 3, 600, this)); ShieldEffect.Complete += (o, e) => Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3890, 3, 600, this) { Repeat = true }); break; default: if (ShieldEffect == null) Effects.Add(ShieldEffect = new Effect(Libraries.Magic, 3890, 3, 600, this) { Repeat = true }); break; } }
private void ObjectTeleportOut(S.ObjectTeleportOut p) { for (int i = MapControl.Objects.Count - 1; i >= 0; i--) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != p.ObjectID) continue; Effect effect = null; switch (p.Type) { case 1: //Yimoogi { effect = new Effect(Libraries.Magic2, 1300, 10, 500, ob); break; } case 2: //RedFoxman { effect = new Effect(Libraries.Monsters[(ushort)Monster.RedFoxman], 243, 10, 500, ob); break; } default: { effect = new Effect(Libraries.Magic, 250, 10, 500, ob); break; } } if (effect != null) { effect.Complete += (o, e) => ob.Remove(); ob.Effects.Add(effect); } SoundManager.PlaySound(SoundList.Teleport); return; } }
private void ObjectEffect(S.ObjectEffect p) { for (int i = MapControl.Objects.Count - 1; i >= 0; i--) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != p.ObjectID) continue; PlayerObject player; switch (p.Effect) { case SpellEffect.FatalSword: ob.Effects.Add(new Effect(Libraries.Magic2, 1940, 4, 400, ob)); SoundManager.PlaySound(20000 + (ushort)Spell.FatalSword * 10); break; case SpellEffect.Teleport: ob.Effects.Add(new Effect(Libraries.Magic, 1600, 10, 600, ob)); SoundManager.PlaySound(SoundList.Teleport); break; case SpellEffect.Healing: SoundManager.PlaySound(20000 + (ushort)Spell.Healing * 10 + 1); ob.Effects.Add(new Effect(Libraries.Magic, 370, 10, 800, ob)); break; case SpellEffect.RedMoonEvil: ob.Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.RedMoonEvil], 32, 6, 400, ob) { Blend = false }); break; case SpellEffect.TwinDrakeBlade: ob.Effects.Add(new Effect(Libraries.Magic2, 380, 6, 800, ob)); break; case SpellEffect.MPEater: for (int j = MapControl.Objects.Count - 1; j >= 0; j--) { MapObject ob2 = MapControl.Objects[j]; if (ob2.ObjectID == p.EffectType) { ob2.Effects.Add(new Effect(Libraries.Magic2, 2411, 19, 1900, ob2)); break; } } ob.Effects.Add(new Effect(Libraries.Magic2, 2400, 9, 900, ob)); SoundManager.PlaySound(20000 + (ushort)Spell.FatalSword * 10); break; case SpellEffect.Bleeding: ob.Effects.Add(new Effect(Libraries.Magic3, 60, 3, 400, ob)); break; case SpellEffect.Hemorrhage: SoundManager.PlaySound(20000 + (ushort)Spell.Hemorrhage * 10); ob.Effects.Add(new Effect(Libraries.Magic3, 0, 4, 400, ob)); ob.Effects.Add(new Effect(Libraries.Magic3, 28, 6, 600, ob)); ob.Effects.Add(new Effect(Libraries.Magic3, 46, 8, 800, ob)); break; case SpellEffect.MagicShieldUp: if (ob.Race != ObjectType.Player) return; player = (PlayerObject)ob; if (player.ShieldEffect != null) { player.ShieldEffect.Clear(); player.ShieldEffect.Remove(); } player.MagicShield = true; player.Effects.Add(player.ShieldEffect = new Effect(Libraries.Magic, 3890, 3, 600, ob) { Repeat = true }); break; case SpellEffect.MagicShieldDown: if (ob.Race != ObjectType.Player) return; player = (PlayerObject)ob; if (player.ShieldEffect != null) { player.ShieldEffect.Clear(); player.ShieldEffect.Remove(); } player.ShieldEffect = null; player.MagicShield = false; break; case SpellEffect.GreatFoxSpirit: ob.Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.GreatFoxSpirit], 375 + (CMain.Random.Next(3) * 20), 20, 1400, ob)); break; case SpellEffect.Entrapment: ob.Effects.Add(new Effect(Libraries.Magic2, 1010, 10, 1500, ob)); ob.Effects.Add(new Effect(Libraries.Magic2, 1020, 8, 1200, ob)); break; case SpellEffect.Critical: ob.Effects.Add(new Effect(Libraries.CustomEffects, 0, 12, 60, ob)); break; case SpellEffect.Reflect: ob.Effects.Add(new Effect(Libraries.Effect, 580, 10, 70, ob)); break; case SpellEffect.ElementalBarrierUp: if (ob.Race != ObjectType.Player) return; player = (PlayerObject)ob; if (player.ElementalBarrierEffect != null) { player.ElementalBarrierEffect.Clear(); player.ElementalBarrierEffect.Remove(); } player.ElementalBarrier = true; player.Effects.Add(player.ElementalBarrierEffect = new Effect(Libraries.Magic3, 1890, 10, 2000, ob) { Repeat = true }); break; case SpellEffect.ElementalBarrierDown: if (ob.Race != ObjectType.Player) return; player = (PlayerObject)ob; if (player.ElementalBarrierEffect != null) { player.ElementalBarrierEffect.Clear(); player.ElementalBarrierEffect.Remove(); } player.ElementalBarrierEffect = null; player.ElementalBarrier = false; player.Effects.Add(player.ElementalBarrierEffect = new Effect(Libraries.Magic3, 1910, 7, 1400, ob)); SoundManager.PlaySound(20000 + 131 * 10 + 5); break; case SpellEffect.DelayedExplosion: int effectid = DelayedExplosionEffect.GetOwnerEffectID(ob.ObjectID); if (effectid < 0) { ob.Effects.Add(new DelayedExplosionEffect(Libraries.Magic3, 1590, 8, 1200, ob, true, 0, 0)); } else if (effectid >= 0) { if (DelayedExplosionEffect.effectlist[effectid].stage < p.EffectType) { DelayedExplosionEffect.effectlist[effectid].Remove(); ob.Effects.Add(new DelayedExplosionEffect(Libraries.Magic3, 1590 + ((int)p.EffectType * 10), 8, 1200, ob, true, (int)p.EffectType, 0)); } } //else // ob.Effects.Add(new DelayedExplosionEffect(Libraries.Magic3, 1590 + ((int)p.EffectType * 10), 8, 1200, ob, true, (int)p.EffectType, 0)); break; case SpellEffect.AwakeningSuccess: { Effect ef = new Effect(Libraries.Magic3, 900, 16, 1600, ob, CMain.Time + p.DelayTime); ef.Played += (o, e) => SoundManager.PlaySound(50002); ef.Complete += (o, e) => MapControl.AwakeningAction = false; ob.Effects.Add(ef); ob.Effects.Add(new Effect(Libraries.Magic3, 840, 16, 1600, ob, CMain.Time + p.DelayTime) { Blend = false }); } break; case SpellEffect.AwakeningFail: { Effect ef = new Effect(Libraries.Magic3, 920, 9, 900, ob, CMain.Time + p.DelayTime); ef.Played += (o, e) => SoundManager.PlaySound(50003); ef.Complete += (o, e) => MapControl.AwakeningAction = false; ob.Effects.Add(ef); ob.Effects.Add(new Effect(Libraries.Magic3, 860, 9, 900, ob, CMain.Time + p.DelayTime) { Blend = false }); } break; case SpellEffect.AwakeningHit: { Effect ef = new Effect(Libraries.Magic3, 880, 5, 500, ob, CMain.Time + p.DelayTime); ef.Played += (o, e) => SoundManager.PlaySound(50001); ob.Effects.Add(ef); ob.Effects.Add(new Effect(Libraries.Magic3, 820, 5, 500, ob, CMain.Time + p.DelayTime) { Blend = false }); } break; case SpellEffect.AwakeningMiss: { Effect ef = new Effect(Libraries.Magic3, 890, 5, 500, ob, CMain.Time + p.DelayTime); ef.Played += (o, e) => SoundManager.PlaySound(50000); ob.Effects.Add(ef); ob.Effects.Add(new Effect(Libraries.Magic3, 830, 5, 500, ob, CMain.Time + p.DelayTime) { Blend = false }); } break; } return; } }
public TrackableEffect(Effect baseEffect, string effName = "null") : base(baseEffect.Library, baseEffect.BaseIndex, baseEffect.Count, baseEffect.Duration, baseEffect.Owner, baseEffect.Start) { Repeat = baseEffect.Repeat; RepeatUntil = baseEffect.RepeatUntil; Blend = baseEffect.Blend; EffectName = effName; effectlist.Add(this); }
private bool IsVitalEffect(Effect effect) { if ((effect.Library == Libraries.Magic) && (effect.BaseIndex == 3890)) return true; if ((effect.Library == Libraries.Magic3) && (effect.BaseIndex == 1890)) return true; return false; }
private void ObjectTeleportOut(S.ObjectTeleportOut p) { for (int i = MapControl.Objects.Count - 1; i >= 0; i--) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != p.ObjectID) continue; Effect effect = null; bool playDefaultSound = true; switch (p.Type) { case 1: //Yimoogi { effect = new Effect(Libraries.Magic2, 1300, 10, 500, ob); break; } case 2: //RedFoxman { effect = new Effect(Libraries.Monsters[(ushort)Monster.RedFoxman], 243, 10, 500, ob); break; } case 4: //MutatedManWorm { effect = new Effect(Libraries.Monsters[(ushort)Monster.MutatedManworm], 272, 6, 500, ob); SoundManager.PlaySound(((ushort)Monster.MutatedManworm) * 10 + 7); playDefaultSound = false; break; } case 5: //WitchDoctor { effect = new Effect(Libraries.Monsters[(ushort)Monster.WitchDoctor], 328, 20, 1000, ob); break; } case 6: //TurtleKing { effect = new Effect(Libraries.Monsters[(ushort)Monster.TurtleKing], 946, 10, 500, ob); break; } default: { effect = new Effect(Libraries.Magic, 250, 10, 500, ob); break; } } if (effect != null) { effect.Complete += (o, e) => ob.Remove(); ob.Effects.Add(effect); } if(playDefaultSound) SoundManager.PlaySound(SoundList.Teleport); return; } }
private void ObjectTeleportOut(S.ObjectTeleportOut p) { for (int i = MapControl.Objects.Count - 1; i >= 0; i--) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != p.ObjectID) continue; Effect effect = new Effect(Libraries.Magic, 250, 10, 500, ob); effect.Complete += (o, e) => ob.Remove(); ob.Effects.Add(effect); SoundManager.PlaySound(SoundList.Teleport); return; } }
public bool SetAction() { if (NextAction != null && !GameScene.CanMove) { switch (NextAction.Action) { case MirAction.Walking: case MirAction.Pushed: return false; } } //IntelligentCreature switch (BaseImage) { case Monster.BabyPig: case Monster.Chick: case Monster.Kitten: case Monster.BabySkeleton: case Monster.Baekdon: case Monster.Wimaen: case Monster.BlackKitten: case Monster.BabyDragon: case Monster.OlympicFlame: case Monster.BabySnowMan: case Monster.Frog: case Monster.BabyMonkey: BodyLibrary = Libraries.Pets[((ushort)BaseImage) - 10000]; break; break; } if (ActionFeed.Count == 0) { CurrentAction = Stoned ? MirAction.Stoned : MirAction.Standing; if (CurrentAction == MirAction.Standing) CurrentAction = SitDown ? MirAction.SitDown : MirAction.Standing; Frames.Frames.TryGetValue(CurrentAction, out Frame); if (MapLocation != CurrentLocation) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = CurrentLocation; GameScene.Scene.MapControl.AddObject(this); } FrameIndex = 0; if (Frame == null) return false; FrameInterval = Frame.Interval; } else { QueuedAction action = ActionFeed[0]; ActionFeed.RemoveAt(0); CurrentAction = action.Action; CurrentLocation = action.Location; Direction = action.Direction; Point temp; switch (CurrentAction) { case MirAction.Walking: case MirAction.Pushed: int i = CurrentAction == MirAction.Running ? 2 : 1; temp = Functions.PointMove(CurrentLocation, Direction, CurrentAction == MirAction.Pushed ? 0 : -i); break; default: temp = CurrentLocation; break; } temp = new Point(action.Location.X, temp.Y > CurrentLocation.Y ? temp.Y : CurrentLocation.Y); if (MapLocation != temp) { GameScene.Scene.MapControl.RemoveObject(this); MapLocation = temp; GameScene.Scene.MapControl.AddObject(this); } switch (CurrentAction) { case MirAction.Pushed: Frames.Frames.TryGetValue(MirAction.Walking, out Frame); break; case MirAction.AttackRange1: if (!Frames.Frames.TryGetValue(CurrentAction, out Frame)) Frames.Frames.TryGetValue(MirAction.Attack1, out Frame); break; case MirAction.AttackRange2: if (!Frames.Frames.TryGetValue(CurrentAction, out Frame)) Frames.Frames.TryGetValue(MirAction.Attack2, out Frame); break; case MirAction.AttackRange3: if (!Frames.Frames.TryGetValue(CurrentAction, out Frame)) Frames.Frames.TryGetValue(MirAction.Attack3, out Frame); break; case MirAction.Special: if (!Frames.Frames.TryGetValue(CurrentAction, out Frame)) Frames.Frames.TryGetValue(MirAction.Attack1, out Frame); break; case MirAction.Skeleton: if (!Frames.Frames.TryGetValue(CurrentAction, out Frame)) Frames.Frames.TryGetValue(MirAction.Dead, out Frame); break; case MirAction.Hide: switch (BaseImage) { case Monster.Shinsu1: BodyLibrary = Libraries.Monsters[(ushort)Monster.Shinsu]; BaseImage = Monster.Shinsu; BaseSound = (ushort)BaseImage * 10; Frames = FrameSet.Monsters[16]; Frames.Frames.TryGetValue(CurrentAction, out Frame); break; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } break; case MirAction.Dead: switch (BaseImage) { case Monster.Shinsu: case Monster.Shinsu1: case Monster.HolyDeva: case Monster.GuardianRock: case Monster.CharmedSnake://SummonSnakes case Monster.HellKnight1: case Monster.HellKnight2: case Monster.HellKnight3: case Monster.HellKnight4: case Monster.HellBomb1: case Monster.HellBomb2: case Monster.HellBomb3: Remove(); return false; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } break; default: Frames.Frames.TryGetValue(CurrentAction, out Frame); break; } FrameIndex = 0; if (Frame == null) return false; FrameInterval = Frame.Interval; switch (CurrentAction) { case MirAction.Appear: PlaySummonSound(); switch (BaseImage) { case Monster.HellKnight1: case Monster.HellKnight2: case Monster.HellKnight3: case Monster.HellKnight4: Effects.Add(new Effect(Libraries.Monsters[(ushort)BaseImage], 448, 10, 600, this)); break; } break; case MirAction.Show: PlayPopupSound(); break; case MirAction.Pushed: FrameIndex = Frame.Count - 1; GameScene.Scene.Redraw(); break; case MirAction.Walking: GameScene.Scene.Redraw(); break; case MirAction.Attack1: PlayAttackSound(); switch (BaseImage) { case Monster.FlamingWooma: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.FlamingWooma], 224 + (int)Direction * 7, 7, Frame.Count * Frame.Interval, this)); break; case Monster.ZumaTaurus: if (CurrentAction == MirAction.Attack1) Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.ZumaTaurus], 244 + (int)Direction * 8, 8, 8 * FrameInterval, this)); break; case Monster.MinotaurKing: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.MinotaurKing], 272 + (int)Direction * 6, 6, Frame.Count * Frame.Interval, this)); break; case Monster.FlamingMutant:///////////////////////////stupple Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.FlamingMutant], 304 + (int)Direction * 6, 6, Frame.Count * Frame.Interval, this)); break; case Monster.Demonwolf: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.Demonwolf], 312 + (int)Direction * 3, 3, Frame.Count * Frame.Interval, this)); break; case Monster.DarkBeast: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.DarkBeast], 296 + (int)Direction * 4, 4, Frame.Count * Frame.Interval, this)); break; case Monster.HardenRhino: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.HardenRhino], 379 + (int)Direction * 6, 6, Frame.Count * Frame.Interval, this)); break; case Monster.AncientBringer: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.AncientBringer], 512 + (int)Direction * 6, 6, Frame.Count * Frame.Interval, this)); break; case Monster.DemonGuard: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.DemonGuard], 288 + (int)Direction * 2, 2, Frame.Count * Frame.Interval, this)); break; case Monster.Bear: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.Bear], 321 + (int)Direction * 4, 4, Frame.Count * Frame.Interval, this)); break; case Monster.Manticore: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.Manticore], 505 + (int)Direction * 3, 3, Frame.Count * Frame.Interval, this)); break; case Monster.StainHammerCat: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.StainHammerCat], 240 + (int)Direction * 5, 5, Frame.Count * Frame.Interval, this)); break; case Monster.BlackHammerCat: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.BlackHammerCat], 648 + (int)Direction * 11, 11, Frame.Count * Frame.Interval, this)); break; case Monster.SeedingsGeneral: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.SeedingsGeneral], 536 + (int)Direction * 4, 4, Frame.Count * Frame.Interval, this)); break; case Monster.TucsonMage: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.TucsonMage], 272 + (int)Direction * 4, 4, Frame.Count * Frame.Interval, this)); break; case Monster.YinDevilNode: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.YinDevilNode], 26, 26, Frame.Count * Frame.Interval, this)); break; case Monster.YangDevilNode: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.YangDevilNode], 26, 26, Frame.Count * Frame.Interval, this)); break; case Monster.GreatFoxSpirit: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.GreatFoxSpirit], 355, 20, Frame.Count * Frame.Interval, this)); break; case Monster.EvilMir: Effects.Add(new Effect(Libraries.Dragon, 60, 8, 8 * Frame.Interval, this)); Effects.Add(new Effect(Libraries.Dragon, 68, 14, 14 * Frame.Interval, this)); byte random = (byte)CMain.Random.Next(7); for (int i = 0; i <= 7 + random; i++) { Point source = new Point(User.CurrentLocation.X + CMain.Random.Next(-7, 7), User.CurrentLocation.Y + CMain.Random.Next(-7, 7)); MapControl.Effects.Add(new Effect(Libraries.Dragon, 230 + (CMain.Random.Next(5) * 10), 5, 400, source, CMain.Time + CMain.Random.Next(1000))); } break; case Monster.CrawlerLave: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.CrawlerLave], 224 + (int)Direction * 6, 6, Frame.Count * Frame.Interval, this)); break; case Monster.HellKeeper: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.HellKeeper], 32, 8, 8 * Frame.Interval, this)); break; case Monster.PoisonHugger: User.Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.PoisonHugger], 224, 5, 5 * Frame.Interval, User, 500, false)); break; case Monster.IcePillar: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.IcePillar], 12, 6, 6 * 100, this)); break; case Monster.TrollKing: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.TrollKing], 288, 6, 6 * Frame.Interval, this)); break; case Monster.HellBomb1: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.HellLord], 61, 7, 7 * Frame.Interval, this)); break; case Monster.HellBomb2: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.HellLord], 79, 9, 9 * Frame.Interval, this)); break; case Monster.HellBomb3: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.HellLord], 97, 8, 8 * Frame.Interval, this)); break; } break; case MirAction.Attack2: PlaySecondAttackSound(); switch (BaseImage) { case Monster.CrystalSpider: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.CrystalSpider], 272 + (int)Direction * 10, 10, Frame.Count * Frame.Interval, this)); break; case Monster.Yimoogi: case Monster.RedYimoogi: case Monster.Snake10: case Monster.Snake11: case Monster.Snake12: case Monster.Snake13: case Monster.Snake14: case Monster.Snake15: case Monster.Snake16: case Monster.Snake17: Effects.Add(new Effect(Libraries.Monsters[(ushort)BaseImage], 304, 6, Frame.Count * Frame.Interval, this)); Effects.Add(new Effect(Libraries.Magic2, 1280, 10, Frame.Count * Frame.Interval, this)); break; case Monster.HellCannibal: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.HellCannibal], 310 + (int)Direction * 12, 12, 12 * Frame.Interval, this)); break; case Monster.ManectricKing: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.ManectricKing], 640 + (int)Direction * 10, 10, 10 * 100, this)); break; } if ((ushort)BaseImage >= 10000) { PlayPetSound(); } break; case MirAction.Attack3: PlayThirdAttackSound(); switch (BaseImage) { case Monster.Yimoogi: case Monster.RedYimoogi: case Monster.Snake10: case Monster.Snake11: case Monster.Snake12: case Monster.Snake13: case Monster.Snake14: case Monster.Snake15: case Monster.Snake16: case Monster.Snake17: Effects.Add(new Effect(Libraries.Magic2, 1330, 10, Frame.Count * Frame.Interval, this)); break; case Monster.Behemoth: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.Behemoth], 697 + (int)Direction * 7, 7, Frame.Count * Frame.Interval, this)); break; } break; case MirAction.Attack4: break; case MirAction.AttackRange1: PlayRangeSound(); switch (BaseImage) { case Monster.KingScorpion: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.KingScorpion], 272 + (int)Direction * 8, 8, Frame.Count * Frame.Interval, this)); break; case Monster.DarkDevil: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.DarkDevil], 272 + (int)Direction * 8, 8, Frame.Count * Frame.Interval, this)); break; case Monster.ShamanZombie: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.ShamanZombie], 232 + (int)Direction * 12, 6, Frame.Count * Frame.Interval, this)); Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.ShamanZombie], 328, 12, Frame.Count * Frame.Interval, this)); break; case Monster.GuardianRock: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.GuardianRock], 12, 10, Frame.Count * Frame.Interval, this)); break; case Monster.GreatFoxSpirit: byte random = (byte)CMain.Random.Next(4); for (int i = 0; i <= 4 + random; i++) { Point source = new Point(User.CurrentLocation.X + CMain.Random.Next(-7, 7), User.CurrentLocation.Y + CMain.Random.Next(-7, 7)); MapControl.Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.GreatFoxSpirit], 375 + (CMain.Random.Next(3) * 20), 20, 1400, source, CMain.Time + CMain.Random.Next(600))); } break; case Monster.EvilMir: Effects.Add(new Effect(Libraries.Dragon, 90 + (int)Direction * 10, 10, 10 * Frame.Interval, this)); break; case Monster.DragonStatue: Effects.Add(new Effect(Libraries.Dragon, 310 + ((int)Direction / 3) * 20, 10, 10 * Frame.Interval, this)); break; case Monster.TurtleKing: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.TurtleKing], 946, 10, Frame.Count * Frame.Interval, User)); break; case Monster.FlyingStatue: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.FlyingStatue], 314, 6, 6 * Frame.Interval, this)); //Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.FlyingStatue], 329, 5, 5 * Frame.Interval, this)); this should follow the projectile break; case Monster.HellBolt: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.HellBolt], 304, 11, 11 * 100, this)); break; case Monster.WitchDoctor: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.WitchDoctor], 304, 9, 9 * 100, this)); break; case Monster.DarkDevourer: User.Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.DarkDevourer], 480, 7, 7 * Frame.Interval, User)); break; case Monster.DreamDevourer: User.Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.DreamDevourer], 264, 7, 7 * Frame.Interval, User)); break; case Monster.ManectricKing: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.ManectricKing], 720, 12, 12 * 100, this)); break; case Monster.IcePillar: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.IcePillar], 26, 6, 8 * 100, this) { Start = CMain.Time + 750 }); break; } TargetID = (uint)action.Params[0]; break; case MirAction.AttackRange2: PlaySecondRangeSound(); TargetID = (uint)action.Params[0]; switch(BaseImage) { case Monster.TurtleKing: byte random = (byte)CMain.Random.Next(4); for (int i = 0; i <= 4 + random; i++) { Point source = new Point(User.CurrentLocation.X + CMain.Random.Next(-7, 7), User.CurrentLocation.Y + CMain.Random.Next(-7, 7)); Effect ef = new Effect(Libraries.Monsters[(ushort)Monster.TurtleKing], CMain.Random.Next(2) == 0 ? 922 : 934, 12, 1200, source, CMain.Time + CMain.Random.Next(600)); ef.Played += (o, e) => SoundManager.PlaySound(20000 + (ushort)Spell.HellFire * 10 + 1); MapControl.Effects.Add(ef); } break; } break; case MirAction.AttackRange3: PlayThirdRangeSound(); TargetID = (uint)action.Params[0]; switch (BaseImage) { case Monster.TurtleKing: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.TurtleKing], 946, 10, Frame.Count * Frame.Interval, User)); break; } break; case MirAction.Struck: uint attackerID = (uint)action.Params[0]; StruckWeapon = -2; for (int i = 0; i < MapControl.Objects.Count; i++) { MapObject ob = MapControl.Objects[i]; if (ob.ObjectID != attackerID) continue; if (ob.Race != ObjectType.Player) break; PlayerObject player = ((PlayerObject)ob); StruckWeapon = player.Weapon; if (player.Class != MirClass.Assassin || StruckWeapon == -1) break; //Archer? StruckWeapon = 1; break; } PlayFlinchSound(); PlayStruckSound(); break; case MirAction.Die: switch (BaseImage) { case Monster.ManectricKing: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.ManectricKing], 504 + (int)Direction * 9, 9, Frame.Count * Frame.Interval, this)); break; case Monster.DarkDevil: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.DarkDevil], 336, 6, Frame.Count * Frame.Interval, this)); break; case Monster.ShamanZombie: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.ShamanZombie], 224, 8, Frame.Count * Frame.Interval, this)); break; case Monster.RoninGhoul: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.RoninGhoul], 224, 10, Frame.Count * FrameInterval, this)); break; case Monster.BoneCaptain: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.BoneCaptain], 224 + (int)Direction * 10, 10, Frame.Count * FrameInterval, this)); break; case Monster.RightGuard: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.RightGuard], 296, 5, Frame.Count * Frame.Interval, this)); break; case Monster.LeftGuard: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.LeftGuard], 296 + (int)Direction * 5, 5, 5 * Frame.Interval, this)); break; case Monster.FrostTiger: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.FrostTiger], 304, 10, Frame.Count * Frame.Interval, this)); break; case Monster.Yimoogi: case Monster.RedYimoogi: case Monster.Snake10: case Monster.Snake11: case Monster.Snake12: case Monster.Snake13: case Monster.Snake14: case Monster.Snake15: case Monster.Snake16: case Monster.Snake17: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.Yimoogi], 352, 10, Frame.Count * Frame.Interval, this)); break; case Monster.YinDevilNode: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.YinDevilNode], 52, 20, Frame.Count * Frame.Interval, this)); break; case Monster.YangDevilNode: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.YangDevilNode], 52, 20, Frame.Count * Frame.Interval, this)); break; case Monster.BlackFoxman: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.BlackFoxman], 224, 10, Frame.Count * Frame.Interval, this)); break; case Monster.VampireSpider: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.VampireSpider], 296, 5, Frame.Count * Frame.Interval, this)); break; case Monster.CharmedSnake: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.CharmedSnake], 40, 8, Frame.Count * Frame.Interval, this)); break; case Monster.Manticore: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.Manticore], 592, 9, Frame.Count * Frame.Interval, this)); break; case Monster.ValeBat: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.ValeBat], 224, 20, Frame.Count * Frame.Interval, this)); break; case Monster.SpiderBat: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.SpiderBat], 224, 20, Frame.Count * Frame.Interval, this)); break; case Monster.VenomWeaver: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.VenomWeaver], 224, 6, Frame.Count * Frame.Interval, this)); break; case Monster.HellBolt: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.HellBolt], 325, 10, Frame.Count * Frame.Interval, this)); break; case Monster.SabukGate: Effects.Add(new Effect(Libraries.Effect, 136, 7, Frame.Count * Frame.Interval, this) { Light = -1 }); break; case Monster.WingedTigerLord: Effects.Add(new Effect(Libraries.Monsters[(ushort)Monster.WingedTigerLord], 650 + (int)Direction * 5, 5, Frame.Count * FrameInterval, this)); break; case Monster.HellKnight1: case Monster.HellKnight2: case Monster.HellKnight3: case Monster.HellKnight4: Effects.Add(new Effect(Libraries.Monsters[(ushort)BaseImage], 448, 10, 600, this)); break; } PlayDieSound(); break; case MirAction.Dead: GameScene.Scene.Redraw(); GameScene.Scene.MapControl.SortObject(this); if (MouseObject == this) MouseObject = null; if (TargetObject == this) TargetObject = null; if (MagicObject == this) MagicObject = null; for (int i = 0; i < Effects.Count; i++) Effects[i].Remove(); DeadTime = CMain.Time; break; } } GameScene.Scene.MapControl.TextureValid = false; NextMotion = CMain.Time + FrameInterval; return true; }