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; } }