using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Text.RegularExpressions; using Snxxz.UI; using TableConfig; using LitJson; public class DailyQuestData { public int id { get; private set; } public Redpoint redpoint { get; private set; } public DailyQuestData(int _id) { this.id = _id; } public DailyQuestData(int _id, int _redpointId, int _parentRedpoint) { this.id = _id; this.redpoint = new Redpoint(_parentRedpoint, _redpointId); } public void UpdateRedpointState(RedPointState _redpointState) { if (this.redpoint != null) { this.redpoint.state = _redpointState; } } } public class DailyQuestActiveValueReward { public int id { get; private set; } bool m_Got = false; public bool got { get { return this.m_Got; } set { this.m_Got = value; } } public DailyQuestActiveValueReward(int _id) { this.id = _id; } } public class DailyQuestOpenTime { public int id; public bool always; //常规的活动时间,key是星期x Dictionary> openTimes = new Dictionary>(); //开服前2周的活动时间,key1是开服日的星期,key2是开服第几天 Dictionary>> specialOpenTimes = new Dictionary>>(); public DailyQuestOpenTime(int _id) { this.id = _id; } public void ParseQuestNormalOpenTime(string timeString, int duration) { var matches = Regex.Matches(timeString, "\\\"[0-9]\\\":\\[[0-9|,|\\[|\\]]+"); always = matches.Count == 0; for (int i = 0; i < matches.Count; i++) { var match = matches[i]; var stringArray = match.Value.Split(':'); var week = 0; var weekMatch = Regex.Match(stringArray[0], "[0-9]"); int.TryParse(weekMatch.Value, out week); if (week == 0) { var subMatches = Regex.Matches(stringArray[1], "[0-9]{1,2},[0-9]{1,2}"); var tempHourMinutes = new List(); for (int j = 0; j < subMatches.Count; j++) { tempHourMinutes.Add(new HourMinute(subMatches[j].Value, duration)); } tempHourMinutes.Sort((HourMinute a, HourMinute b) => { return HourMinute.Compare(a, b); }); for (int j = 0; j < 7; j++) { var hourMinutes = openTimes[j] = new List(tempHourMinutes); } } else { var hourMinutes = openTimes[week % 7] = new List(); var subMatches = Regex.Matches(stringArray[1], "[0-9]{1,2},[0-9]{1,2}"); for (int j = 0; j < subMatches.Count; j++) { hourMinutes.Add(new HourMinute(subMatches[j].Value, duration)); } hourMinutes.Sort((HourMinute a, HourMinute b) => { return HourMinute.Compare(a, b); }); } } } public void ParseQuestSpecialOpenTimes(List configs) { if (configs == null) { return; } foreach (var config in configs) { var openDayWeek = config.OpenServerWeek % 7; if (!specialOpenTimes.ContainsKey(openDayWeek)) { specialOpenTimes[openDayWeek] = new Dictionary>(); } var dayIndexOpenTimes = specialOpenTimes[openDayWeek]; var dayIndex = config.OpenServerDay; if (!dayIndexOpenTimes.ContainsKey(dayIndex)) { dayIndexOpenTimes[dayIndex] = new List(); } var matches = Regex.Matches(config.TimeList, "\\[[0-9]{1,2},[0-9]{1,2}\\]"); var hourMinutes = dayIndexOpenTimes[dayIndex]; for (int i = 0; i < matches.Count; i++) { var temp = matches[i].Value; hourMinutes.Add(new HourMinute(temp, config.Duration)); } } } public void ParseDungeonNormalOpenTimes(List configs) { always = configs == null || configs.Count == 0; if (!always) { for (int i = 0; i < configs.Count; i++) { var config = configs[i]; if (config.CanEnter == 0) { continue; } if (config.StartWeekday == 0 && config.EndWeekday == 0) { for (int j = 0; j < 7; j++) { if (!openTimes.ContainsKey(j)) { openTimes[j] = new List(); } var hourMinutes = openTimes[j]; hourMinutes.Add(new HourMinute(config.StartHour, config.StartMinute, config.EndHour, config.EndMinute)); } } else { var dayOfWeek = config.StartWeekday % 7; if (!openTimes.ContainsKey(dayOfWeek)) { openTimes[dayOfWeek] = new List(); } var hourMinutes = openTimes[dayOfWeek]; hourMinutes.Add(new HourMinute(config.StartHour, config.StartMinute, config.EndHour, config.EndMinute)); } } } } public void ParseDungeonSpecialOpenTimes(List configs) { if (configs == null) { return; } foreach (var config in configs) { if (config.CanEnter == 0) { continue; } var openDayWeek = config.OpenServerWeek % 7; if (!specialOpenTimes.ContainsKey(openDayWeek)) { specialOpenTimes[openDayWeek] = new Dictionary>(); } var dayIndexOpenTimes = specialOpenTimes[openDayWeek]; var dayIndex = config.OpenServerDay; if (!dayIndexOpenTimes.ContainsKey(dayIndex)) { dayIndexOpenTimes[dayIndex] = new List(); } var hourMinutes = dayIndexOpenTimes[dayIndex]; hourMinutes.Add(new HourMinute(config.StartHour, config.StartMinute, config.EndHour, config.EndMinute)); } } public bool IsValidServerOpenTime() { return true; } public bool InOpenTime() { if (always) { return true; } var isSpecialDay = TimeUtility.OpenWeekCnt <= 1; var openDayWeek = (int)TimeUtility.openServerDayOfWeek; var dayIndex = TimeUtility.OpenDay + 1; if (isSpecialDay) { if (specialOpenTimes.ContainsKey(openDayWeek) && specialOpenTimes[openDayWeek].ContainsKey(dayIndex)) { var hourMinutes = specialOpenTimes[openDayWeek][dayIndex]; for (int i = 0; i < hourMinutes.Count; i++) { if (hourMinutes[i].InOpenTime()) { return true; } } return false; } else { return false; } } else { var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek; if (!openTimes.ContainsKey(dayOfWeek)) { return false; } else { var hourMinutes = openTimes[dayOfWeek]; for (int i = 0; i < hourMinutes.Count; i++) { if (hourMinutes[i].InOpenTime()) { return true; } } return false; } } } public bool TryGetTodayNearestOpenTime(out HourMinute _hourMinute) { var isSpecialDay = TimeUtility.OpenWeekCnt <= 1; var openDayWeek = (int)TimeUtility.openServerDayOfWeek; var dayIndex = TimeUtility.OpenDay + 1; if (isSpecialDay) { if (specialOpenTimes.ContainsKey(openDayWeek) && specialOpenTimes[openDayWeek].ContainsKey(dayIndex)) { var hour = TimeUtility.ServerNow.Hour; var minute = TimeUtility.ServerNow.Minute; var hourMinutes = specialOpenTimes[openDayWeek][dayIndex]; _hourMinute = hourMinutes[hourMinutes.Count - 1]; for (int i = 0; i < hourMinutes.Count; i++) { var hourMinute = hourMinutes[i]; if (hour <= hourMinute.hourEnd && minute <= hourMinute.minuteEnd) { _hourMinute = hourMinute; break; } } return true; } else { _hourMinute = default(HourMinute); return false; } } else { var dayOfWeek = (int)TimeUtility.ServerNow.DayOfWeek; if (!openTimes.ContainsKey(dayOfWeek)) { _hourMinute = default(HourMinute); return false; } var hour = TimeUtility.ServerNow.Hour; var minute = TimeUtility.ServerNow.Minute; var hourMinutes = openTimes[dayOfWeek]; _hourMinute = hourMinutes[hourMinutes.Count - 1]; for (int i = 0; i < hourMinutes.Count; i++) { var hourMinute = hourMinutes[i]; if (hour <= hourMinute.hourEnd && minute <= hourMinute.minuteEnd) { _hourMinute = hourMinute; break; } } return true; } } public bool ContainTimeNode(int week, int timeNode) { var openDayWeek = (int)TimeUtility.openServerDayOfWeek; List hourMinutes = null; var dayDelta = (week == 0 ? 7 : week) - (openDayWeek == 0 ? 7 : openDayWeek); if (TimeUtility.OpenWeekCnt < 1 && dayDelta < 0) { openTimes.TryGetValue(week, out hourMinutes); } else { hourMinutes = GetHourMinuteByWeek(week); } if (hourMinutes != null) { foreach (var item in hourMinutes) { if (item.hourBegin * 60 + item.minuteBegin == timeNode) { return true; } } } return false; } private bool ContainWeek(int week) { var openDayWeek = (int)TimeUtility.openServerDayOfWeek; var todayWeek = (int)TimeUtility.ServerNow.DayOfWeek; var dayDelta = (week == 0 ? 7 : week) - (openDayWeek == 0 ? 7 : openDayWeek); if (TimeUtility.OpenWeekCnt < 1 && dayDelta < 0) { return openTimes.ContainsKey(week); } else { return GetHourMinuteByWeek(week) != null; } } public string ToOpenTimeString() { if (always || openTimes.Count >= 7) { return Language.Get("DailyQuest_NoTimeLimit"); } else { var timeStringList = new List(); for (var i = 1; i <= 7; i++) { var week = i % 7; if (ContainWeek(week)) { switch (week) { case 0: timeStringList.Add(Language.Get("Weekday7")); break; case 1: timeStringList.Add(Language.Get("Weekday1")); break; case 2: timeStringList.Add(Language.Get("Weekday2")); break; case 3: timeStringList.Add(Language.Get("Weekday3")); break; case 4: timeStringList.Add(Language.Get("Weekday4")); break; case 5: timeStringList.Add(Language.Get("Weekday5")); break; case 6: timeStringList.Add(Language.Get("Weekday6")); break; } } } return string.Join("、", timeStringList.ToArray()); } } public List GetHourMinuteByWeek(int week) { var isSpecificDay = TimeUtility.OpenWeekCnt <= 1; if (isSpecificDay) { var openDayWeek = (int)TimeUtility.openServerDayOfWeek; var todayWeek = (int)TimeUtility.ServerNow.DayOfWeek; var dayDelta = ((week == 0 ? 7 : week) - (todayWeek == 0 ? 7 : todayWeek)); var dayIndex = TimeUtility.OpenDay + 1 + dayDelta; if (specialOpenTimes.ContainsKey(openDayWeek) && specialOpenTimes[openDayWeek].ContainsKey(dayIndex)) { return specialOpenTimes[openDayWeek][dayIndex]; } } else if (openTimes.ContainsKey(week)) { return openTimes[week]; } return null; } } public struct HourMinute { public int hourBegin; public int minuteBegin; public int hourEnd; public int minuteEnd; public bool wholeDay; public HourMinute(string _input, int _duration) { var matches = Regex.Matches(_input, "[0-9]{1,2}"); if (matches.Count >= 2) { hourBegin = int.Parse(matches[0].Value); minuteBegin = int.Parse(matches[1].Value); hourEnd = hourBegin + _duration / 60; minuteEnd = minuteBegin + _duration % 60; if (minuteEnd >= 60) { minuteEnd = minuteEnd % 60; hourEnd += 1; } wholeDay = false; } else { hourBegin = 0; minuteBegin = 0; hourEnd = 0; minuteEnd = 0; wholeDay = true; } } public HourMinute(int _hourBegin, int _minuteBegin, int _hourEnd, int _minuteEnd) { hourBegin = _hourBegin; minuteBegin = _minuteBegin; hourEnd = _hourEnd; minuteEnd = _minuteEnd; wholeDay = hourBegin == 0 && minuteBegin == 0 && hourEnd == 0 && minuteEnd == 0; } public bool InOpenTime() { if (wholeDay) { return true; } else { var minutes = TimeUtility.ServerNow.Hour * 60 + TimeUtility.ServerNow.Minute; if ((hourBegin * 60 + minuteBegin) <= minutes && (hourEnd * 60 + minuteEnd) > minutes) { return true; } else { return false; } } } public override string ToString() { var minuteBeginStr = minuteBegin > 9 ? minuteBegin.ToString() : StringUtility.Contact("0", minuteBegin); var minuteEndStr = minuteEnd > 9 ? minuteEnd.ToString() : StringUtility.Contact("0", minuteEnd); return StringUtility.Contact(hourBegin, ":", minuteBeginStr, "--", hourEnd, ":", minuteEndStr); } public string ToOpenTime() { if (minuteBegin < 10) { return StringUtility.Contact(hourBegin, ":0", minuteBegin); } else { return StringUtility.Contact(hourBegin, ":", minuteBegin); } } public static int Compare(HourMinute _lhs, HourMinute _rhs) { return (_lhs.hourBegin * 60 + _lhs.minuteBegin) < (_rhs.hourBegin * 60 + _rhs.minuteBegin) ? -1 : 1; } }