Пример #1
0
        public void AddHeal(RecoverEventArgs e)
        {
            this.HealAmount += e.Amount;
            if (Class == ClassType.NONE)
            {
                Class = SkillDictionary.GetClass(e.Skill);
            }
            this.HealLogList.Add(e.log);
            HealSkillEntity entity = null;

            foreach (HealSkillEntity hse in HealList)
            {
                if (hse.Target == e.Name)
                {
                    entity = hse;
                    break;
                }
            }
            if (entity == null)
            {
                entity        = new HealSkillEntity();
                entity.Target = e.Name;
                this.HealList.Add(entity);
            }
            entity.TotalRecover += e.Amount;
            entity.Count++;
        }
Пример #2
0
        public void AddDamage(PlayerDamageEventArgs e)
        {
            //5초간 딜이 없다면 마지막시간으로
            //int temp = DateTime.Compare(e.Time, lastDataTime);
            int temp = e.Time.Subtract(lastDataTime).Seconds;

#if TICK
            if (temp > 0)
            {
                totalDealTime++;
            }
#else
            if (temp < 5 && temp >= 0)
            {
                TotalDealTime += temp;
            }
            else
            {
                TotalDealTime++;
            }
#endif
            TimeSpan timeSpan = e.Time - lastDataTime;
            lastDataTime = e.Time;

            TotalDamage += e.Damage;
            if (e.Damage > MaxDamage)
            {
                MaxDamage = e.Damage;
            }

            this.TotalDealCount++;
            if (e.Skill != "")
            {
                this.totalSkillDealCount++;
                if (Class == ClassType.NONE)
                {
                    Class = SkillDictionary.GetClass(e.Skill);
                    if (Class == ClassType.NONE)
                    {
                    }
                }
            }
            else
            {
                e.Skill = "평타";
                this.totalNormalDealCount++;
            }


            // NewTotalDealCount TotalNormalCancelCount MaxNormalCancelCount CurrentNormalCancelCount
            // 2013-05-30
            if (e.Skill == "평타")
            {
                NewTotalNormalDamage += e.Damage;
            }
            else
            {
                NewTotalSkillDamage += e.Damage;
            }

            // 2013-05-21
            if (NewTotalDealCount == 0) // 첫타는..
            {
                NewTotalDealCount++;
                if (e.Skill == "평타")
                {
                    NewTotalNormalDealCount++;
                }
                else
                {
                    NewTotalSkillDealCount++;
                }
            }
            else
            {
                if (isLastSkill == true && e.Skill != "평타") //스킬 & 스킬
                {
                    NewTotalDealCount++;
                    CurrentNormalCancelCount = 0;
                    NewTotalSkillDealCount++;
                }
                else if ((isLastSkill == true && e.Skill == "평타") || (isLastSkill == false && e.Skill != "평타")) // 스킬 & 평타
                {
                    NewTotalDealCount++;
                    if (timeSpan.TotalSeconds <= 3)
                    {
                        TotalNormalCancelCount++;
                        CurrentNormalCancelCount++;
                    }
                    else
                    {
                        CurrentNormalCancelCount = 0;
                    }
                    if (e.Skill == "평타")
                    {
                        NewTotalNormalDealCount++;
                    }
                    else
                    {
                        NewTotalSkillDealCount++;
                    }
                }
                else if (isLastSkill == false && e.Skill == "평타") //평타 & 평타
                {
                    if (timeSpan.TotalSeconds > 0)
                    {
                        NewTotalDealCount++;
                        NewTotalNormalDealCount++;
                        CurrentNormalCancelCount = 0;
                    }
                }
            }
            isLastSkill = (e.Skill != "평타");

            MaxNormalCancelCount = (CurrentNormalCancelCount > MaxNormalCancelCount) ? CurrentNormalCancelCount : MaxNormalCancelCount;
            PercentNormalCancel  = (NewTotalDealCount > 1) ? (TotalNormalCancelCount * 100 / (NewTotalDealCount - 1)) : 0;

            SkillEntity skillEntity = null;
            foreach (SkillEntity skill in SkillList)
            {
                if (skill.SkillName == e.Skill)
                {
                    skillEntity = skill;
                    break;
                }
            }
            if (skillEntity == null)
            {
                SkillEntity se = new SkillEntity();
                se.SkillName = e.Skill;
                SkillList.Add(se);
                skillEntity = se;
            }
            skillEntity.TotalDamage += e.Damage;
            skillEntity.Count++;
            if (e.bCritical)
            {
                skillEntity.CriticalCount++;
            }


            this.TotalCriticalDealCount = this.TotalCriticalDealCount + ((e.bCritical) ? 1 : 0);
            DPS           = (TotalDealTime > 0) ? (TotalDamage / this.TotalDealTime) : 0;
            percentSkill  = (TotalDealCount > 0) ? (totalSkillDealCount * 100 / TotalDealCount) : 0;
            percentNormal = (TotalDealCount > 0) ? (totalNormalDealCount * 100 / TotalDealCount) : 0;
            // 2013-05-10 평타는 아예 빼기 때문에 스킬만 계산
            percentCritical = (totalSkillDealCount > 0) ? (TotalCriticalDealCount * 100 / totalSkillDealCount) : 0;

            LogList.Add(e.log);
            LastTarget = e.Target;
        }
