/// <summary> /// 生産中師団を構文解析する /// </summary> /// <param name="lexer">字句解析器</param> /// <returns>生産中師団</returns> private static DivisionDevelopment ParseDivisionDevelopment(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; } DivisionDevelopment division = new DivisionDevelopment(); int lastLineNo = -1; 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); lexer.SkipLine(); continue; } string keyword = token.Value as string; if (string.IsNullOrEmpty(keyword)) { continue; } keyword = keyword.ToLower(); // id if (keyword.Equals("id")) { TypeId id = ParseTypeId(lexer); if (id == null) { Log.InvalidSection(LogCategory, "id", lexer); continue; } // typeとidの組 division.Id = id; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // name if (keyword.Equals("name")) { string s = ParseString(lexer); if (s == null) { Log.InvalidClause(LogCategory, "name", lexer); continue; } // 師団名 division.Name = s; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // cost if (keyword.Equals("cost")) { double? d = ParseDouble(lexer); if (!d.HasValue) { Log.InvalidClause(LogCategory, "cost", lexer); continue; } // 必要IC division.Cost = (double) d; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // manpower if (keyword.Equals("manpower")) { double? d = ParseDouble(lexer); if (!d.HasValue) { Log.InvalidClause(LogCategory, "manpower", lexer); continue; } // 必要人的資源 division.Manpower = (double) d; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // unitcost if (keyword.Equals("unitcost")) { bool? b = ParseBool(lexer); if (!b.HasValue) { Log.InvalidClause(LogCategory, "unitcost", lexer); continue; } // unitcost division.UnitCost = (bool) b; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // new_model if (keyword.Equals("new_model")) { bool? b = ParseBool(lexer); if (!b.HasValue) { Log.InvalidClause(LogCategory, "unitcost", lexer); continue; } // new_model division.NewModel = (bool) b; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // date if (keyword.Equals("date")) { GameDate date = ParseDate(lexer); if (date == null) { Log.InvalidSection(LogCategory, "date", lexer); continue; } // 完了予定日 division.Date = date; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // progress if (keyword.Equals("progress")) { double? d = ParseDouble(lexer); if (!d.HasValue) { Log.InvalidClause(LogCategory, "progress", lexer); continue; } // 進捗率増分 division.Progress = (double) d; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // total_progress if (keyword.Equals("total_progress")) { double? d = ParseDouble(lexer); if (!d.HasValue) { Log.InvalidClause(LogCategory, "total_progress", lexer); continue; } // 総進捗率 division.TotalProgress = (double) d; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // gearing_bonus if (keyword.Equals("gearing_bonus")) { double? d = ParseDouble(lexer); if (!d.HasValue) { Log.InvalidClause(LogCategory, "gearing_bonus", lexer); continue; } // 連続生産ボーナス division.GearingBonus = (double) d; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // size if (keyword.Equals("size")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "size", lexer); continue; } // 総生産数 division.Size = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // done if (keyword.Equals("done")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "done", lexer); continue; } // 生産完了数 division.Done = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // days if (keyword.Equals("days")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "days", lexer); continue; } // 完了日数 division.Days = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // days_for_first if (keyword.Equals("days_for_first")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "days_for_first", lexer); continue; } // 1単位の完了日数 division.DaysForFirst = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // halted if (keyword.Equals("halted")) { bool? b = ParseBool(lexer); if (!b.HasValue) { Log.InvalidClause(LogCategory, "halted", lexer); continue; } // 停止中 division.Halted = (bool) b; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // close_when_finished if (keyword.Equals("close_when_finished")) { bool? b = ParseBool(lexer); if (!b.HasValue) { Log.InvalidClause(LogCategory, "close_when_finished", lexer); continue; } // 完了時にキューを削除するかどうか division.CloseWhenFinished = (bool) b; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // waitingforclosure if (keyword.Equals("waitingforclosure")) { bool? b = ParseBool(lexer); if (!b.HasValue) { Log.InvalidClause(LogCategory, "waitingforclosure", lexer); continue; } // waitingforclosure (詳細不明) division.WaitingForClosure = (bool) b; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // retooling_time if (keyword.Equals("retooling_time")) { double? d = ParseDouble(lexer); if (!d.HasValue) { Log.InvalidClause(LogCategory, "retooling_time", lexer); continue; } // 生産ライン準備時間 division.RetoolingTime = (double) d; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // type if (keyword.Equals("type")) { UnitType? type = ParseDivisionType(lexer); if (type == null) { Log.InvalidClause(LogCategory, "type", lexer); continue; } // ユニット種類 division.Type = (UnitType) type; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // model if (keyword.Equals("model")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "model", lexer); continue; } // モデル番号 division.Model = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // extra if (keyword.Equals("extra")) { UnitType? type = ParseBrigadeType(lexer); if (type == null) { Log.InvalidClause(LogCategory, "extra", lexer); continue; } // 付属旅団のユニット種類 division.Extra1 = (UnitType) type; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // extra1 if (keyword.Equals("extra1")) { UnitType? type = ParseBrigadeType(lexer); if (type == null) { Log.InvalidClause(LogCategory, "extra1", lexer); continue; } // 付属旅団のユニット種類 division.Extra1 = (UnitType) type; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // extra2 if (keyword.Equals("extra2")) { UnitType? type = ParseBrigadeType(lexer); if (type == null) { Log.InvalidClause(LogCategory, "extra2", lexer); continue; } // 付属旅団のユニット種類 division.Extra2 = (UnitType) type; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // extra3 if (keyword.Equals("extra3")) { UnitType? type = ParseBrigadeType(lexer); if (type == null) { Log.InvalidClause(LogCategory, "extra3", lexer); continue; } // 付属旅団のユニット種類 division.Extra3 = (UnitType) type; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // extra4 if (keyword.Equals("extra4")) { UnitType? type = ParseBrigadeType(lexer); if (type == null) { Log.InvalidClause(LogCategory, "extra4", lexer); continue; } // 付属旅団のユニット種類 division.Extra4 = (UnitType) type; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // extra5 if (keyword.Equals("extra5")) { UnitType? type = ParseBrigadeType(lexer); if (type == null) { Log.InvalidClause(LogCategory, "extra5", lexer); continue; } // 付属旅団のユニット種類 division.Extra5 = (UnitType) type; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // brigade_model if (keyword.Equals("brigade_model")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "brigade_model", lexer); continue; } // 付属旅団のモデル番号 division.BrigadeModel1 = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // brigade_model1 if (keyword.Equals("brigade_model1")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "brigade_model1", lexer); continue; } // 付属旅団のモデル番号 division.BrigadeModel1 = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // brigade_model2 if (keyword.Equals("brigade_model2")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "brigade_model2", lexer); continue; } // 付属旅団のモデル番号 division.BrigadeModel2 = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // brigade_model3 if (keyword.Equals("brigade_model3")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "brigade_model3", lexer); continue; } // 付属旅団のモデル番号 division.BrigadeModel3 = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // brigade_model4 if (keyword.Equals("brigade_model4")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "brigade_model4", lexer); continue; } // 付属旅団のモデル番号 division.BrigadeModel4 = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // brigade_model5 if (keyword.Equals("brigade_model5")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "brigade_model5", lexer); continue; } // 付属旅団のモデル番号 division.BrigadeModel5 = (int) n; // 最終解釈行を覚えておく lastLineNo = lexer.LineNo; continue; } // 無効なトークン Log.InvalidToken(LogCategory, token, lexer); if (lexer.LineNo != lastLineNo) { // 現在行が最終解釈行と異なる場合、閉じ括弧が不足しているものと見なす lexer.ReserveToken(token); break; } lexer.SkipLine(); } return division; }
/// <summary> /// 生産中師団を書き出す /// </summary> /// <param name="division">師団</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteDivisionDevelopment(DivisionDevelopment division, TextWriter writer) { writer.WriteLine(" division_development = {"); writer.Write(" id = "); WriteTypeId(division.Id, writer); writer.WriteLine(); if (!string.IsNullOrEmpty(division.Name)) { writer.WriteLine(" name = \"{0}\"", division.Name); } writer.WriteLine(" type = {0}", Units.Strings[(int) division.Type]); if (division.Model >= 0) { writer.WriteLine(" model = {0}", division.Model); } if (division.Cost > 0) { writer.WriteLine(" cost = {0}", DoubleHelper.ToString1(division.Cost)); } if (!division.UnitCost) { writer.WriteLine(" unitcost = no"); } if (!division.NewModel) { writer.WriteLine(" new_model = no"); } if (division.Date != null) { writer.Write(" date = "); WriteDate(division.Date, writer); writer.WriteLine(); } if (division.Manpower > 0) { writer.WriteLine(" manpower = {0}", DoubleHelper.ToString(division.Manpower)); } if (Game.Type == GameType.ArsenalOfDemocracy) { if (division.Halted) { writer.WriteLine(" halted = yes"); } writer.WriteLine(" close_when_finished = {0}", BoolHelper.ToString(division.CloseWhenFinished)); writer.WriteLine(" waitingforclosure = {0}", BoolHelper.ToString(division.WaitingForClosure)); if (division.RetoolingTime > 0) { writer.WriteLine(" retooling_time = {0}", DoubleHelper.ToString4(division.RetoolingTime)); } } if (division.TotalProgress > 0) { writer.WriteLine(" total_progress = {0}", DoubleHelper.ToString4(division.Progress)); } if (division.Size > 0) { writer.WriteLine(" size = {0}", division.Size); } if (division.Done > 0) { writer.WriteLine(" done = {0}", division.Done); } if (division.Days > 0) { writer.WriteLine(" days = {0}", division.Days); } if (division.DaysForFirst > 0) { writer.WriteLine(" days_for_first = {0}", division.DaysForFirst); } if (division.GearingBonus > 0) { writer.WriteLine(" gearing_bonus = {0}", DoubleHelper.ToString4(division.GearingBonus)); } if (division.Extra1 != UnitType.Undefined) { writer.WriteLine(" extra{0} = {1}", (division.Extra2 == UnitType.Undefined) && (Units.Items[(int) division.Type].Branch != Branch.Navy) ? " " : "1", Units.Strings[(int) division.Extra1]); } if (division.Extra2 != UnitType.Undefined) { writer.WriteLine(" extra2 = {0}", Units.Strings[(int) division.Extra2]); } if (division.Extra3 != UnitType.Undefined) { writer.WriteLine(" extra3 = {0}", Units.Strings[(int) division.Extra3]); } if (division.Extra4 != UnitType.Undefined) { writer.WriteLine(" extra4 = {0}", Units.Strings[(int) division.Extra4]); } if (division.Extra5 != UnitType.Undefined) { writer.WriteLine(" extra5 = {0}", Units.Strings[(int) division.Extra5]); } if (division.Extra1 != UnitType.Undefined && division.BrigadeModel1 >= 0) { writer.WriteLine(" brigade_model{0} = {1}", (division.Extra2 == UnitType.Undefined) && (Units.Items[(int) division.Type].Branch != Branch.Navy) ? " " : "1", division.BrigadeModel1); } if (division.Extra2 != UnitType.Undefined && division.BrigadeModel2 >= 0) { writer.WriteLine(" brigade_model2 = {0}", division.BrigadeModel2); } if (division.Extra3 != UnitType.Undefined && division.BrigadeModel3 >= 0) { writer.WriteLine(" brigade_model3 = {0}", division.BrigadeModel3); } if (division.Extra4 != UnitType.Undefined && division.BrigadeModel4 >= 0) { writer.WriteLine(" brigade_model4 = {0}", division.BrigadeModel4); } if (division.Extra5 != UnitType.Undefined && division.BrigadeModel5 >= 0) { writer.WriteLine(" brigade_model5 = {0}", division.BrigadeModel5); } writer.WriteLine(" }"); }