From 75a6dd7122830280a0a5b23dea06ce304bf361e6 Mon Sep 17 00:00:00 2001
From: client_Wu Xijin <364452445@qq.com>
Date: 星期六, 08 九月 2018 16:18:33 +0800
Subject: [PATCH] 3243  【开发】开服限时活动定制

---
 System/FairyAu/FairyLeagueModel.cs |  858 ++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 603 insertions(+), 255 deletions(-)

diff --git a/System/FairyAu/FairyLeagueModel.cs b/System/FairyAu/FairyLeagueModel.cs
index f1e0e87..eed633f 100644
--- a/System/FairyAu/FairyLeagueModel.cs
+++ b/System/FairyAu/FairyLeagueModel.cs
@@ -12,75 +12,106 @@
     public class FairyLeagueModel : Model, IAfterPlayerDataInitialize, IBeforePlayerDataInitialize, IPlayerLoginOk
     {
         public event Action OnRefreshFairyLeagueEvent;
-        private FairyLeagueStage m_FairyLeagueStage = FairyLeagueStage.Prepare;
+
+        public FairyLeagueWeekTime currentWeekTime
+        {
+            get
+            {
+                var openServerTime = TimeUtility.openServerTime;
+                var openServerWeekDay = openServerTime.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)openServerTime.DayOfWeek;
+                if (specialLeagueTimes.ContainsKey(openServerWeekDay))
+                {
+                    var dict = specialLeagueTimes[openServerWeekDay];
+                    var weekCount = TimeUtility.OpenWeekCnt;
+                    if (dict.ContainsKey(weekCount))
+                    {
+                        return dict[weekCount];
+                    }
+                }
+                if (TimeUtility.OpenWeekCnt <= 1)
+                {
+                    return null;
+                }
+                return fairyLeagueWeekTime;
+            }
+        }
+
+        public FairyLeagueWeekTime nextWeekTime
+        {
+            get
+            {
+                var openServerTime = TimeUtility.openServerTime;
+                var openServerWeekDay = openServerTime.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)openServerTime.DayOfWeek;
+                if (specialLeagueTimes.ContainsKey(openServerWeekDay))
+                {
+                    var dict = specialLeagueTimes[openServerWeekDay];
+                    var weekCount = TimeUtility.OpenWeekCnt + 1;
+                    if (dict.ContainsKey(weekCount))
+                    {
+                        return dict[weekCount];
+                    }
+                }
+                return fairyLeagueWeekTime;
+            }
+        }
+
+        FairyLeagueStage cacheLeagueStage = FairyLeagueStage.Prepare;
+
         public FairyLeagueStage fairyLeagueStage
         {
             get
             {
-                if (StepRing())
+                if (currentWeekTime == null)
                 {
-                    return FairyLeagueStage.Over;
+                    return FairyLeagueStage.Prepare;
                 }
-                return m_FairyLeagueStage;
+                return currentWeekTime.fairyLeagueStage;
             }
         }
+
+        public int fairyLeagueSession
+        {
+            get
+            {
+                if (currentWeekTime == null)
+                {
+                    return 0;
+                }
+                return currentWeekTime.currentSession;
+            }
+        }
+
         public int fairyLeagueRing
         {
             get
             {
-                if (IsNextWeek)
+                if (currentWeekTime == null)
                 {
                     return 0;
                 }
-                var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
-                if (_dayOfWeek < groupTimes[1].dayOfWeek || _dayOfWeek > resultTimes[1].dayOfWeek)
-                {
-                    return 0;
-                }
-                else if (_dayOfWeek == groupTimes[1].dayOfWeek)
-                {
-                    if (TimeUtility.ServerNow.Hour < groupTimes[1].startHour)
-                    {
-                        return 0;
-                    }
-                    else if (TimeUtility.ServerNow.Hour == groupTimes[1].startHour &&
-                        TimeUtility.ServerNow.Minute < groupTimes[1].startMinute)
-                    {
-                        return 0;
-                    }
-                }
-                return 1;
+                return currentWeekTime.currentRing;
             }
         }
+
         public int OpenServerWeek
         {
             get;
             private set;
         }
-        public int ringCnt
-        {
-            get;
-            private set;
-        }
+
         public bool IsNextWeek
         {
             get
             {
-                if (TimeUtility.OpenWeekCnt >= OpenServerWeek)
-                {
-                    var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
-                    if (_dayOfWeek > resultTimes[1].dayOfWeek && _dayOfWeek <= 7)
-                    {
-                        return true;
-                    }
-                    return false;
-                }
-                else
+                if (currentWeekTime == null)
                 {
                     return true;
                 }
+                return currentWeekTime.IsNextWeek;
             }
         }
+
+        bool serverInited = false;
 
         FairyModel fairyModel { get { return ModelCenter.Instance.GetModel<FairyModel>(); } }
 
