| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取当前我的功能累计活跃度 |
| | | /// 统计从当天开始往前 prepareDayBefore 天的累计活跃贡献之和 |
| | | /// 获取界面展示用的公会攻防战活跃值。 |
| | | /// 口径:显示下一次备战名单生成所使用的 prepareDayBefore 天窗口。 |
| | | /// 后端会在进入备战期 0 点判定参战条件,统计备战日前 prepareDayBefore 天。 |
| | | /// 前端按 cycleConfig[1] 找下一次备战日,再倒推 prepareDayBefore 天;窗口中尚未发生的未来日期按 0 处理, |
| | | /// 避免 activityData 只有星期 key 时误读到上一轮同星期的旧活跃。 |
| | | /// </summary> |
| | | public long GetMyActivityLevel() |
| | | { |
| | | int currentWeekday = TimeUtility.GetCommonWeekday(GetZoneID()); |
| | | int daysUntilPrepare = GetDaysUntilNextPrepareStart(); |
| | | return GetActivityLevelBeforePrepare(daysUntilPrepare); |
| | | } |
| | | |
| | | long total = 0; |
| | | for (int i = 0; i < prepareDayBefore; i++) |
| | | /// <summary> |
| | | /// 获取距离下一次备战期开始还有几天。 |
| | | /// 只从 cycleConfig[1] 读取备战期配置,支持策划自由配置备战星期。 |
| | | /// 如果今天就是备战日,也取下一次备战日,避免把已进入备战期后的活跃算入当前名单口径。 |
| | | /// </summary> |
| | | private int GetDaysUntilNextPrepareStart() |
| | | { |
| | | int currentWeekday = TimeUtility.GetCommonWeekday(GetZoneID()); |
| | | int[] prepareWeekdays = cycleConfig != null && cycleConfig.Length > 1 ? cycleConfig[1] : null; |
| | | if (prepareWeekdays.IsNullOrEmpty()) |
| | | return 1; |
| | | |
| | | int minDaysUntilPrepare = 7; |
| | | foreach (int prepareWeekday in prepareWeekdays) |
| | | { |
| | | // (currentWeekday - i) 转成 1-7 范围 |
| | | int targetWeekday = ((currentWeekday - i - 1 + 7) % 7) + 1; |
| | | int daysUntilPrepare = prepareWeekday > currentWeekday |
| | | ? prepareWeekday - currentWeekday |
| | | : prepareWeekday + 7 - currentWeekday; |
| | | |
| | | if (daysUntilPrepare < minDaysUntilPrepare) |
| | | minDaysUntilPrepare = daysUntilPrepare; |
| | | } |
| | | |
| | | return minDaysUntilPrepare; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 统计下一次备战日前 prepareDayBefore 天的活跃值。 |
| | | /// offsetFromPrepare 表示目标日期距离备战开始还有几天:1=备战前一天,prepareDayBefore=窗口最早一天。 |
| | | /// dayOffsetFromToday 大于 0 表示目标日期在今天之后,未来活跃按 0,不读取 activityData。 |
| | | /// </summary> |
| | | private long GetActivityLevelBeforePrepare(int daysUntilPrepare) |
| | | { |
| | | long total = 0; |
| | | int currentWeekday = TimeUtility.GetCommonWeekday(GetZoneID()); |
| | | for (int offsetFromPrepare = prepareDayBefore; offsetFromPrepare >= 1; offsetFromPrepare--) |
| | | { |
| | | int dayOffsetFromToday = daysUntilPrepare - offsetFromPrepare; |
| | | if (dayOffsetFromToday > 0) |
| | | continue; |
| | | |
| | | int targetWeekday = ((currentWeekday + dayOffsetFromToday - 1 + 7) % 7) + 1; |
| | | |
| | | if (activityData.TryGetValue(targetWeekday, out long contribution)) |
| | | total += contribution; |