Beispiel #1
0
        public static void ApplySkillLoss(Mobile mob)
        {
            SkillLossContext context;

            m_SkillLoss.TryGetValue(mob, out context);

            if (context == null)
            {
                context          = new SkillLossContext();
                m_SkillLoss[mob] = context;

                List <SkillMod> mods = context.m_SkillMods = new List <SkillMod>();

                for (int i = 0; i < mob.Skills.Length; ++i)
                {
                    Skill  sk        = mob.Skills[i];
                    double baseValue = sk.Base;

                    if (baseValue > 0)
                    {
                        SkillMod mod = new DefaultSkillMod(sk.SkillName, true, -(baseValue * SkillLossFactor));

                        mods.Add(mod);
                        mob.AddSkillMod(mod);
                    }
                }

                mob.AddStatMod(new StatMod(StatType.Str, "Ethics Penalty Str", -(int)(mob.RawStr * StatLossFactor), SkillLossPeriod));
                mob.AddStatMod(new StatMod(StatType.Dex, "Ethics Penalty Dex", -(int)(mob.RawDex * StatLossFactor), SkillLossPeriod));
                mob.AddStatMod(new StatMod(StatType.Int, "Ethics Penalty Int", -(int)(mob.RawInt * StatLossFactor), SkillLossPeriod));

                context.m_Timer = Timer.DelayCall <Mobile>(SkillLossPeriod, new TimerStateCallback <Mobile>(ClearSkillLoss_Callback), mob);
            }
        }
        public static void ApplySkillLoss(Mobile mob)
        {
            if (InSkillLoss(mob))
            {
                return;
            }

            SkillLossContext context = new SkillLossContext();

            m_SkillLoss[mob] = context;

            List <SkillMod> mods = context.m_Mods = new List <SkillMod>();

            for (int i = 0; i < mob.Skills.Length; ++i)
            {
                Skill  sk        = mob.Skills[i];
                double baseValue = sk.Base;

                if (baseValue > 0)
                {
                    SkillMod mod = new DefaultSkillMod(sk.SkillName, true, -(baseValue * SkillLossFactor));

                    mods.Add(mod);
                    mob.AddSkillMod(mod);
                }
            }

            context.m_Timer = Timer.DelayCall(SkillLossPeriod, new TimerStateCallback(ClearSkillLoss_Callback), mob);
        }
Beispiel #3
0
        public static void ApplySkillLoss(Mobile mob)
        {
            var pm = mob as PlayerMobile;

            if (pm == null || pm.StatEnd < DateTime.UtcNow)
            {
                return;
            }

            try
            {
                TimeSpan lossperiod = pm.StatEnd - DateTime.UtcNow;
                double   loss       = 0.40;         // 40% loss

                ClearSkillLoss(pm);

                var context = new SkillLossContext();
                m_SkillLoss[pm] = context;

                List <SkillMod> mods = context.m_SkillMods = new List <SkillMod>();

                foreach (Skill sk in pm.Skills)
                {
                    double baseValue = sk.Base;

                    if (baseValue > 0)
                    {
                        SkillMod mod = new DefaultSkillMod(sk.SkillName, true, -(baseValue * loss));

                        mods.Add(mod);
                        mob.AddSkillMod(mod);
                    }
                }

                mob.AddStatMod(new StatMod(StatType.Str, "Murder Penalty Str", -(int)(mob.RawStr * loss), lossperiod));
                mob.AddStatMod(new StatMod(StatType.Dex, "Murder Penalty Dex", -(int)(mob.RawDex * loss), lossperiod));
                mob.AddStatMod(new StatMod(StatType.Int, "Murder Penalty Int", -(int)(mob.RawInt * loss), lossperiod));

                context.m_Timer = Timer.DelayCall(lossperiod, m => ClearSkillLoss(m), mob);
            }
            catch
            { }
        }
		public static bool ClearSkillLoss( Mobile mob )
		{
			SkillLossContext context = (SkillLossContext)m_SkillLoss[mob];

			if ( context == null ) {
				return false;
			}

			m_SkillLoss.Remove( mob );

			ArrayList mods = context.m_Mods;

			for ( int i = 0; i < mods.Count; ++i )
				mob.RemoveSkillMod( (SkillMod) mods[i] );

			context.m_Timer.Stop();

			return true;
		}
