Ticket #3334: t3334_floatingpoint_territorry_radius_v2.patch

File t3334_floatingpoint_territorry_radius_v2.patch, 1.2 KB (added by elexis, 9 years ago)

We can't use float/double in the simulation as the values might slightly differ on different platforms and thus cause out-of-sync. Thus we continue to use u32.

  • source/simulation2/components/CCmpTerritoryManager.cpp

    void CCmpTerritoryManager::CalculateTerr  
    438438        {
    439439            CmpPtr<ICmpPosition> cmpPosition(GetSimContext(), ent);
    440440            if (!cmpPosition || !cmpPosition->IsInWorld())
    441441                continue;
    442442
     443            // Use two digits precision for the radius without introducing floats
    443444            CmpPtr<ICmpTerritoryInfluence> cmpTerritoryInfluence(GetSimContext(), ent);
    444445            u32 weight = cmpTerritoryInfluence->GetWeight();
    445             u32 radius = cmpTerritoryInfluence->GetRadius() / (Pathfinding::NAVCELL_SIZE * NAVCELLS_PER_TERRITORY_TILE).ToInt_RoundToNegInfinity();
     446            u32 radius = 100 * cmpTerritoryInfluence->GetRadius() / (Pathfinding::NAVCELL_SIZE * NAVCELLS_PER_TERRITORY_TILE).ToInt_RoundToNegInfinity();
    446447            if (weight == 0 || radius == 0)
    447448                continue;
    448             u32 falloff = weight / radius;
     449            u32 falloff = 100 * weight / radius;
    449450
    450451            CFixedVector2D pos = cmpPosition->GetPosition2D();
    451452            u16 i, j;
    452453            NearestTerritoryTile(pos.X, pos.Y, i, j, tilesW, tilesH);
    453454