using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Text.RegularExpressions; 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 struct DailyQuestTimes { public int completeTimes; public int dayBuyTimes; public int dayUseItemTimes; } public class DailyQuestOpenTime { public int id; public bool always; //常规的活动时间,key是星期x Dictionary> openTimes = new Dictionary>(); public DailyQuestOpenTime(int _id) { this.id = _id; } public void ParseQuestNormalOpenTime(DailyQuestOpenTimeConfig activityOpenTime) { string timeString = activityOpenTime.OpenTime; int duration = activityOpenTime.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); }); } } } // 改成判断日常活动ID不在定制中配置则定制期间正常开启 public bool InOpenTime() { if (always) { return true; } return IsNormalOpenTime(); } //日常活动开启判断 private bool IsNormalOpenTime() { 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 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 || (hour == hourMinute.hourEnd && minute <= hourMinute.minuteEnd)) { _hourMinute = hourMinute; break; } } return true; } public List GetNormalHourMinutes() { foreach (var hourMinutes in openTimes.Values) { if (hourMinutes != null) { return hourMinutes; } } 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 bool AfterOpenTime(int hour, int minute) { if (wholeDay) { return false; } else { var minutes = hour * 60 + minute; return (hourEnd * 60 + minuteEnd) <= minutes; } } 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; } }