public static Vector2 GetNearestEmptyBuildingLocation(Vector2 _currentLocation) { List <BuildingLocation> emptyLocations; GameData.GetBuildingLocations(BuildingType.NONE, out emptyLocations); int smallestDistance = 9999999; BuildingLocation nearestLocation = null; foreach (BuildingLocation _location in emptyLocations) { float distance = Math.Abs(Vector2.GetDistance(_currentLocation, _location.m_position).GetLength()); if (distance < smallestDistance) { smallestDistance = (int)distance; nearestLocation = _location; } } if (nearestLocation != null) { return(nearestLocation.m_position); } else { return(Vector2.zero); } }
public void EvaluateBuildingLocation(BuildingLocation _location) { float totalRating = 0; foreach (Heuristic _heuristic in m_buildingHeursticList) { totalRating += _heuristic.GetRating(_location); } _location.m_buildingPriorityRating = (int)totalRating; }
public override float GetRating <T>(T _evaluatedObject) { BuildingLocation location = _evaluatedObject as BuildingLocation; if (location == null) { return(0); } if (StrategyManager.GetDesiredBuildingType() == location.m_idealBuildingType) { return(HeuristicData.IDEAL_IS_DESIRED_RATING); } else { return(0); } }
public override float GetRating <T>(T _evaluatedObject) { BuildingLocation location = _evaluatedObject as BuildingLocation; if (location == null) { return(0); } if (location.m_buildingType == BuildingType.NONE) { return(HeuristicData.LOCATION_UNOCCUPIED_RATING); } else { return(0); } }
//Moves to nearest empty location and builds a knight barracks public static string GetBasicQueenStrategy() { string queenInstructions = "WAIT"; BuildingLocation bestLocation = null; if (!GameData.m_upgradingMine) { bestLocation = m_evaluationSystem.GetBestBuildingLocation(); queenInstructions = Helpers.GetQueenMoveCommand(Helpers.VerifyAndAvoidCollisions(bestLocation)); } else if (GameData.m_touchedSite == -1) { GameData.m_upgradingMine = false; } //The queen is at a building location if (GameData.m_touchedSite != -1 && (GameData.m_upgradingMine || GameData.m_touchedSite == bestLocation.m_siteId)) { BuildingLocation touchedLocation = GameData.GetBuilding(GameData.m_touchedSite); if (!GameData.m_upgradingMine && touchedLocation.m_buildingType != BuildingType.MINE && m_evaluationSystem.BarracksRequired()) { queenInstructions = Helpers.GetBuildCommand(touchedLocation, BuildingType.BARRACKS_KNIGHT); } else { if (!GameData.m_upgradingMine && touchedLocation.m_idealBuildingType == BuildingType.MINE) { GameData.m_upgradingMine = true; if (touchedLocation.m_goldRemaining <= 2) { touchedLocation.m_idealBuildingType = BuildingType.TOWER; } } else if (touchedLocation.m_level >= (touchedLocation.m_maxYield - 1 < HeuristicData.MAX_MINE_UPGRADE_LEVEL - 1 ? touchedLocation.m_maxYield - 1: HeuristicData.MAX_MINE_UPGRADE_LEVEL - 1)) { GameData.m_upgradingMine = false; } queenInstructions = Helpers.GetBuildCommand(touchedLocation); } } return(queenInstructions); }
internal static Vector2 VerifyAndAvoidCollisions(BuildingLocation _target) { Unit queen = GameData.m_friendlyQueen; Vector2 direction = (Vector2.GetDistance(queen.m_position, _target.m_position).Normalized() * GameData.m_queenAvoidanceRange); Vector2 targetPosition = queen.m_position + direction; List <Entity> entityList; GameData.GetAllEntities(out entityList); float lastAvoidanceAngle = 0; while (true) { foreach (Entity _entity in entityList) { if (_entity == queen || _entity == _target) { continue; } Vector2 distanceToEntity = Vector2.GetDistance(targetPosition, _entity.m_position); float avoidanceRadius = _entity.m_radius + queen.m_radius; if (distanceToEntity.GetLength() < avoidanceRadius * avoidanceRadius) { float outAvoidanceAngle = 0; targetPosition = GetAvoidanceDestination(direction, distanceToEntity, avoidanceRadius, lastAvoidanceAngle, out outAvoidanceAngle); lastAvoidanceAngle = outAvoidanceAngle; direction = (Vector2.GetDistance(queen.m_position, targetPosition).Normalized() * (GameData.m_queenAvoidanceRange)); break; } } break; } return(targetPosition); }
internal static string GetBuildCommand(BuildingLocation _location, BuildingType _override = BuildingType.NONE) { return(string.Format("BUILD {0} {1}", _location.m_siteId, GetNameFromType(_override == BuildingType.NONE? _location.m_idealBuildingType : _override))); }