public override async Task <bool> IsActive(GameManager gameManager, PathManager pathManager, AutoControllerState state) { MapTile start = GetPlayerPosition(gameManager); int map = start.Item1, minDistance = Int32.MaxValue; bool targetFound = false; // TODO Sort players based on DistanceHeuristic first and loop through until the heuristic distance is more than the min actual distance. foreach (PlayerManager player in gameManager.GetAllPlayerManagers()) { if (player.IsPlayerMob()) { MapTile goal = GetPlayerPosition(gameManager, player); int simpleDistance = PathManager.DistanceHeuristic(start, goal); if (simpleDistance < minDistance) { LinkedList <MapTile> walkPath = null; if (await pathManager.TryGetWalkPath(gameManager, start, goal, player, value => walkPath = value)) { int distance = walkPath.Count; if (distance < minDistance) { minDistance = distance; state.SetTargetTile(goal); state.SetTarget(player); targetFound = true; } } } } } return(targetFound); }
protected override bool CanUseAction(GameManager gameManager, AutoControllerState state) { if (!gameManager.IsMainPlayerMoving()) { MapTile start = GetPlayerPosition(gameManager); int map = start.Item1; foreach (PlayerManager player in gameManager.GetAllPlayerManagers()) { if (player.IsPlayerMob()) { MapTile goal = GetPlayerPosition(gameManager, player); int simpleDistance = PathManager.DistanceHeuristic(start, goal); if (simpleDistance <= 1) { m_target = goal; return(true); } } } } return(false); }
protected async Task WalkToTile(GameManager gameManager, PathManager pathManager, AutoControllerState state, MapTile start, MapTile goal, PlayerManager player, int distanceFromGoal = 0) { LinkedList <MapTile> walkPath = null; if (await pathManager.TryGetWalkPath(gameManager, start, goal, player, value => walkPath = value)) { if (walkPath.Count > 1 && PathManager.DistanceHeuristic(start, goal) > distanceFromGoal) { MapTile nextTile = walkPath.ElementAt(1); Vector3 direction = new Vector3(nextTile.Item2 - start.Item2, -(nextTile.Item3 - start.Item3), 0); gameManager.HandlePlayerPosition(direction, false); Vector3 previous = default(Vector3); foreach (MapTile tile in walkPath) { Vector3 current = gameManager.WorldPosition(tile.Item2, tile.Item3, true) + Vector3.forward; if (!previous.Equals(default(Vector3))) { Debug.DrawLine(previous, current, Color.red, 1f, false); } previous = current; } } } }
protected override bool CanUseAction(GameManager gameManager, AutoControllerState state) { m_target = null; if (!String.IsNullOrEmpty(m_type)) { gameManager.GetMainPlayerHP(out int curHp, out int maxHp); gameManager.GetMainPlayerMP(out int curMp, out int maxMp); int hpPercent = GetPercent(curHp, maxHp); int mpPercent = GetPercent(curMp, maxMp); if (m_type.Equals("Healing")) { int targetPlayerId = 0; if (hpPercent < 90) { targetPlayerId = gameManager.GetMainPlayerId(); } else { if (mpPercent > 20) { foreach (PartyPlayerUI partyPlayer in gameManager.GetAllPartyPlayers()) { if (partyPlayer.GetHPBar() < 90) { targetPlayerId = partyPlayer.GetPlayerId(); break; } } } } if (targetPlayerId > 0) { m_playerId = targetPlayerId; return(true); } } else if (m_type.Equals("Sacrifice")) { if (hpPercent > 50) { int targetPlayerId = 0; if (mpPercent < 50) { targetPlayerId = gameManager.GetMainPlayerId(); } else { foreach (PartyPlayerUI partyPlayer in gameManager.GetAllPartyPlayers()) { if (partyPlayer.GetMPBar() < 90) { targetPlayerId = partyPlayer.GetPlayerId(); break; } } } if (targetPlayerId > 0) { m_playerId = targetPlayerId; return(true); } } } else if (m_type.Equals("Regeneration")) { m_playerId = gameManager.GetMainPlayerId(); return(true); } else if (m_type.Equals("Blast")) { if (mpPercent == 100) { int maxDistance = Int32.MinValue, maxPlayerId = 0; bool targetFound = false; MapTile start = GetPlayerPosition(gameManager); foreach (PlayerManager player in gameManager.GetAllPlayerManagers()) { if (player.IsPlayerMob()) { MapTile goal = GetPlayerPosition(gameManager, player); int simpleDistance = PathManager.DistanceHeuristic(start, goal); if (maxDistance < simpleDistance) { maxDistance = simpleDistance; maxPlayerId = player.GetPlayerId(); targetFound = true; } } } if (targetFound) { m_playerId = maxPlayerId; return(true); } } } else if (m_type.Equals("Assault")) { if (mpPercent > 90) { int maxDistance = Int32.MinValue, maxPlayerId = 0; bool targetFound = false; MapTile start = GetPlayerPosition(gameManager); foreach (PlayerManager player in gameManager.GetAllPlayerManagers()) { if (player.IsPlayerMob()) { MapTile goal = GetPlayerPosition(gameManager, player); int simpleDistance = PathManager.DistanceHeuristic(start, goal); if (maxDistance < simpleDistance) { maxDistance = simpleDistance; maxPlayerId = player.GetPlayerId(); targetFound = true; } } } if (targetFound) { m_playerId = maxPlayerId; return(true); } } } else if (m_type.Equals("Spirit Strike")) { if (!gameManager.IsMainPlayerMoving()) { if (hpPercent > 90) { m_playerId = gameManager.GetMainPlayerId(); MapTile start = GetPlayerPosition(gameManager); foreach (PlayerManager player in gameManager.GetAllPlayerManagers()) { if (player.IsPlayerMob()) { MapTile goal = GetPlayerPosition(gameManager, player); int simpleDistance = PathManager.DistanceHeuristic(start, goal); if (simpleDistance <= 1) { m_target = goal; return(true); } } } } } } else if (m_type.Equals("Critical Strike")) { if (!gameManager.IsMainPlayerMoving()) { if (hpPercent > 90) { m_playerId = gameManager.GetMainPlayerId(); MapTile start = GetPlayerPosition(gameManager); foreach (PlayerManager player in gameManager.GetAllPlayerManagers()) { if (player.IsPlayerMob()) { MapTile goal = GetPlayerPosition(gameManager, player); int simpleDistance = PathManager.DistanceHeuristic(start, goal); if (simpleDistance <= 1) { m_target = goal; return(true); } } } } } } else if (m_type.Equals("Covenant")) { if (hpPercent > 90 && mpPercent < 90) { m_playerId = gameManager.GetMainPlayerId(); return(true); } } } return(false); }