Exemplo n.º 1
0
 /// <summary>
 ///     コピーコンストラクタ
 /// </summary>
 /// <param name="original">複製元のゲーム日時</param>
 public GameDate(GameDate original)
 {
     Year = original.Year;
     Month = original.Month;
     Day = original.Day;
     Hour = original.Hour;
 }
Exemplo n.º 2
0
 /// <summary>
 ///     静的コンストラクタ
 /// </summary>
 static Researches()
 {
     SpecifiedDate = new GameDate();
     Modifier = 1;
 }
Exemplo n.º 3
0
        /// <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;
        }
Exemplo n.º 4
0
        /// <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;
        }
Exemplo n.º 5
0
 /// <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();
 }
Exemplo n.º 6
0
 /// <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);
     }
 }
Exemplo n.º 7
0
 /// <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);
 }