2015-11-11 04:32:42 -05:00
// PieceStructuresGen.cpp
// Declares the cPieceStructuresGen class representing the PieceStructures finisher generator
# include "Globals.h"
# include "PieceStructuresGen.h"
# include "PrefabStructure.h"
# include "IniFile.h"
# include "../Stopwatch.h"
cPieceStructuresGen : : cPieceStructuresGen ( int a_Seed ) :
m_Seed ( a_Seed )
{
}
bool cPieceStructuresGen : : Initialize ( const AString & a_Prefabs , int a_SeaLevel , cBiomeGenPtr a_BiomeGen , cTerrainHeightGenPtr a_HeightGen )
{
// Load each piecepool:
auto structures = StringSplitAndTrim ( a_Prefabs , " | " ) ;
for ( const auto & s : structures )
{
auto fileName = Printf ( " Prefabs%cPieceStructures%c%s.cubeset " , cFile : : PathSeparator , cFile : : PathSeparator , s . c_str ( ) ) ;
if ( ! cFile : : IsFile ( fileName ) )
{
fileName . append ( " .gz " ) ;
if ( ! cFile : : IsFile ( fileName ) )
{
LOGWARNING ( " Cannot load PieceStructures cubeset file %s " , fileName . c_str ( ) ) ;
continue ;
}
}
auto gen = std : : make_shared < cGen > ( m_Seed , a_BiomeGen , a_HeightGen , a_SeaLevel , s ) ;
if ( gen - > LoadFromFile ( fileName ) )
{
m_Gens . push_back ( gen ) ;
}
}
// Report a warning if no generators available:
if ( m_Gens . empty ( ) )
{
2015-12-15 12:04:40 -05:00
LOGWARNING ( " The PieceStructures generator was asked to generate \" %s \" , but none of the prefabs are valid. " , a_Prefabs . c_str ( ) ) ;
2015-11-11 04:32:42 -05:00
return false ;
}
return true ;
}
void cPieceStructuresGen : : GenFinish ( cChunkDesc & a_Chunk )
{
for ( auto & gen : m_Gens )
{
gen - > GenFinish ( a_Chunk ) ;
}
}
////////////////////////////////////////////////////////////////////////////////
// cPieceStructuresGen::cGen:
cPieceStructuresGen : : cGen : : cGen ( int a_Seed , cBiomeGenPtr a_BiomeGen , cTerrainHeightGenPtr a_HeightGen , int a_SeaLevel , const AString & a_Name ) :
Super ( a_Seed ) ,
m_BiomeGen ( a_BiomeGen ) ,
m_HeightGen ( a_HeightGen ) ,
m_SeaLevel ( a_SeaLevel ) ,
m_Name ( a_Name ) ,
m_MaxDepth ( 5 )
{
}
bool cPieceStructuresGen : : cGen : : LoadFromFile ( const AString & a_FileName )
{
// Load the piecepool from the file, log any warnings:
if ( ! m_Pool . LoadFromFile ( a_FileName , true ) )
{
return false ;
}
if ( NoCaseCompare ( m_Pool . GetIntendedUse ( ) , " PieceStructures " ) ! = 0 )
{
LOGWARNING ( " PieceStructures generator: File %s is intended for use in \" %s \" , rather than piece structures. Loading the file, but the generator may behave unexpectedly. " ,
a_FileName . c_str ( ) , m_Pool . GetIntendedUse ( ) . c_str ( )
) ;
}
m_Pool . AssignGens ( m_Seed , m_BiomeGen , m_HeightGen , m_SeaLevel ) ;
// Apply generator params from the piecepool (in the metadata) into the generator:
auto & generatorParams = m_Pool . GetAllMetadata ( ) ;
SetGeneratorParams ( generatorParams ) ;
m_MaxDepth = GetStringMapInteger < int > ( generatorParams , " MaxDepth " , m_MaxDepth ) ;
return true ;
}
cGridStructGen : : cStructurePtr cPieceStructuresGen : : cGen : : CreateStructure ( int a_GridX , int a_GridZ , int a_OriginX , int a_OriginZ )
{
cStopwatch sw ( Printf ( " CreateStructure for %s at <%d, %d> " , m_Name . c_str ( ) , a_GridX , a_GridZ ) ) ;
cBFSPieceGenerator pg ( m_Pool , m_Seed ) ;
cPlacedPieces outPieces ;
pg . PlacePieces ( a_OriginX , a_OriginZ , m_MaxDepth , outPieces ) ;
return std : : make_shared < cPrefabStructure > ( a_GridX , a_GridZ , a_OriginX , a_OriginZ , outPieces , m_HeightGen ) ;
}