@@ -88,45 +119,81 @@
         {
             ParseConfig();
             m_JoinFairyLeagueRedpoint = new Redpoint(10704, 1070401);
-            dataRequestDict.Add(FairyLeagueStage.Grouping, false);
-            dataRequestDict.Add(FairyLeagueStage.Fight, false);
-            dataRequestDict.Add(FairyLeagueStage.Over, false);
             TimeUtility.OnServerOpenDayRefresh += OnServerOpenDayRefresh;
             DTCA003_tagUniversalGameRecInfo.onGetUniversalGameInfo += OnGetUniversalGameInfo;
             PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
             StageManager.Instance.onStageLoadFinish += OnStageLoadFinish;
+            TimeMgr.Instance.OnMinuteEvent += MinuteEvent;
+            TimeMgr.Instance.OnDayEvent += DayEvent;
             fairyLeagueHelp = new FairyLeagueHelp();
         }
 
         public override void UnInit()
         {
             DTCA003_tagUniversalGameRecInfo.onGetUniversalGameInfo -= OnGetUniversalGameInfo;
+            TimeMgr.Instance.OnMinuteEvent -= MinuteEvent;
+            TimeMgr.Instance.OnDayEvent -= DayEvent;
         }
+
         public void OnBeforePlayerDataInitialize()
         {
             ClearFairyWarHelp();
             frontFairyList.Clear();
             fairyLeagueFairyId = 0;
             fairyLeagueFairyName = string.Empty;
+            serverInited = false;
         }
+
         public void OnAfterPlayerDataInitialize()
         {
-            for (int i = 0; i < fairyStages.Length; i++)
-            {
-                dataRequestDict[fairyStages[i]] = false;
-            }
-            TimeMgr.Instance.OnSyntonyEvent -= OnSyntonyEvent;
-            TimeMgr.Instance.OnSyntonyEvent += OnSyntonyEvent;
         }
+
         public void OnPlayerLoginOk()
         {
-            CheckFairyLeagueStage();
+            ResetFairyLeagueTime();
+            cacheLeagueStage = fairyLeagueStage;
             CheckFairyLeagueData();
             UpdateRedpoint();
+            serverInited = true;
         }
+
         private void OnServerOpenDayRefresh()
         {
-            CheckFairyLeagueStage();
+            ResetFairyLeagueTime();
+        }
+
+        private void DayEvent()
+        {
+            ResetFairyLeagueTime();
+        }
+
+        private void MinuteEvent()
+        {
+            if (!(StageManager.Instance.CurrentStage is DungeonStage) || !serverInited)
+            {
+                return;
+            }
+            if (cacheLeagueStage != fairyLeagueStage)
+            {
+                cacheLeagueStage = fairyLeagueStage;
+                if (cacheLeagueStage != FairyLeagueStage.Prepare)
+                {
+                    CheckFairyLeagueData();
+                }
+                if (OnRefreshFairyLeagueEvent != null)
+                {
+                    OnRefreshFairyLeagueEvent();
+                }
+                DebugEx.LogFormat("杩涘叆{0}闃舵", fairyLeagueStage);
+            }
+        }
+
+        void ResetFairyLeagueTime()
+        {
+            if (OnRefreshFairyLeagueEvent != null)
+            {
+                OnRefreshFairyLeagueEvent();
+            }
         }
 
         private void PlayerDataRefreshInfoEvent(PlayerDataRefresh _type)
@@ -146,31 +213,9 @@
             }
         }
 
-        private void OnSyntonyEvent(TimeMgr.SyntonyType type)
-        {
-            if (type == TimeMgr.SyntonyType.FairyLeaugeStage)
-            {
-                CheckFairyLeagueStage();
-                CheckFairyLeagueData();
-                if (OnRefreshFairyLeagueEvent != null)
-                {
-                    OnRefreshFairyLeagueEvent();
-                }
-                UpdateRedpoint();
-            }
-        }
         #region 閰嶇疆
         public const int FAIRY_LEAGUE_DUNGEON = 31220;
         public const int FAIRY_LEAGUE_BATTLE = 68;
-        public readonly int[] groupRingStates = new int[] { 11, 21 };
-        public readonly int[] fightRingStates = new int[] { 12, 22 };
-        public readonly int overRingStates = 99;
-        public WeekTime[] groupTimes { get; private set; }
-        public WeekTime[] fightTimes { get; private set; }
-        public WeekTime[] resultTimes { get; private set; }
-        public WeekTime overTime { get; private set; }
-        public readonly WeekTime skipWeekTime = new WeekTime(1, 0, 0, 0, 0);
-        public List<WeekTime> fairyLeagueWeekTimes = new List<WeekTime>();
         private string[] guideImgKeys;
         public string[] GuideImgKeys
         {
@@ -179,11 +224,7 @@
                 return guideImgKeys;
             }
         }