Beispiel #5
0
        public static void ApplySkillLoss(Mobile mob)
        {
            SkillLossContext context = (SkillLossContext)m_SkillLoss[mob];

            if (context != null)
            {
                return;
            }

            context          = new SkillLossContext();
            m_SkillLoss[mob] = context;

            ArrayList mods = context.m_Mods = new ArrayList();

            int      ShortsLost      = mob.ShortTermMurders / 2;
            double   SkillLossFactor = Math.Min(ShortsLost * 0.01, 0.5);                    //1 percent per short. Max 50%.
            TimeSpan SkillLossPeriod = TimeSpan.FromMinutes(10 + Math.Min(50, ShortsLost)); //10 to 60 minutes.

            //mob.ShortTermMurders -= ShortsLost; //Lose half your shorts. Disable till title system set up.

            for (int i = 0; i < mob.Skills.Length; ++i)
            {
                Skill  sk        = mob.Skills[i];
                double baseValue = sk.Base;

                if (baseValue > 0)
                {
                    SkillMod mod = new DefaultSkillMod(sk.SkillName, true, -(baseValue * SkillLossFactor));

                    mods.Add(mod);
                    mob.AddSkillMod(mod);
                }
            }

            mob.SendMessage(String.Format("You have lost {0}% of your skill for {1} minutes for being a criminal.", (int)(SkillLossFactor * 100), 10 + Math.Min(50, ShortsLost)));

            context.m_Timer = Timer.DelayCall(SkillLossPeriod, new TimerStateCallback(ClearSkillLoss_Callback), mob);
        }
Beispiel #6
0
        public static bool ClearSkillLoss(Mobile mob)
        {
            SkillLossContext context = (SkillLossContext)m_SkillLoss[mob];

            if (context == null)
            {
                return(false);
            }

            m_SkillLoss.Remove(mob);

            ArrayList mods = context.m_Mods;

            for (int i = 0; i < mods.Count; ++i)
            {
                mob.RemoveSkillMod((SkillMod)mods[i]);
            }

            context.m_Timer.Stop();

            mob.SendLocalizedMessage(500912);                   // You have recovered from the impure life force absorbtion.

            return(true);
        }
		public static void ApplySkillLoss(Mobile mob)
		{
			var pm = mob as PlayerMobile;

			if (pm == null || pm.StatEnd < DateTime.UtcNow)
			{
				return;
			}

			try
			{
				TimeSpan lossperiod = pm.StatEnd - DateTime.UtcNow;
				double loss = 0.40; // 40% loss

				ClearSkillLoss(pm);

				var context = new SkillLossContext();
				m_SkillLoss[pm] = context;

				List<SkillMod> mods = context.m_SkillMods = new List<SkillMod>();

				foreach (Skill sk in pm.Skills)
				{
					double baseValue = sk.Base;

					if (baseValue > 0)
					{
						SkillMod mod = new DefaultSkillMod(sk.SkillName, true, -(baseValue * loss));

						mods.Add(mod);
						mob.AddSkillMod(mod);
					}
				}

				mob.AddStatMod(new StatMod(StatType.Str, "Murder Penalty Str", -(int)(mob.RawStr * loss), lossperiod));
				mob.AddStatMod(new StatMod(StatType.Dex, "Murder Penalty Dex", -(int)(mob.RawDex * loss), lossperiod));
				mob.AddStatMod(new StatMod(StatType.Int, "Murder Penalty Int", -(int)(mob.RawInt * loss), lossperiod));

				context.m_Timer = Timer.DelayCall(lossperiod, m => ClearSkillLoss(m), mob);
			}
			catch
			{ }
		}
