Example #1
0
        /// <summary>
        /// パーティを監視する
        /// </summary>
        public void WatchParty()
        {
            // パーティメンバの情報を取得する
            var player    = this.GetPlayer();
            var partyList = this.GetCombatantListParty();

            // パーティリストに存在しないメンバの前回の状態を消去する
            var removeList = new List <PreviousPartyMemberStatus>();

            foreach (var previouseMember in previouseParyMemberList)
            {
                if (!partyList.Any(x => x.ID == previouseMember.ID))
                {
                    removeList.Add(previouseMember);
                }
            }

            foreach (var removeMember in removeList)
            {
                this.previouseParyMemberList.Remove(removeMember);
            }

            foreach (var partyMember in partyList)
            {
                // このPTメンバの現在の状態を取得する
                var hp  = partyMember.CurrentHP;
                var hpp =
                    partyMember.MaxHP != 0 ?
                    ((decimal)partyMember.CurrentHP / (decimal)partyMember.MaxHP) * 100m :
                    0m;

                var mp  = partyMember.CurrentMP;
                var mpp =
                    partyMember.MaxMP != 0 ?
                    ((decimal)partyMember.CurrentMP / (decimal)partyMember.MaxMP) * 100m :
                    0m;

                var tp  = partyMember.CurrentTP;
                var tpp = ((decimal)partyMember.CurrentTP / 1000m) * 100m;

                // このPTメンバの直前の情報を取得する
                var previousePartyMember = (
                    from x in this.previouseParyMemberList
                    where
                    x.ID == partyMember.ID
                    select
                    x).FirstOrDefault();

                if (previousePartyMember == null)
                {
                    previousePartyMember = new PreviousPartyMemberStatus()
                    {
                        ID     = partyMember.ID,
                        Name   = partyMember.Name,
                        HPRate = hpp,
                        MPRate = mpp,
                        TPRate = tpp
                    };

                    this.previouseParyMemberList.Add(previousePartyMember);
                }

                // 読上げ用の名前「ジョブ名+イニシャル」とする
                var pcname =
                    GetJobNameToSpeak(partyMember.Job) +
                    partyMember.Name.Trim().Substring(0, 1);

                // 読上げ用のテキストを編集する
                var hpTextToSpeak = TTSYukkuriConfig.Default.OptionSettings.HPTextToSpeack;
                var mpTextToSpeak = TTSYukkuriConfig.Default.OptionSettings.MPTextToSpeack;
                var tpTextToSpeak = TTSYukkuriConfig.Default.OptionSettings.TPTextToSpeack;

                hpTextToSpeak = hpTextToSpeak.Replace("<pcname>", pcname);
                hpTextToSpeak = hpTextToSpeak.Replace("<hp>", hp.ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<hpp>", decimal.ToInt32(hpp).ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<mp>", mp.ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<mpp>", decimal.ToInt32(mpp).ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<tp>", tp.ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<tpp>", decimal.ToInt32(tpp).ToString());

                mpTextToSpeak = mpTextToSpeak.Replace("<pcname>", pcname);
                mpTextToSpeak = mpTextToSpeak.Replace("<hp>", hp.ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<hpp>", decimal.ToInt32(hpp).ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<mp>", mp.ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<mpp>", decimal.ToInt32(mpp).ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<tp>", tp.ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<tpp>", decimal.ToInt32(tpp).ToString());

                tpTextToSpeak = tpTextToSpeak.Replace("<pcname>", pcname);
                tpTextToSpeak = tpTextToSpeak.Replace("<hp>", hp.ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<hpp>", decimal.ToInt32(hpp).ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<mp>", mp.ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<mpp>", decimal.ToInt32(mpp).ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<tp>", tp.ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<tpp>", decimal.ToInt32(tpp).ToString());

                // HPをチェックして読上げる
                if (TTSYukkuriConfig.Default.OptionSettings.EnabledHPWatch &&
                    !string.IsNullOrWhiteSpace(hpTextToSpeak))
                {
                    if (this.IsWatchTarget(partyMember, player, "HP"))
                    {
                        if (hpp <= (decimal)TTSYukkuriConfig.Default.OptionSettings.HPThreshold &&
                            previousePartyMember.HPRate > (decimal)TTSYukkuriConfig.Default.OptionSettings.HPThreshold)
                        {
                            if ((DateTime.Now - this.lastHPNotice).TotalSeconds >= 6.0d)
                            {
                                this.Speak(hpTextToSpeak);
                                this.lastHPNotice = DateTime.Now;
                            }
                        }
                        else
                        {
                            if (hpp <= decimal.Zero && previousePartyMember.HPRate != decimal.Zero)
                            {
                                this.Speak(pcname + "、せんとうふのう。");
                                this.lastHPNotice = DateTime.Now;
                            }
                        }
                    }
                }

                // MPをチェックして読上げる
                if (hp > 0)
                {
                    if (TTSYukkuriConfig.Default.OptionSettings.EnabledMPWatch &&
                        !string.IsNullOrWhiteSpace(mpTextToSpeak))
                    {
                        if (this.IsWatchTarget(partyMember, player, "MP"))
                        {
                            if (mpp <= (decimal)TTSYukkuriConfig.Default.OptionSettings.MPThreshold &&
                                previousePartyMember.MPRate > (decimal)TTSYukkuriConfig.Default.OptionSettings.MPThreshold)
                            {
                                if ((DateTime.Now - this.lastMPNotice).TotalSeconds >= 6.0d)
                                {
                                    this.Speak(mpTextToSpeak);
                                    this.lastMPNotice = DateTime.Now;
                                }
                            }
                            else
                            {
                                if (mpp <= decimal.Zero && previousePartyMember.MPRate != decimal.Zero)
                                {
                                    this.Speak(pcname + "、MPなし。");
                                    this.lastMPNotice = DateTime.Now;
                                }
                            }
                        }
                    }
                }

                // TPをチェックして読上げる
                if (hp > 0)
                {
                    if (TTSYukkuriConfig.Default.OptionSettings.EnabledTPWatch &&
                        !string.IsNullOrWhiteSpace(tpTextToSpeak))
                    {
                        if (this.IsWatchTarget(partyMember, player, "TP"))
                        {
                            if (tpp <= (decimal)TTSYukkuriConfig.Default.OptionSettings.TPThreshold &&
                                previousePartyMember.TPRate > (decimal)TTSYukkuriConfig.Default.OptionSettings.TPThreshold)
                            {
                                if ((DateTime.Now - this.lastTPNotice).TotalSeconds >= 6.0d)
                                {
                                    this.Speak(tpTextToSpeak);
                                    this.lastTPNotice = DateTime.Now;
                                }
                            }
                            else
                            {
                                if (tpp <= decimal.Zero && previousePartyMember.TPRate != decimal.Zero)
                                {
                                    this.Speak(pcname + "、TPなし。");
                                    this.lastTPNotice = DateTime.Now;
                                }
                            }
                        }
                    }
                }

                // 今回の状態を保存する
                previousePartyMember.HPRate = hpp;
                previousePartyMember.MPRate = mpp;
                previousePartyMember.TPRate = tpp;
            }
        }
Example #2
0
        /// <summary>
        /// パーティを監視する
        /// </summary>
        public void WatchParty()
        {
            // パーティメンバの情報を取得する
            var player    = CombatantsManager.Instance.Player;
            var partyList = CombatantsManager.Instance.GetPartyList();

            // パーティリストに存在しないメンバの前回の状態を消去する
            this.previouseParyMemberList.RemoveAll(x =>
                                                   !partyList.Any(y => y.ID == x.ID));

            foreach (var partyMember in partyList)
            {
                // このPTメンバの現在の状態を取得する
                var hp  = partyMember.CurrentHP;
                var hpp =
                    partyMember.MaxHP != 0 ?
                    ((decimal)partyMember.CurrentHP / (decimal)partyMember.MaxHP) * 100m :
                    0m;

                var mp  = partyMember.CurrentMP;
                var mpp =
                    partyMember.MaxMP != 0 ?
                    ((decimal)partyMember.CurrentMP / (decimal)partyMember.MaxMP) * 100m :
                    0m;

                var tp  = partyMember.CurrentTP;
                var tpp = ((decimal)partyMember.CurrentTP / 1000m) * 100m;

                var gp  = partyMember.CurrentGP;
                var gpp =
                    partyMember.MaxGP != 0 ?
                    ((decimal)partyMember.CurrentGP / (decimal)partyMember.MaxGP) * 100m :
                    0m;

                // このPTメンバの直前の情報を取得する
                var previousePartyMember = (
                    from x in this.previouseParyMemberList
                    where
                    x.ID == partyMember.ID
                    select
                    x).FirstOrDefault();

                if (previousePartyMember == null)
                {
                    previousePartyMember = new PreviousPartyMemberStatus()
                    {
                        ID     = partyMember.ID,
                        Name   = partyMember.Name,
                        HPRate = hpp,
                        MPRate = mpp,
                        TPRate = tpp,
                        GPRate = gpp,
                    };

                    this.previouseParyMemberList.Add(previousePartyMember);
                }

                // 読上げ用の名前「ジョブ名+イニシャル」とする
                var pcname = string.Empty;
                var job    = string.Empty;
                if (partyMember.IsPlayer)
                {
                    switch (Settings.Default.UILocale)
                    {
                    case Locales.EN:
                        pcname = "You";
                        break;

                    case Locales.JA:
                        pcname = "自分";
                        break;

                    case Locales.CN:
                        pcname = "你";
                        break;

                    default:
                        pcname = "You";
                        break;
                    }

                    job = pcname;
                }
                else
                {
                    if (Settings.Default.UILocale == Locales.CN)
                    {
                        pcname = $"{partyMember.Name.Trim()}";
                    }
                    else
                    {
                        pcname = $"{partyMember.JobID.GetPhonetic()} {partyMember.Name.Trim().Substring(0, 1)}";
                    }

                    job = partyMember.JobID.GetPhonetic();
                }

                // 読上げ用のテキストを編集する
                var hpTextToSpeak = Settings.Default.StatusAlertSettings.HPTextToSpeack;
                var mpTextToSpeak = Settings.Default.StatusAlertSettings.MPTextToSpeack;
                var tpTextToSpeak = Settings.Default.StatusAlertSettings.TPTextToSpeack;
                var gpTextToSpeak = Settings.Default.StatusAlertSettings.GPTextToSpeack;

                hpTextToSpeak = replaceTTS(hpTextToSpeak);
                mpTextToSpeak = replaceTTS(mpTextToSpeak);
                tpTextToSpeak = replaceTTS(tpTextToSpeak);
                gpTextToSpeak = replaceTTS(gpTextToSpeak);

                var isUsingJob = false;

                string replaceTTS(string tts)
                {
                    if (tts.Contains("<job>"))
                    {
                        isUsingJob = true;
                    }

                    tts = tts.Replace("<pcname>", pcname);
                    tts = tts.Replace("<job>", job);
                    tts = tts.Replace("<hp>", hp.ToString());
                    tts = tts.Replace("<hpp>", decimal.ToInt32(hpp).ToString());
                    tts = tts.Replace("<mp>", mp.ToString());
                    tts = tts.Replace("<mpp>", decimal.ToInt32(mpp).ToString());
                    tts = tts.Replace("<tp>", tp.ToString());
                    tts = tts.Replace("<tpp>", decimal.ToInt32(tpp).ToString());
                    tts = tts.Replace("<gp>", gp.ToString());
                    tts = tts.Replace("<gpp>", decimal.ToInt32(gpp).ToString());
                    return(tts);
                }

                var deadman = isUsingJob ? job : pcname;

                // 設定へのショートカット
                var config = Settings.Default.StatusAlertSettings;

                // HPをチェックして読上げる
                if (config.EnabledHPAlert &&
                    !string.IsNullOrWhiteSpace(hpTextToSpeak))
                {
                    if (this.IsWatchTarget(partyMember, player, "HP"))
                    {
                        if (hpp <= (decimal)config.HPThreshold &&
                            previousePartyMember.HPRate > (decimal)config.HPThreshold)
                        {
                            if ((DateTime.Now - this.lastHPNotice).TotalSeconds >= NoticeInterval)
                            {
                                this.Speak(hpTextToSpeak, config.NoticeDeviceForHP, config.NoticeVoicePaletteForHP);
                                this.lastHPNotice = DateTime.Now;
                            }
                        }
                        else
                        {
                            if (hpp <= decimal.Zero && previousePartyMember.HPRate != decimal.Zero)
                            {
                                this.SpeakEmpty("HP", deadman, config.NoticeDeviceForHP, config.NoticeVoicePaletteForHP);
                                this.lastHPNotice = DateTime.Now;
                            }
                        }
                    }
                }

                // MPをチェックして読上げる
                if (hp > 0)
                {
                    if (config.EnabledMPAlert &&
                        !string.IsNullOrWhiteSpace(mpTextToSpeak))
                    {
                        if (this.IsWatchTarget(partyMember, player, "MP"))
                        {
                            if (mpp <= (decimal)config.MPThreshold &&
                                previousePartyMember.MPRate > (decimal)config.MPThreshold)
                            {
                                if ((DateTime.Now - this.lastMPNotice).TotalSeconds >= NoticeInterval)
                                {
                                    this.Speak(mpTextToSpeak, config.NoticeDeviceForMP, config.NoticeVoicePaletteForMP);
                                    this.lastMPNotice = DateTime.Now;
                                }
                            }
                            else
                            {
                                if (mpp <= decimal.Zero && previousePartyMember.MPRate != decimal.Zero)
                                {
                                    this.SpeakEmpty("MP", deadman, config.NoticeDeviceForMP, config.NoticeVoicePaletteForMP);
                                    this.lastMPNotice = DateTime.Now;
                                }
                            }
                        }
                    }
                }

                // TPをチェックして読上げる
                if (hp > 0)
                {
                    if (config.EnabledTPAlert &&
                        !string.IsNullOrWhiteSpace(tpTextToSpeak))
                    {
                        if (this.IsWatchTarget(partyMember, player, "TP"))
                        {
                            if (tpp <= (decimal)config.TPThreshold &&
                                previousePartyMember.TPRate > (decimal)config.TPThreshold)
                            {
                                if ((DateTime.Now - this.lastTPNotice).TotalSeconds >= NoticeInterval)
                                {
                                    this.Speak(tpTextToSpeak, config.NoticeDeviceForTP, config.NoticeVoicePaletteForTP);
                                    this.lastTPNotice = DateTime.Now;
                                }
                            }
                            else
                            {
                                if (tpp <= decimal.Zero && previousePartyMember.TPRate != decimal.Zero)
                                {
                                    this.SpeakEmpty("TP", deadman, config.NoticeDeviceForTP, config.NoticeVoicePaletteForTP);
                                    this.lastTPNotice = DateTime.Now;
                                }
                            }
                        }
                    }
                }

                // GPをチェックして読上げる
                if (hp > 0 &&
                    partyMember.MaxGP > 0)
                {
                    if (config.EnabledGPAlert &&
                        !string.IsNullOrWhiteSpace(gpTextToSpeak))
                    {
                        if (this.IsWatchTarget(partyMember, player, "GP"))
                        {
                            if (gpp >= (decimal)config.GPThreshold &&
                                previousePartyMember.GPRate < (decimal)config.GPThreshold)
                            {
                                if ((DateTime.Now - this.lastGPNotice).TotalSeconds >= NoticeInterval)
                                {
                                    this.Speak(gpTextToSpeak, config.NoticeDeviceForGP, config.NoticeVoicePaletteForGP);
                                    this.lastGPNotice = DateTime.Now;
                                }
                            }
                            else
                            {
                                if (gpp >= 100m && previousePartyMember.GPRate < 100m)
                                {
                                    this.SpeakEmpty("GP", deadman, config.NoticeDeviceForGP, config.NoticeVoicePaletteForGP);
                                    this.lastGPNotice = DateTime.Now;
                                }
                            }
                        }
                    }
                }

                // 今回の状態を保存する
                previousePartyMember.HPRate = hpp;
                previousePartyMember.MPRate = mpp;
                previousePartyMember.TPRate = tpp;
                previousePartyMember.GPRate = gpp;
            }
        }
        /// <summary>
        /// パーティを監視する
        /// </summary>
        public void WatchParty()
        {
            // パーティメンバの情報を取得する
            var player = this.GetPlayer();
            var partyList = this.GetCombatantListParty();

            // パーティリストに存在しないメンバの前回の状態を消去する
            var removeList = new List<PreviousPartyMemberStatus>();
            foreach (var previouseMember in previouseParyMemberList)
            {
                if (!partyList.Any(x => x.ID == previouseMember.ID))
                {
                    removeList.Add(previouseMember);
                }
            }

            foreach (var removeMember in removeList)
            {
                this.previouseParyMemberList.Remove(removeMember);
            }

            foreach (var partyMember in partyList)
            {
                // このPTメンバの現在の状態を取得する
                var hp = partyMember.CurrentHP;
                var hpp =
                    partyMember.MaxHP != 0 ?
                    ((decimal)partyMember.CurrentHP / (decimal)partyMember.MaxHP) * 100m :
                    0m;

                var mp = partyMember.CurrentMP;
                var mpp =
                    partyMember.MaxMP != 0 ?
                    ((decimal)partyMember.CurrentMP / (decimal)partyMember.MaxMP) * 100m :
                    0m;

                var tp = partyMember.CurrentTP;
                var tpp = ((decimal)partyMember.CurrentTP / 1000m) * 100m;

                // このPTメンバの直前の情報を取得する
                var previousePartyMember = (
                    from x in this.previouseParyMemberList
                    where
                    x.ID == partyMember.ID
                    select
                    x).FirstOrDefault();

                if (previousePartyMember == null)
                {
                    previousePartyMember = new PreviousPartyMemberStatus()
                    {
                        ID = partyMember.ID,
                        Name = partyMember.Name,
                        HPRate = hpp,
                        MPRate = mpp,
                        TPRate = tpp
                    };

                    this.previouseParyMemberList.Add(previousePartyMember);
                }

                // 読上げ用の名前「ジョブ名+イニシャル」とする
                var pcname =
                    GetJobNameToSpeak(partyMember.Job) +
                    partyMember.Name.Trim().Substring(0, 1);

                // 読上げ用のテキストを編集する
                var hpTextToSpeak = TTSYukkuriConfig.Default.OptionSettings.HPTextToSpeack;
                var mpTextToSpeak = TTSYukkuriConfig.Default.OptionSettings.MPTextToSpeack;
                var tpTextToSpeak = TTSYukkuriConfig.Default.OptionSettings.TPTextToSpeack;

                hpTextToSpeak = hpTextToSpeak.Replace("<pcname>", pcname);
                hpTextToSpeak = hpTextToSpeak.Replace("<hp>", hp.ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<hpp>", decimal.ToInt32(hpp).ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<mp>", mp.ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<mpp>", decimal.ToInt32(mpp).ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<tp>", tp.ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<tpp>", decimal.ToInt32(tpp).ToString());

                mpTextToSpeak = mpTextToSpeak.Replace("<pcname>", pcname);
                mpTextToSpeak = mpTextToSpeak.Replace("<hp>", hp.ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<hpp>", decimal.ToInt32(hpp).ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<mp>", mp.ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<mpp>", decimal.ToInt32(mpp).ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<tp>", tp.ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<tpp>", decimal.ToInt32(tpp).ToString());

                tpTextToSpeak = tpTextToSpeak.Replace("<pcname>", pcname);
                tpTextToSpeak = tpTextToSpeak.Replace("<hp>", hp.ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<hpp>", decimal.ToInt32(hpp).ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<mp>", mp.ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<mpp>", decimal.ToInt32(mpp).ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<tp>", tp.ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<tpp>", decimal.ToInt32(tpp).ToString());

                // HPをチェックして読上げる
                if (TTSYukkuriConfig.Default.OptionSettings.EnabledHPWatch &&
                    !string.IsNullOrWhiteSpace(hpTextToSpeak))
                {
                    if (this.IsWatchTarget(partyMember, player, "HP"))
                    {
                        if (hpp <= (decimal)TTSYukkuriConfig.Default.OptionSettings.HPThreshold &&
                            previousePartyMember.HPRate > (decimal)TTSYukkuriConfig.Default.OptionSettings.HPThreshold)
                        {
                            if ((DateTime.Now - this.lastHPNotice).TotalSeconds >= 6.0d)
                            {
                                this.Speak(hpTextToSpeak);
                                this.lastHPNotice = DateTime.Now;
                            }
                        }
                        else
                        {
                            if (hpp <= decimal.Zero && previousePartyMember.HPRate != decimal.Zero)
                            {
                                this.Speak(pcname + "、せんとうふのう。");
                                this.lastHPNotice = DateTime.Now;
                            }
                        }
                    }
                }

                // MPをチェックして読上げる
                if (hp > 0)
                {
                    if (TTSYukkuriConfig.Default.OptionSettings.EnabledMPWatch &&
                        !string.IsNullOrWhiteSpace(mpTextToSpeak))
                    {
                        if (this.IsWatchTarget(partyMember, player, "MP"))
                        {
                            if (mpp <= (decimal)TTSYukkuriConfig.Default.OptionSettings.MPThreshold &&
                                previousePartyMember.MPRate > (decimal)TTSYukkuriConfig.Default.OptionSettings.MPThreshold)
                            {
                                if ((DateTime.Now - this.lastMPNotice).TotalSeconds >= 6.0d)
                                {
                                    this.Speak(mpTextToSpeak);
                                    this.lastMPNotice = DateTime.Now;
                                }
                            }
                            else
                            {
                                if (mpp <= decimal.Zero && previousePartyMember.MPRate != decimal.Zero)
                                {
                                    this.Speak(pcname + "、MPなし。");
                                    this.lastMPNotice = DateTime.Now;
                                }
                            }
                        }
                    }
                }

                // TPをチェックして読上げる
                if (hp > 0)
                {
                    if (TTSYukkuriConfig.Default.OptionSettings.EnabledTPWatch &&
                        !string.IsNullOrWhiteSpace(tpTextToSpeak))
                    {
                        if (this.IsWatchTarget(partyMember, player, "TP"))
                        {
                            if (tpp <= (decimal)TTSYukkuriConfig.Default.OptionSettings.TPThreshold &&
                                previousePartyMember.TPRate > (decimal)TTSYukkuriConfig.Default.OptionSettings.TPThreshold)
                            {
                                if ((DateTime.Now - this.lastTPNotice).TotalSeconds >= 6.0d)
                                {
                                    this.Speak(tpTextToSpeak);
                                    this.lastTPNotice = DateTime.Now;
                                }
                            }
                            else
                            {
                                if (tpp <= decimal.Zero && previousePartyMember.TPRate != decimal.Zero)
                                {
                                    this.Speak(pcname + "、TPなし。");
                                    this.lastTPNotice = DateTime.Now;
                                }
                            }
                        }
                    }
                }

                // 今回の状態を保存する
                previousePartyMember.HPRate = hpp;
                previousePartyMember.MPRate = mpp;
                previousePartyMember.TPRate = tpp;
            }
        }
        /// <summary>
        /// パーティを監視する
        /// </summary>
        public void WatchParty()
        {
            // パーティメンバの情報を取得する
            var player    = FFXIVPlugin.Instance.GetPlayer();
            var partyList = FFXIVPlugin.Instance.GetPartyList();

            // パーティリストに存在しないメンバの前回の状態を消去する
            this.previouseParyMemberList.RemoveAll(x =>
                                                   !partyList.Any(y => y.ID == x.ID));

            foreach (var partyMember in partyList)
            {
                // このPTメンバの現在の状態を取得する
                var hp  = partyMember.CurrentHP;
                var hpp =
                    partyMember.MaxHP != 0 ?
                    ((decimal)partyMember.CurrentHP / (decimal)partyMember.MaxHP) * 100m :
                    0m;

                var mp  = partyMember.CurrentMP;
                var mpp =
                    partyMember.MaxMP != 0 ?
                    ((decimal)partyMember.CurrentMP / (decimal)partyMember.MaxMP) * 100m :
                    0m;

                var tp  = partyMember.CurrentTP;
                var tpp = ((decimal)partyMember.CurrentTP / 1000m) * 100m;

                // このPTメンバの直前の情報を取得する
                var previousePartyMember = (
                    from x in this.previouseParyMemberList
                    where
                    x.ID == partyMember.ID
                    select
                    x).FirstOrDefault();

                if (previousePartyMember == null)
                {
                    previousePartyMember = new PreviousPartyMemberStatus()
                    {
                        ID     = partyMember.ID,
                        Name   = partyMember.Name,
                        HPRate = hpp,
                        MPRate = mpp,
                        TPRate = tpp
                    };

                    this.previouseParyMemberList.Add(previousePartyMember);
                }

                // 読上げ用の名前「ジョブ名+イニシャル」とする
                var pcname = string.Empty;
                if (partyMember.IsPlayer)
                {
                    switch (Settings.Default.UILocale)
                    {
                    case Locales.EN:
                        pcname = "You";
                        break;

                    case Locales.JA:
                        pcname = "自分";
                        break;
                    }
                }
                else
                {
                    pcname = $"{partyMember.JobID.GetPhonetic()} { partyMember.Name.Trim().Substring(0, 1)}";
                }

                // 読上げ用のテキストを編集する
                var hpTextToSpeak = Settings.Default.StatusAlertSettings.HPTextToSpeack;
                var mpTextToSpeak = Settings.Default.StatusAlertSettings.MPTextToSpeack;
                var tpTextToSpeak = Settings.Default.StatusAlertSettings.TPTextToSpeack;

                hpTextToSpeak = hpTextToSpeak.Replace("<pcname>", pcname);
                hpTextToSpeak = hpTextToSpeak.Replace("<hp>", hp.ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<hpp>", decimal.ToInt32(hpp).ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<mp>", mp.ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<mpp>", decimal.ToInt32(mpp).ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<tp>", tp.ToString());
                hpTextToSpeak = hpTextToSpeak.Replace("<tpp>", decimal.ToInt32(tpp).ToString());

                mpTextToSpeak = mpTextToSpeak.Replace("<pcname>", pcname);
                mpTextToSpeak = mpTextToSpeak.Replace("<hp>", hp.ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<hpp>", decimal.ToInt32(hpp).ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<mp>", mp.ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<mpp>", decimal.ToInt32(mpp).ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<tp>", tp.ToString());
                mpTextToSpeak = mpTextToSpeak.Replace("<tpp>", decimal.ToInt32(tpp).ToString());

                tpTextToSpeak = tpTextToSpeak.Replace("<pcname>", pcname);
                tpTextToSpeak = tpTextToSpeak.Replace("<hp>", hp.ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<hpp>", decimal.ToInt32(hpp).ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<mp>", mp.ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<mpp>", decimal.ToInt32(mpp).ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<tp>", tp.ToString());
                tpTextToSpeak = tpTextToSpeak.Replace("<tpp>", decimal.ToInt32(tpp).ToString());

                // HPをチェックして読上げる
                if (Settings.Default.StatusAlertSettings.EnabledHPAlert &&
                    !string.IsNullOrWhiteSpace(hpTextToSpeak))
                {
                    if (this.IsWatchTarget(partyMember, player, "HP"))
                    {
                        if (hpp <= (decimal)Settings.Default.StatusAlertSettings.HPThreshold &&
                            previousePartyMember.HPRate > (decimal)Settings.Default.StatusAlertSettings.HPThreshold)
                        {
                            if ((DateTime.Now - this.lastHPNotice).TotalSeconds >= NoticeInterval)
                            {
                                this.Speak(hpTextToSpeak);
                                this.lastHPNotice = DateTime.Now;
                            }
                        }
                        else
                        {
                            if (hpp <= decimal.Zero && previousePartyMember.HPRate != decimal.Zero)
                            {
                                this.SpeakEmpty("HP", pcname);
                                this.lastHPNotice = DateTime.Now;
                            }
                        }
                    }
                }

                // MPをチェックして読上げる
                if (hp > 0)
                {
                    if (Settings.Default.StatusAlertSettings.EnabledMPAlert &&
                        !string.IsNullOrWhiteSpace(mpTextToSpeak))
                    {
                        if (this.IsWatchTarget(partyMember, player, "MP"))
                        {
                            if (mpp <= (decimal)Settings.Default.StatusAlertSettings.MPThreshold &&
                                previousePartyMember.MPRate > (decimal)Settings.Default.StatusAlertSettings.MPThreshold)
                            {
                                if ((DateTime.Now - this.lastMPNotice).TotalSeconds >= NoticeInterval)
                                {
                                    this.Speak(mpTextToSpeak);
                                    this.lastMPNotice = DateTime.Now;
                                }
                            }
                            else
                            {
                                if (mpp <= decimal.Zero && previousePartyMember.MPRate != decimal.Zero)
                                {
                                    this.SpeakEmpty("MP", pcname);
                                    this.lastMPNotice = DateTime.Now;
                                }
                            }
                        }
                    }
                }

                // TPをチェックして読上げる
                if (hp > 0)
                {
                    if (Settings.Default.StatusAlertSettings.EnabledTPAlert &&
                        !string.IsNullOrWhiteSpace(tpTextToSpeak))
                    {
                        if (this.IsWatchTarget(partyMember, player, "TP"))
                        {
                            if (tpp <= (decimal)Settings.Default.StatusAlertSettings.TPThreshold &&
                                previousePartyMember.TPRate > (decimal)Settings.Default.StatusAlertSettings.TPThreshold)
                            {
                                if ((DateTime.Now - this.lastTPNotice).TotalSeconds >= NoticeInterval)
                                {
                                    this.Speak(tpTextToSpeak);
                                    this.lastTPNotice = DateTime.Now;
                                }
                            }
                            else
                            {
                                if (tpp <= decimal.Zero && previousePartyMember.TPRate != decimal.Zero)
                                {
                                    this.SpeakEmpty("TP", pcname);
                                    this.lastTPNotice = DateTime.Now;
                                }
                            }
                        }
                    }
                }

                // 今回の状態を保存する
                previousePartyMember.HPRate = hpp;
                previousePartyMember.MPRate = mpp;
                previousePartyMember.TPRate = tpp;
            }
        }