Merge with develop

--HG--
branch : compatibility-develop
hg/compatibility-develop
kervala 9 years ago
commit 1e9092a385

@ -90,14 +90,14 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
*/ */
static bool CheckIfNeedRebuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::string &fileNameWithExtension, bool mustDivideBy2); static bool CheckIfNeedRebuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::string &fileNameWithExtension, bool mustDivideBy2);
/// replace slashes by the matching os value in a file name /// replace slashes by the matching os value in a file name
static std::string replaceSlashes(const std::string &src) static std::string replaceSlashes(const std::string &src)
{ {
std::string result = src; std::string result = src;
for(uint k = 0; k < result.size(); ++k) for(uint k = 0; k < result.size(); ++k)
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
if (result[k] == '/') result[k] = '\\'; if (result[k] == '/') result[k] = '\\';
#else #else
if (result[k] == '\\') result[k] = '/'; if (result[k] == '\\') result[k] = '/';
@ -109,7 +109,7 @@ static std::string replaceSlashes(const std::string &src)
///===================================================== ///=====================================================
int main(int argc, char* argv[]) int main(int argc, char* argv[])
{ {
// Filter addSearchPath // Filter addSearchPath
NLMISC::createDebug(); NLMISC::createDebug();
@ -122,7 +122,7 @@ int main(int argc, char* argv[])
std::string _Path_Input_TexBases; std::string _Path_Input_TexBases;
std::string _Path_Input_Masks; std::string _Path_Input_Masks;
std::string _Path_Output_MaksOptimized; std::string _Path_Output_MasksOptimized;
std::string _Path_Output_Gtm; std::string _Path_Output_Gtm;
std::string _Path_Output_Cgi; std::string _Path_Output_Cgi;
@ -162,10 +162,10 @@ int main(int argc, char* argv[])
{ {
} }
/// repertory output of masks optimized created /// optimized masks output directory created
try try
{ {
_Path_Output_MaksOptimized = NLMISC::CPath::standardizePath(cf.getVar ("output_path_mask_optimized").asString()); _Path_Output_MasksOptimized = NLMISC::CPath::standardizePath(cf.getVar ("output_path_mask_optimized").asString());
} }
catch (const NLMISC::EUnknownVar &) catch (const NLMISC::EUnknownVar &)
{ {
@ -192,8 +192,7 @@ int main(int argc, char* argv[])
} }
catch (const std::exception &e) catch (const std::exception &e)
{ {
nlwarning("Panoply building failed."); nlerror("Panoply building failed: %s", e.what());
nlwarning(e.what());
return -1; return -1;
} }
@ -203,7 +202,7 @@ int main(int argc, char* argv[])
{ {
CInfoMaskGeneration infoMaskGen(_Path_Input_TexBases, CInfoMaskGeneration infoMaskGen(_Path_Input_TexBases,
_Path_Input_Masks, _Path_Input_Masks,
_Path_Output_MaksOptimized, _Path_Output_MasksOptimized,
_Path_Output_Gtm, _Path_Output_Gtm,
argv[3], argv[3],
1); 1);
@ -228,11 +227,11 @@ int main(int argc, char* argv[])
if (argc != 2) if (argc != 2)
{ {
nlwarning("usage : %s [config_file name]", argv[0]); nlinfo("Usage : %s [config_file name]", argv[0]);
return -1; return -1;
} }
CBuildInfo bi; CBuildInfo bi;
///////////////////////////////////////// /////////////////////////////////////////
// reads infos from the config files // // reads infos from the config files //
@ -259,7 +258,7 @@ int main(int argc, char* argv[])
catch (const NLMISC::EUnknownVar &) catch (const NLMISC::EUnknownVar &)
{ {
} }
/// input /// input
try try
{ {
@ -310,7 +309,7 @@ int main(int argc, char* argv[])
/// default ascii character for unused masks /// default ascii character for unused masks
try try
{ {
bi.DefaultSeparator = cf.getVar ("default_separator").asString(); bi.DefaultSeparator = cf.getVar ("default_separator").asString();
} }
catch (const NLMISC::EUnknownVar &) catch (const NLMISC::EUnknownVar &)
{ {
@ -319,7 +318,7 @@ int main(int argc, char* argv[])
/// extension for bitmaps /// extension for bitmaps
try try
{ {
NLMISC::CConfigFile::CVar &bitmap_extensions = cf.getVar ("bitmap_extensions"); NLMISC::CConfigFile::CVar &bitmap_extensions = cf.getVar ("bitmap_extensions");
for (uint k = 0; k < (uint) bitmap_extensions.size(); ++k) for (uint k = 0; k < (uint) bitmap_extensions.size(); ++k)
{ {
std::string ext = "." + bitmap_extensions.asString(k); std::string ext = "." + bitmap_extensions.asString(k);
@ -327,8 +326,8 @@ int main(int argc, char* argv[])
if (std::find(bi.BitmapExtensions.begin(), bi.BitmapExtensions.end(), ext) == bi.BitmapExtensions.end()) if (std::find(bi.BitmapExtensions.begin(), bi.BitmapExtensions.end(), ext) == bi.BitmapExtensions.end())
{ {
bi.BitmapExtensions.push_back(ext); bi.BitmapExtensions.push_back(ext);
} }
} }
} }
catch (const NLMISC::EUnknownVar &) catch (const NLMISC::EUnknownVar &)
{ {
@ -338,7 +337,7 @@ int main(int argc, char* argv[])
try try
{ {
bi.LowDefShift = cf.getVar ("low_def_shift").asInt(); bi.LowDefShift = cf.getVar ("low_def_shift").asInt();
} }
catch (const NLMISC::EUnknownVar &) catch (const NLMISC::EUnknownVar &)
{ {
@ -349,8 +348,7 @@ int main(int argc, char* argv[])
} }
catch (const std::exception &e) catch (const std::exception &e)
{ {
nlwarning("Panoply building failed."); nlerror("Panoply building failed: %s", e.what());
nlwarning(e.what());
return -1; return -1;
} }
@ -363,7 +361,7 @@ int main(int argc, char* argv[])
} }
catch (const std::exception &e) catch (const std::exception &e)
{ {
nlwarning("Something went wrong while building bitmap : %s", e.what()); nlerror("Something went wrong while building bitmap: %s", e.what());
return -1; return -1;
} }
return 0; return 0;
@ -377,7 +375,7 @@ int main(int argc, char* argv[])
static void validateCgiInfo() static void validateCgiInfo()
{ {
NLMISC::CIFile f; NLMISC::CIFile f;
vector<StrInfoTexColor> temp; vector<StrInfoTexColor> temp;
uint version; uint version;
@ -391,7 +389,7 @@ static void validateCgiInfo()
} }
catch(const std::exception &e) catch(const std::exception &e)
{ {
nlwarning("Panoply building failed."); nlerror("Panoply building failed: %s", e.what());
} }
uint16 a = temp.size(); uint16 a = temp.size();
@ -409,15 +407,15 @@ static void validateGtmInfo()
///====================================================== ///======================================================
static void BuildMasksFromConfigFile(NLMISC::CConfigFile &cf, static void BuildMasksFromConfigFile(NLMISC::CConfigFile &cf,
TColorMaskVect &colorMasks) TColorMaskVect &colorMasks)
{ {
/// get a list of the alpha mask extensions /// get a list of the alpha mask extensions
NLMISC::CConfigFile::CVar &mask_extensions = cf.getVar ("mask_extensions"); NLMISC::CConfigFile::CVar &mask_extensions = cf.getVar ("mask_extensions");
colorMasks.resize(mask_extensions.size()); colorMasks.resize(mask_extensions.size());
/// For each kind of mask, build a list of the color modifiers /// For each kind of mask, build a list of the color modifiers
for (uint k = 0; k < (uint) mask_extensions.size(); ++k) for (uint k = 0; k < (uint) mask_extensions.size(); ++k)
{ {
colorMasks[k].MaskExt = mask_extensions.asString(k); colorMasks[k].MaskExt = mask_extensions.asString(k);
NLMISC::CConfigFile::CVar &luminosities = cf.getVar (colorMasks[k].MaskExt + "_luminosities"); NLMISC::CConfigFile::CVar &luminosities = cf.getVar (colorMasks[k].MaskExt + "_luminosities");
NLMISC::CConfigFile::CVar &contrasts = cf.getVar (colorMasks[k].MaskExt + "_constrasts"); NLMISC::CConfigFile::CVar &contrasts = cf.getVar (colorMasks[k].MaskExt + "_constrasts");
@ -427,7 +425,7 @@ static void BuildMasksFromConfigFile(NLMISC::CConfigFile &cf,
NLMISC::CConfigFile::CVar &colorIDs = cf.getVar (colorMasks[k].MaskExt + "_color_id"); NLMISC::CConfigFile::CVar &colorIDs = cf.getVar (colorMasks[k].MaskExt + "_color_id");
if (luminosities.size() != contrasts.size() if (luminosities.size() != contrasts.size()
|| luminosities.size() != hues.size() || luminosities.size() != hues.size()
|| luminosities.size() != lightness.size() || luminosities.size() != lightness.size()
|| luminosities.size() != saturation.size() || luminosities.size() != saturation.size()
|| luminosities.size() != colorIDs.size() || luminosities.size() != colorIDs.size()
@ -455,7 +453,7 @@ static void BuildColoredVersions(const CBuildInfo &bi)
{ {
if (!NLMISC::CFile::isExists(bi.InputPath)) if (!NLMISC::CFile::isExists(bi.InputPath))
{ {
nlwarning(("Path not found : " + bi.InputPath).c_str()); nlerror("Path not found: %s", bi.InputPath.c_str());
return; return;
} }
for(uint sizeVersion= 0; sizeVersion<2; sizeVersion++) for(uint sizeVersion= 0; sizeVersion<2; sizeVersion++)
@ -473,16 +471,16 @@ static void BuildColoredVersions(const CBuildInfo &bi)
{ {
for (uint l = 0; l < bi.BitmapExtensions.size(); ++l) for (uint l = 0; l < bi.BitmapExtensions.size(); ++l)
{ {
std::string fileExt = "." + NLMISC::strupr(NLMISC::CFile::getExtension(files[k])); std::string fileExt = "." + NLMISC::strupr(NLMISC::CFile::getExtension(files[k]));
if (fileExt == bi.BitmapExtensions[l]) if (fileExt == bi.BitmapExtensions[l])
{ {
//nlwarning("Processing : %s ", files[k].c_str()); //nlwarning("Processing : %s ", files[k].c_str());
try try
{ {
if (CheckIfNeedRebuildColoredVersionForOneBitmap(bi, NLMISC::CFile::getFilename(files[k]), if (CheckIfNeedRebuildColoredVersionForOneBitmap(bi, NLMISC::CFile::getFilename(files[k]),
sizeVersion==1) ) sizeVersion==1) )
{ {
BuildColoredVersionForOneBitmap(bi, BuildColoredVersionForOneBitmap(bi,
NLMISC::CFile::getFilename(files[k]), NLMISC::CFile::getFilename(files[k]),
sizeVersion==1); sizeVersion==1);
} }
@ -493,7 +491,7 @@ static void BuildColoredVersions(const CBuildInfo &bi)
} }
catch (const std::exception &e) catch (const std::exception &e)
{ {
nlwarning("Processing of %s failed : %s \n", files[k].c_str(), e.what()); nlerror("Processing of %s failed: %s", files[k].c_str(), e.what());
} }
} }
} }
@ -502,7 +500,7 @@ static void BuildColoredVersions(const CBuildInfo &bi)
} }
/// used to loop throiugh the process, avoiding unused masks /// used to loop throiugh the process, avoiding unused masks
struct CLoopInfo struct CLoopInfo
{ {
NLMISC::CBitmap Mask; NLMISC::CBitmap Mask;
@ -512,11 +510,11 @@ struct CLoopInfo
///====================================================== ///======================================================
static bool CheckIfNeedRebuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::string &fileNameWithExtension, static bool CheckIfNeedRebuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::string &fileNameWithExtension,
bool mustDivideBy2) bool mustDivideBy2)
{ {
if (bi.CachePath.empty()) return true; if (bi.CachePath.empty()) return true;
uint32 srcDate = (uint32) NLMISC::CFile::getFileModificationDate(replaceSlashes(bi.InputPath + fileNameWithExtension)); uint32 srcDate = (uint32) NLMISC::CFile::getFileModificationDate(replaceSlashes(bi.InputPath + fileNameWithExtension));
static std::vector<CLoopInfo> masks; static std::vector<CLoopInfo> masks;
/// check the needed masks /// check the needed masks
masks.clear(); masks.clear();
@ -530,16 +528,16 @@ static bool CheckIfNeedRebuildColoredVersionForOneBitmap(const CBuildInfo &bi, c
std::string maskFileName = NLMISC::CPath::lookup(maskName, std::string maskFileName = NLMISC::CPath::lookup(maskName,
false, false); false, false);
if (!maskFileName.empty()) // found the mask ? if (!maskFileName.empty()) // found the mask ?
{ {
CLoopInfo li; CLoopInfo li;
li.Counter = 0; li.Counter = 0;
li.MaskID = k; li.MaskID = k;
if (NLMISC::CFile::fileExists(maskFileName)) if (NLMISC::CFile::fileExists(maskFileName))
{ {
srcDate = std::max(srcDate, (uint32) NLMISC::CFile::getFileModificationDate(replaceSlashes(maskFileName))); srcDate = std::max(srcDate, (uint32) NLMISC::CFile::getFileModificationDate(replaceSlashes(maskFileName)));
masks.push_back(li); masks.push_back(li);
} }
} }
} }
@ -550,7 +548,7 @@ static bool CheckIfNeedRebuildColoredVersionForOneBitmap(const CBuildInfo &bi, c
return true; return true;
else else
{ {
// Must now if was moved beetween normal dir and d4/ dir. // Must now if was moved beetween normal dir and d4/ dir.
CHLSBankTextureInfo hlsInfo; CHLSBankTextureInfo hlsInfo;
// read .hlsInfo cache // read .hlsInfo cache
CIFile f; CIFile f;
@ -565,7 +563,7 @@ static bool CheckIfNeedRebuildColoredVersionForOneBitmap(const CBuildInfo &bi, c
// ok, can move the cache // ok, can move the cache
if (!NLMISC::CFile::moveFile(outputHLSInfo, cacheHLSInfo)) if (!NLMISC::CFile::moveFile(outputHLSInfo, cacheHLSInfo))
{ {
nlwarning(("Couldn't move " + cacheHLSInfo + " to " + outputHLSInfo).c_str()); nlerror("Couldn't move %s to %s", cacheHLSInfo.c_str(), outputHLSInfo.c_str());
return true; return true;
} }
} }
@ -573,33 +571,34 @@ static bool CheckIfNeedRebuildColoredVersionForOneBitmap(const CBuildInfo &bi, c
/// check is each generated texture has the same date or is more recent /// check is each generated texture has the same date or is more recent
for(;;) for(;;)
{ {
uint l; uint l;
std::string outputFileName = fileName; std::string outputFileName = fileName;
/// build current tex name /// build current tex name
for (l = 0; l < masks.size(); ++l) for (l = 0; l < masks.size(); ++l)
{ {
uint maskID = masks[l].MaskID; uint maskID = masks[l].MaskID;
uint colorID = masks[l].Counter; uint colorID = masks[l].Counter;
/// complete the file name /// complete the file name
outputFileName += bi.DefaultSeparator + bi.ColorMasks[maskID].CMs[colorID].ColID; outputFileName += bi.DefaultSeparator + bi.ColorMasks[maskID].CMs[colorID].ColID;
} }
// compare date // compare date
std::string searchName = replaceSlashes(bi.CachePath + outputFileName + bi.OutputFormat); std::string searchName = replaceSlashes(bi.CachePath + outputFileName + bi.OutputFormat);
if ((uint32) NLMISC::CFile::getFileModificationDate(searchName) < srcDate) if ((uint32) NLMISC::CFile::getFileModificationDate(searchName) < srcDate)
{ {
return true; // not found or more old => need rebuild return true; // not found or more old => need rebuild
} }
// get version that is in the cache // get version that is in the cache
std::string cacheDest = bi.OutputPath + outputFileName + bi.OutputFormat; std::string cacheDest = bi.OutputPath + outputFileName + bi.OutputFormat;
if (!NLMISC::CFile::moveFile(cacheDest, searchName)) if (!NLMISC::CFile::moveFile(cacheDest, searchName))
{ {
nlwarning(("Couldn't move " + searchName + " to " + cacheDest).c_str()); nlerror("Couldn't move %s to %s", searchName.c_str(), cacheDest.c_str());
return true; return true;
} }
/// increment counters /// increment counters
for (l = 0; l < (uint) masks.size(); ++l) for (l = 0; l < (uint) masks.size(); ++l)
@ -624,9 +623,9 @@ static bool CheckIfNeedRebuildColoredVersionForOneBitmap(const CBuildInfo &bi, c
///====================================================== ///======================================================
static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::string &fileNameWithExtension, static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::string &fileNameWithExtension,
bool mustDivideBy2) bool mustDivideBy2)
{ {
uint32 depth; uint32 depth;
NLMISC::CBitmap srcBitmap; NLMISC::CBitmap srcBitmap;
NLMISC::CBitmap resultBitmap; NLMISC::CBitmap resultBitmap;
@ -641,16 +640,19 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
actualInputPath= bi.InputPath; actualInputPath= bi.InputPath;
// load // load
std::string fullInputBitmapPath = actualInputPath + fileNameWithExtension;
NLMISC::CIFile is; NLMISC::CIFile is;
try try
{ {
if (is.open(actualInputPath + fileNameWithExtension)) if (is.open(fullInputBitmapPath))
{ {
depth = srcBitmap.load(is); depth = srcBitmap.load(is);
if (depth == 0 || srcBitmap.getPixels().empty()) if (depth == 0 || srcBitmap.getPixels().empty())
{ {
throw NLMISC::Exception(std::string("Failed to load bitmap ") + actualInputPath + fileNameWithExtension); throw NLMISC::Exception("Failed to load bitmap");
} }
if (srcBitmap.PixelFormat != NLMISC::CBitmap::RGBA) if (srcBitmap.PixelFormat != NLMISC::CBitmap::RGBA)
{ {
srcBitmap.convertToType(NLMISC::CBitmap::RGBA); srcBitmap.convertToType(NLMISC::CBitmap::RGBA);
@ -658,17 +660,17 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
} }
else else
{ {
nlwarning("Unable to open %s. Processing next", (actualInputPath + fileNameWithExtension).c_str()); nlerror("Unable to open %s. Processing next", fullInputBitmapPath.c_str());
return; return;
} }
} }
catch (const NLMISC::Exception &) catch (const NLMISC::Exception &e)
{ {
nlwarning("File or format error with : %s. Processing next...", fileNameWithExtension.c_str()); nlerror("File or format error with %s (%s). Processing next...", fullInputBitmapPath.c_str(), e.what());
return; return;
} }
} }
/// **** Build and prepare build of the .hlsinfo to write. /// **** Build and prepare build of the .hlsinfo to write.
CHLSBankTextureInfo hlsInfo; CHLSBankTextureInfo hlsInfo;
CBitmap hlsInfoSrcBitmap; CBitmap hlsInfoSrcBitmap;
@ -703,7 +705,7 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
std::string maskFileName = NLMISC::CPath::lookup(maskName, std::string maskFileName = NLMISC::CPath::lookup(maskName,
false, false); false, false);
if (!maskFileName.empty()) // found the mask ? if (!maskFileName.empty()) // found the mask ?
{ {
CLoopInfo li; CLoopInfo li;
li.Counter = 0; li.Counter = 0;
li.MaskID = k; li.MaskID = k;
@ -714,14 +716,10 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
{ {
if (is.open(maskFileName)) if (is.open(maskFileName))
{ {
if (li.Mask.load(is) == 0) if (li.Mask.load(is) == 0 || li.Mask.getPixels().empty())
{
throw NLMISC::Exception(std::string("Failed to load mask ") + maskFileName);
}
if (li.Mask.getPixels().empty())
{ {
throw NLMISC::Exception(std::string("Failed to load mask ") + maskFileName); throw NLMISC::Exception("Failed to load mask");
} }
if (li.Mask.PixelFormat != NLMISC::CBitmap::RGBA) if (li.Mask.PixelFormat != NLMISC::CBitmap::RGBA)
@ -735,17 +733,18 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
{ {
throw NLMISC::Exception("Bitmap and mask do not have the same size"); throw NLMISC::Exception("Bitmap and mask do not have the same size");
} }
masks.push_back(li); masks.push_back(li);
} }
else else
{ {
nlwarning("Unable to open %s. Processing next", maskFileName.c_str()); nlerror("Unable to open %s. Processing next", maskFileName.c_str());
return; return;
} }
} }
catch (const std::exception &e) catch (const std::exception &e)
{ {
nlwarning("Error with : %s : %s. Aborting this bitmap processing", maskFileName.c_str(), e.what()); nlerror("Error with %s: %s. Aborting this bitmap processing", maskFileName.c_str(), e.what());
return; return;
} }
} }
@ -762,14 +761,14 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
} }
// **** generate each texture // **** generate each texture
// NB : if there are no masks the texture just will be copied // NB : if there are no masks the texture just will be copied
for(;;) for(;;)
{ {
resultBitmap = srcBitmap; resultBitmap = srcBitmap;
uint l; uint l;
std::string outputFileName = fileName; std::string outputFileName = fileName;
// Add an instance entry to the hlsInfo // Add an instance entry to the hlsInfo
uint instId= (uint)hlsInfo.Instances.size(); uint instId= (uint)hlsInfo.Instances.size();
hlsInfo.Instances.resize(instId+1); hlsInfo.Instances.resize(instId+1);
@ -797,17 +796,19 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
/// complete the file name /// complete the file name
outputFileName += bi.DefaultSeparator + bi.ColorMasks[maskID].CMs[colorID].ColID; outputFileName += bi.DefaultSeparator + bi.ColorMasks[maskID].CMs[colorID].ColID;
} }
// save good hlsInfo instance name // save good hlsInfo instance name
hlsTextInstance.Name= outputFileName + bi.OutputFormat; hlsTextInstance.Name = outputFileName + bi.OutputFormat;
nlwarning("Writing %s", outputFileName.c_str()); nlinfo("Writing %s", outputFileName.c_str());
/// Save the result. We let propagate exceptions (if there's no more space disk it useless to continue...) /// Save the result. We let propagate exceptions (if there's no more space disk it useless to continue...)
{ {
std::string fullOutputPath = bi.OutputPath + "/" + outputFileName + bi.OutputFormat;
try try
{ {
NLMISC::COFile os; NLMISC::COFile os;
if (os.open(bi.OutputPath + "/" + outputFileName + bi.OutputFormat)) if (os.open(fullOutputPath))
{ {
// divide by 2 when needed. // divide by 2 when needed.
if(mustDivideBy2) if(mustDivideBy2)
@ -824,17 +825,17 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
} }
else else
{ {
nlwarning(("Couldn't open " + bi.OutputPath + outputFileName + bi.OutputFormat + " for writing").c_str()); nlerror("Couldn't open %s for writing", fullOutputPath.c_str());
} }
} }
catch(const NLMISC::EStream &e) catch(const NLMISC::EStream &e)
{ {
nlwarning(("Couldn't write " + bi.OutputPath + outputFileName + bi.OutputFormat + " : " + e.what()).c_str()); nlerror("Couldn't write %s: %s", fullOutputPath.c_str(), e.what());
} }
} }
/// increment counters
/// increment counters
for (l = 0; l < (uint) masks.size(); ++l) for (l = 0; l < (uint) masks.size(); ++l)
{ {
++ (masks[l].Counter); ++ (masks[l].Counter);
@ -853,14 +854,16 @@ static void BuildColoredVersionForOneBitmap(const CBuildInfo &bi, const std::str
} }
// **** save the TMP hlsInfo // **** save the TMP hlsInfo
std::string fullHlsInfoPath = bi.HlsInfoPath + fileName + ".hlsinfo";
NLMISC::COFile os; NLMISC::COFile os;
if (os.open(bi.HlsInfoPath + fileName + ".hlsinfo")) if (os.open(fullHlsInfoPath))
{ {
os.serial(hlsInfo); os.serial(hlsInfo);
} }
else else
{ {
nlwarning(("Couldn't write " + bi.HlsInfoPath + fileName + ".hlsinfo").c_str()); nlerror("Couldn't write %s", fullHlsInfoPath.c_str());
} }
} }

@ -45,7 +45,7 @@ static char const* stateName(CSpawnGroupFauna::TState s)
// helper : get a fauna xyr zone from a base zone or a zone reference // helper : get a fauna xyr zone from a base zone or a zone reference
static inline const CFaunaGenericPlace *getFaunaGenericPlace(const CAIPlace *place) static inline const CFaunaGenericPlace *getFaunaGenericPlace(const CAIPlace *place)
{ {
const CFaunaGenericPlace *faunaPlace = dynamic_cast<const CFaunaGenericPlace *>(place); const CFaunaGenericPlace *faunaPlace = dynamic_cast<const CFaunaGenericPlace *>(place);
nlassert(faunaPlace); nlassert(faunaPlace);
return faunaPlace; return faunaPlace;
@ -75,11 +75,11 @@ CSpawnGroupFauna::CSpawnGroupFauna(CPersistent<CSpawnGroup>& owner, RYAI_MAP_CRU
{ {
// variables for CAIMgrFauna's update prioritisation system // variables for CAIMgrFauna's update prioritisation system
_UpdatePriority = 0; // 0..15 - priority class (distance based - 0 is highest priority) _UpdatePriority = 0; // 0..15 - priority class (distance based - 0 is highest priority)
_Leader = (CBotFauna*)NULL; _Leader = (CBotFauna*)NULL;
_Timer.set(0); _Timer.set(0);
// pick a spawn place // pick a spawn place
sint spawnPlace = getPersistent().getNextPlace(NULL, CAIPlaceXYRFauna::FLAG_SPAWN); sint spawnPlace = getPersistent().getNextPlace(NULL, CAIPlaceXYRFauna::FLAG_SPAWN);
if (spawnPlace == CGrpFauna::INVALID_PLACE) if (spawnPlace == CGrpFauna::INVALID_PLACE)
@ -88,40 +88,40 @@ CSpawnGroupFauna::CSpawnGroupFauna(CPersistent<CSpawnGroup>& owner, RYAI_MAP_CRU
// seek place with the smallest index // seek place with the smallest index
sint minIndex = INT_MAX; sint minIndex = INT_MAX;
for (uint k = 0; k < getPersistent().places().size(); ++k) for (uint k = 0; k < getPersistent().places().size(); ++k)
{ {
const CFaunaGenericPlace *place = getFaunaGenericPlace(getPersistent().places()[k]); const CFaunaGenericPlace *place = getFaunaGenericPlace(getPersistent().places()[k]);
minIndex = std::min((sint) place->getIndex(), minIndex); minIndex = std::min((sint) place->getIndex(), minIndex);
} }
for (uint k = 0; k < getPersistent().places().size(); ++k) for (uint k = 0; k < getPersistent().places().size(); ++k)
{ {
const CFaunaGenericPlace *place = getFaunaGenericPlace(getPersistent().places()[k]); const CFaunaGenericPlace *place = getFaunaGenericPlace(getPersistent().places()[k]);
if ((sint) place->getIndex() == minIndex) if ((sint) place->getIndex() == minIndex)
{ {
candidates.push_back(k); candidates.push_back(k);
} }
} }
spawnPlace = (sint) candidates[rand() % candidates.size()]; spawnPlace = (sint) candidates[rand() % candidates.size()];
//nlwarning("No spawn place found for group %s, using place with smallest index", getPersistent().getName().c_str()); //nlwarning("No spawn place found for group %s, using place with smallest index", getPersistent().getName().c_str());
} }
setPlace(spawnPlace); setPlace(spawnPlace);
_CenterPos = _TargetPlace->midPos(); _CenterPos = _TargetPlace->midPos();
// make sure memory's been allocated for the bots // make sure memory's been allocated for the bots
if (bots().size()==0) if (bots().size()==0)
getPersistent().allocateBots(); getPersistent().allocateBots();
if (bots().size()!=0) if (bots().size()!=0)
{ {
uint32 const spawnTimer = getPersistent().timer(CGrpFauna::SPAWN_TIME); uint32 const spawnTimer = getPersistent().timer(CGrpFauna::SPAWN_TIME);
_Timer.set(spawnTimer); _Timer.set(spawnTimer);
} }
// setup the update priority system variables // setup the update priority system variables
_LastUpdate = CTimeInterface::gameCycle(); _LastUpdate = CTimeInterface::gameCycle();
_DeltaTime = 1; _DeltaTime = 1;
_CurrentCycle = 0; _CurrentCycle = 0;
setMustDespawnBots(false); setMustDespawnBots(false);
} }
@ -138,14 +138,14 @@ void CSpawnGroupFauna::despawnGrp() // critical code (despawn 'this' object).
} }
void CSpawnGroupFauna::recalcUpdatePriorityDeltaAndGroupPos() void CSpawnGroupFauna::recalcUpdatePriorityDeltaAndGroupPos()
{ {
// recalculate the priority delta score for the group based on players in vision // recalculate the priority delta score for the group based on players in vision
bool speedUpdate = false; bool speedUpdate = false;
sint32 grpPosx = 0; sint32 grpPosx = 0;
sint32 grpPosy = 0; sint32 grpPosy = 0;
sint32 nbBots = 0; sint32 nbBots = 0;
FOREACH(it, CCont<CBot>, bots()) FOREACH(it, CCont<CBot>, bots())
{ {
CBotFauna *bot=NLMISC::safe_cast<CBotFauna*>(*it); CBotFauna *bot=NLMISC::safe_cast<CBotFauna*>(*it);
@ -159,39 +159,39 @@ void CSpawnGroupFauna::recalcUpdatePriorityDeltaAndGroupPos()
grpPosy+=(sint32)(pos.y().asInt()*(1.0/1000.0)); grpPosy+=(sint32)(pos.y().asInt()*(1.0/1000.0));
nbBots++; nbBots++;
} }
if (botFauna->havePlayersAround()) if (botFauna->havePlayersAround())
{ {
speedUpdate=true; speedUpdate=true;
break; break;
} }
} }
} }
if (nbBots>0) if (nbBots>0)
{ {
_CenterPos = CAIVector(grpPosx/nbBots,grpPosy/nbBots); _CenterPos = CAIVector(grpPosx/nbBots,grpPosy/nbBots);
} }
if (speedUpdate) if (speedUpdate)
_UpdatePriority = 1; _UpdatePriority = 1;
else else
_UpdatePriority = 31; _UpdatePriority = 31;
// if players are approaching then crop our move time // if players are approaching then crop our move time
uint32 curTime = CTimeInterface::gameCycle (); uint32 curTime = CTimeInterface::gameCycle ();
if (((sint32)(curTime-_LastUpdate))>(_UpdatePriority+1)) if (((sint32)(curTime-_LastUpdate))>(_UpdatePriority+1))
_LastUpdate = curTime-(_UpdatePriority+1); _LastUpdate = curTime-(_UpdatePriority+1);
_DeltaTime = curTime-_LastUpdate; _DeltaTime = curTime-_LastUpdate;
} }
CBotFauna* CSpawnGroupFauna::findLeader() CBotFauna* CSpawnGroupFauna::findLeader()
{ {
CBotFauna* possibleLeader = NULL; CBotFauna* possibleLeader = NULL;
CCont<CBot >::iterator it = bots().begin(); CCont<CBot >::iterator it = bots().begin();
CCont<CBot >::iterator itEnd = bots().end(); CCont<CBot >::iterator itEnd = bots().end();
while (it!=itEnd) while (it!=itEnd)
@ -214,21 +214,21 @@ CBotFauna* CSpawnGroupFauna::findLeader()
void CSpawnGroupFauna::update() void CSpawnGroupFauna::update()
{ {
H_AUTO(GrpFaunaUpdate); H_AUTO(GrpFaunaUpdate);
++AISStat::GrpTotalUpdCtr; ++AISStat::GrpTotalUpdCtr;
++AISStat::GrpFaunaUpdCtr; ++AISStat::GrpFaunaUpdCtr;
getPersistent().updateStateInstance(); getPersistent().updateStateInstance();
if (_CurrentCycle==std::numeric_limits<uint32>::max()) if (_CurrentCycle==std::numeric_limits<uint32>::max())
return; return;
// Respawn // Respawn
// breakable // breakable
{ {
H_AUTO(GrpFaunaUpdateDealWithDead); H_AUTO(GrpFaunaUpdateDealWithDead);
checkDespawn (); checkDespawn ();
if (nbBotToRespawn()>0) if (nbBotToRespawn()>0)
{ {
if (nbSpawnedBot()>0) // (getPersistent().bots().size()/2)) if (nbSpawnedBot()>0) // (getPersistent().bots().size()/2))
@ -246,23 +246,23 @@ void CSpawnGroupFauna::update()
} }
} }
} }
// recalculate our priority rating in function of distance from player // recalculate our priority rating in function of distance from player
// if players are approaching then crop our move time // if players are approaching then crop our move time
recalcUpdatePriorityDeltaAndGroupPos(); recalcUpdatePriorityDeltaAndGroupPos();
// identify the leader, call type-dependent update and calculate group position and radius // identify the leader, call type-dependent update and calculate group position and radius
{ {
H_AUTO(GrpFaunaUpdateByType); H_AUTO(GrpFaunaUpdateByType);
H_TIME(GrpFaunaUpdateFindLeader, _Leader = findLeader();); H_TIME(GrpFaunaUpdateFindLeader, _Leader = findLeader(););
// locate the first live bot and treat them as the group leader // locate the first live bot and treat them as the group leader
// update the state variable (think about changing state) // update the state variable (think about changing state)
H_TIME(GrpFaunaUpdateCheckTimer, checkTimers();); H_TIME(GrpFaunaUpdateCheckTimer, checkTimers(););
H_TIME(GrpFaunaUpdateGeneralUpdate, generalUpdate();); H_TIME(GrpFaunaUpdateGeneralUpdate, generalUpdate(););
// re-find leader as it could have been despawn .. // re-find leader as it could have been despawn ..
_Leader = findLeader(); _Leader = findLeader();
} }
@ -273,10 +273,10 @@ void CSpawnGroupFauna::update()
void CSpawnGroupFauna::generalUpdate(TState state) void CSpawnGroupFauna::generalUpdate(TState state)
{ {
H_TIME(GrpFaunaReorganize, reorganize(bots().begin(), bots().end());); H_TIME(GrpFaunaReorganize, reorganize(bots().begin(), bots().end()););
{ {
H_AUTO(GrpFaunaUpdDespawnTest); H_AUTO(GrpFaunaUpdDespawnTest);
if ( !mustDespawnBots() if ( !mustDespawnBots()
&& getUpdatePriority ()>(2<<3) && getUpdatePriority ()>(2<<3)
&& !getPersistent().timeAllowSpawn() ) // 40*3 -> more than 120 meters far from players && !getPersistent().timeAllowSpawn() ) // 40*3 -> more than 120 meters far from players
@ -284,10 +284,10 @@ void CSpawnGroupFauna::generalUpdate(TState state)
setMustDespawnBots (true); setMustDespawnBots (true);
} }
} }
if (state==StateUndefined) if (state==StateUndefined)
state=CGrpFauna::cycles[_CurrentCycle]._Activity; state=CGrpFauna::cycles[_CurrentCycle]._Activity;
// call a type-dependent update // call a type-dependent update
switch (getPersistent().getType()) switch (getPersistent().getType())
{ {
@ -306,7 +306,7 @@ void CSpawnGroupFauna::generalUpdate(TState state)
} }
} }
break; break;
case FaunaTypePlant: case FaunaTypePlant:
{ {
H_AUTO(GrpFaunaUpdPlant); H_AUTO(GrpFaunaUpdPlant);
@ -322,7 +322,7 @@ void CSpawnGroupFauna::generalUpdate(TState state)
} }
} }
break; break;
default: nlwarning("CSpawnGroupFauna::update() FAILED because group type not valid: %d",getPersistent().getType()); default: nlwarning("CSpawnGroupFauna::update() FAILED because group type not valid: %d",getPersistent().getType());
} }
} }
@ -351,7 +351,7 @@ void CSpawnGroupFauna::updateSpawning()
for (i=0;i<curPop.size();++i) for (i=0;i<curPop.size();++i)
targetCount+=curPop[i].getBotCount(getPersistent().getCountMultiplierFlag()); targetCount+=curPop[i].getBotCount(getPersistent().getCountMultiplierFlag());
// if no more bots to spawn then change state... // if no more bots to spawn then change state...
if (bots()[targetCount-1]->isSpawned()) if (bots()[targetCount-1]->isSpawned())
{ {
@ -378,8 +378,8 @@ void CSpawnGroupFauna::updateSpawning()
} }
// by definition there must be a bot type // by definition there must be a bot type
nlassert(i<curPop.size()); nlassert(i<curPop.size());
@ -409,7 +409,7 @@ void CSpawnGroupFauna::incCurrentCycle()
} }
void CSpawnGroupFauna::setCurrentCycle(uint32 cycle) void CSpawnGroupFauna::setCurrentCycle(uint32 cycle)
{ {
if (getPersistent().places().isEmpty()) if (getPersistent().places().isEmpty())
{ {
nlwarning("No places in fauna group %s", getPersistent().getName().c_str()); nlwarning("No places in fauna group %s", getPersistent().getName().c_str());
@ -426,11 +426,11 @@ void CSpawnGroupFauna::setCurrentCycle(uint32 cycle)
// First we search a neighbour place that has wanted activity // First we search a neighbour place that has wanted activity
// otherwise we change activity to the one we found // otherwise we change activity to the one we found
switch(CGrpFauna::cycles[cycle]._Place) switch(CGrpFauna::cycles[cycle]._Place)
{ {
case CGrpFauna::EAT_PLACE: case CGrpFauna::EAT_PLACE:
nextPlace = getPersistent().getNextPlace(targetPlacePtr, CAIPlaceXYRFauna::FLAG_EAT); nextPlace = getPersistent().getNextPlace(targetPlacePtr, CAIPlaceXYRFauna::FLAG_EAT);
if (nextPlace == CGrpFauna::INVALID_PLACE) if (nextPlace == CGrpFauna::INVALID_PLACE)
{ {
nextPlace = getPersistent().getNextPlace(targetPlacePtr, CAIPlaceXYRFauna::FLAG_REST); nextPlace = getPersistent().getNextPlace(targetPlacePtr, CAIPlaceXYRFauna::FLAG_REST);
if (nextPlace != CGrpFauna::INVALID_PLACE) if (nextPlace != CGrpFauna::INVALID_PLACE)
{ {
@ -446,10 +446,10 @@ void CSpawnGroupFauna::setCurrentCycle(uint32 cycle)
cycle = CGrpFauna::REST_PLACE; // force to rest cycle = CGrpFauna::REST_PLACE; // force to rest
} }
} }
} }
break; break;
case CGrpFauna::REST_PLACE: case CGrpFauna::REST_PLACE:
nextPlace = getPersistent().getNextPlace(targetPlacePtr, CAIPlaceXYRFauna::FLAG_REST); nextPlace = getPersistent().getNextPlace(targetPlacePtr, CAIPlaceXYRFauna::FLAG_REST);
if (nextPlace == CGrpFauna::INVALID_PLACE) if (nextPlace == CGrpFauna::INVALID_PLACE)
{ {
nextPlace = getPersistent().getNextPlace(targetPlacePtr, CAIPlaceXYRFauna::FLAG_EAT); nextPlace = getPersistent().getNextPlace(targetPlacePtr, CAIPlaceXYRFauna::FLAG_EAT);
@ -467,9 +467,9 @@ void CSpawnGroupFauna::setCurrentCycle(uint32 cycle)
cycle = CGrpFauna::EAT_PLACE; // force to rest cycle = CGrpFauna::EAT_PLACE; // force to rest
} }
} }
} }
break; break;
} }
_CurrentCycle = cycle; _CurrentCycle = cycle;
setPlace(nextPlace); setPlace(nextPlace);
@ -501,25 +501,25 @@ void CSpawnGroupFauna::checkTimers()
{ {
if (CGrpFauna::cycles[_CurrentCycle]._Activity==StateSpawning) if (CGrpFauna::cycles[_CurrentCycle]._Activity==StateSpawning)
return; return;
if (!_ArrivedInZone) // if we are changing the current activity zone. if (!_ArrivedInZone) // if we are changing the current activity zone.
{ {
if ( !_Leader.isNULL() if ( !_Leader.isNULL()
&& _Leader->isSpawned()) && _Leader->isSpawned())
{ {
const CAIPos leaderPos(_Leader->getSpawn()->pos()); const CAIPos leaderPos(_Leader->getSpawn()->pos());
const CAIPos midPos=_TargetPlace->midPos(); // better is very possible. const CAIPos midPos=_TargetPlace->midPos(); // better is very possible.
if (leaderPos.distTo(midPos)<_TargetPlace->getRadius()) // si leader dans la zone. if (leaderPos.distTo(midPos)<_TargetPlace->getRadius()) // si leader dans la zone.
{ {
_ArrivedInZone=true; // we desactivate the boolean. _ArrivedInZone=true; // we desactivate the boolean.
const CFaunaGenericPlace *faunaPlace = getFaunaGenericPlace(targetPlace()); const CFaunaGenericPlace *faunaPlace = getFaunaGenericPlace(targetPlace());
NLMISC::CRandom rnd; NLMISC::CRandom rnd;
uint32 stayTime = faunaPlace->getMinStayTime() + (sint32) (rnd.frand() * ((sint32) faunaPlace->getMaxStayTime() - (sint32) faunaPlace->getMinStayTime())); uint32 stayTime = faunaPlace->getMinStayTime() + (sint32) (rnd.frand() * ((sint32) faunaPlace->getMaxStayTime() - (sint32) faunaPlace->getMinStayTime()));
_Timer.set(stayTime); _Timer.set(stayTime);
/* /*
nlwarning("Group %s : Setting stay time to %d in place %s with index %d", nlwarning("Group %s : Setting stay time to %d in place %s with index %d",
getPersistent().getName().c_str(), getPersistent().getName().c_str(),
(int) stayTime, (int) stayTime,
faunaPlace->getName().c_str(), faunaPlace->getName().c_str(),
(int) faunaPlace->getIndex()); (int) faunaPlace->getIndex());
@ -528,7 +528,7 @@ void CSpawnGroupFauna::checkTimers()
} }
} }
} }
else else
{ {
@ -553,17 +553,17 @@ void CSpawnGroupFauna::despawnBots(bool immediately)
} }
CAIPos const& CSpawnGroupFauna::magnetPos() const CAIPos const& CSpawnGroupFauna::magnetPos() const
{ {
return targetPlace()->midPos(); return targetPlace()->midPos();
} }
float CSpawnGroupFauna::magnetRadiusNear() const float CSpawnGroupFauna::magnetRadiusNear() const
{ {
return targetPlace()->getRadius()*(7.0f/8.0f); return targetPlace()->getRadius()*(7.0f/8.0f);
} }
float CSpawnGroupFauna::magnetRadiusFar() const float CSpawnGroupFauna::magnetRadiusFar() const
{ {
return targetPlace()->getRadius()*(9.0f/8.0f); return targetPlace()->getRadius()*(9.0f/8.0f);
} }
@ -603,19 +603,19 @@ CGrpFauna::CGrpFauna(CMgrFauna* mgr, CAIAliasDescriptionNode* aliasTree, RYAI_MA
, CDynGrpBase() , CDynGrpBase()
, CPersistentStateInstance(*mgr->getStateMachine()) , CPersistentStateInstance(*mgr->getStateMachine())
{ {
// state // state
_CurPopulation = std::numeric_limits<uint32>::max(); _CurPopulation = std::numeric_limits<uint32>::max();
_CurrentCycle = std::numeric_limits<sint32>::max(); _CurrentCycle = std::numeric_limits<sint32>::max();
// default values. // default values.
setTimer(EAT_TIME, refTimer(EAT_TIME)); setTimer(EAT_TIME, refTimer(EAT_TIME));
setTimer(REST_TIME, refTimer(REST_TIME)); setTimer(REST_TIME, refTimer(REST_TIME));
setTimer(SPAWN_TIME, refTimer(SPAWN_TIME)); setTimer(SPAWN_TIME, refTimer(SPAWN_TIME));
setTimer(CORPSE_TIME, refTimer(CORPSE_TIME)); setTimer(CORPSE_TIME, refTimer(CORPSE_TIME));
setTimer(RESPAWN_TIME, refTimer(RESPAWN_TIME)); setTimer(RESPAWN_TIME, refTimer(RESPAWN_TIME));
} }
void CGrpFauna::stateChange(CAIState const* oldState, CAIState const* newState) void CGrpFauna::stateChange(CAIState const* oldState, CAIState const* newState)
@ -630,8 +630,8 @@ std::string CGrpFauna::getOneLineInfoString() const
std::vector<std::string> CGrpFauna::getMultiLineInfoString() const std::vector<std::string> CGrpFauna::getMultiLineInfoString() const
{ {
std::vector<std::string> container; std::vector<std::string> container;
pushTitle(container, "CGrpFauna"); pushTitle(container, "CGrpFauna");
pushEntry(container, "id=" + CGroup::getIndexString()); pushEntry(container, "id=" + CGroup::getIndexString());
container.back() += " alias=" + getAliasString(); container.back() += " alias=" + getAliasString();
@ -642,7 +642,7 @@ std::vector<std::string> CGrpFauna::getMultiLineInfoString() const
CPopulation const* pop = *it; CPopulation const* pop = *it;
uint32 index = pop->getChildIndex(); uint32 index = pop->getChildIndex();
pushEntry(container, "- population["+toString(index)+"]: "+((_CurPopulation==index)? "* ACTIVE *": "")); pushEntry(container, "- population["+toString(index)+"]: "+((_CurPopulation==index)? "* ACTIVE *": ""));
for (uint j=0; j<pop->size(); ++j) for (uint j=0; j<pop->size(); ++j)
{ {
CPopulationRecord& popRecord = (*pop)[j]; CPopulationRecord& popRecord = (*pop)[j];
@ -661,8 +661,8 @@ std::vector<std::string> CGrpFauna::getMultiLineInfoString() const
container.push_back(" " + *itString); container.push_back(" " + *itString);
} }
pushFooter(container); pushFooter(container);
return container; return container;
} }
@ -684,26 +684,26 @@ CAliasTreeOwner* CGrpFauna::createChild(IAliasCont* cont, CAIAliasDescriptionNod
{ {
if (!cont) if (!cont)
return NULL; return NULL;
CAliasTreeOwner* child = NULL; CAliasTreeOwner* child = NULL;
switch (aliasTree->getType()) switch (aliasTree->getType())
{ {
// create the child and adds it to the corresponding position. // create the child and adds it to the corresponding position.
case AITypePlaceFauna: case AITypePlaceFauna:
child = new CAIPlaceXYRFauna(this, aliasTree); child = new CAIPlaceXYRFauna(this, aliasTree);
break; break;
case AITypePlace: case AITypePlace:
{ {
std::string const& name = aliasTree->getName(); std::string const& name = aliasTree->getName();
CAIPlaceXYRFauna *faunaPlace = new CAIPlaceXYRFauna(this, aliasTree); CAIPlaceXYRFauna *faunaPlace = new CAIPlaceXYRFauna(this, aliasTree);
child = faunaPlace; child = faunaPlace;
uint placeIndex = faunaPlace->setupFromOldName(name); uint placeIndex = faunaPlace->setupFromOldName(name);
nlassert(placeIndex!=std::numeric_limits<uint>::max()); nlassert(placeIndex!=std::numeric_limits<uint>::max());
if (placeIndex!=std::numeric_limits<uint>::max()) if (placeIndex!=std::numeric_limits<uint>::max())
cont->addAliasChild(child, placeIndex); cont->addAliasChild(child, placeIndex);
return child; return child;
} }
break; break;
@ -711,7 +711,7 @@ CAliasTreeOwner* CGrpFauna::createChild(IAliasCont* cont, CAIAliasDescriptionNod
child = new CPopulation(this, aliasTree); child = new CPopulation(this, aliasTree);
break; break;
} }
if (child) if (child)
cont->addAliasChild(child); cont->addAliasChild(child);
return child; return child;
@ -726,13 +726,13 @@ void CGrpFauna::displayPlaces(CStringWriter& stringWriter) const
} }
CGrpFauna::~CGrpFauna() CGrpFauna::~CGrpFauna()
{ {
if (isSpawned()) // to avoid bad CDbgPtr link interpretation if (isSpawned()) // to avoid bad CDbgPtr link interpretation
{ {
despawnGrp(); despawnGrp();
} }
// unlink all child persistent state instance // unlink all child persistent state instance
while (!_PSIChilds.empty()) while (!_PSIChilds.empty())
{ {
@ -750,12 +750,12 @@ void CGrpFauna::setEvent(uint eventId)
void CGrpFauna::serviceEvent (const CServiceEvent &info) void CGrpFauna::serviceEvent (const CServiceEvent &info)
{ {
CGroup::serviceEvent(info); CGroup::serviceEvent(info);
if ((info.getServiceName() == "EGS") && (info.getEventType() == CServiceEvent::SERVICE_UP)) if ((info.getServiceName() == "EGS") && (info.getEventType() == CServiceEvent::SERVICE_UP))
{ {
processStateEvent(getEventContainer().EventEGSUp); processStateEvent(getEventContainer().EventEGSUp);
} }
} }
NLMISC::CSmartPtr<CSpawnGroup> CGrpFauna::createSpawnGroup() NLMISC::CSmartPtr<CSpawnGroup> CGrpFauna::createSpawnGroup()
@ -767,7 +767,7 @@ bool CGrpFauna::spawn()
{ {
if (!getSpawnCounter().remainToMax()) if (!getSpawnCounter().remainToMax())
return false; return false;
setStartState(getStartState()); // stateInstance. setStartState(getStartState()); // stateInstance.
return spawnPop(std::numeric_limits<uint>::max()); return spawnPop(std::numeric_limits<uint>::max());
} }
@ -778,7 +778,7 @@ bool CGrpFauna::timeAllowSpawn(uint32 popVersion) const
{ {
popVersion = _CurPopulation; popVersion = _CurPopulation;
} }
CPopulation* popPtr = _Populations[popVersion]; CPopulation* popPtr = _Populations[popVersion];
#ifdef NL_DEBUG #ifdef NL_DEBUG
nlassert(popPtr); nlassert(popPtr);
@ -788,7 +788,7 @@ bool CGrpFauna::timeAllowSpawn(uint32 popVersion) const
return false; return false;
} }
TSpawnType st = popPtr->getSpawnType(); TSpawnType st = popPtr->getSpawnType();
bool const& isDay = CTimeInterface::isDay(); bool const& isDay = CTimeInterface::isDay();
return (st==SpawnTypeAlways) || (isDay&&st==SpawnTypeDay) || (!isDay&&st==SpawnTypeNight); return (st==SpawnTypeAlways) || (isDay&&st==SpawnTypeDay) || (!isDay&&st==SpawnTypeNight);
@ -806,7 +806,7 @@ bool CGrpFauna::spawnPop(uint popVersion)
|| !places()[EAT_PLACE]->worldValidPos().isValid() || !places()[EAT_PLACE]->worldValidPos().isValid()
|| !places()[REST_PLACE]->worldValidPos().isValid()) // coz time is not initialized yet .. || !places()[REST_PLACE]->worldValidPos().isValid()) // coz time is not initialized yet ..
return false;*/ return false;*/
// check compatibility. // check compatibility.
/* /*
{ {
@ -829,7 +829,7 @@ bool CGrpFauna::spawnPop(uint popVersion)
checkArcs(*_Places[k]); checkArcs(*_Places[k]);
} }
// check flags .. // check flags ..
for (uint32 i=0;i<places().size();i++) for (uint32 i=0;i<places().size();i++)
{ {
@ -839,48 +839,50 @@ bool CGrpFauna::spawnPop(uint popVersion)
if ((flags&getAStarFlag())!=0) if ((flags&getAStarFlag())!=0)
return false; return false;
} }
// check the validity of the input parameter // check the validity of the input parameter
if (popVersion!=std::numeric_limits<uint>::max() && popVersion>=_Populations.size()) if (popVersion!=std::numeric_limits<uint>::max() && popVersion>=_Populations.size())
{ {
nlwarning("CGrpFauna::spawn(idx) FAILED for group %s because idx (%d) >= _Populations.size() (%d)",this->CGroup::getFullName().c_str(),popVersion,_Populations.size()); nlwarning("CGrpFauna::spawn(idx) FAILED for group %s because idx (%d) >= _Populations.size() (%d)",this->CGroup::getFullName().c_str(),popVersion,_Populations.size());
return false; return false;
} }
popVersion = ~0; popVersion = std::numeric_limits<uint>::max();
// if we are in a cycle. // if we are in a cycle.
if (_CurrentCycle!=~0) if (_CurrentCycle != std::numeric_limits<uint32>::max())
{ {
Cycle const& cycle = _Cycles[_CurrentCycle]; Cycle const& cycle = _Cycles[_CurrentCycle];
// this to avoid bug dues to bad data initialization. // this to avoid bug dues to bad data initialization.
do do
{ {
++_CurrentCycleIndex; ++_CurrentCycleIndex;
} while ( _CurrentCycleIndex<(sint32)cycle._PopList.size() }
while ( _CurrentCycleIndex<(sint32)cycle._PopList.size()
&& !_Populations[cycle._PopList[_CurrentCycleIndex]]); && !_Populations[cycle._PopList[_CurrentCycleIndex]]);
if (_CurrentCycleIndex<(sint32)cycle._PopList.size()) if (_CurrentCycleIndex<(sint32)cycle._PopList.size())
{ {
popVersion=cycle._PopList[_CurrentCycleIndex]; popVersion=cycle._PopList[_CurrentCycleIndex];
if (!timeAllowSpawn(popVersion)) if (!timeAllowSpawn(popVersion))
{ {
popVersion=~0; popVersion = std::numeric_limits<uint>::max();
} }
} }
if (popVersion==~0) if (popVersion == std::numeric_limits<uint>::max())
{ {
_CurrentCycle = ~0; _CurrentCycle = std::numeric_limits<uint32>::max();
} }
} }
// if the population version has not been specified then select one at weighted random with day/night difference. // if the population version has not been specified then select one at weighted random with day/night difference.
if (popVersion==~0) if (popVersion == std::numeric_limits<uint>::max())
{ {
uint32 totalWeight = 0; uint32 totalWeight = 0;
// we can precalculate this, but it won't appears so much to be called. // we can precalculate this, but it won't appears so much to be called.
FOREACH(it, CCont<CPopulation>, _Populations) FOREACH(it, CCont<CPopulation>, _Populations)
{ {
@ -889,10 +891,10 @@ bool CGrpFauna::spawnPop(uint popVersion)
continue; continue;
totalWeight += pop.getWeight(); totalWeight += pop.getWeight();
} }
if (totalWeight==0) if (totalWeight==0)
return false; return false;
{ {
sint32 rnd = CAIS::rand32(totalWeight); sint32 rnd = CAIS::rand32(totalWeight);
FOREACH(it, CCont<CPopulation>, _Populations) FOREACH(it, CCont<CPopulation>, _Populations)
@ -900,62 +902,62 @@ bool CGrpFauna::spawnPop(uint popVersion)
CPopulation const& pop = *(*it); CPopulation const& pop = *(*it);
if (!timeAllowSpawn(pop.getChildIndex())) if (!timeAllowSpawn(pop.getChildIndex()))
continue; continue;
rnd -= pop.getWeight(); rnd -= pop.getWeight();
if (rnd>0) // we found the population to spawn. :) if (rnd>0) // we found the population to spawn. :)
continue; continue;
popVersion=pop.getChildIndex(); popVersion=pop.getChildIndex();
break; break;
} }
} }
#if !FINAL_VERSION #if !FINAL_VERSION
nlassert(popVersion!=~0); nlassert(popVersion != std::numeric_limits<uint>::max());
#endif #endif
if (popVersion==~0) if (popVersion == std::numeric_limits<uint>::max())
return false; return false;
// find if we are starting a new cycle .. // find if we are starting a new cycle ..
for (uint32 i=0;i<_Cycles.size();i++) for (uint32 i=0;i<_Cycles.size();i++)
{ {
nlassert(_Cycles[i]._PopList.size()>0); nlassert(_Cycles[i]._PopList.size()>0);
if (_Cycles[i]._PopList[0]!=popVersion) if (_Cycles[i]._PopList[0]!=popVersion)
continue; continue;
_CurrentCycle = i; _CurrentCycle = i;
_CurrentCycleIndex = 0; _CurrentCycleIndex = 0;
} }
} }
if (popVersion >= _Populations.size()) if (popVersion >= _Populations.size())
{ {
nlwarning("Problem with pop size for group id %s, NAME = %s", this->CGroup::getFullName().c_str(), getName().c_str() ); nlwarning("Problem with pop size for group id %s, NAME = %s", this->CGroup::getFullName().c_str(), getName().c_str() );
return false; return false;
} }
// setup the pointer to the current population // setup the pointer to the current population
_CurPopulation = popVersion; _CurPopulation = popVersion;
// check that we have a defined spawn location // check that we have a defined spawn location
if (!_Places[SPAWN_PLACE]) if (!_Places[SPAWN_PLACE])
{ {
nlwarning("CGrpFauna::spawn(idx) FAILED for group %s because _spawnPlace==NULL",this->CGroup::getFullName().c_str()); nlwarning("CGrpFauna::spawn(idx) FAILED for group %s because _spawnPlace==NULL",this->CGroup::getFullName().c_str());
return false; return false;
} }
// if the group is already spawned despawn it // if the group is already spawned despawn it
if (isSpawned()) if (isSpawned())
{ {
despawnGrp(); despawnGrp();
} }
nlassert(_CurPopulation!=~0); nlassert(_CurPopulation != std::numeric_limits<uint32>::max());
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// Init the group type. // Init the group type.
setType ((*_Populations[_CurPopulation])[0].getCreatureSheet()->FaunaType()); // gets the first population record of the population to spawn. setType ((*_Populations[_CurPopulation])[0].getCreatureSheet()->FaunaType()); // gets the first population record of the population to spawn.
{ {
uint32 botCount=0; uint32 botCount=0;
uint32 i; uint32 i;
@ -966,7 +968,7 @@ bool CGrpFauna::spawnPop(uint popVersion)
if ( curPop[i].getBotCount(getCountMultiplierFlag()) == 0 if ( curPop[i].getBotCount(getCountMultiplierFlag()) == 0
|| curPop[i].getCreatureSheet()->FaunaType() == getType()) || curPop[i].getCreatureSheet()->FaunaType() == getType())
continue; continue;
if (getGroupDesc()) // Dyn system. if (getGroupDesc()) // Dyn system.
{ {
nlwarning("****** WARNING: Different Fauna Type in Template Group %s", getGroupDesc()->getFullName().c_str()); nlwarning("****** WARNING: Different Fauna Type in Template Group %s", getGroupDesc()->getFullName().c_str());
@ -977,36 +979,36 @@ bool CGrpFauna::spawnPop(uint popVersion)
} }
} }
bots().setChildSize(botCount); // set the good size for bots vector. bots().setChildSize(botCount); // set the good size for bots vector.
for (i=0;i<botCount;i++) for (i=0;i<botCount;i++)
_Bots.addChild(new CBotFauna(getType(), this), i); _Bots.addChild(new CBotFauna(getType(), this), i);
} }
return CGroup::spawn(); return CGroup::spawn();
} }
void CGrpFauna::despawnGrp() void CGrpFauna::despawnGrp()
{ {
CGroup::despawnGrp(); CGroup::despawnGrp();
_CurPopulation = ~0u; _CurPopulation = std::numeric_limits<uint32>::max();
} }
// reads cycle from primitive (string representation). // reads cycle from primitive (string representation).
void CGrpFauna::setCyles(std::string const& cycles) void CGrpFauna::setCyles(std::string const& cycles)
{ {
uint32 strIndex = 0; uint32 strIndex = 0;
uint32 curCycle = ~0; uint32 curCycle = std::numeric_limits<uint32>::max();
while (strIndex<cycles.size()) while (strIndex<cycles.size())
{ {
char carac = cycles[++strIndex]; char carac = cycles[++strIndex];
if (carac>='A' && carac<='Z') if (carac>='A' && carac<='Z')
carac += 'a'-'A'; carac += 'a'-'A';
if (carac>='a' && carac<='z') if (carac>='a' && carac<='z')
{ {
if (curCycle==~0) if (curCycle == std::numeric_limits<uint32>::max())
{ {
curCycle = (uint32)_Cycles.size(); curCycle = (uint32)_Cycles.size();
_Cycles.push_back(Cycle()); _Cycles.push_back(Cycle());
@ -1016,22 +1018,22 @@ void CGrpFauna::setCyles(std::string const& cycles)
} }
else else
{ {
curCycle = ~0; curCycle = std::numeric_limits<uint32>::max();
} }
} }
} }
void CGrpFauna::setPopulation(CPopulation* pop) void CGrpFauna::setPopulation(CPopulation* pop)
{ {
CPopulation* sameAliasPop = NULL; CPopulation* sameAliasPop = NULL;
uint32 index = ~0; uint32 index = std::numeric_limits<uint32>::max();
if (pop) if (pop)
sameAliasPop = _Populations.getChildByAlias(pop->getAlias()); sameAliasPop = _Populations.getChildByAlias(pop->getAlias());
if (pop && pop->size()==0) // no population record :( if (pop && pop->size()==0) // no population record :(
pop=NULL; pop=NULL;
if (sameAliasPop) // Alias already present ? if (sameAliasPop) // Alias already present ?
{ {
index = sameAliasPop->getChildIndex(); index = sameAliasPop->getChildIndex();
@ -1041,7 +1043,7 @@ void CGrpFauna::setPopulation(CPopulation* pop)
{ {
_Populations.addChild(pop); // else simply add it to the populations container _Populations.addChild(pop); // else simply add it to the populations container
} }
// if it was the current population, respawn it. (to check with designers?) // if it was the current population, respawn it. (to check with designers?)
if (index==_CurPopulation) if (index==_CurPopulation)
{ {
@ -1057,24 +1059,24 @@ void CGrpFauna::setPopulation(CPopulation* pop)
void CGrpFauna::allocateBots() void CGrpFauna::allocateBots()
{ {
uint maxPopulation = 0; uint maxPopulation = 0;
// work out how much space we need // work out how much space we need
CCont<CPopulation>::iterator it = populations().begin(); CCont<CPopulation>::iterator it = populations().begin();
CCont<CPopulation>::iterator itEnd = populations().end(); CCont<CPopulation>::iterator itEnd = populations().end();
while (it!=itEnd) while (it!=itEnd)
{ {
CPopulation* pop = *(it); CPopulation* pop = *(it);
uint count=0; uint count=0;
for (sint j=(sint)pop->size()-1;j>=0;j--) for (sint j=(sint)pop->size()-1;j>=0;j--)
count+=(*pop)[j].getBotCount(getCountMultiplierFlag()); count+=(*pop)[j].getBotCount(getCountMultiplierFlag());
if (count>maxPopulation) if (count>maxPopulation)
maxPopulation=count; maxPopulation=count;
++it; ++it;
} }
_Bots.setChildSize(maxPopulation); _Bots.setChildSize(maxPopulation);
for (uint32 i=0;i<maxPopulation;i++) for (uint32 i=0;i<maxPopulation;i++)
_Bots.addChild(new CBotFauna(getType(),this),i); _Bots.addChild(new CBotFauna(getType(),this),i);
@ -1085,13 +1087,13 @@ void CGrpFauna::setType(TFaunaType type)
{ {
faction().removeProperties(); faction().removeProperties();
if (type==AITYPES::FaunaTypePredator) if (type==AITYPES::FaunaTypePredator)
faction().addProperty(AITYPES::CPropertyId("Predator")); faction().addProperty(AITYPES::CPropertyId("Predator"));
_Type = type; _Type = type;
} }
CMgrFauna& CGrpFauna::mgr() const CMgrFauna& CGrpFauna::mgr() const
{ {
return *static_cast<CMgrFauna*>(getOwner()); return *static_cast<CMgrFauna*>(getOwner());
} }
CAIS::CCounter& CGrpFauna::getSpawnCounter() CAIS::CCounter& CGrpFauna::getSpawnCounter()
@ -1134,13 +1136,13 @@ sint CGrpFauna::getNextPlace(const CFaunaGenericPlace *startPlace, CAIPlaceXYRFa
} }
} }
else else
{ {
sint minIndex = INT_MAX; sint minIndex = INT_MAX;
sint firstIndex = INT_MAX; sint firstIndex = INT_MAX;
if (startPlace->getReachNext()) if (startPlace->getReachNext())
{ {
for (uint k = 0; k < _Places.size(); ++k) for (uint k = 0; k < _Places.size(); ++k)
{ {
const CFaunaGenericPlace *place = getFaunaGenericPlace(_Places[k]); const CFaunaGenericPlace *place = getFaunaGenericPlace(_Places[k]);
firstIndex = std::min(firstIndex, (sint) place->getIndex()); firstIndex = std::min(firstIndex, (sint) place->getIndex());
if (place->getIndex() < minIndex && place->getIndex() > startPlace->getIndex()) if (place->getIndex() < minIndex && place->getIndex() > startPlace->getIndex())
@ -1165,9 +1167,9 @@ sint CGrpFauna::getNextPlace(const CFaunaGenericPlace *startPlace, CAIPlaceXYRFa
} }
} }
} }
// includes all places reachable from the arcs list // includes all places reachable from the arcs list
for (uint k = 0; k < _Places.size(); ++k) for (uint k = 0; k < _Places.size(); ++k)
{ {
const CFaunaGenericPlace *place = getFaunaGenericPlace(_Places[k]); const CFaunaGenericPlace *place = getFaunaGenericPlace(_Places[k]);
if (place != startPlace && place->getFlag(wantedFlag)) if (place != startPlace && place->getFlag(wantedFlag))
{ {
@ -1192,7 +1194,7 @@ sint CGrpFauna::getNextPlace(const CFaunaGenericPlace *startPlace, CAIPlaceXYRFa
if (!activeCandidates.empty()) if (!activeCandidates.empty())
{ {
return (sint) activeCandidates[rand() % activeCandidates.size()]; return (sint) activeCandidates[rand() % activeCandidates.size()];
} }
// if current place is valid then don't move // if current place is valid then don't move
if (startPlace && startPlace->getActive()) return CAIPlaceXYRFauna::INVALID_PLACE; if (startPlace && startPlace->getActive()) return CAIPlaceXYRFauna::INVALID_PLACE;
// otherwise select a place in unactive places // otherwise select a place in unactive places
@ -1210,7 +1212,7 @@ bool CGrpFauna::checkArcs(const CAIPlace &startPlace) const
if (startPlaceGeneric->getReachNext()) if (startPlaceGeneric->getReachNext())
{ {
for (uint k = 0; k < _Places.size(); ++k) for (uint k = 0; k < _Places.size(); ++k)
{ {
const CFaunaGenericPlace *place = getFaunaGenericPlace(_Places[k]); const CFaunaGenericPlace *place = getFaunaGenericPlace(_Places[k]);
firstIndex = std::min(firstIndex, (sint) place->getIndex()); firstIndex = std::min(firstIndex, (sint) place->getIndex());
if (place->getIndex() < minIndex && place->getIndex() > startPlaceGeneric->getIndex()) if (place->getIndex() < minIndex && place->getIndex() > startPlaceGeneric->getIndex())
@ -1226,22 +1228,22 @@ bool CGrpFauna::checkArcs(const CAIPlace &startPlace) const
{ {
RYAI_MAP_CRUNCH::CCompatibleResult res; RYAI_MAP_CRUNCH::CCompatibleResult res;
areCompatiblesWithoutStartRestriction(startPlace.worldValidPos(), _Places[k]->worldValidPos(), getAStarFlag(), res); areCompatiblesWithoutStartRestriction(startPlace.worldValidPos(), _Places[k]->worldValidPos(), getAStarFlag(), res);
if (!res.isValid()) return false; if (!res.isValid()) return false;
} }
} }
} }
// includes all places reachable from the arcs list // includes all places reachable from the arcs list
for (uint k = 0; k < _Places.size(); ++k) for (uint k = 0; k < _Places.size(); ++k)
{ {
const CFaunaGenericPlace *place = getFaunaGenericPlace(_Places[k]); const CFaunaGenericPlace *place = getFaunaGenericPlace(_Places[k]);
if (place != startPlaceGeneric) if (place != startPlaceGeneric)
{ {
if (std::find(startPlaceGeneric->getArcs().begin(), startPlaceGeneric->getArcs().end(), place->getIndex()) != startPlaceGeneric->getArcs().end()) if (std::find(startPlaceGeneric->getArcs().begin(), startPlaceGeneric->getArcs().end(), place->getIndex()) != startPlaceGeneric->getArcs().end())
{ {
// this place is in current arc list // this place is in current arc list
RYAI_MAP_CRUNCH::CCompatibleResult res; RYAI_MAP_CRUNCH::CCompatibleResult res;
areCompatiblesWithoutStartRestriction(startPlace.worldValidPos(), _Places[k]->worldValidPos(), getAStarFlag(), res); areCompatiblesWithoutStartRestriction(startPlace.worldValidPos(), _Places[k]->worldValidPos(), getAStarFlag(), res);
if (!res.isValid()) return false; if (!res.isValid()) return false;
} }
} }
} }
@ -1249,7 +1251,7 @@ bool CGrpFauna::checkArcs(const CAIPlace &startPlace) const
} }
void CSpawnGroupFauna::setPlace(int placeIndex) void CSpawnGroupFauna::setPlace(int placeIndex)
{ {
const CFaunaGenericPlace *place = getFaunaGenericPlace(getPersistent().places()[placeIndex]); const CFaunaGenericPlace *place = getFaunaGenericPlace(getPersistent().places()[placeIndex]);
//nlwarning("Going to place %s with index %d", getPersistent().places()[placeIndex]->getName().c_str(), place->getIndex()); //nlwarning("Going to place %s with index %d", getPersistent().places()[placeIndex]->getName().c_str(), place->getIndex());
@ -1257,7 +1259,7 @@ void CSpawnGroupFauna::setPlace(int placeIndex)
{ {
nlwarning("Bad place index for fauna group %s", getPersistent().getName().c_str()); nlwarning("Bad place index for fauna group %s", getPersistent().getName().c_str());
} }
// const CFaunaGenericPlace *faunaPlace = getFaunaGenericPlace(getPersistent().places()[placeIndex]); // const CFaunaGenericPlace *faunaPlace = getFaunaGenericPlace(getPersistent().places()[placeIndex]);
// nlwarning("Group %s : Chosing place %s (%d) with graph index %d", getPersistent().getName().c_str(), faunaPlace->getName().c_str(), placeIndex, (int) faunaPlace->getIndex()); // nlwarning("Group %s : Chosing place %s (%d) with graph index %d", getPersistent().getName().c_str(), faunaPlace->getName().c_str(), placeIndex, (int) faunaPlace->getIndex());

@ -412,7 +412,7 @@ CAIEntity* CAIInstance::tryToGetEntity(char const* str, CAIS::TSearchType search
CManager *mgrPtr=NULL; CManager *mgrPtr=NULL;
CGroup *grpPtr=NULL; CGroup *grpPtr=NULL;
CBot *botPtr=NULL; CBot *botPtr=NULL;
uint32 localIndex=~0; uint32 localIndex = std::numeric_limits<uint32>::max();
mgr = id; mgr = id;
while((*id!=':')&&(*id!=0)) id++; while((*id!=':')&&(*id!=0)) id++;
@ -635,7 +635,7 @@ static CAIVector randomPos(double dispersionRadius)
{ {
return CAIVector(0., 0.); return CAIVector(0., 0.);
} }
uint32 const maxLimit=((uint32)~0U)>>1; const uint32 maxLimit = std::numeric_limits<uint32>::max() >>1;
double rval = (double)CAIS::rand32(maxLimit)/(double)maxLimit; // [0-1[ double rval = (double)CAIS::rand32(maxLimit)/(double)maxLimit; // [0-1[
double r = dispersionRadius*sqrt(rval); double r = dispersionRadius*sqrt(rval);
rval = (double)CAIS::rand32(maxLimit)/(double)maxLimit; // [0-1[ rval = (double)CAIS::rand32(maxLimit)/(double)maxLimit; // [0-1[
@ -896,7 +896,7 @@ void cbEventNpcGroupScript( NLNET::CMessage& msgin, const std::string &serviceNa
msgin.serial(messageVersion); msgin.serial(messageVersion);
nlassert(messageVersion==1); nlassert(messageVersion==1);
msgin.serial(nbString); msgin.serial(nbString);
string eid; string eid;
string firstCommand; string firstCommand;
msgin.serial(eid); // Player or boteid msgin.serial(eid); // Player or boteid

Loading…
Cancel
Save