Beispiel #8
0
        public static void ApplySkillLoss(Mobile mob)
        {
            if (InSkillLoss(mob))
                return;

            SkillLossContext context = new SkillLossContext();
            m_SkillLoss[mob] = context;

            List<SkillMod> mods = context.m_Mods = new List<SkillMod>();

            for (int i = 0; i < mob.Skills.Length; ++i)
            {
                Skill sk = mob.Skills[i];
                double baseValue = sk.Base;

                if (baseValue > 0)
                {
                    SkillMod mod = new DefaultSkillMod(sk.SkillName, true, -(baseValue * SkillLossFactor));

                    mods.Add(mod);
                    mob.AddSkillMod(mod);
                }
            }

            context.m_Timer = Timer.DelayCall(SkillLossPeriod, new TimerStateCallback(ClearSkillLoss_Callback), mob);
        }
Beispiel #9
0
        public static void ApplySkillLoss( Mobile mob )
        {
            SkillLossContext context = (SkillLossContext) m_SkillLoss[mob];

            if ( context != null )
                return;

            context = new SkillLossContext();
            m_SkillLoss[mob] = context;

            ArrayList mods = context.m_Mods = new ArrayList();

            for ( int i = 0; i < mob.Skills.Length; ++i )
            {
                Skill sk = mob.Skills[i];
                double baseValue = sk.Base;

                if ( baseValue > 0 )
                {
                    SkillMod mod = new DefaultSkillMod( sk.SkillName, true, -( baseValue * SkillLossFactor ) );

                    mods.Add( mod );
                    mob.AddSkillMod( mod );
                }
            }

            context.m_Timer = Timer.DelayCall( SkillLossPeriod, new TimerStateCallback( ClearSkillLoss_Callback ), mob );

            // Stat Loss / All of your skills have been reduced by one third.
            mob.AddBuff( new BuffInfo( BuffIcon.FactionStatLoss, 1153800, 1153826, SkillLossPeriod, mob, true ) );
        }