Пример #3
0
        private void ParseLine(string line)
        {
            //bool matched = false;

            try
            {
                if (String.IsNullOrEmpty(line))
                {
                    return;
                }
                MatchCollection matches;//, matches2;

                //2013.09.27 22:03:05 : [charname:소주빵;0.6275 1.0000 0.6275] 님의 귓속말: 65레벨 호법성 [cmd:NhkYrLsNIUzA4S2H8bKZ80VRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCMyFSf2E6oRjO/ARkAPeSAA==] [cmd:NhkYrLsNIUzA4S2H8bKZ80VRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCBFIJJAvhQDR0YvSr04J+Hw==]
                //2013.09.27 22:05:35 : [charname:소주빵;0.6275 1.0000 0.6275] 님의 귓속말: 65레벨 호법성 [cmd:NhkYrLsNIUzA4S2H8bKZ80VRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCU2f0SPAFix1Al20lxc5xrA==] [cmd:NhkYrLsNIUzA4S2H8bKZ80VRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCb1i817SotrLkxDzVpR19Tg==]
                //2013.09.27 23:13:44 : [charname:양주오빠;0.6275 1.0000 0.6275] 님의 귓속말: 65레벨 마도성 [cmd:PRsw2mUTV6+xEJEbzsUmjUVRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tC+rENLG7oLuN2jKnfHei2Cg==] [cmd:PRsw2mUTV6+xEJEbzsUmjUVRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCkf5+HgnjLItxN1XZDgINPQ=
                //2013.09.28 19:13:13 : 양맥-이스라펠 님의 귓속말: 65레벨 정령성 [cmd:QjDMbqN8fEG9MKRVzO8PGEVRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tC5MwvBuvh5IrzUzKexwiXyw==] [cmd:QjDMbqN8fEG9MKRVzO8PGEVRg5mfKVnkcIKURP7j+0JFUYOZnylZ5HCClET+4/tCxTXqOAN7CGj3YfYHyAkDrQ==]
                //파티지원포스지원Regex = new Regex(timeStampRegex + "\\[charname:(?<name>.+);(?<ignore>.+) 님의 귓속말: (?<level>.+) (?<class>.+) \\[cmd:(?<ignore2>.+) \\[cmd:(?<ignore3>.+)", RegexOptions.Compiled);
                matches = 티지원포스지원Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name = matches[0].Groups["name"].Value;
                    ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 6, name));
                    return;
                }

                matches = 통합파티지원포스지원Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name = matches[0].Groups["name"].Value;
                    ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 6, name));
                    return;
                }


                matches = 타인의채팅Regex.Matches(line);
                if (matches.Count > 0)
                {
                    return;
                }

                //도움말, 공지사항도 ?
                matches = 자신의채팅Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name = matches[0].Groups["name"].Value;
                    String   chat = matches[0].Groups["chat"].Value;

                    if (name.IndexOf(' ') == -1) //채널창이 아니면..이름에 빈칸이 없다면
                    {
                        /*
                         * if (name != Myname)
                         * {// 내이름 세팅
                         *  ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 0, name));
                         * }
                         */
                        if (chat.StartsWith("//이름"))
                        {
                            ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 0, name));
                        }
                        else if (chat.StartsWith("//템"))
                        {
                            String searchName = chat.Split(' ')[1];
                            ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 1, searchName));
                        }
                        else if (chat.StartsWith("//모두지우기"))
                        {
                            ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 2, null));
                        }
                        else if (chat.StartsWith("//도움말 바센1"))
                        {
                            String where = chat.Split(' ')[1];
                            ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 3, where));
                        }
                        else if (chat.StartsWith("//타이머"))
                        {
                            ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 5, null));
                        }
                        else if (chat.StartsWith("//"))
                        {
                            String tmp  = chat.Substring(2);
                            int    step = 0;
                            try
                            {
                                step = Int32.Parse(tmp);
                                ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 4, step + ""));
                            }
                            catch
                            {
                            }
                        }

                        /*
                         * else if (chat.Trim().Contains("사용 완료!"))
                         * {
                         * // 2013-07-15
                         * // 팻 18
                         * }
                         */
                        else if (name == "티아마트" || name == "마르쿠탄")
                        {
                            InstanceDungeonEvent(this, new InstanceDungeonEventArgs(line, time, 1, name, chat));
                        }
                        else
                        {
                            //if (name == "도움말" || name == "공지사항") return;
                            //2013-07-15
                            if (name.Trim() == "도움말" || name.Trim() == "공지사항")
                            {
                            }
                            else if (chat.Trim().EndsWith(".") || chat.Trim().EndsWith("!") || chat.Trim().EndsWith("?"))
                            {
                            }
                            else if (chat.Contains("니다"))
                            {
                            }
                            //2013-07-16 명령:

                            /*
                             * else if (name.Trim() == "명령" && chat.Contains("사용합니다")) ;
                             * else if (name.Trim() == "소환" && chat.Contains("소환했습니다")) ;
                             * else if (name.Trim() == "변신" && (chat.Contains("발생했습니다") || chat.Contains("변신했습니다") || chat.Contains("회복했습니다"))) ;
                             * else if (name.Trim() == "수면" && chat.EndsWith("니다.")) ;
                             */
                            else
                            {
                                // 2013-07-17 저주:
                                // 2013-07-15
                                // 여기까지 왔다면 이름을 세팅하자.
                                ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 0, name));
                            }
                        }
                    }
                    else if (name.EndsWith("소환") || name.EndsWith("변신") || name.EndsWith("강화") || name.EndsWith("보호") || name.EndsWith("저주"))
                    {
                        //스킬에 : 가 포함되어져 있는 것들이다.
                    }
                    else
                    {
                        InstanceDungeonEvent(this, new InstanceDungeonEventArgs(line, time, 1, name, chat));
                    }
                }

                //도움말, 공지사항도 ?
                matches = 지역채널에입장했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String where = matches[0].Groups["where"].Value;
                    InstanceDungeonEvent(this, new InstanceDungeonEventArgs(line, time, 0, where, null));
                    return;
                }



                matches = 대미지를줬습니다Regex.Matches(line);

                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name   = matches[0].Groups["name"].Value;
                    String   skill  = matches[0].Groups["skill"].Value;
                    String   target = matches[0].Groups["target"].Value;

                    int  damage    = matches[0].Groups["damage"].Value.GetDigits();
                    bool bCritical = false;

                    // 2013-05-07 평타는 계산하지 않는다.
                    // if (line.IndexOf("치명타") != -1) bCritical = true;
                    if (line.IndexOf("치명타") != -1 && skill != "")
                    {
                        bCritical = true;
                    }


                    if (name == "")
                    {
                        name = Myname;
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Attack, ""));
                    }
                    else if (name.IndexOf("의 정령") != -1 || name.IndexOf("의 기운") != -1)
                    {
                        DamageInflicted(this, new PlayerDamageEventArgs(line, time, Noname, name + "-" + skill, target, damage, bCritical));
                        return;
                    }
                    else if (name.IndexOf(' ') != -1 && skill.IndexOf(name) != -1)
                    {
                        DamageInflicted(this, new PlayerDamageEventArgs(line, time, Noname, name + "-" + skill, target, damage, bCritical));
                        return;
                    }
                    else if (name == "빙판" && skill.StartsWith("빙판") && skill.EndsWith("효과"))
                    {
                        DamageInflicted(this, new PlayerDamageEventArgs(line, time, Noname, name + "-" + skill, target, damage, bCritical));
                        return;
                    }
                    //2013-09-27 이벤트때문에 이런 이름들이 존나 많아짐
                    else if (name == "티아마트" || name == "마르쿠탄" || name == "히페리온" || name == "카이시넬" || name == "카룬")
                    {// 이름에 빈칸이 없지만..
                        // 이미 유저목록에 이 이름이 있다면 패스하자
                        if (mainForm.data.GetPlayer(name) == null)
                        {
                            // 위의 이름이 들어오고 스킬목록에 없다면 추가하지 않는다.
                            if (SkillDictionary.GetClass(skill) == ClassType.NONE)
                            {
                                return;
                            }
                        }
                    }
                    else if ((name.IndexOf(" ")) != -1)
                    {
                        // 여기까지 왔다면 몹이다.
                        return;
                    }


                    DamageInflicted(this, new PlayerDamageEventArgs(line, time, name, skill, target, damage, bCritical));

                    //matched = true;
                    return;
                }

                matches = 대미지를받았습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name   = matches[0].Groups["name"].Value;
                    String   skill  = matches[0].Groups["skill"].Value;
                    int      damage = matches[0].Groups["damage"].Value.GetDigits();
                    String   from   = matches[0].Groups["from"].Value;

                    if (name == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.BeBeaten1, damage + ""));
                    }
                    else
                    {
                        // 다른사람 피해, 중독 출혈 신석 도트
                        // 지연폭발류
                        bool bCritical = false;

                        // from은 없다.. 항상 효과
                        //2013.02.08 03:41:49 : 치명타! 땅의 정령이 시야랑에게서 564의 치명적인 대미지를 받았습니다.
                        if (line.IndexOf("치명타") != -1)
                        {
                            bCritical = true;
                        }

                        // 1818
                        if (line.IndexOf("어둠의 문양 파열") != -1)
                        {
                        }

                        if (name.EndsWith("어둠의 문양 파열 I 추"))
                        {
                            name  = name.Substring(0, name.Length - 15);
                            skill = "어둠의 문양 파열 I 추가 효과";
                        }

                        DamageInflicted(this, new PlayerDamageEventArgs(line, time, Noname, skill, name, damage, bCritical));

                        //matched = true;
                    }
                    return;
                }

                matches = 사용한영향으로대미지를받았습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      damage = matches[0].Groups["damage"].Value.GetDigits();
                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.BeBeaten2, damage + ""));
                }

                matches = 공격이반사되어대미지를받았습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      damage = matches[0].Groups["damage"].Value.GetDigits();
                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.BeBeaten3, damage + ""));
                    return;
                }

                //자힐.. 스킬..
                //만큼회복됐습니다Regex = new Regex(timeStampRegex + "(?<skill>.+)[을를] 사용해 (?<amount>[^a-zA-Z]+)만큼 (?<what>.+)[이가] 회복됐습니다", RegexOptions.Compiled);
                matches = 만큼회복됐습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   name   = LogParser.Myname;
                    String   skill  = matches[0].Groups["skill"].Value;

                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Heal1, ""));

                    RecoverEvent(this, new RecoverEventArgs(line, time, name, null, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }

                // 사용해만큼회복했습니다... 내가 치유다.. 힐을한다
                // 2013.09.27 00:39:19 : 치유의 빛 VI을 사용해 소주전용풍이 1,615만큼 생명력을 회복했습니다.
                //만큼회복했습니다Regex = new Regex(timeStampRegex + "(?<skill>.+)[을를] 사용해 (?<name>.+)[이가] (?<amount>[^a-zA-Z]+)만큼 (?<what>.+)[을를] 회복했습니다", RegexOptions.Compiled);
                matches = 만큼회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   who    = LogParser.Myname;
                    String   skill  = matches[0].Groups["skill"].Value;
                    String   name   = matches[0].Groups["name"].Value;
                    RecoverEvent(this, new RecoverEventArgs(line, time, name, who, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }



                //도트류? WHO가 없다.. 미분류 힐
                //효과로회복했습니다Regex = new Regex(timeStampRegex + "((?<name>.+)[이가] )?(?<skill>.+)의 효과로 (?<amount>[^a-zA-Z]+)의 (?<what>.+)을 회복했습니다", RegexOptions.Compiled);
                // 버그 : 2013.09.22 21:18:48 : 흑영귀-이스라펠이 고갈의 문양 폭발 III 추가 효과의 효과로 2,536의 생명력을 회복했습니다.
                matches = 추가효과의효과로회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   name   = matches[0].Groups["name"].Value;
                    String   skill  = matches[0].Groups["skill"].Value;
                    if (name == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Heal1, ""));
                        name = LogParser.Myname;
                    }
                    else if (name.IndexOf(" ") != -1)
                    {
                        return;
                    }

                    RecoverEvent(this, new RecoverEventArgs(line, time, name, null, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }

                matches = 효과로회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   name   = matches[0].Groups["name"].Value;
                    String   skill  = matches[0].Groups["skill"].Value;
                    if (name == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Heal1, ""));
                        name = LogParser.Myname;
                    }
                    else if (name.IndexOf(" ") != -1)
                    {
                        return;
                    }
                    RecoverEvent(this, new RecoverEventArgs(line, time, name, null, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }

                //사용해회복했습니다Regex = new Regex(timeStampRegex + "(?<name>.+)[이가] (?<skill>.+)[을를] 사용해 ((?<whom>.+)[이가] )?(?<amount>[^a-zA-Z]+)의 (?<what>.+)을 회복했습니다", RegexOptions.Compiled);
                //2013.09.22 21:11:40 : 나비가 온후한 울림 V을 사용해 에꾸가 1,778의 생명력을 회복했습니다.
                //2013.09.22 21:11:53 : 구라독종이 약초 치료 V을 사용해 818의 생명력을 회복했습니다.
                // 중요: 여기는 자기자신의 로그가 올수 없다. 자힐의 경우 만큼 회복이 된다
                // 치유의 기운이 소환: 치유의 기운 III을 사용해 깐따삐아가 394의 생명력을 회복했습니다.
                matches = 사용해회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   skill  = matches[0].Groups["skill"].Value;
                    String   name   = matches[0].Groups["name"].Value;
                    String   who    = matches[0].Groups["whom"].Value;
                    // who가 있다면.. 실제회복한 사람은 who이다
                    if (String.IsNullOrEmpty(who) == false)
                    {
                        name = who;
                        who  = matches[0].Groups["name"].Value;
                    }

                    if (name.IndexOf(" ") != -1)
                    {
                        return;
                    }
                    RecoverEvent(this, new RecoverEventArgs(line, time, name, who, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }


                // 이것도 무조건 나만.. 사용해회복했습니다와 쌍을 이룬다.
                // 사용해회복했습니다 : 무조건 다른사람
                // 사용한영향으로회복됐습니다 : 무조건 나만
                //사용한영향으로회복됐습니다Regex = new Regex(timeStampRegex + "(?<name>.+)[이가] 사용한 (?<skill>.+)의 영향으로 (?<amount>[^a-zA-Z]+)의 (?<what>.+)[이가] 회복됐습니다", RegexOptions.Compiled);
                matches = 사용한영향으로회복됐습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   name   = LogParser.Myname;
                    String   skill  = matches[0].Groups["skill"].Value;
                    String   who    = matches[0].Groups["name"].Value;

                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Heal2, ""));

                    RecoverEvent(this, new RecoverEventArgs(line, time, name, who, skill, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }


                // 비약류?
                //방법없이회복했습니다Regex = new Regex(timeStampRegex + "((?<name>.+)[이가] )?(?<amount>[^a-zA-Z]+)의 (?<what>.+)을 회복했습니다", RegexOptions.Compiled);
                matches = 방법없이회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    int      amount = matches[0].Groups["amount"].Value.GetDigits();
                    String   name   = matches[0].Groups["name"].Value;

                    if (String.IsNullOrEmpty(name))
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Heal3, ""));
                        name = LogParser.Myname;
                    }
                    RecoverEvent(this, new RecoverEventArgs(line, time, name, null, null, amount, (matches[0].Groups["what"].Value == "생명력")));
                    return;
                }



                matches = 속도를회복했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name = matches[0].Groups["name"].Value;
                    String   what = matches[0].Groups["what"].Value;
                    if (matches[0].Groups["name"].Value == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Repair1, what));
                    }
                    return;
                }


                matches = 사용한영향으로상태가됐습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   target = matches[0].Groups["target"].Value;
                    String   debuff = matches[0].Groups["debuff"].Value.Trim();
                    if (target == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Debuff1, debuff));
                    }
                    return;
                }

                matches = 사용한영향으로기타등등Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   debuff = matches[0].Groups["debuff"].Value.Trim();

                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Status1, debuff));
                    return;
                }

                matches = 벗어났습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name   = matches[0].Groups["name"].Value;
                    String   debuff = matches[0].Groups["debuff"].Value;

                    if (name == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Repair2, debuff));
                    }
                    return;
                }

                matches = 사용해상태가됐습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    if (matches[0].Groups["name"].Value == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Status2, ""));
                    }
                    return;
                }

                matches = 내스킬을써서효과가발생했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Status3, ""));
                    return;
                }

                //효과가발동했습니다Regex
                matches = 효과가발동했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time  = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   skill = matches[0].Groups["skill"].Value.Trim();

                    MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Debuff2, skill));
                    return;
                }

                //2013-05-03
                matches = 사망했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name   = matches[0].Groups["name"].Value.Trim();
                    String   ignore = matches[0].Groups["ignore"].Value.Trim();
                    if (name == "")
                    {
                        MyStatusEvent(this, new MyStatusEventArgs(line, time, MyStatus.Die, null));
                    }
                    return;
                }

                //2013-05-24
                matches = 경험치를얻었습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   target = matches[0].Groups["target"].Value.Trim();
                    String   amount = matches[0].Groups["amount"].Value.Trim();
                    InstanceDungeonEvent(this, new InstanceDungeonEventArgs(line, time, 2, target, amount));
                    return;
                }


                matches = 삼자가자신의무엇가를변경했습니다Regex.Matches(line);
                if (matches.Count > 0)
                {
                    return;
                }

                matches = 무시Regex.Matches(line);
                if (matches.Count > 0)
                {
                    //tempEvent(this, new LogEventArgs(">>무시 " + line));
                    return;
                }

                matches = 명령표현Regex.Matches(line);
                if (matches.Count > 0)
                {
                    DateTime time   = matches[0].Groups["time"].Value.GetTime(LogTimeFormat);
                    String   name   = matches[0].Groups["name"].Value;
                    String   target = matches[0].Groups["target"].Value;

                    if (name == Myname && target != "" && target.IndexOf(" ") == -1)
                    {
                        ChatCommandEvent(this, new ChatCommandEventArgs(line, time, 1, target));
                    }
                    return;
                }


                matches = 감정표현Regex.Matches(line);
                if (matches.Count > 0)
                {
                    return;
                }
                tempEvent(this, new LogEventArgs(line));
            }
            catch
            {
            }
        }