From 97a5c0ac4196d9baa2b622de63b9baf79cba2b94 Mon Sep 17 00:00:00 2001 From: milimoe Date: Fri, 23 Jan 2026 01:25:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=81=A5=E5=A3=AE=E6=80=A7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Controller/AIController.cs | 32 ++++++++------------------------ Entity/Character/Character.cs | 2 +- Entity/Skill/Skill.cs | 12 +++++++++++- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/Controller/AIController.cs b/Controller/AIController.cs index 459c930..6f3236b 100644 --- a/Controller/AIController.cs +++ b/Controller/AIController.cs @@ -50,12 +50,8 @@ namespace Milimoe.FunGame.Core.Controller // 计算普通攻击的可达格子 List normalAttackReachableGrids = _map.GetGridsByRange(potentialMoveGrid, character.ATR, true); - List normalAttackReachableEnemys = [.. allEnemysInGame - .Where(c => normalAttackReachableGrids.SelectMany(g => g.Characters).Contains(c) && !c.IsUnselectable && selectableEnemys.Contains(c)) - .Distinct()]; - List normalAttackReachableTeammates = [.. allTeammatesInGame - .Where(c => normalAttackReachableGrids.SelectMany(g => g.Characters).Contains(c) && selectableTeammates.Contains(c)) - .Distinct()]; + List normalAttackReachableEnemys = [.. allEnemysInGame.Where(c => normalAttackReachableGrids.SelectMany(g => g.Characters).Contains(c) && !c.IsUnselectable && selectableEnemys.Contains(c)).Distinct()]; + List normalAttackReachableTeammates = [.. allTeammatesInGame.Where(c => normalAttackReachableGrids.SelectMany(g => g.Characters).Contains(c) && selectableTeammates.Contains(c)).Distinct()]; if (normalAttackReachableEnemys.Count > 0) { @@ -97,12 +93,8 @@ namespace Milimoe.FunGame.Core.Controller } else { - List skillReachableEnemys = [.. allEnemysInGame - .Where(c => skillReachableGrids.SelectMany(g => g.Characters).Contains(c) && !c.IsUnselectable && selectableEnemys.Contains(c)) - .Distinct()]; - List skillReachableTeammates = [.. allTeammatesInGame - .Where(c => skillReachableGrids.SelectMany(g => g.Characters).Contains(c) && selectableTeammates.Contains(c)) - .Distinct()]; + List skillReachableEnemys = [.. allEnemysInGame.Where(c => skillReachableGrids.SelectMany(g => g.Characters).Contains(c) && !c.IsUnselectable && selectableEnemys.Contains(c)).Distinct()]; + List skillReachableTeammates = [.. allTeammatesInGame.Where(c => skillReachableGrids.SelectMany(g => g.Characters).Contains(c) && selectableTeammates.Contains(c)).Distinct()]; // 检查是否有可用的目标(敌人或队友,取决于技能类型) if (skillReachableEnemys.Count > 0 || skillReachableTeammates.Count > 0) @@ -149,12 +141,8 @@ namespace Milimoe.FunGame.Core.Controller } else { - List itemSkillReachableEnemys = [.. allEnemysInGame - .Where(c => itemSkillReachableGrids.SelectMany(g => g.Characters).Contains(c) && !c.IsUnselectable && selectableEnemys.Contains(c)) - .Distinct()]; - List itemSkillReachableTeammates = [.. allTeammatesInGame - .Where(c => itemSkillReachableGrids.SelectMany(g => g.Characters).Contains(c) && selectableTeammates.Contains(c)) - .Distinct()]; + List itemSkillReachableEnemys = [.. allEnemysInGame.Where(c => itemSkillReachableGrids.SelectMany(g => g.Characters).Contains(c) && !c.IsUnselectable && selectableEnemys.Contains(c)).Distinct()]; + List itemSkillReachableTeammates = [.. allTeammatesInGame.Where(c => itemSkillReachableGrids.SelectMany(g => g.Characters).Contains(c) && selectableTeammates.Contains(c)).Distinct()]; // 检查是否有可用的目标 if (itemSkillReachableEnemys.Count > 0 || itemSkillReachableTeammates.Count > 0) @@ -203,16 +191,12 @@ namespace Milimoe.FunGame.Core.Controller } } List tempAllReachableGridsForPureMove = [.. tempAttackGridsForPureMove.Union(tempCastGridsForPureMove).Distinct()]; - List tempCurrentReachableEnemysForPureMove = [.. allEnemysInGame - .Where(c => tempAllReachableGridsForPureMove.SelectMany(g => g.Characters).Contains(c) && !c.IsUnselectable && selectableEnemys.Contains(c)) - .Distinct()]; + List tempCurrentReachableEnemysForPureMove = [.. allEnemysInGame.Where(c => tempAllReachableGridsForPureMove.SelectMany(g => g.Characters).Contains(c) && !c.IsUnselectable && selectableEnemys.Contains(c)).Distinct()]; // 如果当前位置无法攻击任何敌人,但地图上还有敌人,尝试向最近的敌人移动 if (tempCurrentReachableEnemysForPureMove.Count == 0 && allEnemysInGame.Count > 0) // 使用新计算的列表 { - Character? target = allEnemysInGame - .OrderBy(e => GameMap.CalculateManhattanDistance(potentialMoveGrid, _map.GetCharacterCurrentGrid(e)!)) - .FirstOrDefault(); + Character? target = allEnemysInGame.OrderBy(e => GameMap.CalculateManhattanDistance(potentialMoveGrid, _map.GetCharacterCurrentGrid(e) ?? Grid.Empty)).FirstOrDefault(); if (target != null) { diff --git a/Entity/Character/Character.cs b/Entity/Character/Character.cs index 71ea295..225ed4e 100644 --- a/Entity/Character/Character.cs +++ b/Entity/Character/Character.cs @@ -1866,7 +1866,7 @@ namespace Milimoe.FunGame.Core.Entity } if (EquipSlot.Weapon != null) { - builder.AppendLine($"[{ItemSet.GetQualityTypeName(EquipSlot.Weapon.QualityType)}]" + ItemSet.GetEquipSlotTypeName(EquipSlotType.Weapon) + ":" + EquipSlot.Weapon.Name); + builder.AppendLine($"[{ItemSet.GetQualityTypeName(EquipSlot.Weapon.QualityType)}]" + ItemSet.GetEquipSlotTypeName(EquipSlotType.Weapon) + $"-{ItemSet.GetWeaponTypeName(EquipSlot.Weapon.WeaponType)}" + ":" + EquipSlot.Weapon.Name); builder.AppendLine(EquipSlot.Weapon.Description); } if (EquipSlot.Armor != null) diff --git a/Entity/Skill/Skill.cs b/Entity/Skill/Skill.cs index 0b14d1b..c4cb1d4 100644 --- a/Entity/Skill/Skill.cs +++ b/Entity/Skill/Skill.cs @@ -268,7 +268,17 @@ namespace Milimoe.FunGame.Core.Entity /// /// 剩余冷却时间 [ 和 属性配合使用 ] /// - public double CurrentCD { get; set; } = 0; + public double CurrentCD + { + get + { + return Math.Max(0, field); + } + set + { + field = Math.Max(0, value); + } + } /// /// 无 CD [ 运行时 ]