public void ProcessSpell(MapObject ob)
        {
            switch (Effect)
            {
            case SpellEffect.PoisonousCloud:
                if (!Owner.CanHelpTarget(ob))
                {
                    return;
                }

                BuffInfo buff      = ob.Buffs.FirstOrDefault(x => x.Type == BuffType.PoisonousCloud);
                TimeSpan remaining = TickTime - SEnvir.Now;

                if (buff != null)
                {
                    if (buff.RemainingTime > remaining)
                    {
                        return;
                    }
                }

                ob.BuffAdd(BuffType.PoisonousCloud, remaining, new Stats {
                    [Stat.Agility] = Power
                }, false, false, TimeSpan.Zero);
                break;

            case SpellEffect.FireWall:
            case SpellEffect.Tempest:
                PlayerObject player = Owner as PlayerObject;
                if (player == null || !player.CanAttackTarget(ob))
                {
                    return;
                }

                int damage = player.MagicAttack(new List <UserMagic> {
                    Magic
                }, ob, true);

                if (damage > 0 && ob.Race == ObjectType.Player)
                {
                    foreach (SpellObject spell in player.SpellList)
                    {
                        if (spell.Effect != Effect)
                        {
                            continue;
                        }

                        spell.TickCount--;
                    }
                }
                break;

            case SpellEffect.MonsterFireWall:
                MonsterObject monster = Owner as MonsterObject;
                if (monster == null || !monster.CanAttackTarget(ob))
                {
                    return;
                }

                monster.Attack(ob, monster.GetDC(), Element.Fire);
                break;

            case SpellEffect.DarkSoulPrison:
                player = Owner as PlayerObject;
                if (player == null || !player.CanAttackTarget(ob))
                {
                    return;
                }

                damage = player.MagicAttack(new List <UserMagic> {
                    Magic
                }, ob, true);

                if (damage > 0 && ob.Race == ObjectType.Player)
                {
                    foreach (SpellObject spell in player.SpellList)
                    {
                        if (spell.Effect != Effect)
                        {
                            continue;
                        }

                        spell.TickCount--;
                    }
                }
                break;
            }
        }