Beispiel #10
0
        public static void ApplySkillLoss(Mobile mob)
        {
            PlayerMobile Killer = mob as PlayerMobile;

            if (mob.ShortTermMurders >= 5 && Killer.MurderBounty <= 0)
            {
                double loss = (100.0 - (19.0 + (mob.ShortTermMurders / 5.0))) / 100.0;                 // 20 to 30% loss

                if (loss < 0.75)
                {
                    loss = 0.60;                    // changed to .80 from .95
                }
                else if (loss > 0.95)
                {
                    loss = 0.60;                     // changed to .80 from /95
                }
                TimeSpan lossperiod = TimeSpan.FromMinutes(240.0);

                loss = 1.0 - loss;

                ClearSkillLoss(mob);

                SkillLossContext context = new SkillLossContext();
                m_SkillLoss[mob] = context;

                List <SkillMod> mods = context.m_SkillMods = new List <SkillMod>();

                for (int i = 0; i < mob.Skills.Length; ++i)
                {
                    Skill  sk        = mob.Skills[i];
                    double baseValue = sk.Base;

                    if (baseValue > 0)
                    {
                        SkillMod mod = new DefaultSkillMod(sk.SkillName, true, -(baseValue * loss));

                        mods.Add(mod);
                        mob.AddSkillMod(mod);
                    }
                }

                mob.AddStatMod(new StatMod(StatType.Str, "Murder Penalty Str", -(int)(mob.RawStr * loss), lossperiod));
                mob.AddStatMod(new StatMod(StatType.Dex, "Murder Penalty Dex", -(int)(mob.RawDex * loss), lossperiod));
                mob.AddStatMod(new StatMod(StatType.Int, "Murder Penalty Int", -(int)(mob.RawInt * loss), lossperiod));

                context.m_Timer = Timer.DelayCall <Mobile>(lossperiod, new TimerStateCallback <Mobile>(ClearSkillLoss_Callback), mob);
            }
            else              ///Removed short term statloss.
            if (mob.ShortTermMurders < 5 && Killer.MurderBounty > 0)
            {
                double loss = (100.0 - (19.0 + (Killer.MurderBounty / 10000.0))) / 100.0;                 // 20 to 30% loss
                if (loss < 0.75)
                {
                    loss = 0.60;                    // changed to .80 from .95
                }
                else if (loss > 0.95)
                {
                    loss = 0.60;                     // changed to .80 from /95
                }
                mob.SendMessage("Current MurderBounty: " + Killer.MurderBounty);
                double   timeloss   = (double)Killer.MurderBounty / 33.3;
                TimeSpan lossperiod = TimeSpan.FromMinutes(timeloss);

                int m = (int)Math.Round(timeloss);
                mob.SendMessage("You have entered a bounty statloss for: " + m + " minutes.");

                loss = 1.0 - loss;

                ClearSkillLoss(mob);

                SkillLossContext context = new SkillLossContext();
                m_SkillLoss[mob] = context;

                List <SkillMod> mods = context.m_SkillMods = new List <SkillMod>();

                for (int i = 0; i < mob.Skills.Length; ++i)
                {
                    Skill  sk        = mob.Skills[i];
                    double baseValue = sk.Base;

                    if (baseValue > 0)
                    {
                        SkillMod mod = new DefaultSkillMod(sk.SkillName, true, -(baseValue * loss));

                        mods.Add(mod);
                        mob.AddSkillMod(mod);
                    }
                }

                mob.AddStatMod(new StatMod(StatType.Str, "Murder Penalty Str", -(int)(mob.RawStr * loss), lossperiod));
                mob.AddStatMod(new StatMod(StatType.Dex, "Murder Penalty Dex", -(int)(mob.RawDex * loss), lossperiod));
                mob.AddStatMod(new StatMod(StatType.Int, "Murder Penalty Int", -(int)(mob.RawInt * loss), lossperiod));

                context.m_Timer = Timer.DelayCall <Mobile>(lossperiod, new TimerStateCallback <Mobile>(ClearSkillLoss_Callback), mob);
            }
            else if (mob.ShortTermMurders >= 5 && Killer.MurderBounty > 0)
            {
                double loss = (100.0 - (19.0 + (mob.ShortTermMurders / 5.0))) / 100.0;                 // 20 to 30% loss
                if (loss < 0.75)
                {
                    loss = 0.60;                    // changed to .80 from .95
                }
                else if (loss > 0.95)
                {
                    loss = 0.60;                     // changed to .80 from /95
                }
                mob.SendMessage("Current MurderBounty: " + Killer.MurderBounty);
                double   timeloss   = (double)Killer.MurderBounty / 33.3;
                TimeSpan lossperiod = TimeSpan.FromMinutes(timeloss + 240.0);

                Killer.MurderBounty = 0;

                int m = (int)Math.Round(timeloss + 240.0);
                mob.SendMessage("You have entered statloss for: " + m + " minutes.");

                loss = 1.0 - loss;

                ClearSkillLoss(mob);

                SkillLossContext context = new SkillLossContext();
                m_SkillLoss[mob] = context;

                List <SkillMod> mods = context.m_SkillMods = new List <SkillMod>();

                for (int i = 0; i < mob.Skills.Length; ++i)
                {
                    Skill  sk        = mob.Skills[i];
                    double baseValue = sk.Base;

                    if (baseValue > 0)
                    {
                        SkillMod mod = new DefaultSkillMod(sk.SkillName, true, -(baseValue * loss));

                        mods.Add(mod);
                        mob.AddSkillMod(mod);
                    }
                }

                mob.AddStatMod(new StatMod(StatType.Str, "Murder Penalty Str", -(int)(mob.RawStr * loss), lossperiod));
                mob.AddStatMod(new StatMod(StatType.Dex, "Murder Penalty Dex", -(int)(mob.RawDex * loss), lossperiod));
                mob.AddStatMod(new StatMod(StatType.Int, "Murder Penalty Int", -(int)(mob.RawInt * loss), lossperiod));

                context.m_Timer = Timer.DelayCall <Mobile>(lossperiod, new TimerStateCallback <Mobile>(ClearSkillLoss_Callback), mob);
            }
        }
		public static void ApplySkillLoss( Mobile mob )
		{
			PlayerMobile Killer = mob as PlayerMobile;
			if ( mob.ShortTermMurders >= 5 && Killer.MurderBounty <= 0)
			{
				double loss = (100.0 - (19.0 + (mob.ShortTermMurders / 5.0))) / 100.0; // 20 to 30% loss

				if( loss < 0.75 )
					loss = 0.60;// changed to .80 from .95
				else if( loss > 0.95 )
					loss = 0.60; // changed to .80 from /95

				TimeSpan lossperiod = TimeSpan.FromMinutes( 240.0 );

				loss = 1.0 - loss;

				ClearSkillLoss( mob );

				SkillLossContext context = new SkillLossContext();
				m_SkillLoss[mob] = context;

				List<SkillMod> mods = context.m_SkillMods = new List<SkillMod>();

				for ( int i = 0; i < mob.Skills.Length; ++i )
				{
					Skill sk = mob.Skills[i];
					double baseValue = sk.Base;

					if ( baseValue > 0 )
					{
						SkillMod mod = new DefaultSkillMod( sk.SkillName, true, -(baseValue * loss) );

						mods.Add( mod );
						mob.AddSkillMod( mod );
					}
				}

				mob.AddStatMod( new StatMod( StatType.Str, "Murder Penalty Str", -(int)(mob.RawStr * loss), lossperiod ) );
				mob.AddStatMod( new StatMod( StatType.Dex, "Murder Penalty Dex", -(int)(mob.RawDex * loss), lossperiod ) );
				mob.AddStatMod( new StatMod( StatType.Int, "Murder Penalty Int", -(int)(mob.RawInt * loss), lossperiod ) );

				context.m_Timer = Timer.DelayCall<Mobile>( lossperiod, new TimerStateCallback<Mobile>( ClearSkillLoss_Callback ), mob );
			}
			else  ///Removed short term statloss. 
			if ( mob.ShortTermMurders < 5 && Killer.MurderBounty > 0 )
			{
				double loss = (100.0 - (19.0 + (Killer.MurderBounty / 10000.0))) / 100.0; // 20 to 30% loss
				if( loss < 0.75 )
					loss = 0.60;// changed to .80 from .95
				else if( loss > 0.95 )
					loss = 0.60; // changed to .80 from /95
				mob.SendMessage( "Current MurderBounty: " + Killer.MurderBounty);
				double timeloss = (double)Killer.MurderBounty/33.3;
				TimeSpan lossperiod = TimeSpan.FromMinutes( timeloss );
				
				int m = (int)Math.Round( timeloss );
				mob.SendMessage( "You have entered a bounty statloss for: " + m + " minutes.");

				loss = 1.0 - loss;

				ClearSkillLoss( mob );

				SkillLossContext context = new SkillLossContext();
				m_SkillLoss[mob] = context;

				List<SkillMod> mods = context.m_SkillMods = new List<SkillMod>();

				for ( int i = 0; i < mob.Skills.Length; ++i )
				{
					Skill sk = mob.Skills[i];
					double baseValue = sk.Base;

					if ( baseValue > 0 )
					{
						SkillMod mod = new DefaultSkillMod( sk.SkillName, true, -(baseValue * loss) );

						mods.Add( mod );
						mob.AddSkillMod( mod );
					}
				}

				mob.AddStatMod( new StatMod( StatType.Str, "Murder Penalty Str", -(int)(mob.RawStr * loss), lossperiod ) );
				mob.AddStatMod( new StatMod( StatType.Dex, "Murder Penalty Dex", -(int)(mob.RawDex * loss), lossperiod ) );
				mob.AddStatMod( new StatMod( StatType.Int, "Murder Penalty Int", -(int)(mob.RawInt * loss), lossperiod ) );

				context.m_Timer = Timer.DelayCall<Mobile>( lossperiod, new TimerStateCallback<Mobile>( ClearSkillLoss_Callback ), mob );
			}
			else if ( mob.ShortTermMurders >= 5 && Killer.MurderBounty > 0 )
			{
				double loss = (100.0 - (19.0 + (mob.ShortTermMurders / 5.0))) / 100.0; // 20 to 30% loss
				if( loss < 0.75 )
					loss = 0.60;// changed to .80 from .95
				else if( loss > 0.95 )
					loss = 0.60; // changed to .80 from /95
				mob.SendMessage( "Current MurderBounty: " + Killer.MurderBounty);
				double timeloss = (double)Killer.MurderBounty/33.3;
				TimeSpan lossperiod = TimeSpan.FromMinutes( timeloss + 240.0);
				
				Killer.MurderBounty = 0;
				
				int m = (int)Math.Round( timeloss + 240.0);
				mob.SendMessage( "You have entered statloss for: " + m + " minutes.");

				loss = 1.0 - loss;

				ClearSkillLoss( mob );

				SkillLossContext context = new SkillLossContext();
				m_SkillLoss[mob] = context;

				List<SkillMod> mods = context.m_SkillMods = new List<SkillMod>();

				for ( int i = 0; i < mob.Skills.Length; ++i )
				{
					Skill sk = mob.Skills[i];
					double baseValue = sk.Base;

					if ( baseValue > 0 )
					{
						SkillMod mod = new DefaultSkillMod( sk.SkillName, true, -(baseValue * loss) );

						mods.Add( mod );
						mob.AddSkillMod( mod );
					}
				}

				mob.AddStatMod( new StatMod( StatType.Str, "Murder Penalty Str", -(int)(mob.RawStr * loss), lossperiod ) );
				mob.AddStatMod( new StatMod( StatType.Dex, "Murder Penalty Dex", -(int)(mob.RawDex * loss), lossperiod ) );
				mob.AddStatMod( new StatMod( StatType.Int, "Murder Penalty Int", -(int)(mob.RawInt * loss), lossperiod ) );

				context.m_Timer = Timer.DelayCall<Mobile>( lossperiod, new TimerStateCallback<Mobile>( ClearSkillLoss_Callback ), mob );
			}
		}
