using System; using System.Collections.Generic; using System.Globalization; using IgnoreOPS; using UnityEngine; using Random = System.Random; namespace ChillConnect { public class RankSystemMgr : BaseInterfaceManager { public string[] time_slot = { "00:00-2:00", "2:00-9:00", "9:00-19:00", "19:00-23:59" }; public int hourTime = 3 * 60; // 3 hour public int[] basePoint = { 0, 10 }; public int RobotNum = 500; // public long selfUid = 12345678; public int[] RobotBasicScore = { 10, 20 }; public int addPoints; public int addPointsUI; public List hourRewardList; public List dayRewardList; public List weekRewardList; public void checkUsers() { time_slot = ConfigSystem.GetConfig().TimeSlot; hourTime = ConfigSystem.GetConfig().HourTime * 60; basePoint = ConfigSystem.GetConfig().basePoint; // basePoint[0] = basePoint[1]; RobotNum = ConfigSystem.GetConfig().RobotNum; hourRewardList = ConfigSystem.GetConfig().DataList; dayRewardList = ConfigSystem.GetConfig().DataList; weekRewardList = ConfigSystem.GetConfig().DataList; if (SaveData.GetRankData().users == null || SaveData.GetRankData().users.Count == 0) { CreatUsers(); } upRewardAndRank(); } public void upRewardAndRank() { // upRankReward(); // updateRank(); } private void CreatUsers() { string name = GameHelper.GetUserName(); SaveData.GetRankData().users.Clear(); for (int i = 0; i < RobotNum; i++) { UserData user = new UserData(); user.uid = i + 1; user.name = GenerateName(name.Length); user.bonus = 0; user.headId = _random.Next(1, 5); user.hourPoints = 0; user.dayPoints = 0; user.weekPoints = 0; user.lastHourPoints = 0; user.lastDayPoints = 0; user.lastWeekPoints = 0; // user.add_points_time = new int[time_slot.Length]; // user.remaining_time = new int[time_slot.Length]; user.add_points_time = new int[7][]; user.remaining_time = new int[7][]; for (int j = 0; j < 7; j++) { user.add_points_time[j] = new int[time_slot.Length]; user.remaining_time[j] = new int[time_slot.Length]; } for (int k = 0; k < 7; k++) { for (int j = 0; j < time_slot.Length; j++) { int value = GetTimeDifferenceInMinutes(time_slot[j]); if (value > 10) { user.add_points_time[k][j] = _random.Next(10, value); } else { user.add_points_time[k][j] = _random.Next(0, value); } user.remaining_time[k][j] = user.add_points_time[k][j]; } } SaveData.GetRankData().users.Add(user); } // 自己的数据 SaveData.GetRankData().selfUser = new UserData(); // if (GameHelper.IsGiftSwitch()) // { SaveData.GetRankData().selfUser.uid = GameHelper.GetLoginModel().Uid; // } // else // { // SaveData.GetRankData().selfUser.uid = selfUid; // } SaveData.GetRankData().selfUser.name = GameHelper.GetUserName(); SaveData.GetRankData().selfUser.bonus = 0; SaveData.GetRankData().selfUser.headId = DataMgr.PlayerAvatarId.Value; SaveData.GetRankData().selfUser.points = 0; SaveData.GetRankData().selfUser.hourPoints = 0; SaveData.GetRankData().selfUser.dayPoints = 0; SaveData.GetRankData().selfUser.weekPoints = 0; SaveData.SaveRankFunc(); } public void updateRank() { // SaveData.GetSaveObject().lastLoginTime = 1747056321 + (long)(86400 * 0.5); long curTime = GameHelper.GetNowTime(); DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(curTime); DateTime curLocalTime = utcTime.ToLocalTime(); int hour = curLocalTime.Hour; int minute = curLocalTime.Minute; DayOfWeek dayOfWeek = curLocalTime.DayOfWeek; if (SaveData.GetSaveObject().lastLoginTime != 0) { utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(SaveData.GetSaveObject().lastLoginTime); DateTime lastLocalTime = utcTime.ToLocalTime(); int lastHour = lastLocalTime.Hour; int lastMinute = lastLocalTime.Minute; DayOfWeek lastDayOfWeek = lastLocalTime.DayOfWeek; bool sameWeek = isInSameWeek(curLocalTime, lastLocalTime); if (sameWeek) { if (dayOfWeek != lastDayOfWeek) { clearAndCreateData(dayOfWeek); } else { upLastToCurPoints(dayOfWeek, lastHour, lastMinute, hour, minute); } } else { CreatUsers(); clearAndCreateData(dayOfWeek); } } else { clearAndCreateData(dayOfWeek); } upSelfPoints(); SaveData.GetSaveObject().lastLoginTime = GameHelper.GetNowTime(); SaveData.SaveRankFunc(); } // 检查是否有奖励 public void upRankReward() { long curTime = GameHelper.GetNowTime(); DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(curTime); DateTime curLocalTime = utcTime.ToLocalTime(); int hour = curLocalTime.Hour; int minute = curLocalTime.Minute; int day = curLocalTime.Day; int year = curLocalTime.Year; int month = curLocalTime.Month; DayOfWeek dayOfWeek = curLocalTime.DayOfWeek; int round = hour / (hourTime / 60); if (SaveData.GetSaveObject().lastLoginTime != 0) { utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(SaveData.GetSaveObject().lastLoginTime); DateTime lastLocalTime = utcTime.ToLocalTime(); int lastHour = lastLocalTime.Hour; int lastMinute = lastLocalTime.Minute; int lastDay = lastLocalTime.Day; int lastyear = curLocalTime.Year; int lastmonth = curLocalTime.Month; DayOfWeek lastDayOfWeek = lastLocalTime.DayOfWeek; int lastRound = lastHour / (hourTime / 60); // 不同一周 List users = SaveData.GetRankData().users; if (!isInSameWeek(curLocalTime, lastLocalTime)) { for (int i = 0; i < users.Count; i++) { int points1 = getWeekPoints(users[i]); users[i].lastWeekPoints = points1; } SaveData.GetRankData().selfUser.lastWeekPoints = SaveData.GetRankData().selfUser.weekPoints; var temp = SaveData.GetRankData().selfUser.lastWeekPoints; SaveData.GetRankData().users.Add(SaveData.GetRankData().selfUser); SaveData.GetRankData().users.Sort((a, b) => b.lastWeekPoints.CompareTo(a.lastWeekPoints)); for (int i = 0; i < weekRewardList.Count; i++) { // SaveData.GetRankData().users[i].bonus = weekRewardList[i].award; if (SaveData.GetRankData().users[i].uid == SaveData.GetRankData().selfUser.uid) { RankRewardData data = new RankRewardData(); data.rank = i + 1; data.type = rankType.week; data.bonus = weekRewardList[i].award; data.time = getLastLoginWeekEndTime(); SaveData.GetRankData().rankRewardData.Insert(0, data); SaveData.GetRankData().selfUser.lastWeekPoints = 0; break; } } SaveData.GetRankData().users.Remove(SaveData.GetRankData().selfUser); } // 不同一天 if (year != lastyear || month != lastmonth || day != lastDay) { int index = getIndexInTimeSlot(lastHour, lastMinute); for (int i = 0; i < users.Count; i++) { users[i].lastDayPoints = getDayPoints(users[i], lastDayOfWeek, index); } SaveData.GetRankData().selfUser.lastDayPoints = SaveData.GetRankData().selfUser.dayPoints; SaveData.GetRankData().users.Add(SaveData.GetRankData().selfUser); SaveData.GetRankData().users.Sort((a, b) => b.lastDayPoints.CompareTo(a.lastDayPoints)); for (int i = 0; i < dayRewardList.Count; i++) { // SaveData.GetRankData().users[i].bonus = dayRewardList[i].award; if (SaveData.GetRankData().users[i].uid == SaveData.GetRankData().selfUser.uid) { RankRewardData data = new RankRewardData(); data.rank = i + 1; data.type = rankType.day; data.bonus = dayRewardList[i].award; data.time = getLastLoginDateTime(); SaveData.GetRankData().rankRewardData.Insert(0, data); SaveData.GetRankData().selfUser.lastDayPoints = 0; break; } } SaveData.GetRankData().users.Remove(SaveData.GetRankData().selfUser); } // 不同时段 if (day != lastDay || round != lastRound) { int index = getIndexInTimeSlot(lastHour, lastMinute); for (int i = 0; i < users.Count; i++) { users[i].lastHourPoints = getRoundPoints(users[i], lastDayOfWeek, index); } SaveData.GetRankData().selfUser.lastHourPoints = SaveData.GetRankData().selfUser.hourPoints; var temp = SaveData.GetRankData().selfUser.lastHourPoints; SaveData.GetRankData().users.Add(SaveData.GetRankData().selfUser); SaveData.GetRankData().users.Sort((a, b) => b.lastHourPoints.CompareTo(a.lastHourPoints)); var temp2 = SaveData.GetRankData().users; for (int i = 0; i < hourRewardList.Count; i++) { // SaveData.GetRankData().users[i].bonus = hourRewardList[i].award; if (SaveData.GetRankData().users[i].uid == SaveData.GetRankData().selfUser.uid) { RankRewardData data = new RankRewardData(); data.rank = i + 1; data.type = rankType.hour; data.bonus = hourRewardList[i].award; data.time = getLastLoginRoundTime(); SaveData.GetRankData().rankRewardData.Insert(0, data); SaveData.GetRankData().selfUser.lastHourPoints = 0; break; } } SaveData.GetRankData().users.Remove(SaveData.GetRankData().selfUser); } } remove30DaysData(); if (SaveData.GetRankData().rankRewardData.Count > 0) { GameDispatcher.Instance.Dispatch(GameMsg.RefreshHallRank); } } // 获取排行榜 public List getRankData(rankType type) { List originalUsers = SaveData.GetRankData().users; List rankList = new List(originalUsers); rankList.Add(SaveData.GetRankData().selfUser); for (int i = 0; i < rankList.Count; i++) { rankList[i].bonus = 0; } if (type == rankType.hour) { rankList.Sort((a, b) => b.hourPoints.CompareTo(a.hourPoints)); for (int i = 0; i < hourRewardList.Count; i++) { if (i >= rankList.Count) { break; } rankList[i].bonus = hourRewardList[i].award; } } else if (type == rankType.day) { rankList.Sort((a, b) => b.dayPoints.CompareTo(a.dayPoints)); for (int i = 0; i < dayRewardList.Count; i++) { if (i >= rankList.Count) { break; } rankList[i].bonus = dayRewardList[i].award; } } else if (type == rankType.week) { rankList.Sort((a, b) => b.weekPoints.CompareTo(a.weekPoints)); for (int i = 0; i < weekRewardList.Count; i++) { if (i >= rankList.Count) { break; } rankList[i].bonus = weekRewardList[i].award; } } return rankList; } // 更新排行榜 public void clearAndCreateData(DayOfWeek dayOfWeek) { List users = SaveData.GetRankData().users; for (int i = 0; i < users.Count; i++) { int points1 = getMondayToCurDayPoints(users[i], dayOfWeek); int[] pointsArr = getCurDayPoints(users[i]); users[i].weekPoints = points1 + pointsArr[0]; users[i].dayPoints = pointsArr[0]; users[i].hourPoints = pointsArr[1]; } } // 更新同一天内上次到本次登陆的积分 public int upLastToCurPoints(DayOfWeek day_of_week, int lastHour, int lastMinute, int hour, int minute) { int dayOfWeek = (int)day_of_week; if (day_of_week == DayOfWeek.Sunday) { dayOfWeek = 7; } int index = getIndexInTimeSlot(hour, minute); int lastLoginIndex = getIndexInTimeSlot(lastHour, lastMinute); int round = hour / (hourTime / 60); int last_round = lastHour / (hourTime / 60); int perTime = getInPreSlotTime(index, hour); List users = SaveData.GetRankData().users; int totalTime = GetTimeDifferenceInMinutes(time_slot[lastLoginIndex]); for (int i = 0; i < users.Count; i++) { int points = 0; for (int j = 0; j < users[i].add_points_time.Length; j++) { if (j + 1 == dayOfWeek) { string[] parts = time_slot[index].Split('-'); string startTimeStr = parts[0].Trim(); string curHM = $"{hour:D2}:{minute:D2}"; string curTimeDifference = startTimeStr + "-" + curHM; string lastHM = $"{lastHour:D2}:{lastMinute:D2}"; string lastTimeDifference = startTimeStr + "-" + lastHM; int passTime = GetTimeDifferenceInMinutes(curTimeDifference); int randBasePoint = _random.Next(basePoint[0], basePoint[1]); if (lastLoginIndex == index) { int lastPassTime = GetTimeDifferenceInMinutes(lastTimeDifference); int dif = passTime - lastPassTime; if (dif < 0) { dif = 0; } int randomMin = 0; if (totalTime - passTime < users[i].remaining_time[dayOfWeek - 1][index]) { randomMin = users[i].remaining_time[dayOfWeek - 1][index] - (totalTime - passTime); } int randomMax = passTime > users[i].remaining_time[dayOfWeek - 1][index] ? users[i].remaining_time[dayOfWeek - 1][index] : passTime; randomMax = randomMax > dif ? dif : randomMax; if (randomMin > randomMax) { randomMax = randomMin + 1; } int value = _random.Next(randomMin, randomMax + 1); points += value * randBasePoint; users[i].remaining_time[dayOfWeek - 1][index] -= value; if (users[i].remaining_time[dayOfWeek - 1][index] < 0) { users[i].remaining_time[dayOfWeek - 1][index] = 0; } if (round == last_round) { users[i].hourPoints += points; } else { int curRoundStartTime = round * hourTime / 60; string curRoundStartTimeHM = $"{curRoundStartTime:D2}:00"; string DifferenceTime = curRoundStartTimeHM + "-" + curHM; int curRoundPassTime = GetTimeDifferenceInMinutes(DifferenceTime); if (curRoundPassTime == 0 || dif == 0) { users[i].hourPoints = 0; } else { int curRoundActiveTime = (int)((decimal)curRoundPassTime / dif * value); users[i].hourPoints = curRoundActiveTime * randBasePoint; } } users[i].weekPoints += points; users[i].dayPoints += points; } else { if (round == last_round) { users[i].weekPoints += users[i].remaining_time[dayOfWeek - 1][lastLoginIndex] * randBasePoint; users[i].dayPoints += users[i].remaining_time[dayOfWeek - 1][lastLoginIndex] * randBasePoint; users[i].hourPoints += users[i].remaining_time[dayOfWeek - 1][lastLoginIndex] * randBasePoint; users[i].remaining_time[dayOfWeek - 1][lastLoginIndex] = 0; int value = _random.Next(0, passTime); if (users[i].remaining_time[dayOfWeek - 1][index] - value > 0) { points += value * randBasePoint; users[i].remaining_time[dayOfWeek - 1][index] -= value; if (users[i].remaining_time[dayOfWeek - 1][index] < 0) { users[i].remaining_time[dayOfWeek - 1][index] = 0; } } else { points += users[i].remaining_time[dayOfWeek - 1][index] * randBasePoint; users[i].remaining_time[dayOfWeek - 1][index] = 0; } users[i].hourPoints += points; users[i].weekPoints += points; users[i].dayPoints += points; } else { // todo bug,周和天多加了,应该算上一次到本次的积分 int[] pointsArr = getCurDayPoints(users[i]); users[i].weekPoints += pointsArr[0]; users[i].dayPoints += pointsArr[0]; users[i].hourPoints = pointsArr[1]; } } } } } return 0; } // 获取一周的积分 public int getWeekPoints(UserData user) { int points = 0; for (int i = 0; i < user.add_points_time.Length; i++) { for (int j = 0; j < user.add_points_time[i].Length; j++) { int randBasePoint = _random.Next(basePoint[0], basePoint[1]); points += user.add_points_time[i][j] * randBasePoint; } } return points; } // 获取一天的积分 public int getDayPoints(UserData user, DayOfWeek dayOfWeek, int lastIndex) { int points = 0; int days = (int)dayOfWeek; if (dayOfWeek == DayOfWeek.Sunday) { days = 7; } DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(SaveData.GetSaveObject().lastLoginTime); DateTime lastLocalTime = utcTime.ToLocalTime(); int lastHour = lastLocalTime.Hour; int lastMinute = lastLocalTime.Minute; int randBasePoint = _random.Next(basePoint[0], basePoint[1]); points += user.dayPoints + user.remaining_time[days - 1][lastIndex] * randBasePoint; for (int i = lastIndex; i < user.remaining_time[days - 1].Length; i++) { randBasePoint = _random.Next(basePoint[0], basePoint[1]); points += user.remaining_time[days - 1][i] * randBasePoint; } // for (int i = 0; i < user.add_points_time.Length; i++) // { // if ((i + 1) == days) // { // for (int j = 0; j < user.add_points_time[i].Length; j++) // { // randBasePoint = _random.Next(basePoint[0], basePoint[1]); // points += user.add_points_time[i][j] * randBasePoint; // } // } // } return points; } // 获取小时排行榜积分 public int getRoundPoints(UserData user, DayOfWeek dayOfWeek, int index) { DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(SaveData.GetSaveObject().lastLoginTime); DateTime lastLocalTime = utcTime.ToLocalTime(); int lastHour = lastLocalTime.Hour; int lastMinute = lastLocalTime.Minute; int lastRound = lastHour / (hourTime / 60); int curRoundStartTime = lastRound * hourTime / 60; string curRoundStartTimeHM = $"{curRoundStartTime:D2}:00"; int endTime = curRoundStartTime + hourTime / 60; string curRoundEndHM = $"{endTime:D2}:00"; string DifferenceTime = curRoundStartTimeHM + "-" + curRoundEndHM; if (endTime >= 24) { DifferenceTime = curRoundStartTimeHM + "-" + "23:59"; } int RoundTime = GetTimeDifferenceInMinutes(DifferenceTime); string roundPassTimeStr = curRoundStartTimeHM + "-" + $"{lastHour:D2}:{lastMinute:D2}"; int roundPassTime = GetTimeDifferenceInMinutes(roundPassTimeStr); int round_remain_time = RoundTime - roundPassTime; string[] parts = time_slot[index].Split('-'); string slotEndTime = parts[1].Trim(); string curToSlotEndTimeStr = $"{lastHour:D2}:{lastMinute:D2}" + "-" + slotEndTime; int curToSlotEndTime = GetTimeDifferenceInMinutes(curToSlotEndTimeStr); int days = (int)dayOfWeek; if (dayOfWeek == DayOfWeek.Sunday) { days = 7; } int consumeTime = 0; int points = 0; int randBasePoint = _random.Next(basePoint[0], basePoint[1]); if (curToSlotEndTime == 0) { consumeTime = user.remaining_time[days - 1][index]; points = user.hourPoints + consumeTime * randBasePoint; } else { consumeTime = (int)((decimal)user.remaining_time[days - 1][index] / curToSlotEndTime * round_remain_time); points = user.hourPoints + (int)((decimal)user.remaining_time[days - 1][index] / curToSlotEndTime * round_remain_time * randBasePoint); } user.remaining_time[days - 1][index] -= consumeTime; if (user.remaining_time[days - 1][index] < 0) { user.remaining_time[days - 1][index] = 0; } return points; } // 获取周一到当前周几整天的积分 public int getMondayToCurDayPoints(UserData user, DayOfWeek dayOfWeek) { int points = 0; int days = (int)dayOfWeek; if (dayOfWeek == DayOfWeek.Sunday) { days = 7; } for (int i = 0; i < user.add_points_time.Length; i++) { if (i + 1 < days) { for (int j = 0; j < user.add_points_time[i].Length; j++) { int randBasePoint = _random.Next(basePoint[0], basePoint[1]); points += user.add_points_time[i][j] * randBasePoint; user.remaining_time[i][j] = 0; } } } return points; } // 获取当天的积分 public int[] getCurDayPoints(UserData user) { int points = 0; int hourPoints = 0; int[] result = new int[2]; long curTime = GameHelper.GetNowTime(); DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(curTime); DateTime curLocalTime = utcTime.ToLocalTime(); int day = curLocalTime.Day; int hour = curLocalTime.Hour; int minute = curLocalTime.Minute; int dayOfWeek = (int)curLocalTime.DayOfWeek; if (curLocalTime.DayOfWeek == DayOfWeek.Sunday) { dayOfWeek = 7; } int index = getIndexInTimeSlot(hour, minute); int perTime = getInPreSlotTime(index, hour); for (int i = 0; i < user.add_points_time.Length; i++) { if (i + 1 == dayOfWeek) { for (int j = 0; j <= index; j++) { int totalTime = GetTimeDifferenceInMinutes(time_slot[j]); if (totalTime < 0) { totalTime = 0; Debug.Log("config error!!!"); } int randBasePoint = _random.Next(basePoint[0], basePoint[1]); if (j < index) { points += user.add_points_time[i][j] * randBasePoint; if (perTime > 0 && j == index - 1) { hourPoints += (int)Math.Round((decimal)perTime * 60 / totalTime * user.add_points_time[i][j]) * randBasePoint; } user.remaining_time[i][j] = 0; } else { string[] parts = time_slot[index].Split('-'); string startTimeStr = parts[0].Trim(); string[] hours = startTimeStr.Split(':'); int startHour = int.Parse(hours[0]); int startMinute = int.Parse(hours[1]); string curHM = $"{hour:D2}:{minute:D2}"; string curTimeDifference = startTimeStr + "-" + curHM; int passTime = GetTimeDifferenceInMinutes(curTimeDifference); int randomMin = 0; if (totalTime - passTime < user.remaining_time[i][j]) { randomMin = user.remaining_time[i][j] - (totalTime - passTime); } if (startMinute == minute && startHour == hour) { passTime = 0; } int randomMax = passTime > user.remaining_time[i][j] ? user.remaining_time[i][j] : passTime; if (randomMin > randomMax) { randomMax = randomMin + 1; } int value = _random.Next(randomMin, randomMax + 1); // 随机到的时间是否全在小时榜时间内 int inHourTime = getInHourTime(index, hour, minute, value); hourPoints += inHourTime * randBasePoint; user.remaining_time[i][j] -= value; if (user.remaining_time[i][j] < 0) { user.remaining_time[i][j] = 0; } points += value * randBasePoint; } } } } result[0] = points; result[1] = hourPoints; return result; } // 判断在time_slot哪个时间段 public int getIndexInTimeSlot(int hour, int minute) { int index = 0; if (hour == 23) { index = time_slot.Length - 1; } else { for (int j = 0; j < time_slot.Length; j++) { string[] parts = time_slot[j].Split('-'); string startTimeStr = parts[0].Trim(); string endTimeStr = parts[1].Trim(); string[] startParts = startTimeStr.Split(':'); string[] endParts = endTimeStr.Split(':'); if (hour >= int.Parse(startParts[0]) && hour < int.Parse(endParts[0])) { index = j; break; } } } return index; } public int getInPreSlotTime(int index, int hour) { string[] parts = time_slot[index].Split('-'); string startTimeStr = parts[0].Trim(); string endTimeStr = parts[1].Trim(); string[] startParts = startTimeStr.Split(':'); string[] endParts = endTimeStr.Split(':'); int pass_hour = hour % (hourTime / 60); int value = hour - int.Parse(startParts[0]); int result = 0; if (value < pass_hour) { result = pass_hour - value; } return result; } public int getInHourTime(int index, int hour, int minute, int seed) { int pass_hour = hour % (hourTime / 60); int startTime = hour - pass_hour; int min = 0; string starHM = $"{startTime:D2}:{min:D2}"; string endHM = $"{startTime + (hourTime / 60):D2}:{min:D2}"; string curHM = $"{hour:D2}:{minute:D2}"; string startToCurStr = starHM + "-" + curHM; int hourStartToCur = GetTimeDifferenceInMinutes(startToCurStr); string[] parts = time_slot[index].Split('-'); string startTimeStr = parts[0].Trim(); string endTimeStr = parts[1].Trim(); string curTimeDifference = startTimeStr + "-" + curHM; int passTime = GetTimeDifferenceInMinutes(curTimeDifference); if (hourStartToCur >= passTime) { return seed; } int resulte = 0; if (hourStartToCur > seed) { resulte = seed; } else { if (passTime <= 0) { resulte = 0; } else { resulte = seed - (int)Math.Round((decimal)seed / passTime * (passTime - hourStartToCur)); } } return resulte; } public bool hasPreSlotTime(int index, int hour) { string[] parts = time_slot[index].Split('-'); string startTimeStr = parts[0].Trim(); string endTimeStr = parts[1].Trim(); string[] startParts = startTimeStr.Split(':'); string[] endParts = endTimeStr.Split(':'); if (int.Parse(startParts[0]) < hour) { return false; } return true; } public bool isInSameWeek(DateTime date1, DateTime date2) { // 创建 GregorianCalendar 实例 Calendar cal = CultureInfo.InvariantCulture.Calendar; // 获取两个日期的年份和周数 int year1 = cal.GetYear(date1); int year2 = cal.GetYear(date2); int week1 = cal.GetWeekOfYear(date1, CalendarWeekRule.FirstDay, DayOfWeek.Monday); int week2 = cal.GetWeekOfYear(date2, CalendarWeekRule.FirstDay, DayOfWeek.Monday); // 比较两个日期的年份和周数 return year1 == year2 && week1 == week2; } // 示例:判断 curLocalTime 和 anotherTime 是否是同一天 public bool IsSameDay(DateTime time1, DateTime time2) { return time1.Date == time2.Date; } public int GetTimeDifferenceInMinutes(string range) { // 拆分开始时间和结束时间 string[] parts = range.Split('-'); if (parts.Length != 2) throw new ArgumentException("格式错误,应为 \"hh:mm-hh:mm\""); string startTimeStr = parts[0].Trim(); string endTimeStr = parts[1].Trim(); // 解析时间 if (!TimeSpan.TryParse(startTimeStr, out TimeSpan startTime)) throw new ArgumentException($"无法解析开始时间:{startTimeStr}"); if (!TimeSpan.TryParse(endTimeStr, out TimeSpan endTime)) throw new ArgumentException($"无法解析结束时间:{endTimeStr}"); // 如果结束时间小于开始时间,则视为跨天 if (endTime < startTime) { endTime = endTime.Add(TimeSpan.FromDays(1)); } // 计算时间差并返回分钟数 int resluet = (int)(endTime - startTime).TotalMinutes; // resluet = resluet > 0 ? resluet : 1; return resluet; } // 可用字符集 private static readonly string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private Random _random = new Random(); private static HashSet _generatedCodes = new HashSet(); // 生成指定长度且同时包含字母和数字的唯一编码 public string GenerateName(int length) { string name; do { name = GenerateRandomCode(length); } while (_generatedCodes.Contains(name) || !ContainsBothLettersAndNumbers(name)); _generatedCodes.Add(name); return name; } // 生成一个随机编码 private string GenerateRandomCode(int length) { char[] result = new char[length]; for (int i = 0; i < length; i++) { result[i] = _chars[_random.Next(_chars.Length)]; } return new string(result); } // 检查字符串是否同时包含字母和数字 private bool ContainsBothLettersAndNumbers(string str) { bool hasLetter = false, hasNumber = false; foreach (char c in str) { if (char.IsLetter(c)) hasLetter = true; if (char.IsDigit(c)) hasNumber = true; if (hasLetter && hasNumber) return true; } return false; } public void addGameExp(addPointType type, decimal count = 0) { long curTime = GameHelper.GetNowTime(); int points = 0; if (type == addPointType.eliminate) { points = ConfigSystem.GetConfig().eliminatePoints; } else if (type == addPointType.ads) { points = getAdsAddPoint(); } else if (type == addPointType.buy) { int a = ConfigSystem.GetConfig().USDPoints; points = (int)Math.Ceiling(ConfigSystem.GetConfig().USDPoints * (float)count); } addPointsData data = new addPointsData(); data.points = points; data.type = type; SaveData.GetRankData().selfUser.addPointsDic.TryAdd(curTime, data); addPoints += points; addPointsUI += points; if (addPoints > 0) { GameDispatcher.Instance.Dispatch(GameMsg.add_points); } upSelfPoints(); } public int getAddPoints() { int temp = addPoints; addPoints = 0; return temp; } public int getAddPointsUI() { int temp = addPointsUI; addPointsUI = 0; return temp; } // 广告积分是否达上限 public int getAdsAddPoint() { long curTime = GameHelper.GetNowTime(); DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(curTime); DateTime curLocalTime = utcTime.ToLocalTime(); int points = 0; foreach (KeyValuePair kvp in SaveData.GetRankData().selfUser.addPointsDic) { long time = kvp.Key; addPointsData data = kvp.Value; DateTime utcTime_history = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(time); DateTime curLocalTime_history = utcTime_history.ToLocalTime(); bool sameDay = IsSameDay(curLocalTime, curLocalTime_history); if (sameDay) { if (data.type == addPointType.ads) { points += data.points; } } } int nextPoints = ConfigSystem.GetConfig().adsPoints[0] + points; int maxPoints = ConfigSystem.GetConfig().adsPoints[1]; int minPoints = ConfigSystem.GetConfig().adsPoints[0]; if (ConfigSystem.GetConfig().adsPoints[1] < 0) { return ConfigSystem.GetConfig().adsPoints[0]; } if (nextPoints >= ConfigSystem.GetConfig().adsPoints[1]) { if (maxPoints - points < 0) { return 0; } return maxPoints - points; } return ConfigSystem.GetConfig().adsPoints[0]; } // 更新自己的积分 public void upSelfPoints() { List keysToRemove = new List(); long curTime = GameHelper.GetNowTime(); DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(curTime); DateTime curLocalTime = utcTime.ToLocalTime(); DayOfWeek dayOfWeek = curLocalTime.DayOfWeek; int hour = curLocalTime.Hour; SaveData.GetRankData().selfUser.weekPoints = 0; SaveData.GetRankData().selfUser.dayPoints = 0; SaveData.GetRankData().selfUser.hourPoints = 0; foreach (KeyValuePair kvp in SaveData.GetRankData().selfUser.addPointsDic) { long time = kvp.Key; addPointsData data = kvp.Value; DateTime utcTime_history = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(time); DateTime curLocalTime_history = utcTime_history.ToLocalTime(); DayOfWeek dayOfWeek_history = curLocalTime_history.DayOfWeek; int hour_history = curLocalTime_history.Hour; bool sameWeek = isInSameWeek(curLocalTime, curLocalTime_history); if (sameWeek) { SaveData.GetRankData().selfUser.weekPoints += data.points; if (dayOfWeek == dayOfWeek_history) { SaveData.GetRankData().selfUser.dayPoints += data.points; int round = hour / (hourTime / 60); int last_round = hour_history / (hourTime / 60); if (round == last_round) { SaveData.GetRankData().selfUser.hourPoints += data.points; } } } else { keysToRemove.Add(kvp.Key); } } // 遍历完成后删除所有标记为删除的键值对 foreach (var key in keysToRemove) { SaveData.GetRankData().selfUser.addPointsDic.Remove(key); } } // 获取某个时间点之后的指定星期几的具体时间(如:下周日 23:59:59) public DateTime GetThisWeekdayTime(DateTime fromTime, DayOfWeek targetDay, int hour, int minute, int second) { int daysToAdd = ((int)targetDay - (int)fromTime.DayOfWeek + 7) % 7; if (daysToAdd == 0) { // 如果今天就是目标星期几,则判断时间是否已经过了设定的时间 TimeSpan targetTimeSpan = new TimeSpan(hour, minute, second); if (fromTime.TimeOfDay > targetTimeSpan) { daysToAdd = 7; // 已过当天设定时间,取下周的 } } return fromTime.Date .AddDays(daysToAdd) .AddHours(hour) .AddMinutes(minute) .AddSeconds(second); } // 获取周日日期 public string getLastLoginWeekEndTime() { DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(SaveData.GetSaveObject().lastLoginTime); DateTime curLocalTime = utcTime.ToLocalTime(); int daysToAdd = ((int)DayOfWeek.Sunday - (int)curLocalTime.DayOfWeek + 7) % 7; // if (daysToAdd == 0 && curLocalTime.Hour >= 0) // { // // 如果已经过了今天的时间点,就取下一周的 // daysToAdd = 7; // } DateTime thisWeekend = curLocalTime.Date.AddDays(daysToAdd); string weekendDateStr = thisWeekend.ToString("yyyy-MM-dd"); return weekendDateStr; } // 获取lastLoginTime日期 public string getLastLoginDateTime() { DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(SaveData.GetSaveObject().lastLoginTime); DateTime curLocalTime = utcTime.ToLocalTime(); string dateStr = curLocalTime.ToString("yyyy-MM-dd"); return dateStr; } // 获取lastLoginTime当前轮日期 public string getLastLoginRoundTime() { DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds(SaveData.GetSaveObject().lastLoginTime); DateTime curLocalTime = utcTime.ToLocalTime(); int hour = curLocalTime.Hour; int round = hour / ConfigSystem.GetConfig().HourTime; string dateStr = curLocalTime.ToString("yyyy-MM-dd "); int endHour = (round + 1) * ConfigSystem.GetConfig().HourTime; string endHM = $"{endHour:D2}:00:00"; if (endHour >= 24) { endHM = "00:00:00"; } return dateStr + endHM; } // 删除大于30天的数据 private void remove30DaysData() { int count = SaveData.GetRankData().rankRewardData.Count; for (int i = count - 1; i >= 0; i--) { RankRewardData data = SaveData.GetRankData().rankRewardData[i]; if (data.type == rankType.week || data.type == rankType.day) { if (IsMoreThan30Days(data.time)) { SaveData.GetRankData().rankRewardData.RemoveAt(i); } } else if (data.type == rankType.hour) { if (IsOver30Days(data.time)) { SaveData.GetRankData().rankRewardData.RemoveAt(i); } } } } public bool IsMoreThan30Days(string dateStr) { DateTime specifiedDate = DateTime.ParseExact(dateStr, "yyyy-MM-dd", null); DateTime currentDate = DateTime.Today; int daysDifference = (currentDate - specifiedDate).Days; return daysDifference > 30; } public static bool IsOver30Days(string dateTimeStr) { DateTime specifiedDateTime; if (!DateTime.TryParseExact(dateTimeStr, "yyyy-MM-dd HH:mm:ss", null, DateTimeStyles.None, out specifiedDateTime)) { throw new ArgumentException("日期格式无效"); } TimeSpan diff = DateTime.Now - specifiedDateTime; return diff.TotalDays > 30; } } }