mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-12-05 00:06:02 +00:00
修复无法选择处于免疫状态队友的问题;修复顺序表排序错误的问题
This commit is contained in:
parent
fab341d001
commit
607d36e23a
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -449,18 +449,24 @@ namespace Milimoe.FunGame.Core.Model
|
|||||||
// 确保角色不在队列中
|
// 确保角色不在队列中
|
||||||
_queue.RemoveAll(c => c == character);
|
_queue.RemoveAll(c => c == character);
|
||||||
|
|
||||||
// 插队机制:按硬直时间排序
|
// 增加硬直时间直到唯一
|
||||||
|
double ResolveConflict(double time, Character c)
|
||||||
|
{
|
||||||
|
while (_hardnessTimes.Any(kv => kv.Key != c && kv.Value == time))
|
||||||
|
{
|
||||||
|
time = Calculation.Round2Digits(time + 0.01);
|
||||||
|
}
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始插入索引:第一个硬直时间大于当前值的角色位置
|
||||||
int insertIndex = _queue.FindIndex(c => _hardnessTimes[c] > hardnessTime);
|
int insertIndex = _queue.FindIndex(c => _hardnessTimes[c] > hardnessTime);
|
||||||
double addHardnessTime = 0.01;
|
|
||||||
while (_hardnessTimes.Any(kv => kv.Key != character && kv.Value == hardnessTime))
|
// 调整硬直时间以避免冲突
|
||||||
{
|
hardnessTime = ResolveConflict(hardnessTime, character);
|
||||||
insertIndex++;
|
|
||||||
if (insertIndex != 0 && _queue.Count > insertIndex)
|
// 重新计算插入索引
|
||||||
{
|
insertIndex = _queue.FindIndex(c => _hardnessTimes[c] > hardnessTime);
|
||||||
addHardnessTime += Calculation.Round2Digits(_hardnessTimes[_queue[insertIndex]] - _hardnessTimes[_queue[insertIndex - 1]]);
|
|
||||||
}
|
|
||||||
hardnessTime = Calculation.Round2Digits(hardnessTime + addHardnessTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isCheckProtected)
|
if (isCheckProtected)
|
||||||
{
|
{
|
||||||
@ -481,37 +487,17 @@ 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
|
|
||||||
.Select((c, index) => new { Character = c, Index = index })
|
|
||||||
.Where(x => _hardnessTimes[x.Character] == lastProtectedHardnessTime && x.Index > protectIndex);
|
|
||||||
|
|
||||||
// 如果找到了相同硬直时间的角色,更新 protectIndex 为它们中最后一个的索引
|
|
||||||
if (sameHardnessList.Any())
|
|
||||||
{
|
|
||||||
protectIndex = sameHardnessList.Select(x => x.Index).Last();
|
|
||||||
}
|
|
||||||
|
|
||||||
// 判断是否需要插入到受保护角色的后面
|
|
||||||
if (insertIndex != -1 && insertIndex <= protectIndex)
|
|
||||||
{
|
|
||||||
// 如果按硬直时间插入的位置在受保护角色之前或相同,则插入到受保护角色的后面一位
|
|
||||||
insertIndex = protectIndex + 1;
|
|
||||||
hardnessTime = lastProtectedHardnessTime + 0.01;
|
hardnessTime = lastProtectedHardnessTime + 0.01;
|
||||||
while (_hardnessTimes.Any(kv => kv.Key != character && kv.Value == hardnessTime))
|
hardnessTime = ResolveConflict(hardnessTime, character);
|
||||||
{
|
|
||||||
if (insertIndex != 0 && _queue.Count > insertIndex)
|
// 重新计算插入索引
|
||||||
{
|
insertIndex = _queue.FindIndex(c => _hardnessTimes[c] > hardnessTime);
|
||||||
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} 位。");
|
WriteLine($"由于 [ {string.Join(" ],[ ", list.Select(x => x.Character))} ] 受到行动保护,因此角色 [ {character} ] 将插入至顺序表第 {insertIndex + 1} 位。");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// 如果插入索引无效(为-1 或 大于等于队列长度),则添加到队列尾部
|
// 如果插入索引无效(为-1 或 大于等于队列长度),则添加到队列尾部
|
||||||
if (insertIndex == -1 || insertIndex >= _queue.Count)
|
if (insertIndex == -1 || insertIndex >= _queue.Count)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user