AI 优化

This commit is contained in:
wuwenbo 2025-06-05 19:45:56 +08:00
parent a53b2b54c0
commit 2a6a964465

View File

@ -83,13 +83,15 @@ namespace Logic.AI
private Dictionary<UnitData, float> _unitScore;
private Dictionary<CityData, float> _cityScore;
private Dictionary<CityData, float> _cityDefendScore;
private HashSet<UnitData> _unitOnCity;
private HashSet<UnitData> _unitOnCityCanMove;
private HashSet<UnitData> _unitInCityTerritory;
private HashSet<CityData> _defendCity;
private UnitTargetMap _unitTargetMap;
private List<CommonActionId> _actionList;
private AITechScoreCalculator _techCalculator;
private Dictionary<UnitData, float> _unitAttack;
private Dictionary<UnitData, float> _unitDefend;
private bool _hasUnitMoney;
public AITechScoreCalculator TechScoreCalculator => _techCalculator;
@ -97,13 +99,13 @@ namespace Logic.AI
public Dictionary<UnitData, float> UnitScore => _unitScore;
public Dictionary<CityData, float> CityScore => _cityScore;
public Dictionary<CityData, float> CityDefendScore => _cityDefendScore;
public HashSet<UnitData> UnitOnCity => _unitOnCity;
public UnitTargetMap UnitTargetMap => _unitTargetMap;
private bool IsTrueAction(AIActionBase aiAction)
{
if (aiAction.ActionLogic is UnitAttackAction && UnitOnCity.Contains(aiAction.Param.TargetUnitData)) return true;
if (aiAction.ActionLogic is UnitMoveAction && _unitOnCityCanMove.Contains(aiAction.Param.UnitData)) return true;
if (aiAction.ActionLogic is UnitAttackAction && _unitInCityTerritory.Contains(aiAction.Param.TargetUnitData)) return true;
if (aiAction.ActionLogic.ActionId == null) return false;
if (aiAction.ActionLogic.ActionId.UnitActionType == UnitActionType.Capture) return true;
if (aiAction.ActionLogic.ActionId.UnitActionType == UnitActionType.Gather) return true;
@ -152,13 +154,15 @@ namespace Logic.AI
_unitScore ??= new Dictionary<UnitData, float>();
_cityScore ??= new Dictionary<CityData, float>();
_cityDefendScore ??= new Dictionary<CityData, float>();
_unitOnCity ??= new HashSet<UnitData>();
_unitOnCityCanMove ??= new HashSet<UnitData>();
_unitInCityTerritory ??= new HashSet<UnitData>();
_defendCity ??= new HashSet<CityData>();
_canMoveGrid ??= new HashSet<GridData>();
_unitTargetMap ??= new UnitTargetMap();
_unitScore.Clear();
_cityScore.Clear();
_unitOnCity.Clear();
_unitOnCityCanMove.Clear();
_unitInCityTerritory.Clear();
_defendCity.Clear();
_canMoveGrid.Clear();
UnitTargetMap.Clear();
@ -319,10 +323,12 @@ namespace Logic.AI
foreach (var unit in mapData.UnitMap.UnitList)
{
if (selfUnits.Contains(unit)) continue;
if (!mapData.GetGridDataByUnitId(unit.Id, out var gridData)) continue;
if (!city.Territory.TerritoryArea.Contains(gridData.Id)) continue;
_unitOnCity.Add(unit);
if (!mapData.GetGridDataByUnitId(unit.Id, out var unitData)) continue;
if (!city.Territory.TerritoryArea.Contains(unitData.Id)) continue;
_unitInCityTerritory.Add(unit);
_defendCity.Add(city);
if (!mapData.GetGridDataByCityId(city.Id, out var cityGrid)) continue;
if (cityGrid == unitData && !mapData.CheckIfCityFullPopulation(city)) _unitOnCityCanMove.Add(unit);
}
}
}