Files
CaptainDiceDubloons_IOS_unity/Assets/Scripts/System/Game/RankSystem.cs
T
2026-05-20 15:18:16 +08:00

1174 lines
48 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using IgnoreOPS;
using UnityEngine;
using Random = System.Random;
namespace ChillConnect
{
public class RankSystemMgr : BaseInterfaceManager<RankSystemMgr>
{
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<RankRewards> hourRewardList;
public List<RankRewards> dayRewardList;
public List<RankRewards> weekRewardList;
public void checkUsers()
{
time_slot = ConfigSystem.GetConfig<CommonModel>().TimeSlot;
hourTime = ConfigSystem.GetConfig<CommonModel>().HourTime * 60;
basePoint = ConfigSystem.GetConfig<CommonModel>().basePoint;
// basePoint[0] = basePoint[1];
RobotNum = ConfigSystem.GetConfig<CommonModel>().RobotNum;
hourRewardList = ConfigSystem.GetConfig<RankHourRewardsModel>().DataList;
dayRewardList = ConfigSystem.GetConfig<RankDayRewardsModel>().DataList;
weekRewardList = ConfigSystem.GetConfig<RankWeekRewardsModel>().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<UserData> 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<UserData> getRankData(rankType type)
{
List<UserData> originalUsers = SaveData.GetRankData().users;
List<UserData> rankList = new List<UserData>(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<UserData> 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<UserData> 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<string> _generatedCodes = new HashSet<string>();
// 生成指定长度且同时包含字母和数字的唯一编码
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<CommonModel>().eliminatePoints;
}
else if (type == addPointType.ads)
{
points = getAdsAddPoint();
}
else if (type == addPointType.buy)
{
int a = ConfigSystem.GetConfig<CommonModel>().USDPoints;
points = (int)Math.Ceiling(ConfigSystem.GetConfig<CommonModel>().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<long, addPointsData> 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<CommonModel>().adsPoints[0] + points;
int maxPoints = ConfigSystem.GetConfig<CommonModel>().adsPoints[1];
int minPoints = ConfigSystem.GetConfig<CommonModel>().adsPoints[0];
if (ConfigSystem.GetConfig<CommonModel>().adsPoints[1] < 0)
{
return ConfigSystem.GetConfig<CommonModel>().adsPoints[0];
}
if (nextPoints >= ConfigSystem.GetConfig<CommonModel>().adsPoints[1])
{
if (maxPoints - points < 0)
{
return 0;
}
return maxPoints - points;
}
return ConfigSystem.GetConfig<CommonModel>().adsPoints[0];
}
// 更新自己的积分
public void upSelfPoints()
{
List<long> keysToRemove = new List<long>();
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<long, addPointsData> 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<CommonModel>().HourTime;
string dateStr = curLocalTime.ToString("yyyy-MM-dd ");
int endHour = (round + 1) * ConfigSystem.GetConfig<CommonModel>().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;
}
}
}