/* * CZonePlacer.h, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ #pragma once #include "float3.h" #include "../int3.h" #include "../GameConstants.h" VCMI_LIB_NAMESPACE_BEGIN namespace vstd { class RNG; } class CZoneGraph; class CMap; class RmgMap; class Zone; typedef std::vector>> TZoneVector; typedef std::map> TZoneMap; typedef std::map, float3> TForceVector; typedef std::map, float> TDistanceVector; typedef std::map> TDistanceMap; class CZonePlacer { public: explicit CZonePlacer(RmgMap & map); int3 cords(const float3 & f) const; float metric (const int3 &a, const int3 &b) const; float getDistance(float distance) const; //additional scaling without 0 division ~CZonePlacer() = default; void placeZones(vstd::RNG * rand); void findPathsBetweenZones(); void placeOnGrid(vstd::RNG* rand); float scaleForceBetweenZones(const std::shared_ptr zoneA, const std::shared_ptr zoneB) const; void assignZones(vstd::RNG * rand); const TDistanceMap & getDistanceMap(); private: void prepareZones(TZoneMap &zones, TZoneVector &zonesVector, const bool underground, vstd::RNG * rand); void attractConnectedZones(TZoneMap & zones, TForceVector & forces, TDistanceVector & distances) const; void separateOverlappingZones(TZoneMap &zones, TForceVector &forces, TDistanceVector &overlaps); void moveOneZone(TZoneMap & zones, TForceVector & totalForces, TDistanceVector & distances, TDistanceVector & overlaps); private: int width; int height; //metric coefficient float mapSize; float gravityConstant; float stiffnessConstant; float stifness; float stiffnessIncreaseFactor; //remember best solution float bestTotalDistance; float bestTotalOverlap; //distance [a][b] = number of zone connections required to travel between the zones TDistanceMap distancesBetweenZones; std::set lastSwappedZones; RmgMap & map; }; VCMI_LIB_NAMESPACE_END