private bool ParseSkillDB(string skilldbPath, RoGrfFile grf)
        {
            ReportUpdate("skill_db.txt");

            if (File.Exists(skilldbPath) == false)
            {
                return(false);
            }

            string[] lines = File.ReadAllLines(skilldbPath);
            for (int i = 0; i < lines.Length; i++)
            {
                string line = lines[i].Trim();
                if (line.Length == 0 || line.StartsWith("//") == true)
                {
                    continue;
                }

                string[] parts = line.Split(new char[] { ',' }, StringSplitOptions.None);
                if (parts.Length != 17)
                {
                    continue;
                }
                //id,range,hit,inf,element,nk,splash,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count,name,description

                /*
                 *      00: id
                 *      range
                 *      hit
                 *      inf
                 *      04: element
                 *      nk
                 *      splash
                 *      max
                 *      list_num
                 *      castcancel
                 *      cast_defence_rate
                 *      inf2
                 *      maxcount
                 *      skill_type
                 *      blow_count
                 *      15: name
                 *      16: description
                 */
                int    id      = int.Parse(parts[0].Trim());
                string grvName = parts[15].Trim();
                string eaName  = parts[16].Trim();
                // Element may be splitted by level
                // ele_on_lv_1:ele_on_lv_2: ..
                // in this case, choose first element
                EElement eaElement;
                if (parts[4].Contains(':') == true)
                {
                    string[] eleParts = parts[4].Split(':');
                    eaElement = (EElement)int.Parse(eleParts[0].Trim());
                }
                else
                {
                    eaElement = (EElement)int.Parse(parts[4].Trim());
                }

                if (mSkillsTemp.ContainsKey(grvName) == false)
                {
                    // mh..
                    mSkillsTemp.Remove(grvName);
                    System.Diagnostics.Debug.WriteLine("Skill not found in skill_db.txt: " + grvName);
                    continue;
                }
                // Skip NPC, Item, Cash, All Skills..
                if (grvName.StartsWith("NPC_") == true || grvName.StartsWith("ITEM_") == true || grvName.StartsWith("CASH_") == true || grvName.StartsWith("ALL_") == true || grvName.StartsWith("MER_") == true)
                {
                    mSkillsTemp.Remove(grvName);
                    continue;
                }

                if (id >= MAX_SKILL_ID)
                {
                    mSkillsTemp.Remove(grvName);
                    continue;
                }

                mSkillsTemp[grvName].ID          = id;
                mSkillsTemp[grvName].Element     = eaElement;
                mSkillsTemp[grvName].NameEathena = eaName;

                ReportUpdate("[Skill] " + mSkillsTemp[grvName].ToString());

                if (mSkillsTemp[grvName].ImageExists == false)
                {
                    // Load Image..
                    // We try to get the sprite name based on eAthena's Sprite_Name field..
                    RoGrfFileItem grfItem = grf.GetFileByName("data/texture/À¯ÀúÀÎÅÍÆäÀ̽º/item/" + grvName.ToLower() + ".bmp");
                    if (grfItem != null)
                    {
                        grf.CacheFileData(grfItem, true);

                        mSkillsTemp[grvName].ExportImage(grfItem);
                    }
                    else
                    {
                        Debug.WriteLine("Skill image not found: " + mSkillsTemp[grvName].ToString());
                    }
                }
            }

            return(true);
        }