protected override void OnTarget(Mobile from, object target) { m_Squire.RevealingAction(); m_Squire.NextSkillTime = Core.TickCount + 1000; if (!m_Instrument.IsChildOf(m_Squire.Backpack)) { if (m_Squire.m_SquireBeQuiet == false) { SquireDialog.DoSquireDialog(from, m_Squire, SquireDialogTree.WheredMyInstrumentGo, null, null); } } else if (target is Mobile) { Mobile targ = (Mobile)target; if (targ == m_Squire || targ == from || (targ is BaseCreature && (((BaseCreature)targ).BardImmune || !m_Squire.CanBeHarmful(targ, false)) && ((BaseCreature)targ).ControlMaster != from)) { if (m_Squire.m_SquireBeQuiet == false) { SquireDialog.DoSquireDialog(from, m_Squire, SquireDialogTree.CantDiscord, null, null); } } else if (Discordance.m_Table.Contains(targ)) { if (m_Squire.m_SquireBeQuiet == false) { SquireDialog.DoSquireDialog(from, m_Squire, SquireDialogTree.AlreadyDiscord, null, null); } } else if (!targ.Player) { double diff = m_Instrument.GetDifficultyFor(targ) - 10.0; double music = m_Squire.Skills[SkillName.Musicianship].Value; if (music > 100.0) diff -= (music - 100.0) * 0.5; if (!BaseInstrument.CheckMusicianship(m_Squire)) { if (m_Squire.m_SquireBeQuiet == false) { SquireDialog.DoSquireDialog(from, m_Squire, SquireDialogTree.BadPerformance, null, null); } m_Instrument.PlayInstrumentBadly(m_Squire); m_Instrument.ConsumeUse(m_Squire); } else if (m_Squire.CheckTargetSkill(SkillName.Discordance, target, diff - 25.0, diff + 25.0)) { if (m_Squire.m_SquireBeQuiet == false) { SquireDialog.DoSquireDialog(from, m_Squire, SquireDialogTree.GoodPerformanceDiscord, null, null); } m_Instrument.PlayInstrumentWell(m_Squire); m_Instrument.ConsumeUse(m_Squire); ArrayList mods = new ArrayList(); int effect; double scalar; if (Core.AOS) { double discord = m_Squire.Skills[SkillName.Discordance].Value; if (discord > 100.0) effect = -20 + (int)((discord - 100.0) / -2.5); else effect = (int)(discord / -5.0); if (Core.SE && BaseInstrument.GetBaseDifficulty(targ) >= 160.0) effect /= 2; scalar = effect * 0.01; mods.Add(new ResistanceMod(ResistanceType.Physical, effect)); mods.Add(new ResistanceMod(ResistanceType.Fire, effect)); mods.Add(new ResistanceMod(ResistanceType.Cold, effect)); mods.Add(new ResistanceMod(ResistanceType.Poison, effect)); mods.Add(new ResistanceMod(ResistanceType.Energy, effect)); for (int i = 0; i < targ.Skills.Length; ++i) { if (targ.Skills[i].Value > 0) mods.Add(new DefaultSkillMod((SkillName)i, true, targ.Skills[i].Value * scalar)); } } else { effect = (int)(m_Squire.Skills[SkillName.Discordance].Value / -5.0); scalar = effect * 0.01; mods.Add(new StatMod(StatType.Str, "DiscordanceStr", (int)(targ.RawStr * scalar), TimeSpan.Zero)); mods.Add(new StatMod(StatType.Int, "DiscordanceInt", (int)(targ.RawInt * scalar), TimeSpan.Zero)); mods.Add(new StatMod(StatType.Dex, "DiscordanceDex", (int)(targ.RawDex * scalar), TimeSpan.Zero)); for (int i = 0; i < targ.Skills.Length; ++i) { if (targ.Skills[i].Value > 0) mods.Add(new DefaultSkillMod((SkillName)i, true, targ.Skills[i].Value * scalar)); } } Discordance.DiscordanceInfo info = new Discordance.DiscordanceInfo(m_Squire, targ, Math.Abs(effect), mods); info.m_Timer = Timer.DelayCall<Discordance.DiscordanceInfo>(TimeSpan.Zero, TimeSpan.FromSeconds(1.25), new TimerStateCallback<Discordance.DiscordanceInfo>(Discordance.ProcessDiscordance), info); Discordance.m_Table[targ] = info; } else { if (m_Squire.m_SquireBeQuiet == false) { SquireDialog.DoSquireDialog(from, m_Squire, SquireDialogTree.FailedPerformanceDiscord, null, null); } m_Instrument.PlayInstrumentBadly(m_Squire); m_Instrument.ConsumeUse(m_Squire); } m_Squire.NextSkillTime = Core.TickCount + 12000; } else { m_Instrument.PlayInstrumentBadly(m_Squire); } } else { if (m_Squire.m_SquireBeQuiet == false) { SquireDialog.DoSquireDialog(from, m_Squire, SquireDialogTree.CantDiscord, null, null); } } }
public void DoDiscordance() { DebugSay( "I Discord!" ); TimeSpan len = TimeSpan.FromSeconds( this.Skills[SkillName.Discordance].Value * 2 ); double diff = BaseInstrument.GetBaseDifficulty( Combatant ) - 10.0; double music = this.Skills[SkillName.Musicianship].Value; if ( music > 100.0 ) diff -= ( music - 100.0 ) * 0.5; if ( this.CheckTargetSkill( SkillName.Discordance, Combatant, diff - 25.0, diff + 25.0 ) ) { DebugSay( "Discord success!" ); ArrayList mods = new ArrayList(); int effect; double scalar; double discord = this.Skills[SkillName.Discordance].Value; if ( discord > 100.0 ) effect = -20 + (int) ( ( discord - 100.0 ) / -2.5 ); else effect = (int) ( discord / -5.0 ); if ( BaseInstrument.GetBaseDifficulty( Combatant ) >= 160.0 ) effect /= 2; scalar = effect * 0.01; mods.Add( new ResistanceMod( ResistanceType.Physical, effect ) ); mods.Add( new ResistanceMod( ResistanceType.Fire, effect ) ); mods.Add( new ResistanceMod( ResistanceType.Cold, effect ) ); mods.Add( new ResistanceMod( ResistanceType.Poison, effect ) ); mods.Add( new ResistanceMod( ResistanceType.Energy, effect ) ); for ( int i = 0; i < Combatant.Skills.Length; ++i ) { if ( Combatant.Skills[i].Value > 0 ) mods.Add( new DefaultSkillMod( (SkillName) i, true, Combatant.Skills[i].Value * scalar ) ); } Discordance.DiscordanceInfo info = new Discordance.DiscordanceInfo( this, Combatant, len, Math.Abs( effect ), mods ); info.m_Timer = Timer.DelayCall( TimeSpan.Zero, TimeSpan.FromSeconds( 1.25 ), new TimerStateCallback( ProcessDiscordance ), info ); Discordance.m_Table[Combatant] = info; this.PlaySound( SuccessSound ); } else { DebugSay( "Discord failure :(" ); this.PlaySound( FailureSound ); } }