using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Text.RegularExpressions; using Snxxz.UI; using TableConfig; 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 DailyQuestOpenTime { public int id; public bool always; public int openServerWeek; public int openServerDay; public Dictionary> openTimes; public DailyQuestOpenTime(int _id, string _timeString, int _duration) { this.id = _id; this.openServerWeek = 0; this.openServerDay = 0; var matches = Regex.Matches(_timeString, "\\\"[0-9]\\\":\\[[0-9|,|\\[|\\]]+"); always = matches.Count == 0; openTimes = new Dictionary>(); 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 DailyQuestOpenTime(int _id, List _configs) { id = _id; always = _configs == null || _configs.Count == 0; openTimes = new Dictionary>(); this.openServerWeek = 0; this.openServerDay = 0; if (!always) { if (_configs.Count > 0) { this.openServerWeek = _configs[0].OpenServerWeek; this.openServerDay = _configs[0].OpenServerDay; } for (int i = 0; i < _configs.Count; i++) { var config = _configs[i]; 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 bool IsValidServerOpenTime() { if (TimeUtility.OpenDay >= this.openServerDay && TimeUtility.OpenWeekCnt >= this.openServerWeek) { return true; } else { return false; } } public bool InOpenTime() { if (always) { return true; } 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 && minute <= hourMinute.minuteEnd) { _hourMinute = hourMinute; break; } } return true; } public string ToOpenTimeString() { if (always || openTimes.Count >= 7) { return Language.Get("DailyQuest_NoTimeLimit"); } else { var timeStringArray = new string[openTimes.Count]; var index = 0; foreach (var key in openTimes.Keys) { switch (key) { case 0: timeStringArray[index] = Language.Get("Weekday7"); break; case 1: timeStringArray[index] = Language.Get("Weekday1"); break; case 2: timeStringArray[index] = Language.Get("Weekday2"); break; case 3: timeStringArray[index] = Language.Get("Weekday3"); break; case 4: timeStringArray[index] = Language.Get("Weekday4"); break; case 5: timeStringArray[index] = Language.Get("Weekday5"); break; case 6: timeStringArray[index] = Language.Get("Weekday6"); break; } index++; } return string.Join("、", timeStringArray); } } public List GetHourMinuteByWeek(int week) { 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; } }