Beispiel #12
0
		public static void ApplySkillLoss(Mobile mob)
		{
			SkillLossContext context;

			if (!m_SkillLoss.TryGetValue(mob, out context))
			{
				m_SkillLoss.Add(mob, context = new SkillLossContext());
			}
			else if (context == null)
			{
				m_SkillLoss[mob] = context = new SkillLossContext();
			}
			else
			{
				return;
			}

			List<SkillMod> mods = context.m_Mods = new List<SkillMod>();

			foreach (Skill sk in mob.Skills)
			{
				double baseValue = sk.Base;

				if (baseValue <= 0)
				{
					continue;
				}

				SkillMod mod = new DefaultSkillMod(sk.SkillName, true, -(baseValue * SkillLossFactor));

				mods.Add(mod);
				mob.AddSkillMod(mod);
			}

			//PlayerState ps = PlayerState.Find( mob );

		    context.m_Timer = Timer.DelayCall(SkillLossPeriod, ClearSkillLoss_Callback, mob);
		}
        public static void ApplySkillLoss( Mobile mob )
        {
            SkillLossContext context;
            m_SkillLoss.TryGetValue( mob, out context );

            if ( context == null )
            {
                context = new SkillLossContext();
                m_SkillLoss[mob] = context;

                List<SkillMod> mods = context.m_Mods = new List<SkillMod>();

                for ( int i = 0; i < mob.Skills.Length; ++i )
                {
                    Skill sk = mob.Skills[i];
                    double baseValue = sk.Base;

                    if ( baseValue > 0 )
                    {
                        SkillMod mod = new DefaultSkillMod( sk.SkillName, true, -(baseValue * SkillLossFactor) );

                        mods.Add( mod );
                        mob.AddSkillMod( mod );
                    }
                }

                // Added by Silver: Skill Loss Reduction
                Faction faction = Faction.Find( mob );
                int towns = faction.OwnedTowns;

                TimeSpan lossReduction = TimeSpan.FromMinutes( 0.25 - ( 0.025 * towns ) );

                //PlayerState ps = PlayerState.Find( mob );

                context.m_Timer = Timer.DelayCall( SkillLossPeriod - lossReduction, new TimerStateCallback( ClearSkillLoss_Callback ), mob );
            }
        }
