/// <summary> /// minister_personalitiesセクションを構文解析する /// </summary> /// <param name="lexer">字句解析器</param> /// <returns>閣僚特性リスト</returns> private static List <MinisterPersonalityInfo> ParseMinisterPersonalities(TextLexer lexer) { // = Token token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); return(null); } // { token = lexer.GetToken(); if (token.Type != TokenType.OpenBrace) { Log.InvalidToken(LogCategory, token, lexer); return(null); } List <MinisterPersonalityInfo> list = new List <MinisterPersonalityInfo>(); while (true) { // ファイル終端 token = lexer.GetToken(); if (token == null) { break; } // } (セクション終端) if (token.Type == TokenType.CloseBrace) { break; } // 無効なトークン if (token.Type != TokenType.Identifier || !((string)token.Value).Equals("personality")) { Log.InvalidToken(LogCategory, token, lexer); continue; } // personalityセクション MinisterPersonalityInfo info = ParseMinisterPersonality(lexer); if (info == null) { Log.InvalidSection(LogCategory, "personality", lexer); continue; } // 閣僚特性リストへ登録 list.Add(info); } return(list); }
/// <summary> /// 閣僚特性定義ファイルを構文解析する /// </summary> /// <param name="fileName">ファイル名</param> /// <returns>閣僚特性リスト</returns> public static List <MinisterPersonalityInfo> Parse(string fileName) { List <MinisterPersonalityInfo> list = new List <MinisterPersonalityInfo>(); using (TextLexer lexer = new TextLexer(fileName, true)) { while (true) { Token token = lexer.GetToken(); // ファイルの終端 if (token == null) { break; } // 無効なトークン if (token.Type != TokenType.Identifier || !((string)token.Value).Equals("minister")) { Log.InvalidToken(LogCategory, token, lexer); continue; } // ministerセクション MinisterPersonalityInfo info = ParseMinister(lexer); if (info == null) { Log.InvalidSection(LogCategory, "minister", lexer); } // 閣僚特性リストへ登録 list.Add(info); } return(list); } }
/// <summary> /// ministerセクションを構文解析する /// </summary> /// <param name="lexer">字句解析器</param> /// <returns>閣僚特性データ</returns> private static MinisterPersonalityInfo ParseMinister(TextLexer lexer) { // = Token token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); return null; } // { token = lexer.GetToken(); if (token.Type != TokenType.OpenBrace) { Log.InvalidToken(LogCategory, token, lexer); return null; } MinisterPersonalityInfo info = new MinisterPersonalityInfo(); while (true) { // ファイル終端 token = lexer.GetToken(); if (token == null) { break; } // } (セクション終端) if (token.Type == TokenType.CloseBrace) { break; } // 無効なトークン if (token.Type != TokenType.Identifier) { Log.InvalidToken(LogCategory, token, lexer); return null; } string keyword = token.Value as string; if (keyword == null) { return null; } // trait if (keyword.Equals("trait")) { // = token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // 無効なトークン token = lexer.GetToken(); if (token.Type != TokenType.String) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // 閣僚特性文字列 info.String = token.Value as string; continue; } // id if (keyword.Equals("id")) { // 暫定: 1行単位で読み飛ばす lexer.SkipLine(); continue; } // name if (keyword.Equals("name")) { // = token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // 無効なトークン token = lexer.GetToken(); if (token.Type != TokenType.Identifier && token.Type != TokenType.String) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // 閣僚特性名 info.Name = token.Value as string; continue; } // desc if (keyword.Equals("desc")) { // 暫定: 1行単位で読み飛ばす lexer.SkipLine(); continue; } // position if (keyword.Equals("position")) { // = token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // 無効なトークン token = lexer.GetToken(); if (token.Type != TokenType.Identifier) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } string position = token.Value as string; if (string.IsNullOrEmpty(position)) { continue; } position = position.ToLower(); // 閣僚地位 if (PositionMap.ContainsKey(position)) { // いずれか1つ info.Position[PositionMap[position]] = true; } else if (position.Equals("all")) { // 全て for (int i = 0; i < info.Position.Length; i++) { info.Position[i] = true; } } else if (!position.Equals("generic")) { // 無効なトークン Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); } continue; } // value if (keyword.Equals("value")) { // 暫定: 1行単位で読み飛ばす lexer.SkipLine(); continue; } // command if (keyword.Equals("command")) { // 暫定: 1行単位で読み飛ばす lexer.SkipLine(); //continue; } } return info; }
/// <summary> /// 閣僚特性を初期化する(HoI2) /// </summary> private static void InitPeronalityHoI2() { int positionCount = Enum.GetValues(typeof (MinisterPosition)).Length; int personalityCount = Enum.GetValues(typeof (MinisterPersonalityHoI2)).Length; // 閣僚特性情報を初期化する Personalities = new MinisterPersonalityInfo[personalityCount]; PersonalityStringMap.Clear(); for (int i = 0; i < personalityCount; i++) { MinisterPersonalityInfo info = new MinisterPersonalityInfo { String = PersonalityStringsHoI2[i], Name = PersonalityNamesHoI2[i] }; Personalities[i] = info; PersonalityStringMap.Add(info.String.ToLower(), i); } // 閣僚地位と閣僚特性の対応付けを初期化する for (int i = 0; i < positionCount; i++) { // MinisterPosition.Noneに対しては何もしない if (PositionPersonalityTableHoI2[i] == null) { continue; } PositionPersonalityTable[i] = PositionPersonalityTableHoI2[i].ToList(); foreach (int j in PositionPersonalityTable[i]) { Personalities[j].Position[i] = true; } } }
/// <summary> /// personalityセクションを構文解析する /// </summary> /// <param name="lexer">字句解析器</param> /// <returns>閣僚特性データ</returns> private static MinisterPersonalityInfo ParseMinisterPersonality(TextLexer lexer) { // = Token token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); return(null); } // { token = lexer.GetToken(); if (token.Type != TokenType.OpenBrace) { Log.InvalidToken(LogCategory, token, lexer); return(null); } MinisterPersonalityInfo info = new MinisterPersonalityInfo(); while (true) { // ファイル終端 token = lexer.GetToken(); if (token == null) { break; } // } (セクション終端) if (token.Type == TokenType.CloseBrace) { break; } // 無効なトークン if (token.Type != TokenType.Identifier) { Log.InvalidToken(LogCategory, token, lexer); return(null); } string keyword = token.Value as string; if (keyword == null) { return(null); } // personality_string if (keyword.Equals("personality_string")) { // = token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // 無効なトークン token = lexer.GetToken(); if (token.Type != TokenType.String) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // 閣僚特性文字列 info.String = token.Value as string; continue; } // name if (keyword.Equals("name")) { // = token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // 無効なトークン token = lexer.GetToken(); if (token.Type != TokenType.Identifier && token.Type != TokenType.String) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // 閣僚特性名 info.Name = token.Value as string; continue; } // desc if (keyword.Equals("desc")) { // 暫定: 1行単位で読み飛ばす lexer.SkipLine(); continue; } // minister_position if (keyword.Equals("minister_position")) { // = token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // 無効なトークン token = lexer.GetToken(); if (token.Type != TokenType.Identifier) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } string position = token.Value as string; if (string.IsNullOrEmpty(position)) { continue; } position = position.ToLower(); // 閣僚地位 if (PositionMap.ContainsKey(position)) { // いずれか1つ info.Position[PositionMap[position]] = true; } else if (position.Equals("all")) { // 全て for (int i = 0; i < info.Position.Length; i++) { info.Position[i] = true; } } else if (Game.Type != GameType.DarkestHour || !position.Equals("generic")) { // 無効なトークン Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); } continue; } // modifier if (keyword.Equals("modifier")) { if (!ParseMinisterPersonalityModifier(lexer)) { Log.InvalidSection(LogCategory, "modifier", lexer); } continue; } // 無効なトークン Log.InvalidToken(LogCategory, token, lexer); } return(info); }