修复无法选择处于免疫状态队友的问题;修复顺序表排序错误的问题

This commit is contained in:
milimoe 2025-09-06 03:36:39 +08:00
parent fab341d001
commit 607d36e23a
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
3 changed files with 23 additions and 38 deletions

View File

@ -264,7 +264,7 @@ namespace Milimoe.FunGame.Core.Entity
foreach (Character character in teammates) foreach (Character character in teammates)
{ {
if (CanSelectTeammate && ((character.ImmuneType & ImmuneType.All) != ImmuneType.All || IgnoreImmune == ImmuneType.All)) if (CanSelectTeammate)
{ {
selectable.Add(character); selectable.Add(character);
} }

View File

@ -365,8 +365,7 @@ namespace Milimoe.FunGame.Core.Entity
foreach (Character character in teammates) foreach (Character character in teammates)
{ {
IEnumerable<Effect> effects = character.Effects.Where(e => e.IsInEffect); IEnumerable<Effect> effects = character.Effects.Where(e => e.IsInEffect);
if (CanSelectTeammate && ((character.ImmuneType & checkType) == ImmuneType.None || if (CanSelectTeammate)
effects.Any(e => e.IgnoreImmune == ImmuneType.All || e.IgnoreImmune == ImmuneType.Skilled || (IsMagic && e.IgnoreImmune == ImmuneType.Magical))))
{ {
selectable.Add(character); selectable.Add(character);
} }

View File

@ -449,19 +449,25 @@ namespace Milimoe.FunGame.Core.Model
// 确保角色不在队列中 // 确保角色不在队列中
_queue.RemoveAll(c => c == character); _queue.RemoveAll(c => c == character);
// 插队机制:按硬直时间排序 // 增加硬直时间直到唯一
int insertIndex = _queue.FindIndex(c => _hardnessTimes[c] > hardnessTime); double ResolveConflict(double time, Character c)
double addHardnessTime = 0.01;
while (_hardnessTimes.Any(kv => kv.Key != character && kv.Value == hardnessTime))
{ {
insertIndex++; while (_hardnessTimes.Any(kv => kv.Key != c && kv.Value == time))
if (insertIndex != 0 && _queue.Count > insertIndex)
{ {
addHardnessTime += Calculation.Round2Digits(_hardnessTimes[_queue[insertIndex]] - _hardnessTimes[_queue[insertIndex - 1]]); time = Calculation.Round2Digits(time + 0.01);
} }
hardnessTime = Calculation.Round2Digits(hardnessTime + addHardnessTime); return time;
} }
// 初始插入索引:第一个硬直时间大于当前值的角色位置
int insertIndex = _queue.FindIndex(c => _hardnessTimes[c] > hardnessTime);
// 调整硬直时间以避免冲突
hardnessTime = ResolveConflict(hardnessTime, character);
// 重新计算插入索引
insertIndex = _queue.FindIndex(c => _hardnessTimes[c] > hardnessTime);
if (isCheckProtected) if (isCheckProtected)
{ {
// 查找保护条件 被插队超过此次数便能获得插队补偿 即行动保护 // 查找保护条件 被插队超过此次数便能获得插队补偿 即行动保护
@ -481,35 +487,15 @@ namespace Milimoe.FunGame.Core.Model
Character lastProtectedCharacter = list.Last().Character; Character lastProtectedCharacter = list.Last().Character;
double lastProtectedHardnessTime = _hardnessTimes[lastProtectedCharacter]; double lastProtectedHardnessTime = _hardnessTimes[lastProtectedCharacter];
// 查找与最后一个受保护角色相同硬直时间的其他角色 // 设置新的硬直时间大于保护角色的硬直时间
var sameHardnessList = _queue hardnessTime = lastProtectedHardnessTime + 0.01;
.Select((c, index) => new { Character = c, Index = index }) hardnessTime = ResolveConflict(hardnessTime, character);
.Where(x => _hardnessTimes[x.Character] == lastProtectedHardnessTime && x.Index > protectIndex);
// 如果找到了相同硬直时间的角色,更新 protectIndex 为它们中最后一个的索引 // 重新计算插入索引
if (sameHardnessList.Any()) insertIndex = _queue.FindIndex(c => _hardnessTimes[c] > hardnessTime);
{
protectIndex = sameHardnessList.Select(x => x.Index).Last();
}
// 判断是否需要插入到受保护角色的后面 // 列出受保护角色的名单
if (insertIndex != -1 && insertIndex <= protectIndex) WriteLine($"由于 [ {string.Join(" ][ ", list.Select(x => x.Character))} ] 受到行动保护,因此角色 [ {character} ] 将插入至顺序表第 {insertIndex + 1} 位。");
{
// 如果按硬直时间插入的位置在受保护角色之前或相同,则插入到受保护角色的后面一位
insertIndex = protectIndex + 1;
hardnessTime = lastProtectedHardnessTime + 0.01;
while (_hardnessTimes.Any(kv => kv.Key != character && kv.Value == hardnessTime))
{
if (insertIndex != 0 && _queue.Count > insertIndex)
{
addHardnessTime += Calculation.Round2Digits(_hardnessTimes[_queue[insertIndex]] - _hardnessTimes[_queue[insertIndex - 1]]);
}
hardnessTime = Calculation.Round2Digits(hardnessTime + addHardnessTime);
}
// 列出受保护角色的名单
WriteLine($"由于 [ {string.Join(" ][ ", list.Select(x => x.Character))} ] 受到行动保护,因此角色 [ {character} ] 将插入至顺序表第 {insertIndex + 1} 位。");
}
} }
} }