Beispiel #14
0
        public static void ApplySkillLoss( Mobile mob )
        {
            SkillLossContext context = (SkillLossContext)m_SkillLoss[mob];

            if ( context != null )
                return;

            context = new SkillLossContext();
            m_SkillLoss[mob] = context;

            ArrayList mods = context.m_Mods = new ArrayList();

            int ShortsLost = mob.ShortTermMurders/2;
            double SkillLossFactor = Math.Min(ShortsLost*0.01,0.5); //1 percent per short. Max 50%.
            TimeSpan SkillLossPeriod = TimeSpan.FromMinutes(10 + Math.Min(50, ShortsLost)); //10 to 60 minutes.
            //mob.ShortTermMurders -= ShortsLost; //Lose half your shorts. Disable till title system set up.

            for ( int i = 0; i < mob.Skills.Length; ++i )
            {
                Skill sk = mob.Skills[i];
                double baseValue = sk.Base;

                if ( baseValue > 0 )
                {
                    SkillMod mod = new DefaultSkillMod( sk.SkillName, true, -(baseValue * SkillLossFactor) );

                    mods.Add( mod );
                    mob.AddSkillMod( mod );
                }
            }

            mob.SendMessage(String.Format("You have lost {0}% of your skill for {1} minutes for being a criminal.", (int)(SkillLossFactor*100), 10 + Math.Min(50, ShortsLost)));

            context.m_Timer = Timer.DelayCall( SkillLossPeriod, new TimerStateCallback( ClearSkillLoss_Callback ), mob );
        }
		public static void ApplySkillLoss( Mobile mob )
		{
			SkillLossContext context = (SkillLossContext)m_SkillLoss[mob];

			if ( context != null )
				return;

			context = new SkillLossContext();
			m_SkillLoss[mob] = context;

			ArrayList mods = context.m_Mods = new ArrayList();

			for ( int i = 0; i < mob.Skills.Length; ++i )
			{
				Skill sk = mob.Skills[i];
				double baseValue = sk.Base;

				if ( baseValue > 0 )
				{
					SkillMod mod = new DefaultSkillMod( sk.SkillName, true, -(baseValue * SkillLossFactor) );

					mods.Add( mod );
					mob.AddSkillMod( mod );
				}
			}


			// jakob, added this to shorten skillloss timer by 1 minute per owned town
			int ownedTowns = 0;
			PlayerState ps = PlayerState.Find( mob );
			if ( ps != null )
				foreach ( Town town in Town.Towns )
				{
					if ( town.Owner == ps.Faction )
						ownedTowns++;
				}

			context.m_Timer = Timer.DelayCall( SkillLossPeriod - TimeSpan.FromMinutes( (double)ownedTowns ), new TimerStateCallback( ClearSkillLoss_Callback ), mob );
			// end
		}