Ejemplo n.º 1
0
        public static IEnumerable <CK2Terrain> MakeTerrainsByText(string textPath)
        {
            using (var reader = new StreamReader(textPath))
            {
                int    nestLevel = 0;
                var    scopeName = new Stack <string>();
                string line;
                var    terra = new CK2Terrain();

                while ((line = reader.ReadLine()) != null)
                {
                    // "#"で始まっていればコメント行なので読み飛ばす
                    if (line.StartsWith("#"))
                    {
                        continue;
                    }

                    string idName = "";

                    // "="が含まれていれば識別子の宣言
                    if (line.Contains("="))
                    {
                        idName = line.Replace('\t', ' ');
                        idName = idName.Remove(idName.IndexOf("=")).Trim();

                        switch (idName)
                        {
                        case "terrain":
                            // 地形の数が書かれている
                            // 不要
                            break;

                        case "categories":
                            // 地形情報のスコープの開始
                            break;

                        default:
                            if (nestLevel > 0 && scopeName.Peek() == "categories")
                            {
                                // 地形情報の識別名
                                terra.Name = idName;
                            }
                            else if (idName == "color")
                            {
                                // 色情報行
                                string numStart   = line.Remove(0, line.IndexOf("{") + 1);
                                var    colorValue = numStart.Remove(numStart.IndexOf("}")).Trim().Split(' ').Select(num => byte.Parse(num)).ToArray();
                                terra.Color = Color.FromArgb(colorValue[0], colorValue[1], colorValue[2]);
                            }

                            break;
                        }
                    }

                    if (line.Contains("{"))
                    {
                        nestLevel++;
                        scopeName.Push(idName);
                    }

                    if (line.Contains("}"))
                    {
                        nestLevel--;
                        scopeName.Pop();

                        if (nestLevel == 0)
                        {
                            // categories を抜けたら後は不要なので抜ける
                            break;
                        }

                        if (scopeName.Peek() == "categories")
                        {
                            yield return(terra);

                            terra = new CK2Terrain();
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
 private IEnumerable <CK2Terrain> ReadCK2TerrainList(string path) => CK2Terrain.MakeTerrains(path);