/// <summary> /// コピーコンストラクタ /// </summary> /// <param name="original">複製元のゲーム日時</param> public GameDate(GameDate original) { Year = original.Year; Month = original.Month; Day = original.Day; Hour = original.Hour; }
/// <summary> /// 静的コンストラクタ /// </summary> static Researches() { SpecifiedDate = new GameDate(); Modifier = 1; }
/// <summary> /// 保存日時を構文解析する /// </summary> /// <param name="lexer">字句解析器</param> /// <param name="startDate">開始日時</param> /// <returns>保存日時</returns> private static Dictionary<int, GameDate> ParseSaveDate(TextLexer lexer, GameDate startDate) { // = 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; } Dictionary<int, GameDate> dates = new Dictionary<int, GameDate>(); while (true) { token = lexer.GetToken(); // ファイルの終端 if (token == null) { break; } // } (セクション終端) if (token.Type == TokenType.CloseBrace) { break; } // 無効なトークン if (token.Type != TokenType.Number) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } int id = (int) (double) token.Value; int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, IntHelper.ToString(id), lexer); continue; } // 保存日時 GameDate date = startDate.Minus((int) n); dates[id] = date; } return dates; }
/// <summary> /// 日時を構文解析する /// </summary> /// <param name="lexer">字句解析器</param> /// <returns>日時</returns> private static GameDate ParseDate(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; } GameDate date = new GameDate(); 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(); // year if (keyword.Equals("year")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "year", lexer); continue; } // 年 date.Year = (int) n; continue; } // month if (keyword.Equals("month")) { // = token = lexer.GetToken(); if (token.Type != TokenType.Equal) { Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } token = lexer.GetToken(); if (token.Type == TokenType.Number) { // 無効なトークン int month = (int) (double) token.Value; if (month < 0 || month >= 12) { Log.OutOfRange(LogCategory, "month", month, lexer); } // 月 date.Month = month + 1; continue; } if (token.Type == TokenType.Identifier) { // 無効なトークン string name = token.Value as string; if (string.IsNullOrEmpty(name)) { continue; } name = name.ToLower(); if (!Scenarios.MonthStrings.Contains(name)) { Log.InvalidToken(LogCategory, token, lexer); continue; } int month = Array.IndexOf(Scenarios.MonthStrings, name); if (month < 0 || month >= 12) { Log.OutOfRange(LogCategory, "month", month, lexer); continue; } // 月 date.Month = month + 1; continue; } // 無効なトークン Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); continue; } // day if (keyword.Equals("day")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "day", lexer); continue; } // 30日の記載が数多くあるので[情報]レベルでエラー出力する if (n == 30) { Log.Info("[Scenario] Out of range: {0} at day ({1} L{2})", n, lexer.FileName, lexer.LineNo); } else if (n < 0 || n > 30) { Log.OutOfRange(LogCategory, "day", n, lexer); } // 日 date.Day = (int) n + 1; continue; } // hour if (keyword.Equals("hour")) { int? n = ParseInt(lexer); if (!n.HasValue) { Log.InvalidClause(LogCategory, "day", lexer); continue; } if (n < 0 || n >= 24) { Log.OutOfRange(LogCategory, "hour", n, lexer); } // 時 date.Hour = (int) n; continue; } // 無効なトークン Log.InvalidToken(LogCategory, token, lexer); lexer.SkipLine(); } return date; }
/// <summary> /// シナリオ開始日を書き出す /// </summary> /// <param name="date">シナリオ開始日</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteScenarioStartDate(GameDate date, TextWriter writer) { if (date == null) { return; } writer.Write(" startdate = "); WriteDate(date, writer); writer.WriteLine(); }
/// <summary> /// 日時を書き出す /// </summary> /// <param name="date">日時</param> /// <param name="writer">ファイル書き込み用</param> private static void WriteDate(GameDate date, TextWriter writer) { if (date.Hour == 0) { writer.Write("{{ year = {0} month = {1} day = {2} }}", date.Year, Scenarios.MonthStrings[date.Month - 1], date.Day - 1); } else { writer.Write("{{ year = {0} month = {1} day = {2} hour = {3} }}", date.Year, Scenarios.MonthStrings[date.Month - 1], date.Day - 1, date.Hour); } }
/// <summary> /// 差分日数を取得する /// </summary> /// <param name="date">比較対象の日付</param> /// <returns>差分日数</returns> public int Difference(GameDate date) { return (Year - date.Year) * 360 + (Month - date.Month) * 30 + (Day - date.Day); }