private void FindHealTarget(out MCharacter healTarget, out VTile healTile) { BattleCharactersManager charactersManager = Global.charactersManager; BattleTilesManager tilesManager = Global.battleManager.tilesManager; healTarget = null; healTile = null; foreach (MCharacter character in charactersManager.mCharacters) { if (character.hp == 0 || character.isHide) { continue; } if (!charactersManager.IsSameBelong(mCharacter.belong, character.belong)) { continue; } if (character.hp * 1f / character.ability.hpMax > Global.Constant.weak_hp) { continue; } VTile vTile = GetNearestNode(character, tilesManager.currentMovingTiles); bool canAttack = charactersManager.IsInSkillDistance(character.coordinate, vTile.coordinate, mCharacter); if (!canAttack) { continue; } if (healTarget == null) { healTarget = character; healTile = vTile; continue; } if (character.hp < healTarget.hp) { healTarget = character; healTile = vTile; } } }
private void FindAttackTarget() { BattleCalculateManager calculateManager = Global.battleManager.calculateManager; BattleTilesManager tilesManager = Global.battleManager.tilesManager; BattleCharactersManager charactersManager = Global.charactersManager; attackTarget = null; targetTile = null; if (mCharacter.currentSkill == null) { return; } float tileAid = 0; foreach (MCharacter character in charactersManager.mCharacters) { if (character.hp == 0 || character.isHide) { continue; } if (charactersManager.IsSameBelong(mCharacter.belong, character.belong)) { continue; } VTile vTile = GetNearestNode(character, tilesManager.currentMovingTiles); //可否攻击 bool canAttack = charactersManager.IsInSkillDistance(character.coordinate, vTile.coordinate, mCharacter); if (!canAttack) { continue; } if (attackTarget == null) { attackTarget = character; targetTile = vTile; tileAid = 0; continue; } //是否可杀死 bool aCanKill = calculateManager.Hert(mCharacter, attackTarget, targetTile) - attackTarget.hp >= 0; if (aCanKill) { continue; } bool bCanKill = calculateManager.Hert(mCharacter, character, targetTile) - character.hp >= 0; if (!aCanKill && bCanKill) { attackTarget = character; targetTile = vTile; tileAid = 0; continue; } //是否反击 bool aCanCounter = calculateManager.CanCounterAttack(mCharacter, attackTarget, targetTile.coordinate, attackTarget.coordinate); bool bCanCounter = calculateManager.CanCounterAttack(mCharacter, character, vTile.coordinate, character.coordinate); if (!aCanCounter && bCanCounter) { continue; } else if (aCanCounter && !bCanCounter) { attackTarget = character; targetTile = vTile; tileAid = 0; continue; } //地形优势 float aTileAid = tileAid; if (Global.IsFloatZero(aTileAid)) { aTileAid = attackTarget.TileAid(targetTile); } float bTileAid = character.TileAid(vTile); if (aTileAid > bTileAid) { attackTarget = character; targetTile = vTile; tileAid = bTileAid; continue; } } }
private VTile GetNearestNode(MCharacter target, List <VTile> tiles) { BattleCalculateManager calculateManager = Global.battleManager.calculateManager; BattleCharactersManager charactersManager = Global.charactersManager; TileMap mapSearch = Global.mapSearch; Debug.LogError("GetNearestNode tiles = " + tiles.Count); if (mCharacter.mission == Mission.defensive) { return(tiles.Find(t => t.coordinate.Equals(mCharacter.coordinate))); } if (tiles.Count == 1) { return(tiles[0]); } tiles.Sort((a, b) => { bool aNotRoad = charactersManager.mCharacters.Exists((c) => { return(c.hp > 0 && !c.isHide && c.coordinate.Equals(a.coordinate)); }); if (aNotRoad) { return(1); } bool aCanAttack = charactersManager.IsInSkillDistance(target.coordinate, a.coordinate, mCharacter); bool bCanAttack = charactersManager.IsInSkillDistance(target.coordinate, b.coordinate, mCharacter); if (aCanAttack && !bCanAttack) { return(-1); } else if (!aCanAttack && bCanAttack) { return(1); } else if (aCanAttack && bCanAttack) { bool aCanCounter = calculateManager.CanCounterAttack(mCharacter, target, a.coordinate, target.coordinate); bool bCanCounter = calculateManager.CanCounterAttack(mCharacter, target, b.coordinate, target.coordinate); if (aCanCounter && !bCanCounter) { return(1); } else if (!aCanCounter && bCanCounter) { return(-1); } else if (aCanCounter && bCanCounter) { //地形优势 float aTileAid = mCharacter.TileAid(a); float bTileAid = mCharacter.TileAid(b); if (aTileAid < bTileAid) { return(-1); } else if (aTileAid > bTileAid) { return(1); } } } int aDistance = mapSearch.GetDistance(mCharacter.coordinate, a.coordinate); int bDistance = mapSearch.GetDistance(mCharacter.coordinate, b.coordinate); return(aDistance - bDistance); }); return(tiles[0]); }