private static List <TerrainDisparity> CalculateAllCoverDisparities(
        HumanoidVantage strategizer,
        List <HumanoidVantage> enemyVantages,
        Vector3 location
        )
    {
        List <TerrainDisparity> totalDisparity = new List <TerrainDisparity>();

        Projectile stratWeaponThreat = strategizer.GetWeaponThreat();
        Vector3    standingAtEnd     = location.AddY(strategizer.GetStandingHeight());
        Vector3    kneelingAtEnd     = location.AddY(strategizer.GetKneelingHeight());
        Vector3    layingAtEnd       = location.AddY(strategizer.GetLayingHeight());

        foreach (HumanoidVantage enemyVantage in enemyVantages)
        {
            Projectile enemyWeaponThreat = enemyVantage.GetWeaponThreat();
            Vector3    enemyStanding     = enemyVantage.GetStandingVantage();
            Vector3    enemyKneeling     = enemyVantage.GetKneelingVantage();
            Vector3    enemyLaying       = enemyVantage.GetLayingVantage();

            TerrainDisparity topToTopDisp =
                EnvironmentPhysics.CalculateTerrainDisparityBetween(
                    stratWeaponThreat,
                    enemyWeaponThreat,
                    standingAtEnd,
                    enemyStanding
                    );

            totalDisparity.Add(topToTopDisp);
        }

        return(totalDisparity);
    }
示例#2
0
    public override CostResult GetAdditionalCostAt(Vector3 location)
    {
        var enemyVantages = targeter.GetAllKnownVantages();

        TerrainDisparity totalCoverDisparityPenalty =
            CostCalculatorHelper.CalculateByMostVisibleToTarget(
                strategizer.InfoGetVantageData(),
                enemyVantages,
                location
                );

        CostResult result = new CostResult(
            new Tuple <float, float, TerrainDisparity>(
                coverDisparityData.coverDisparityPenalty,
                coverDisparityData.exposedPenalty,
                totalCoverDisparityPenalty
                ),
            0,
            new Tuple <bool, float>(
                Grid.GetMapNodeAt(location).IsCoverNode(),
                coverDisparityData.notCoverPenalty
                )

            );

        return(result);
    }
示例#3
0
 public CostResult(
     Tuple <float, float, TerrainDisparity> disparityPenalty,
     int terrainPenalty,
     Tuple <bool, float> coverData
     )
 {
     terrainDisparity         = disparityPenalty.Item3;
     coverDisparityMultiplier = disparityPenalty.Item1;
     exposedPenalty           = disparityPenalty.Item2;
     heightPenalty            = terrainPenalty;
     isCover         = coverData.Item1;
     notCoverPenalty = coverData.Item2;
 }
示例#4
0
    public virtual void EffectOnSeeEnemy(HumanoidModel enemy)
    {
        Vector3    thisVantagePoint = GetVantagePoint();
        Projectile thisWeapon       = currentWeapon.GetProjectile();

        Vector3    enemyVantagePoint = enemy.GetVantagePoint();
        Projectile enemyWeapon       = enemy.currentWeapon.GetProjectile();

        TerrainDisparity terrainDisparity = EnvironmentPhysics.CalculateTerrainDisparityBetween(
            thisWeapon, enemyWeapon, thisVantagePoint, enemyVantagePoint
            );

        float coverDisparity = terrainDisparity.visibleToTarget - terrainDisparity.visibleToObserver;

        // the following line prevents advantageous cover from decreasing stress
        coverDisparity = coverDisparity < 0 ? 0 : coverDisparity;
        baseStressManager.PendSightStress(coverDisparity, enemy);
    }
示例#5
0
    public static TerrainDisparity CalculateTerrainDisparityBetween(
        Projectile heuristicOfObserver,
        Projectile heuristicOfTarget,
        Vector3 observerVantage,
        Vector3 targetVantage
        )
    {
        Tuple <Projectile, Projectile, Vector3, Vector3> data =
            new Tuple <Projectile, Projectile, Vector3, Vector3>(
                heuristicOfObserver,
                heuristicOfTarget,
                observerVantage,
                targetVantage
                );

        if (instance.calculateTerrainDisparityBetweenCache.ContainsKey(data))
        {
            return(instance.calculateTerrainDisparityBetweenCache[data]);
        }

        TerrainDisparity     result         = new TerrainDisparity();
        VisiblePortionResult observerResult =
            CalculateVisiblePortion(heuristicOfObserver, observerVantage, targetVantage);
        VisiblePortionResult targetResult =
            CalculateVisiblePortion(heuristicOfTarget, targetVantage, observerVantage);

        result.visibleToObserver = observerResult.visible;
        result.targetHeight      = observerResult.heightOfTarget;
        result.visibleToTarget   = targetResult.visible;
        result.observerHeight    = targetResult.heightOfTarget;

        instance.calculateTerrainDisparityBetweenCache[data] =
            result;
        if (instance.calculateTerrainDisparityBetweenCache.Count
            > CALCULATE_TERRAIN_DISPARITY_BETWEEN_CACHE_MAX_SIZE)
        {
            instance.calculateTerrainDisparityBetweenCache.PopFirst();
        }
        return(result);
    }
示例#6
0
    /*
     * Need to cache the result of this
     */
    public override CostResult GetAdditionalCostAt(Vector3 start, Vector3 end)
    {
        var enemyVantages = targeter.GetAllKnownVantages();

        float heightDifference = end.y - start.y;
        float heightPenalty    = CostCalculatorHelper.CalculateHeightPenalty(
            heightDifference,
            heightData.goingUpPenalty,
            heightData.climbUpThreshold,
            heightData.climbUpThreshold,
            heightData.goingDownPenalty,
            heightData.climbDownPenalty,
            heightData.climbDownThreshold
            );

        TerrainDisparity totalCoverDisparityPenalty = CostCalculatorHelper.CalculateByMostVisibleToTarget(
            strategizer.InfoGetVantageData(),
            enemyVantages,
            end/*,
                * coverDisparityData.exposedPenalty,
                * coverDisparityData.coverDisparityPenalty*/
            );

        CostResult result = new CostResult(
            new Tuple <float, float, TerrainDisparity> (
                coverDisparityData.coverDisparityPenalty,
                coverDisparityData.exposedPenalty,
                totalCoverDisparityPenalty
                )
            , (int)heightPenalty
            , new Tuple <bool, float>(
                Grid.GetMapNodeAt(end).IsCoverNode(),
                coverDisparityData.notCoverPenalty
                )
            );

        //DrawGizmo.AddGizmo(Color.grey, "" + result.CompletelyHidden(), end);

        return(result);
    }