using UnityEngine; using System.Collections; using System.Collections.Generic; public class NormalAI : CraftAI { private MapObject targetOccupier; // Use this for initialization override protected void Start () { base.Start(); checkTimeInterval = 1f; } // Update is called once per frame protected virtual void FixedUpdate () { if(player.IsAI()) { AICheck (); } else if(owner.IsCtrl()) { ManualCheck (); } } private void ManualCheck() { if(owner.IsDead()) { return; } if(battleController.isGameOver) { return; } if(CheckDead()) { return; } if(owner.GetSwapManager().isPreparingSwap) { Debuger.Log("swap prapare time : "+owner.GetSwapManager().GetPreparingSwapTime()); if(owner.GetSwapManager().IsReadySwap()) { battleController.GetMessageManager().RequestSwap(owner.id, owner.GetSwapManager().GetTargetSwapId()); owner.GetSwapManager().RequestedSwap(); } } else if(GameTime.time-lastCheckTime >= checkTimeInterval) { lastCheckTime = GameTime.time; CheckAction(); } } private void CheckAction() { if(owner.target != null) { float targetDis = NumberUtil.distanceVector3(owner.position, owner.target.position, true); Power attack = owner.GetPowerManager().GetAttack(); if(!owner.target.CanShoot()) { owner.target = null; } else if(targetDis > owner.viewRange) { owner.target = null; } else if(targetDis > attack.GetDistance()) { if(!owner.isMoving) { Vector3 targetPos = owner.target.position; owner.MoveTo(targetPos.x, targetPos.z); } } else if(targetDis <= attack.GetDistance()) { if(owner.isMoving && !owner.forceMove) owner.StopMove(); owner.GetPowerManager().AttempUserPower(attack.GetId(), battleController); } } else { base.FindTarget (); if(owner.target == null) { CheckOccupy(); } } } private void AICheck() { if(!CanSendMessage()) { return; } if(CheckDead()) { return; } if(GameTime.time-lastCheckTime >= checkTimeInterval) { lastCheckTime = GameTime.time; } else { return; } if(owner.holdAction) return; //clear target occupier if that is dead ClearOccupyTarget(); ClearTarget(); if(owner.target == null) FindTarget(); else FindMaxThreatTarget(); CheckStack(); if(owner.target != null) { Action(); } else if(targetOccupier != null) { Occupy(); } } protected virtual void CheckStack() { List battleObjList = battleController.GetMap().GetBattleObjectByRange(owner.position, 0.5f, TeamUtil.Team.None); for(int i=0; i owner.id) { float angle = owner.rotateTargetAngle + Random.Range(0, 2) > 0 ? 90f : -90f; float radian = NumberUtil.angleToRadian(angle); float x = 1.5f * Mathf.Cos(radian); float z = 1.5f * Mathf.Sin(radian); int col = Map.XToColumn(owner.position.x + x); int row = Map.ZToRow(owner.position.z + z); battleController.GetMessageManager().Move(owner, col, row); return; } } } protected void ClearOccupyTarget() { if(targetOccupier == null) { return; } if(map.HasFlag() && (map.GetFlag(TeamUtil.Team.Blue).IsOnGround() || map.GetFlag(TeamUtil.Team.Red).IsOnGround())) { if(targetOccupier is FlagItem) { FlagItem flagItem = targetOccupier as FlagItem; if(!flagItem.IsOnGround()) { targetOccupier = null; return; } } else { targetOccupier = null; return; } } if(targetOccupier is BattleObject && (targetOccupier as BattleObject).IsDead()) { targetOccupier = null; } else if(targetOccupier is FlagItem) { if(!map.HasFlag()) { targetOccupier = null; return; } FlagItem flagItem = (targetOccupier as FlagItem); if(flagItem.linkedCraftId != -1) { targetOccupier = null; } else if(flagItem.team == owner.team && flagItem.IsInBase()) { targetOccupier = null; } } else if(targetOccupier is MapItemPos) { if((targetOccupier as MapItemPos).item == null) targetOccupier = null; } } protected void ClearTarget() { if(owner.target == null) { return; } if(owner.target.IsDead()) { owner.target = null; } else if(!owner.target.CanShoot()) { owner.target = null; } else { if(IsTargetCarryFlag()) return; float targetDistance = NumberUtil.distanceVector3(owner.position, owner.target.position); if(targetDistance > owner.viewRange) { owner.target = null; } } } private bool IsTargetCarryFlag() { if(map.HasFlag() && owner.target is Craft) { Craft craft = owner.target as Craft; FlagItem flagItem = map.GetFlag(owner.team); if(flagItem.linkedCraftId == craft.id) return true; } return false; } protected virtual void Action() { if(!CheckPowerUse()) { Attack(); } } protected bool CheckPowerUse() { PowerManager powerManager = owner.GetPowerManager(); for(int i=1; i distance) { AStarNode node = map.GetAStarNodeByPosition(targetOccupier.position); battleController.GetMessageManager().Move(owner, node.X, node.Y); } else if(CheckOccupy() && owner is Craft && targetOccupier != null) { battleController.GetMessageManager().OccupyStation(owner as Craft, targetOccupier as CrystalBase); } } else if(owner.isMoving) { } } protected override bool CheckOccupy () { if (owner.IsCtrl ()) { if (!base.CheckOccupy ()) return false; CrystalBase targetCrystal = battleController.GetMap ().GetInRangeCrystalBase (owner.position); if (targetCrystal == null || targetCrystal.GetStation () != null) return false; List list = map.GetBattleObjectByRange (targetCrystal.position, targetCrystal.range, TeamUtil.GetOpponentTeam (owner.team)); if (list.Count > 0) return false; if (owner != null && targetCrystal != null) battleController.GetMessageManager ().OccupyStation (owner, targetCrystal); return true; } else { if (!base.CheckOccupy ()) return false; if (targetOccupier == null) return false; if (targetOccupier is CrystalBase) { CrystalBase crystalBase = targetOccupier as CrystalBase; if (crystalBase.GetStation () != null) { return false; } if (NumberUtil.distanceVector3 (owner.position, targetOccupier.position) > crystalBase.range) return false; int bigUserId = int.MinValue; List list = map.GetBattleObjectByRange (crystalBase.position, crystalBase.range, TeamUtil.Team.None); for (int i = 0; i < list.Count; i++) { BattleObject battleObj = list [i]; if (battleObj.team != owner.team) { continue; } else if (battleObj.userId > bigUserId) { bigUserId = battleObj.userId; } } if (bigUserId == owner.userId) { return true; } } } return false; } private void FindChallengeOccupyTarget() { if(targetOccupier == null) { List list = new List(); List cbList = battleController.GetMap().GetCrystalBaseList(); for(int i=0; i 0) { int index = Random.Range(0, list.Count); targetOccupier = list[index]; } else { FindTargetAllMap(); } } } private void FindDefenceOccupyTarget() { if(targetOccupier != null) return; Map map = battleController.GetMap(); List itemPosList = map.GetMapItemPosList(); for(int i=0; i targetDoorList = new List(); List doorList = map.GetDoorList(); for(int i=0; i 0) { int index = Random.Range(0, targetDoorList.Count); targetOccupier = targetDoorList[index]; return; } List cbList = battleController.GetMap().GetCrystalBaseList(); for(int i=0; i 0) { BattleObject battleObject = map.GetBattleObject(myFlag.linkedCraftId); if(battleObject != null) { targetOccupier = battleObject; return; } } else if(myFlag.IsOnGround()) { targetOccupier = myFlag; return; } } if(oppFlag != null) { if(oppFlag.IsOnGround() || oppFlag.IsInBase()) { targetOccupier = oppFlag; return; } if(oppFlag.linkedCraftId == owner.id) { targetOccupier = myFlag; return; } } } }