lcy
2026-06-10 1cce54ef352f4a7033e25208989a8e96e398c205
588 公会攻防战  累计活跃度显示改为 下一次备战日前x天之和
1个文件已修改
56 ■■■■ 已修改文件
Main/System/GuildAtkDefBat/GuildAtkDefBatManager.cs 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/GuildAtkDefBat/GuildAtkDefBatManager.cs
@@ -733,18 +733,60 @@
    }
    /// <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;