/// <summary> /// Calculate the best position from which I can shoot to the target using the weapon /// First = position closest to the player /// Second = position closer to the target /// </summary> private Tuple <Vector2, Vector2> GetShootPositionTo(Vector2 pShootTarget, EWeaponId pWeapon) { float maxDist = GetWeaponMaxUseDistance(pWeapon); float idealDist = GetWeaponIdealUseDistance(pWeapon); //ideal distance shouldnt be bigger. (probably not configured) if (idealDist > maxDist) { idealDist = maxDist; } Tuple <Vector2, Vector2> posHorizontal = GetShootPositions(pShootTarget, maxDist, idealDist, true, GetDontHitLayer(pWeapon)); Tuple <Vector2, Vector2> posVertical = GetShootPositions(pShootTarget, maxDist, idealDist, false, GetDontHitLayer(pWeapon)); //TESTING - Select the closest shoot position //- simple distance compare - select the closest const bool useSimpleDistCompare = true; if (useSimpleDistCompare) { if (Vector2.Distance(playerPosition, posHorizontal.Item1) < Vector2.Distance(playerPosition, posVertical.Item1)) { return(posHorizontal); } else { return(posVertical); } } //- calculate path and compare their lengths //-- seems very costly, player lags MovePath pathHorizontal = pathFinder.GetPath(playerPosition, posHorizontal.Item1); //, AiMovement.PATH_STEP); MovePath pathVertical = pathFinder.GetPath(playerPosition, posVertical.Item1); //, AiMovement.PATH_STEP); if (pathHorizontal.GetLength() < pathVertical.GetLength()) { return(posHorizontal); } else { return(posVertical); } }