-        private readonly FairyLeagueStage[] fairyStages = new FairyLeagueStage[]
-        {
-            FairyLeagueStage.Grouping,
-            FairyLeagueStage.Fight, FairyLeagueStage.Over
-        };
+
         public int fairyWarResUpperLimit
         {
             get;
@@ -200,6 +241,9 @@
         public Dictionary<int, List<AwardItem>> finalWarAwardDict = new Dictionary<int, List<AwardItem>>();
         public Dictionary<int, List<AwardItem>> finalWarChampionAwardDict = new Dictionary<int, List<AwardItem>>();
         private Dictionary<int, float> crystalRateDict = new Dictionary<int, float>();
+        readonly List<int> fairyLeagueStateValues = new List<int>() { 11, 12, 13, 21, 22, 23 };
+        FairyLeagueWeekTime fairyLeagueWeekTime = new FairyLeagueWeekTime();
+        Dictionary<int, Dictionary<int, FairyLeagueWeekTime>> specialLeagueTimes = new Dictionary<int, Dictionary<int, FairyLeagueWeekTime>>();
         private void ParseConfig()
         {
             FuncConfigConfig cfg = Config.Instance.Get<FuncConfigConfig>("FamilyMatchGuide");
@@ -207,40 +251,45 @@
             {
                 guideImgKeys = ConfigParse.GetMultipleStr(cfg.Numerical1);
             }
-            ringCnt = groupRingStates.Length;
-            groupTimes = new WeekTime[groupRingStates.Length];
-            DungeonStateTimeConfig stateCfg = null;
-            for (int i = 0; i < groupRingStates.Length; i++)
+            var configs = Config.Instance.GetAllValues<DungeonStateTimeConfig>();
+            for (int i = 0; i < configs.Count; i++)
             {
-                stateCfg = DungeonStateTimeConfig.DungeonStateTime(FAIRY_LEAGUE_DUNGEON, groupRingStates[i]);
-                if (stateCfg != null)
+                if (configs[i].DataMapID == FAIRY_LEAGUE_DUNGEON && fairyLeagueStateValues.Contains(configs[i].StateValue))
                 {
-                    OpenServerWeek = stateCfg.OpenServerWeek;
-                    groupTimes[i] = new WeekTime(stateCfg.StartWeekday, stateCfg.StartHour,
-                        stateCfg.StartMinute, stateCfg.EndHour, stateCfg.EndMinute);
-                    fairyLeagueWeekTimes.Add(groupTimes[i]);
+                    fairyLeagueWeekTime.AddStage(configs[i]);
                 }
             }
-            fightTimes = new WeekTime[fightRingStates.Length];
-            resultTimes = new WeekTime[fightRingStates.Length];
-            for (int i = 0; i < fightRingStates.Length; i++)
+            fairyLeagueWeekTime.Sort();
+            var specialStateTimes = DungeonSpecialStateTimeConfig.GetDungeonTimes(FAIRY_LEAGUE_DUNGEON);
+            for (int i = 0; i < specialStateTimes.Count; i++)
             {
-                stateCfg = DungeonStateTimeConfig.DungeonStateTime(FAIRY_LEAGUE_DUNGEON, fightRingStates[i]);
-                if (stateCfg != null)
+                var specialConfig = specialStateTimes[i];
+                if (fairyLeagueStateValues.Contains(specialConfig.StateValue))
                 {
-                    fightTimes[i] = new WeekTime(stateCfg.StartWeekday, stateCfg.StartHour,
-                        stateCfg.StartMinute, stateCfg.EndHour, stateCfg.EndMinute);
-                    fairyLeagueWeekTimes.Add(fightTimes[i]);
-                    resultTimes[i] = new WeekTime(stateCfg.StartWeekday, stateCfg.EndHour, stateCfg.EndMinute, 0, 0);
-                    fairyLeagueWeekTimes.Add(resultTimes[i]);
+                    Dictionary<int, FairyLeagueWeekTime> dict;
+                    if (!specialLeagueTimes.TryGetValue(specialConfig.OpenServerWeek, out dict))
+                    {
+                        dict = new Dictionary<int, FairyLeagueWeekTime>();
+                        specialLeagueTimes.Add(specialConfig.OpenServerWeek, dict);
+                    }
+                    var dayOfWeek = 0;
+                    var index = GetIndexOfWeek(specialConfig.OpenServerWeek, specialConfig.OpenServerDay, out dayOfWeek);
+                    FairyLeagueWeekTime leagueTime;
+                    if (!dict.TryGetValue(index, out leagueTime))
+                    {
+                        leagueTime = new FairyLeagueWeekTime();
+                        dict.Add(index, leagueTime);
+                    }
+                    leagueTime.AddStage(specialConfig, dayOfWeek);
                 }
             }
-            stateCfg = DungeonStateTimeConfig.DungeonStateTime(FAIRY_LEAGUE_DUNGEON, overRingStates);
-            overTime = new WeekTime(stateCfg.StartWeekday, stateCfg.StartHour,
-                stateCfg.StartMinute, stateCfg.EndHour, stateCfg.EndMinute);
-            fairyLeagueWeekTimes.Add(overTime);
-            fairyLeagueWeekTimes.Sort(CompareTime);
-
+            foreach (var dict in specialLeagueTimes.Values)
+            {
+                foreach (var leagueTime in dict.Values)
+                {
+                    leagueTime.Sort();
+                }
+            }
             cfg = Config.Instance.Get<FuncConfigConfig>("FamilyMatchResourcePoint");
             if (cfg != null)
             {
@@ -303,6 +352,14 @@
             cfg = Config.Instance.Get<FuncConfigConfig>("FamilyMatchResourcePoint1");
             crystalRateDict = ConfigParse.GetDic<int, float>(cfg.Numerical1);
         }
+
+        int GetIndexOfWeek(int _openWeekDay, int _openDays, out int dayOfWeek)
+        {
+            var index = (_openWeekDay + _openDays - 1) / 7;
+            dayOfWeek = (_openWeekDay + _openDays - 1) % 7;
+            return index;
+        }
+
         private List<AwardItem> ParseAward(string _config)
         {
             List<AwardItem> _list = new List<AwardItem>();
@@ -350,76 +407,7 @@
             return crystalRateDict.TryGetValue(_npcId, out _rate);
         }
         #endregion
-        public void CheckFairyLeagueStage()
-        {
-            var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
-            if (IsNextWeek)
-            {
-                m_FairyLeagueStage = FairyLeagueStage.Prepare;
-                return;
-            }
-            for (int i = 0; i < fairyLeagueWeekTimes.Count; i++)
-            {
-                var _weekTime = fairyLeagueWeekTimes[i];
-                if (_dayOfWeek < _weekTime.dayOfWeek)
-                {
-                    m_FairyLeagueStage = GetFairyLeagueStage(i);
-                    return;
-                }
-                if (_dayOfWeek == _weekTime.dayOfWeek)
-                {
-                    if (TimeUtility.Hour < _weekTime.startHour)
-                    {
-                        m_FairyLeagueStage = GetFairyLeagueStage(i);
-                        return;
-                    }
-                    if (TimeUtility.Hour == _weekTime.startHour &&
-                        TimeUtility.Minute < _weekTime.startMinute)
-                    {
-                        m_FairyLeagueStage = GetFairyLeagueStage(i);
-                        return;
-                    }
-                }
-            }
-            var _nowTime = new WeekTime(_dayOfWeek, TimeUtility.Hour, TimeUtility.Minute, 0, 0, TimeUtility.Second);
-            TimeMgr.Instance.Register(TimeMgr.SyntonyType.FairyLeaugeStage,
-                (float)(skipWeekTime - _nowTime).TotalSeconds);
-            m_FairyLeagueStage = FairyLeagueStage.Prepare;
-        }
-        private FairyLeagueStage GetFairyLeagueStage(int _index)
-        {
-            var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
-            var _nowTime = new WeekTime(_dayOfWeek, TimeUtility.Hour, TimeUtility.Minute, 0, 0, TimeUtility.Second);
-            TimeMgr.Instance.Register(TimeMgr.SyntonyType.FairyLeaugeStage,
-                (float)(fairyLeagueWeekTimes[_index] - _nowTime).TotalSeconds);
-            switch (_index)
-            {
-                case 0:
-                    return FairyLeagueStage.Prepare;
-                case 1:
-                case 4:
-                    return FairyLeagueStage.Grouping;
-                case 2:
-                case 5:
-                    return FairyLeagueStage.Fight;
-                case 3:
-                case 6:
-                    return FairyLeagueStage.Over;
-            }
-            return FairyLeagueStage.Prepare;
-        }
-        private int CompareTime(WeekTime x, WeekTime y)
-        {
-            if (x.dayOfWeek.CompareTo(y.dayOfWeek) != 0)
-            {
-                return x.dayOfWeek.CompareTo(y.dayOfWeek);
-            }
-            if (x.startHour.CompareTo(y.startHour) != 0)
-            {
-                return x.startHour.CompareTo(y.startHour);
-            }
-            return x.startMinute.CompareTo(y.startMinute);
-        }
+
         #region 浠欑洘鑱旇禌鍓湰
         public int[] fairyLeagueCrystals
         {
@@ -512,12 +500,12 @@
 
         public bool BattleChampion()
         {
-            var _ring = fairyLeagueRing;
-            if (_ring == 0 &&
-                fairyLeagueBattleDict.ContainsKey(_ring)
-                && fairyLeagueBattleDict[_ring].ContainsKey(5))
+            var _session = fairyLeagueSession;
+            if (_session == 0 &&
+                fairyLeagueBattleDict.ContainsKey(_session)
+                && fairyLeagueBattleDict[_session].ContainsKey(5))
             {
-                var _list = fairyLeagueBattleDict[_ring][5];
+                var _list = fairyLeagueBattleDict[_session][5];
                 return _list.Count == 1;
             }
             return false;
@@ -570,22 +558,18 @@
                     onFairyLeagueBattleEvent();
                 }
                 UpdateRedpoint();
-                for (int i = 0; i < fairyStages.Length; i++)
-                {
-                    dataRequestDict[fairyStages[i]] = fairyStages[i] == fairyLeagueStage ? true : false;
-                }
             }
         }
         public bool SelfFairyInBattle(out int _error)
         {
             _error = 3;
-            var _ring = fairyLeagueRing;
+            var _session = fairyLeagueSession;
             var _fairyId = PlayerDatas.Instance.fairyData.fairy.FamilyID;
-            if (!fairyLeagueBattleDict.ContainsKey(_ring))
+            if (!fairyLeagueBattleDict.ContainsKey(_session))
             {
                 return false;
             }
-            var _dict = fairyLeagueBattleDict[_ring];
+            var _dict = fairyLeagueBattleDict[_session];
             foreach (var _grade in _dict.Keys)
             {
                 if (_dict[_grade] == null)
@@ -659,18 +643,26 @@
                     SysNotifyMgr.Instance.ShowTip("LeagueCannotGo4");
                     break;
                 case 5:
-                    var _ring = fairyLeagueRing;
-                    _ring = fairyLeagueStage == FairyLeagueStage.Fight || fairyLeagueStage == FairyLeagueStage.Over ? 1 - _ring : _ring;
-                    if (_ring == 1)
+                    var _session = fairyLeagueSession;
+                    var isNextWeek = IsNextWeek;
+                    FairyLeagueWeekTime.Session session;
+                    var weekTime = isNextWeek ? nextWeekTime : currentWeekTime;
+                    weekTime.TryGetSession(fairyLeagueRing, 1 - _session, out session);
+                    var fightStage = session.stages.Find((x) =>
                     {
-                        var _param = StringUtility.Contact(Language.Get(StringUtility.Contact("Weekday", groupTimes[_ring].dayOfWeek)),
-                            fightTimes[1].startHour.ToString("D2"), ":", fightTimes[1].startMinute.ToString("D2"));
+                        return x.stage == FairyLeagueStage.Fight;
+                    });
+                    if (_session == 0)
+                    {
+                        var _param = StringUtility.Contact(Language.Get(StringUtility.Contact("Weekday", weekTime.GetDayOfWeek(fairyLeagueRing))),
+                            fightStage.startHour.ToString("D2"), ":", fightStage.startMinute.ToString("D2"));
                         SysNotifyMgr.Instance.ShowTip("LeagueCannotGo1", _param);
                     }
                     else
                     {
-                        var _param = StringUtility.Contact(Language.Get("Next"), Language.Get(StringUtility.Contact("Weekday", groupTimes[_ring].dayOfWeek)),
-                            fightTimes[0].startHour.ToString("D2"), ":", fightTimes[0].startMinute.ToString("D2"));
+                        var _param = StringUtility.Contact(isNextWeek ? Language.Get("Next") : Language.Get("ThisTime"),
+                            Language.Get(StringUtility.Contact("Weekday", weekTime.GetDayOfWeek(fairyLeagueRing))),
+                            fightStage.startHour.ToString("D2"), ":", fightStage.startMinute.ToString("D2"));
                         SysNotifyMgr.Instance.ShowTip("LeagueCannotGo2", _param);
                     }
                     break;
@@ -680,16 +672,13 @@
             }
         }
 
-        private Dictionary<FairyLeagueStage, bool> dataRequestDict = new Dictionary<FairyLeagueStage, bool>();
         public void CheckFairyLeagueData()
         {
-            //if (dataRequestDict.ContainsKey(fairyLeagueStage) && !dataRequestDict[fairyLeagueStage])
-            //{
             CA001_tagViewUniversalGameRec _pak = new CA001_tagViewUniversalGameRec();
             _pak.ViewType = (byte)FAIRY_LEAGUE_BATTLE;
             GameNetSystem.Instance.SendInfo(_pak);
-            //}
         }
+
         public List<FairyLeagueBattleData> GetFairyLeague(int _ring, int _grade)
         {
             Dictionary<int, List<FairyLeagueBattleData>> dic = null;
@@ -780,13 +769,13 @@
 
         public FairyLeagueBattleData GetSelfBattleInfo()
         {
-            var _ring = fairyLeagueRing;
+            var _session = fairyLeagueSession;
             var _fairyId = PlayerDatas.Instance.fairyData.fairy.FamilyID;
-            if (!fairyLeagueBattleDict.ContainsKey(_ring))
+            if (!fairyLeagueBattleDict.ContainsKey(_session))
             {
                 return null;
             }
-            var _dict = fairyLeagueBattleDict[_ring];
+            var _dict = fairyLeagueBattleDict[_session];
             foreach (var _grade in _dict.Keys)
             {
                 if (_dict[_grade] == null)
@@ -804,9 +793,9 @@
             return null;
         }
 
-        public bool StepRing(int _grade = 5)
+        public bool StepSession(int _grade = 5)
         {
-            if (fairyLeagueRing == 1)
+            if (fairyLeagueSession == 1)
             {
                 if (!fairyLeagueBattleDict.ContainsKey(1))
                 {
@@ -932,69 +921,428 @@
         }
         #endregion
     }
-    public struct WeekTime
+
+    public class FairyLeagueWeekTime
     {
-        public int dayOfWeek { get; private set; }
-        public int startHour { get; private set; }
-        public int startMinute { get; private set; }
-        public int startSeconds { get; private set; }
-        public int endHour { get; private set; }
-        public int endMinute { get; private set; }
+        public List<Ring> rings = new List<Ring>();
 
-        public WeekTime(int _weekDay, int _startHour, int _startMinute, int _endHour, int _endMinute, int _startSeconds = 0)
-        {
-            dayOfWeek = _weekDay;
-            startHour = _startHour;
-            startMinute = _startMinute;
-            startSeconds = _startSeconds;
-            endHour = _endHour;
-            endMinute = _endMinute;
-        }
-        public static TimeSpan operator -(WeekTime y, WeekTime x)
-        {
-            var _totalSeconds = 0;
-            int i = x.dayOfWeek;
-            for (i = x.dayOfWeek; i != y.dayOfWeek; i = i == 7 ? 1 : i + 1)
-            {
-                if (i == x.dayOfWeek)
-                {
-                    _totalSeconds += (23 - x.startHour) * 3600 + (59 - x.startMinute) * 60 + 60 - x.startSeconds;
-                }
-                else
-                {
-                    _totalSeconds += 24 * 3600;
-                }
-            }
-            if (i == y.dayOfWeek)
-            {
-                if (x.dayOfWeek == i)
-                {
-                    var _timeSpany = new TimeSpan(y.startHour, y.startMinute, y.startSeconds);
-                    var _timeSpanx = new TimeSpan(x.startHour, x.startMinute, x.startSeconds);
-                    _totalSeconds += (int)(_timeSpany.TotalSeconds - _timeSpanx.TotalSeconds);
-                }
-                else
-                {
-                    _totalSeconds += y.startHour * 3600;
-                }
-            }
-            return new TimeSpan(_totalSeconds * TimeSpan.TicksPerSecond);
-        }
-
-        private static WeekTime s_Now = new WeekTime();
-        public static WeekTime Now
+        public bool IsNextWeek
         {
             get
             {
-                var _dayOfWeek = TimeUtility.ServerNow.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
-                s_Now.dayOfWeek = _dayOfWeek;
-                s_Now.startHour = TimeUtility.Hour;
-                s_Now.startMinute = TimeUtility.Minute;
-                s_Now.startSeconds = TimeUtility.Second;
-                return s_Now;
+                return rings.Count == 0 || rings[rings.Count - 1].IsOver(TimeUtility.ServerNow);
+            }
+        }
+
+        public FairyLeagueStage fairyLeagueStage
+        {
+            get
+            {
+                if (IsNextWeek)
+                {
+                    return FairyLeagueStage.Prepare;
+                }
+                Ring ring;
+                if (TryGetCurrentRing(out ring))
+                {
+                    Session session;
+                    if (ring.TryGetSession(TimeUtility.ServerNow, out session))
+                    {
+                        Stage stage;
+                        if (session.TryGetStage(TimeUtility.ServerNow, out stage))
+                        {
+                            return stage.stage;
+                        }
+                    }
+                }
+                return FairyLeagueStage.Prepare;
+            }
+        }
+
+        public int currentRing
+        {
+            get
+            {
+                var ring = 0;
+                for (int i = 0; i < rings.Count; i++)
+                {
+                    if (rings[i].InRing(TimeUtility.ServerNow))
+                    {
+                        return i;
+                    }
+                    if (rings[i].IsOver(TimeUtility.ServerNow))
+                    {
+                        ring++;
+                    }
+                }
+                return Mathf.Min(ring, rings.Count - 1);
+            }
+        }
+
+        public int GetDayOfWeek(int _index)
+        {
+            if (_index >= 0 && _index < rings.Count)
+            {
+                return rings[_index].dayOfWeek;
+            }
+            return 0;
+        }
+
+        public int currentSession
+        {
+            get
+            {
+                Ring ring;
+                if (TryGetCurrentRing(out ring))
+                {
+                    return ring.currentSession;
+                }
+                return 0;
+            }
+        }
+
+        public void AddStage(DungeonStateTimeConfig config)
+        {
+            var ring = rings.Find((x) =>
+            {
+                return x.dayOfWeek == config.StartWeekday;
+            });
+            if (ring == null)
+            {
+                ring = new Ring();
+                rings.Add(ring);
+                ring.dayOfWeek = config.StartWeekday;
+            }
+            ring.ParseConfig(config);
+        }
+
+        public void AddStage(DungeonSpecialStateTimeConfig config, int dayOfWeek)
+        {
+            var ring = rings.Find((x) =>
+            {
+                return x.dayOfWeek == dayOfWeek;
+            });
+
+            if (ring == null)
+            {
+                ring = new Ring();
+                rings.Add(ring);
+                ring.dayOfWeek = dayOfWeek;
+            }
+            ring.ParseConfig(config, dayOfWeek);
+        }
+
+        public void Sort()
+        {
+            rings.Sort((Ring x, Ring y) =>
+            {
+                return x.dayOfWeek.CompareTo(y.dayOfWeek);
+            });
+            for (int i = 0; i < rings.Count; i++)
+            {
+                rings[i].Sort();
+            }
+        }
+
+        public bool TryGetCurrentRing(out Ring ring)
+        {
+            ring = null;
+            for (int i = 0; i < rings.Count; i++)
+            {
+                if (rings[i].InRing(TimeUtility.ServerNow))
+                {
+                    ring = rings[i];
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public bool TryGetSession(int _ring, int _session, out Session session)
+        {
+            session = null;
+            if (_ring >= 0 && _ring < rings.Count)
+            {
+                if (_session >= 0 && _session < rings[_ring].sessions.Count)
+                {
+                    session = rings[_ring].sessions[_session];
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        public class Ring
+        {
+            public List<Session> sessions = new List<Session>();
+
+            public int currentSession
+            {
+                get
+                {
+                    for (int i = 0; i < sessions.Count; i++)
+                    {
+                        if (sessions[i].InSession(TimeUtility.ServerNow))
+                        {
+                            return i;
+                        }
+                    }
+                    return 0;
+                }
+            }
+
+            public int dayOfWeek { get; set; }
+
+            public void Sort()
+            {
+                sessions.Sort((Session x, Session y) =>
+                {
+                    return x.session.CompareTo(y.session);
+                });
+                for (int i = 0; i < sessions.Count; i++)
+                {
+                    sessions[i].Sort();
+                }
+            }
+
+            public void ParseConfig(DungeonStateTimeConfig config)
+            {
+                var session = sessions.Find((x) =>
+                {
+                    return x.session == (config.StateValue < 20 ? 0 : 1);
+                });
+                if (session == null)
+                {
+                    session = new Session();
+                    session.session = config.StateValue < 20 ? 0 : 1;
+                    sessions.Add(session);
+                }
+                session.ParseConfig(config);
+            }
+
+            public void ParseConfig(DungeonSpecialStateTimeConfig config, int dayOfWeek)
+            {
+                var session = sessions.Find((x) =>
+                {
+                    return x.session == (config.StateValue < 20 ? 0 : 1);
+                });
+                if (session == null)
+                {
+                    session = new Session();
+                    session.session = config.StateValue < 20 ? 0 : 1;
+                    sessions.Add(session);
+                }
+                session.ParseConfig(config, dayOfWeek);
+            }
+
+            public bool InRing(DateTime time)
+            {
+                for (int i = 0; i < sessions.Count; i++)
+                {
+                    if (sessions[i].InSession(time))
+                    {
+                        return true;
+                    }
+                }
+                return false;
+            }
+
+            public bool TryGetSession(DateTime time, out Session session)
+            {
+                session = null;
+                for (int i = 0; i < sessions.Count; i++)
+                {
+                    if (sessions[i].InSession(time))
+                    {
+                        session = sessions[i];
+                        return true;
+                    }
+                }
+                return false;
+            }
+            public bool IsOver(DateTime time)
+            {
+                bool allOver = true;
+                for (int i = 0; i < sessions.Count; i++)
+                {
+                    if (!sessions[i].IsOver(time))
+                    {
+                        allOver = false;
+                        break;
+                    }
+                }
+                return allOver;
+            }
+        }
+
+        public class Session
+        {
+            public List<Stage> stages = new List<Stage>();
+
+            public int session { get; set; }
+
+            public void Sort()
+            {
+                var fightStage = stages.Find((x) =>
+                {
+                    return x.stage == FairyLeagueStage.Fight;
+                });
+                var overStage = stages.Find((x) =>
+                {
+                    return x.stage == FairyLeagueStage.Over;
+                });
+                overStage.startHour = fightStage.endHour;
+                overStage.startMinute = fightStage.endMinute;
+                stages.Sort(Compare);
+            }
+
+            public void ParseConfig(DungeonStateTimeConfig config)
+            {
+                var state = config.StateValue % 10;
+                var stage = new Stage()
+                {
+                    stage = state == 1 ? FairyLeagueStage.Grouping : (state == 2 ? FairyLeagueStage.Fight : FairyLeagueStage.Over),
+                    dayOfWeek = config.StartWeekday,
+                    startHour = config.StartHour,
+                    endHour = config.EndHour,
+                    startMinute = config.StartMinute,
+                    endMinute = config.EndMinute
+                };
+                stages.Add(stage);
+            }
+
+            public void ParseConfig(DungeonSpecialStateTimeConfig config, int dayOfWeek)
+            {
+                var state = config.StateValue % 10;
+                var stage = new Stage()
+                {
+                    stage = state == 1 ? FairyLeagueStage.Grouping : (state == 2 ? FairyLeagueStage.Fight : FairyLeagueStage.Over),
+                    dayOfWeek = dayOfWeek,
+                    startHour = config.StartHour,
+                    endHour = config.EndHour,
+                    startMinute = config.StartMinute,
+                    endMinute = config.EndMinute
+                };
+                stages.Add(stage);
+            }
+
+            public bool InSession(DateTime time)
+            {
+                var groupStage = stages.Find((x) =>
+                {
+                    return x.stage == FairyLeagueStage.Grouping;
+                });
+                var overStage = stages.Find((x) =>
+                {
+                    return x.stage == FairyLeagueStage.Over;
+                });
+                var _dayOfWeek = time.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)time.DayOfWeek;
+                if (_dayOfWeek != groupStage.dayOfWeek)
+                {
+                    return false;
+                }
+                if (time.Hour < groupStage.startHour || time.Hour > overStage.endHour)
+                {
+                    return false;
+                }
+                if (time.Hour == groupStage.startHour && time.Minute < groupStage.startMinute)
+                {
+                    return false;
+                }
+                if (time.Hour == overStage.endHour && time.Minute > overStage.endMinute)
+                {
+                    return false;
+                }
+                return true;
+            }
+
+            public bool TryGetStage(DateTime time, out Stage stage)
+            {
+                stage = default(Stage);
+                for (int i = 0; i < stages.Count; i++)
+                {
+                    if (stages[i].InStage(time))
+                    {
+                        stage = stages[i];
+                        return true;
+                    }
+                    if (stages[i].IsOver(time))
+                    {
+                        stage = stages[i];
+                    }
+                }
+                return !stage.Equals(default(Stage));
+            }
+
+            public bool IsOver(DateTime time)
+            {
+                var stage = stages.Find((x) =>
+                {
+                    return x.stage == FairyLeagueStage.Over;
+                });
+                return stage.IsOver(time);
+            }
+
+            int Compare(Stage x, Stage y)
+            {
+                return x.stage.CompareTo(y.stage);
+            }
+        }
+
+        public class Stage
+        {
+            public FairyLeagueStage stage;
+            public int dayOfWeek;
+            public int startHour;
+            public int endHour;
+            public int startMinute;
+            public int endMinute;
+
+            public bool InStage(DateTime time)
+            {
+                var _dayOfWeek = time.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)time.DayOfWeek;
+                if (dayOfWeek != _dayOfWeek)
+                {
+                    return false;
+                }
+                if (time.Hour < startHour || time.Hour > endHour)
+                {
+                    return false;
+                }
+                if (time.Hour == startHour && time.Minute < startMinute)
+                {
+                    return false;
+                }
+                if (time.Hour == endHour && time.Minute >= endMinute)
+                {
+                    return false;
+                }
+                return true;
+            }
+
+            public bool IsOver(DateTime time)
+            {
+                var _dayOfWeek = time.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)time.DayOfWeek;
+                if (_dayOfWeek > dayOfWeek)
+                {
+                    return true;
+                }
+                if (dayOfWeek == _dayOfWeek)
+                {
+                    if (time.Hour > endHour)
+                    {
+                        return true;
+                    }
+                    if (time.Hour == endHour && time.Minute >= endMinute)
+                    {
+                        return true;
+                    }
+                }
+                return false;
             }
         }
     }
+
     public enum FairyLeagueStage
     {
         Prepare,

--
Gitblit v1.8.0