void AIOnMoveAttackOver() { GameBattleUnitMovement.instance.unShow(); if (BattleAIType == GameBattleAIType.AIMoveToPos) { if (GameBattlePathFinder.instance.getDistance(PosX, PosY, AIMoveToX, AIMoveToY) < 3) { battleAICheckFight = true; // BattleAIType = GameBattleAIType.AINegative; } } if (BattleAIType == GameBattleAIType.AIMoveToUnit) { GameBattleUnit u = GameBattleUnitManager.instance.getUnit(AIMoveToID); if (u != null && GameBattlePathFinder.instance.getDistance(PosX, PosY, u.PosX, u.PosY) < 3) { battleAICheckFight = true; // BattleAIType = GameBattleAIType.AINegative; } } switch (gameBattleUnitAIType) { case GameBattleUnitAIType.Move: { List <int> useSkills = new List <int>(); List <GameBattleUnitMovement.Cell> useSkillsCells = new List <GameBattleUnitMovement.Cell>(); for (int i = 0; i < GameDefine.MAX_SLOT; i++) { if (Skill[i] == GameDefine.INVALID_ID) { continue; } gameSkillAI = GameSkillData.instance.getData(Skill[i]); if (canUseSkillMove(gameSkillAI, moveCostAI)) { GameBattleUnitSkillSelection.instance.canAttackAI(this, PosX, PosY, PosX, PosY, gameSkillAI, UnitCampType, AIMoveToID); if (GameBattleUnitSkillSelection.instance.AttackUnits.Count != 0) { useSkills.Add(i); if (gameSkillAI.ResultType == GameSkillResutlType.Cure) { break; } } } } if (useSkills.Count > 0) { int r = Random.Range(0, useSkills.Count); gameSkillAI = GameSkillData.instance.getData(Skill[useSkills[r]]); GameBattleUnitSkillSelection.instance.AttackUnits.Clear(); GameBattleUnitSkillSelection.instance.canAttackAI(this, PosX, PosY, PosX, PosY, gameSkillAI, UnitCampType, AIMoveToID); GameBattleUnitSkillSelection.instance.getUnits(this, gameSkillAI); gameBattleUnitAIType = GameBattleUnitAIType.Skill; AIOnMoveOver(); return; } GameBattleUnit unit = GameBattleUnitAttackSelection.instance.canAttack(PosX, PosY, Weapon, UnitCampType); if (unit != null) { listUnitsAI.Clear(); listUnitsAI.Add(unit); targetIndexAI = 0; gameBattleUnitAIType = GameBattleUnitAIType.Attack; AIOnMoveOver(); return; } move(); AIOver(); } break; } }
bool AIUseItem(List <GameBattleUnitMovement.Cell> cells) { gameItemAI = null; int itemIndex = GameDefine.INVALID_ID; for (int i = 0; i < Items.Length; i++) { if (Items[i] != GameDefine.INVALID_ID) { GameItem item = GameItemData.instance.getData(Items[i]); if (item.UseType == GameItemUseType.Cure) { itemIndex = i; gameItemAI = item; break; } } } if (itemIndex == GameDefine.INVALID_ID) { return(false); } GameUnitMove unitMove = GameUnitMoveTypeData.instance.getData(MoveType); bool fly = checkEffect(GameSkillResutlEffect.Under) ? true : unitMove.fly; GameBattleUnit moveToUnit1 = null; GameBattleUnitMovement.Cell cellMove1 = null; for (int j = 0; j < cells.Count; j++) { int size = 1; for (int i0 = -size; i0 <= size; i0++) { for (int j0 = -size; j0 <= size; j0++) { if (Mathf.Abs(i0) + Mathf.Abs(j0) > size) { continue; } GameBattleUnit unit = GameBattleUnitManager.instance.getUnit(cells[j].x + i0, cells[j].y + j0); if (unit != null && unit != this && unit.UnitCampType == UnitCampType && (unit.HP / (float)unit.HPMax < 0.4f)) { if (moveToUnit1 == null || Random.Range(0, 100) > 50) { moveToUnit1 = unit; cellMove1 = cells[j]; } } } } } if (moveToUnit1 != null) { GameBattleUnitItemSelection.instance.setAttackAI(moveToUnit1, moveToUnit1.PosX, moveToUnit1.PosY); gameBattleUnitAIType = GameBattleUnitAIType.Item; if (cellMove1.x != PosX || cellMove1.y != PosY) { bool b = moveTo(cellMove1.x, cellMove1.y, true, false, 3, AIOnMoveOver); if (!b) { return(false); } else { GameBattleCursor.instance.show(); GameBattleCursor.instance.moveTo(cellMove1.x, cellMove1.y, GameBattleCursor.SpeedX3, GameBattleCursor.SpeedY3, true, null); } } else { AIOnMoveOver(); } return(true); } if (HP / (float)HPMax < 0.4f) { List <GameBattleUnit> User = GameBattleUnitManager.instance.User; List <GameBattleUnit> Enemy = GameBattleUnitManager.instance.Enemy; List <GameBattleUnit> Npc = GameBattleUnitManager.instance.Npc; GameBattleUnit moveToUnit = null; GameBattleUnitMovement.Cell cellMove = null; int disMove = 999; int cost = 999; moveCostAI = 0; if (UnitCampType == GameUnitCampType.User) { for (int j = 0; j < Enemy.Count; j++) { GameBattleUnit enemy = Enemy[j]; if (!enemy.IsAlive) { continue; } enemy.IsShow = false; int dis = GameBattlePathFinder.instance.findPath(PosX, PosY, enemy.PosX, enemy.PosY, unitMove.block, fly, UnitCampType); enemy.IsShow = true; if ((dis > 0 && dis < disMove) || (dis > 0 && dis <= disMove && cost > GameBattlePathFinder.instance.cost) || ((dis > 0 && dis <= disMove && cost == GameBattlePathFinder.instance.cost) && Random.Range(0, 100) > 50)) { cost = GameBattlePathFinder.instance.cost; disMove = dis; moveToUnit = enemy; } } } else { for (int j = 0; j < Npc.Count; j++) { GameBattleUnit npc = Npc[j]; if (!npc.IsAlive) { continue; } npc.IsShow = false; int dis = GameBattlePathFinder.instance.findPath(PosX, PosY, npc.PosX, npc.PosY, unitMove.block, fly, UnitCampType); npc.IsShow = true; if ((dis > 0 && dis < disMove) || (dis > 0 && dis <= disMove && cost > GameBattlePathFinder.instance.cost) || ((dis > 0 && dis <= disMove && cost == GameBattlePathFinder.instance.cost) && Random.Range(0, 100) > 50)) { cost = GameBattlePathFinder.instance.cost; disMove = dis; moveToUnit = npc; } } for (int j = 0; j < User.Count; j++) { GameBattleUnit user = User[j]; if (!user.IsAlive) { continue; } user.IsShow = false; int dis = GameBattlePathFinder.instance.findPath(PosX, PosY, user.PosX, user.PosY , unitMove.block, fly, UnitCampType); user.IsShow = true; if ((dis > 0 && dis < disMove) || (dis > 0 && dis <= disMove && cost > GameBattlePathFinder.instance.cost) || ((dis > 0 && dis <= disMove && cost == GameBattlePathFinder.instance.cost) && Random.Range(0, 100) > 50)) { cost = GameBattlePathFinder.instance.cost; disMove = dis; moveToUnit = user; } } } if (moveToUnit != null) { int disMove1 = 0; for (int i = 0; i < cells.Count; i++) { GameBattleUnitMovement.Cell cell = cells[i]; int dis = GameBattlePathFinder.instance.findPath(moveToUnit.PosX, moveToUnit.PosY, cell.x, cell.y , unitMove.block, fly, UnitCampType); if ((dis > 0 && dis > disMove1) || (dis > 0 && dis >= disMove1 && Random.Range(0, 100) > 50)) { disMove1 = dis; cellMove = cell; } } } gameBattleUnitAIType = GameBattleUnitAIType.Item; if (cellMove != null && (cellMove.x != PosX || cellMove.y != PosY)) { GameBattleUnitItemSelection.instance.setAttackAI(this, cellMove.x, cellMove.y); bool b = moveTo(cellMove.x, cellMove.y, true, false, 3, AIOnMoveOver); if (!b) { return(false); } else { GameBattleCursor.instance.show(); GameBattleCursor.instance.moveTo(cellMove.x, cellMove.y, GameBattleCursor.SpeedX3, GameBattleCursor.SpeedY3, true, null); } } else { AIOnMoveOver(); } return(true); } return(false); }
void AIFindNearEnemy() { if (BattleAIType == GameBattleAIType.AIStay) { AIOver(); return; } GameUnitMove unitMove = GameUnitMoveTypeData.instance.getData(MoveType); bool fly = checkEffect(GameSkillResutlEffect.Under) ? true : unitMove.fly; GameBattleUnitMovement.instance.show(PosX, PosY, Move, MoveType, fly, UnitCampType, false); List <GameBattleUnitMovement.Cell> cells = GameBattleUnitMovement.instance.Cells; listUnitsAI.Clear(); listCellsAI.Clear(); gameSkillAI = null; GameBattleUnitSkillSelection.instance.AttackUnits.Clear(); if (AIUseItem(cells)) { return; } int targetID = AITargetID; if (BattleAIType == GameBattleAIType.AIPositive || BattleAIType == GameBattleAIType.AINegative || battleAICheckFight) { battleAICheckFight = false; // skill List <int> useSkills = new List <int>(); List <GameBattleUnitMovement.Cell> useSkillsCells = new List <GameBattleUnitMovement.Cell>(); for (int i = 0; i < GameDefine.MAX_SLOT; i++) { if (Skill[i] == GameDefine.INVALID_ID) { continue; } gameSkillAI = GameSkillData.instance.getData(Skill[i]); if (canUseSkill(gameSkillAI)) { GameBattleUnitSkillSelection.instance.canAttackAI(this, PosX, PosY, PosX, PosY, gameSkillAI, UnitCampType, targetID); if (GameBattleUnitSkillSelection.instance.AttackUnits.Count != 0 && GameBattleUnitSkillSelection.instance.IsAttackUnits) { useSkills.Add(i); if (gameSkillAI.ResultType == GameSkillResutlType.Cure) { break; } } } } if (useSkills.Count > 0) { int r = Random.Range(0, useSkills.Count); gameSkillAI = GameSkillData.instance.getData(Skill[useSkills[r]]); GameBattleUnitSkillSelection.instance.AttackUnits.Clear(); GameBattleUnitSkillSelection.instance.canAttackAI(this, PosX, PosY, PosX, PosY, gameSkillAI, UnitCampType, targetID); GameBattleUnitSkillSelection.instance.getUnits(this, gameSkillAI); gameBattleUnitAIType = GameBattleUnitAIType.Skill; AIOnMoveOver(); return; } gameSkillAI = null; GameBattleUnitSkillSelection.instance.AttackUnits.Clear(); for (int i = 0; i < GameDefine.MAX_SLOT; i++) { if (Skill[i] == GameDefine.INVALID_ID) { continue; } GameSkill skill = GameSkillData.instance.getData(Skill[i]); for (int j = 0; j < cells.Count; j++) { if (canUseSkillMove(skill, cells[j].ca)) { GameBattleUnitSkillSelection.instance.canAttackAI(this, PosX, PosY, cells[j].x, cells[j].y, skill, UnitCampType, AIMoveToID); if (GameBattleUnitSkillSelection.instance.IsAttackUnits) { gameSkillAI = skill; } } } } if (GameBattleUnitSkillSelection.instance.AttackUnits.Count > 0 && Random.Range(1, 100) > 10) { gameBattleUnitAIType = GameBattleUnitAIType.Skill; GameBattleUnitSkillSelection.instance.getUnits(this, gameSkillAI); bool b = moveTo(GameBattleUnitSkillSelection.instance.AttackMoveCell.x, GameBattleUnitSkillSelection.instance.AttackMoveCell.y, true, false, 3, AIOnMoveOver); if (!b) { GameBattleUnitMovement.instance.unShow(); AIOver(); #if UNITY_EDITOR Debug.LogError("error ai skill move "); #endif } else { GameBattleCursor.instance.moveTo(GameBattleUnitSkillSelection.instance.AttackMoveCell.x, GameBattleUnitSkillSelection.instance.AttackMoveCell.y, GameBattleCursor.SpeedX3, GameBattleCursor.SpeedY3, true, null); } return; } // attack for (int i = 0; i < cells.Count; i++) { GameBattleUnit u = GameBattleUnitAttackSelection.instance.canAttack(cells[i].x, cells[i].y, Weapon, UnitCampType); if (u != null) { listUnitsAI.Add(u); listCellsAI.Add(cells[i]); } } if (listUnitsAI.Count != 0) { AIrandomTarget(targetID); gameBattleUnitAIType = GameBattleUnitAIType.Attack; GameBattleUnit target = listUnitsAI[targetIndexAI]; GameBattleUnitMovement.Cell cell = listCellsAI[targetIndexAI]; if (cell.x != PosX || cell.y != PosY) { bool b = moveTo(cell.x, cell.y, true, false, 3, AIOnMoveOver); if (!b) { #if UNITY_EDITOR Debug.LogError("error ai move "); #endif GameBattleUnitMovement.instance.unShow(); AIOver(); } else { GameBattleCursor.instance.moveTo(cell.x, cell.y, GameBattleCursor.SpeedX3, GameBattleCursor.SpeedY3, true, null); } } else { AIOnMoveOver(); } return; } if (BattleAIType == GameBattleAIType.AINegative) { GameBattleUnitMovement.instance.unShow(); AIOver(); return; } } // move List <GameBattleUnit> User = GameBattleUnitManager.instance.User; List <GameBattleUnit> Enemy = GameBattleUnitManager.instance.Enemy; List <GameBattleUnit> Npc = GameBattleUnitManager.instance.Npc; GameBattleUnit moveToUnit = null; GameBattleUnitMovement.Cell cellMove = null; int disMove = 999; int cost = 999; moveCostAI = 0; if (BattleAIType == GameBattleAIType.AIPositive) { if (UnitCampType == GameUnitCampType.User) { for (int j = 0; j < Enemy.Count; j++) { GameBattleUnit enemy = Enemy[j]; if (!enemy.IsAlive) { continue; } enemy.IsShow = false; int dis = GameBattlePathFinder.instance.findPath(PosX, PosY, enemy.PosX, enemy.PosY, unitMove.block, fly, UnitCampType); enemy.IsShow = true; if ((dis > 0 && dis < disMove) || (dis > 0 && dis <= disMove && cost > GameBattlePathFinder.instance.cost) || ((dis > 0 && dis <= disMove && cost == GameBattlePathFinder.instance.cost) && Random.Range(0, 100) > 50)) { cost = GameBattlePathFinder.instance.cost; disMove = dis; moveToUnit = enemy; } } } else { for (int j = 0; j < Npc.Count; j++) { GameBattleUnit npc = Npc[j]; if (!npc.IsAlive) { continue; } npc.IsShow = false; int dis = GameBattlePathFinder.instance.findPath(PosX, PosY, npc.PosX, npc.PosY, unitMove.block, fly, UnitCampType); npc.IsShow = true; if ((dis > 0 && dis < disMove) || (dis > 0 && dis <= disMove && cost > GameBattlePathFinder.instance.cost) || ((dis > 0 && dis <= disMove && cost == GameBattlePathFinder.instance.cost) && Random.Range(0, 100) > 50)) { cost = GameBattlePathFinder.instance.cost; disMove = dis; moveToUnit = npc; } } for (int j = 0; j < User.Count; j++) { GameBattleUnit user = User[j]; if (!user.IsAlive) { continue; } user.IsShow = false; int dis = GameBattlePathFinder.instance.findPath(PosX, PosY, user.PosX, user.PosY , unitMove.block, fly, UnitCampType); user.IsShow = true; if ((dis > 0 && dis < disMove) || (dis > 0 && dis <= disMove && cost > GameBattlePathFinder.instance.cost) || ((dis > 0 && dis <= disMove && cost == GameBattlePathFinder.instance.cost) && Random.Range(0, 100) > 50)) { cost = GameBattlePathFinder.instance.cost; disMove = dis; moveToUnit = user; } } } if (moveToUnit != null) { int disMove1 = 999; int cost1 = 999; int dis1 = 0; for (int i = 0; i < cells.Count; i++) { GameBattleUnitMovement.Cell cell = cells[i]; int dis = GameBattlePathFinder.instance.findPath(moveToUnit.PosX, moveToUnit.PosY, cell.x, cell.y , unitMove.block, fly, UnitCampType); for (int i0 = 0; i0 < GameDefine.MAX_SLOT; i0++) { if (Skill[i0] == GameDefine.INVALID_ID) { continue; } GameSkill skill = GameSkillData.instance.getData(Skill[i0]); if (canUseSkillStand(skill)) { GameBattleUnitSkillSelection.instance.canAttackAI(this, cell.x, cell.y, cell.x, cell.y, skill, UnitCampType, targetID); if (GameBattleUnitSkillSelection.instance.AttackUnits.Count != 0 && GameBattleUnitSkillSelection.instance.IsAttackUnits) { if (dis > dis1) { dis1 = dis; dis = 1; } } } } if ((dis > 0 && dis < disMove1) || (dis > 0 && dis <= disMove1 && cost1 > GameBattlePathFinder.instance.cost) || ((dis > 0 && dis <= disMove1 && cost1 == GameBattlePathFinder.instance.cost) && Random.Range(0, 100) > 50)) { cost1 = GameBattlePathFinder.instance.cost; disMove1 = dis; cellMove = cell; } } } gameBattleUnitAIType = GameBattleUnitAIType.Move; if (cellMove != null && (cellMove.x != PosX || cellMove.y != PosY)) { int dis2 = GameBattlePathFinder.instance.findPath(PosX, PosY, moveToUnit.PosX, moveToUnit.PosY , unitMove.block, true, UnitCampType); if (dis2 > 0 && disMove > dis2) { AIOnMoveOver(); } else { bool b = moveTo(cellMove.x, cellMove.y, true, false, 3, AIOnMoveOver); if (!b) { AIOver(); } else { GameBattleCursor.instance.show(); GameBattleCursor.instance.moveTo(cellMove.x, cellMove.y, GameBattleCursor.SpeedX3, GameBattleCursor.SpeedY3, true, null); } } } else { AIOnMoveOver(); } } else if (BattleAIType == GameBattleAIType.AIMoveToUnit || BattleAIType == GameBattleAIType.AIMoveToPos) { int mx = AIMoveToX; int my = AIMoveToY; if (BattleAIType == GameBattleAIType.AIMoveToUnit) { GameBattleUnit u = GameBattleUnitManager.instance.getUnit(AIMoveToID); if (u == null && u.UnitID >= GameDefine.MAX_USER) { move(); AIOver(); battleAICheckFight = true; // BattleAIType = GameBattleAIType.AINegative; return; } mx = u.PosX; my = u.PosY; } if (GameBattlePathFinder.instance.isBlockPos(mx, my, unitMove.block)) { if (GameBattlePathFinder.instance.findNearPos(mx, my, PosX, PosY, UnitMove.block)) { mx = GameBattlePathFinder.instance.nearPosX; my = GameBattlePathFinder.instance.nearPosY; } else { #if UNITY_EDITOR Debug.LogError("ai cann't move."); #endif GameBattleUnitMovement.instance.unShow(); AIOver(); return; } } else { } for (int i = 0; i < cells.Count; i++) { GameBattleUnitMovement.Cell cell = cells[i]; if (cell.x == mx && cell.y == my) { disMove = 2; cellMove = cell; break; } int dis = GameBattlePathFinder.instance.findPathNear(cell.x, cell.y, mx, my, unitMove.block, fly, UnitCampType); if ((dis > 0 && dis < disMove) || (dis > 0 && dis <= disMove && cost > GameBattlePathFinder.instance.cost) || ((dis > 0 && dis <= disMove && cost == GameBattlePathFinder.instance.cost) && Random.Range(0, 100) > 50)) { cost = GameBattlePathFinder.instance.cost; disMove = dis; cellMove = cell; moveCostAI = cell.ca; } } gameBattleUnitAIType = GameBattleUnitAIType.Move; if (cellMove != null && (cellMove.x != PosX || cellMove.y != PosY)) { int dis2 = GameBattlePathFinder.instance.findPathNear(PosX, PosY, mx, my , unitMove.block, true, UnitCampType); if (dis2 > 0 && disMove > dis2) { GameBattleUnitMovement.instance.unShow(); AIOver(); } else { bool b = false; b = moveTo(cellMove.x, cellMove.y, true, false, 3, AIOnMoveAttackOver); if (!b) { AIOver(); } else { GameBattleCursor.instance.show(); GameBattleCursor.instance.moveTo(cellMove.x, cellMove.y, GameBattleCursor.SpeedX3, GameBattleCursor.SpeedY3, true, null); } } } else { AIOnMoveAttackOver(); } } }