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<int, List<HourMinute>> openTimes = new Dictionary<int, List<HourMinute>>();
|
//开服前2周的活动时间,key1是开服日的星期,key2是开服第几天
|
Dictionary<int, Dictionary<int, List<HourMinute>>> specialOpenTimes = new Dictionary<int, Dictionary<int, List<HourMinute>>>();
|
|
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<HourMinute>();
|
|
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<HourMinute>(tempHourMinutes);
|
}
|
}
|
else
|
{
|
var hourMinutes = openTimes[week % 7] = new List<HourMinute>();
|
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<DailyQuestSpecialOpenTimeConfig> configs)
|
{
|
if (configs == null)
|
{
|
return;
|
}
|
|
foreach (var config in configs)
|
{
|
var openDayWeek = config.OpenServerWeek % 7;
|
if (!specialOpenTimes.ContainsKey(openDayWeek))
|
{
|
specialOpenTimes[openDayWeek] = new Dictionary<int, List<HourMinute>>();
|
}
|
|
var dayIndexOpenTimes = specialOpenTimes[openDayWeek];
|
var dayIndex = config.OpenServerDay;
|
if (!dayIndexOpenTimes.ContainsKey(dayIndex))
|
{
|
dayIndexOpenTimes[dayIndex] = new List<HourMinute>();
|
}
|
|
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<DungeonStateTimeConfig> configs)
|
{
|
always = configs == null || configs.Count == 0;
|
|
if (!always)
|
{
|
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<HourMinute>();
|
}
|
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<HourMinute>();
|
}
|
|
var hourMinutes = openTimes[dayOfWeek];
|
hourMinutes.Add(new HourMinute(config.StartHour, config.StartMinute, config.EndHour, config.EndMinute));
|
}
|
}
|
}
|
}
|
|
public void ParseDungeonSpecialOpenTimes(List<DungeonSpecialStateTimeConfig> configs)
|
{
|
if (configs == null)
|
{
|
return;
|
}
|
|
foreach (var config in configs)
|
{
|
var openDayWeek = config.OpenServerWeek % 7;
|
if (!specialOpenTimes.ContainsKey(openDayWeek))
|
{
|
specialOpenTimes[openDayWeek] = new Dictionary<int, List<HourMinute>>();
|
}
|
|
var dayIndexOpenTimes = specialOpenTimes[openDayWeek];
|
var dayIndex = config.OpenServerDay;
|
if (!dayIndexOpenTimes.ContainsKey(dayIndex))
|
{
|
dayIndexOpenTimes[dayIndex] = new List<HourMinute>();
|
}
|
|
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.openServerTime.DayOfWeek;
|
var dayIndex = TimeUtility.OpenDay + 1;
|
if (isSpecialDay && specialOpenTimes.ContainsKey(openDayWeek) && specialOpenTimes[openDayWeek].ContainsKey(dayIndex))
|
{
|
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.openServerTime.DayOfWeek;
|
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.openServerTime.DayOfWeek;
|
|
List<HourMinute> 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.openServerTime.DayOfWeek;
|
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<string>();
|
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<HourMinute> GetHourMinuteByWeek(int week)
|
{
|
var isSpecificDay = TimeUtility.OpenWeekCnt <= 1;
|
if (isSpecificDay)
|
{
|
var openDayWeek = (int)TimeUtility.openServerTime.DayOfWeek;
|
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;
|
}
|
|
}
|
|
|
|
|
|