Merge branch 'NetherFortGen'.
This commit is contained in:
commit
1bda9b0424
@ -258,12 +258,11 @@ g_APIDesc =
|
|||||||
</ol>
|
</ol>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<h3>Special strategies</h3>
|
||||||
Special strategies:
|
<p>For each strategy, evaluate the table rows from top downwards, the first match wins.</p>
|
||||||
</p>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<strong>msLake</strong> (evaluate top-down, first match wins):
|
<strong>msLake</strong> - used for merging areas with lava and water lakes, in the appropriate generator.
|
||||||
</p>
|
</p>
|
||||||
<table><tbody><tr>
|
<table><tbody><tr>
|
||||||
<th colspan="2"> area block </th><th> </th><th> Notes </th>
|
<th colspan="2"> area block </th><th> </th><th> Notes </th>
|
||||||
@ -293,6 +292,23 @@ g_APIDesc =
|
|||||||
<td> A </td><td> * </td><td> A </td><td> Everything else is left as it is </td>
|
<td> A </td><td> * </td><td> A </td><td> Everything else is left as it is </td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody></table>
|
</tbody></table>
|
||||||
|
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<strong>msSpongePrint</strong> - used for most prefab-generators to merge the prefabs. Similar to
|
||||||
|
msImprint, but uses the sponge block as the NOP block instead, so that the prefabs may carve out air
|
||||||
|
pockets, too.
|
||||||
|
</p>
|
||||||
|
<table><tbody><tr>
|
||||||
|
<th colspan="2"> area block </th><th> </th><th> Notes </th>
|
||||||
|
</tr><tr>
|
||||||
|
<th> this </th><th> Src </th><th> result </th><th> </th>
|
||||||
|
</tr><tr>
|
||||||
|
<td> A </td><td> sponge </td><td> A </td><td> Sponge is the NOP block </td>
|
||||||
|
</tr><tr>
|
||||||
|
<td> * </td><td> B </td><td> B </td><td> Everything else overwrites anything </td>
|
||||||
|
</tr>
|
||||||
|
</tbody></table>
|
||||||
]],
|
]],
|
||||||
}, -- Merge strategies
|
}, -- Merge strategies
|
||||||
}, -- AdditionalInfo
|
}, -- AdditionalInfo
|
||||||
|
@ -54,7 +54,7 @@ template<typename Combinator> void InternalMergeBlocks(
|
|||||||
|
|
||||||
|
|
||||||
/// Combinator used for cBlockArea::msOverwrite merging
|
/// Combinator used for cBlockArea::msOverwrite merging
|
||||||
static void MergeCombinatorOverwrite(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
static inline void MergeCombinatorOverwrite(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
||||||
{
|
{
|
||||||
a_DstType = a_SrcType;
|
a_DstType = a_SrcType;
|
||||||
a_DstMeta = a_SrcMeta;
|
a_DstMeta = a_SrcMeta;
|
||||||
@ -65,7 +65,7 @@ static void MergeCombinatorOverwrite(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType,
|
|||||||
|
|
||||||
|
|
||||||
/// Combinator used for cBlockArea::msFillAir merging
|
/// Combinator used for cBlockArea::msFillAir merging
|
||||||
static void MergeCombinatorFillAir(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
static inline void MergeCombinatorFillAir(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
||||||
{
|
{
|
||||||
if (a_DstType == E_BLOCK_AIR)
|
if (a_DstType == E_BLOCK_AIR)
|
||||||
{
|
{
|
||||||
@ -80,7 +80,7 @@ static void MergeCombinatorFillAir(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, N
|
|||||||
|
|
||||||
|
|
||||||
/// Combinator used for cBlockArea::msImprint merging
|
/// Combinator used for cBlockArea::msImprint merging
|
||||||
static void MergeCombinatorImprint(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
static inline void MergeCombinatorImprint(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
||||||
{
|
{
|
||||||
if (a_SrcType != E_BLOCK_AIR)
|
if (a_SrcType != E_BLOCK_AIR)
|
||||||
{
|
{
|
||||||
@ -95,7 +95,7 @@ static void MergeCombinatorImprint(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, N
|
|||||||
|
|
||||||
|
|
||||||
/// Combinator used for cBlockArea::msLake merging
|
/// Combinator used for cBlockArea::msLake merging
|
||||||
static void MergeCombinatorLake(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
static inline void MergeCombinatorLake(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
||||||
{
|
{
|
||||||
// Sponge is the NOP block
|
// Sponge is the NOP block
|
||||||
if (a_SrcType == E_BLOCK_SPONGE)
|
if (a_SrcType == E_BLOCK_SPONGE)
|
||||||
@ -158,6 +158,21 @@ static void MergeCombinatorLake(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBB
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** Combinator used for cBlockArea::msSpongePrint merging */
|
||||||
|
static inline void MergeCombinatorSpongePrint(BLOCKTYPE & a_DstType, BLOCKTYPE a_SrcType, NIBBLETYPE & a_DstMeta, NIBBLETYPE a_SrcMeta)
|
||||||
|
{
|
||||||
|
// Sponge overwrites nothing, everything else overwrites anything
|
||||||
|
if (a_SrcType != E_BLOCK_SPONGE)
|
||||||
|
{
|
||||||
|
a_DstType = a_SrcType;
|
||||||
|
a_DstMeta = a_SrcMeta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// cBlockArea:
|
// cBlockArea:
|
||||||
|
|
||||||
@ -680,6 +695,21 @@ void cBlockArea::Merge(const cBlockArea & a_Src, int a_RelX, int a_RelY, int a_R
|
|||||||
break;
|
break;
|
||||||
} // case msLake
|
} // case msLake
|
||||||
|
|
||||||
|
case msSpongePrint:
|
||||||
|
{
|
||||||
|
InternalMergeBlocks(
|
||||||
|
m_BlockTypes, a_Src.GetBlockTypes(),
|
||||||
|
DstMetas, SrcMetas,
|
||||||
|
SizeX, SizeY, SizeZ,
|
||||||
|
SrcOffX, SrcOffY, SrcOffZ,
|
||||||
|
DstOffX, DstOffY, DstOffZ,
|
||||||
|
a_Src.GetSizeX(), a_Src.GetSizeY(), a_Src.GetSizeZ(),
|
||||||
|
m_Size.x, m_Size.y, m_Size.z,
|
||||||
|
MergeCombinatorSpongePrint
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
} // case msSpongePrint
|
||||||
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
LOGWARNING("Unknown block area merge strategy: %d", a_Strategy);
|
LOGWARNING("Unknown block area merge strategy: %d", a_Strategy);
|
||||||
|
@ -51,6 +51,7 @@ public:
|
|||||||
msFillAir,
|
msFillAir,
|
||||||
msImprint,
|
msImprint,
|
||||||
msLake,
|
msLake,
|
||||||
|
msSpongePrint,
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
cBlockArea(void);
|
cBlockArea(void);
|
||||||
@ -127,8 +128,8 @@ public:
|
|||||||
- msFillAir overwrites only those blocks that were air
|
- msFillAir overwrites only those blocks that were air
|
||||||
- msImprint overwrites with only those blocks that are non-air
|
- msImprint overwrites with only those blocks that are non-air
|
||||||
|
|
||||||
Special strategies:
|
Special strategies (evaluate top-down, first match wins):
|
||||||
msLake (evaluate top-down, first match wins):
|
msLake:
|
||||||
| area block | |
|
| area block | |
|
||||||
| this | Src | result |
|
| this | Src | result |
|
||||||
+----------+--------+--------+
|
+----------+--------+--------+
|
||||||
@ -143,6 +144,14 @@ public:
|
|||||||
| mycelium | stone | stone | ... and mycelium
|
| mycelium | stone | stone | ... and mycelium
|
||||||
| A | stone | A | ... but nothing else
|
| A | stone | A | ... but nothing else
|
||||||
| A | * | A | Everything else is left as it is
|
| A | * | A | Everything else is left as it is
|
||||||
|
|
||||||
|
msSpongePrint:
|
||||||
|
Used for most generators, it allows carving out air pockets, too, and uses the Sponge as the NOP block
|
||||||
|
| area block | |
|
||||||
|
| this | Src | result |
|
||||||
|
+----------+--------+--------+
|
||||||
|
| A | sponge | A | Sponge is the NOP block
|
||||||
|
| * | B | B | Everything else overwrites anything
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void Merge(const cBlockArea & a_Src, int a_RelX, int a_RelY, int a_RelZ, eMergeStrategy a_Strategy);
|
void Merge(const cBlockArea & a_Src, int a_RelX, int a_RelY, int a_RelZ, eMergeStrategy a_Strategy);
|
||||||
|
@ -6,14 +6,14 @@ include_directories (SYSTEM "${PROJECT_SOURCE_DIR}/../lib/jsoncpp/include")
|
|||||||
include_directories (SYSTEM "${PROJECT_SOURCE_DIR}/../lib/polarssl/include")
|
include_directories (SYSTEM "${PROJECT_SOURCE_DIR}/../lib/polarssl/include")
|
||||||
|
|
||||||
set(FOLDERS OSSupport HTTPServer Items Blocks Protocol Generating)
|
set(FOLDERS OSSupport HTTPServer Items Blocks Protocol Generating)
|
||||||
set(FOLDERS ${FOLDERS} WorldStorage Mobs Entities Simulator UI BlockEntities)
|
set(FOLDERS ${FOLDERS} WorldStorage Mobs Entities Simulator UI BlockEntities Generating/Prefabs)
|
||||||
|
|
||||||
|
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
|
|
||||||
#Bindings needs to reference other folders so are done here
|
# Bindings need to reference other folders, so they are done here instead
|
||||||
|
|
||||||
#lib dependecies are not included
|
# lib dependencies are not included
|
||||||
|
|
||||||
set(BINDING_DEPENDECIES
|
set(BINDING_DEPENDECIES
|
||||||
tolua
|
tolua
|
||||||
@ -104,7 +104,6 @@ if (NOT MSVC)
|
|||||||
Bindings/PluginLua
|
Bindings/PluginLua
|
||||||
Bindings/PluginManager
|
Bindings/PluginManager
|
||||||
Bindings/WebPlugin
|
Bindings/WebPlugin
|
||||||
Bindings/WebPlugin
|
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(Bindings lua sqlite tolualib)
|
target_link_libraries(Bindings lua sqlite tolualib)
|
||||||
@ -138,6 +137,7 @@ if (NOT MSVC)
|
|||||||
|
|
||||||
|
|
||||||
else ()
|
else ()
|
||||||
|
# MSVC-specific handling: Put all files into one project, separate by the folders:
|
||||||
|
|
||||||
# Generate the Bindings if they don't exist:
|
# Generate the Bindings if they don't exist:
|
||||||
if (NOT EXISTS "${PROJECT_SOURCE_DIR}/Bindings/Bindings.cpp")
|
if (NOT EXISTS "${PROJECT_SOURCE_DIR}/Bindings/Bindings.cpp")
|
||||||
@ -149,6 +149,14 @@ else ()
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Get all files in this folder:
|
||||||
|
file(GLOB_RECURSE SOURCE
|
||||||
|
"*.cpp"
|
||||||
|
"*.h"
|
||||||
|
"*.pkg"
|
||||||
|
)
|
||||||
|
source_group("" FILES ${SOURCE})
|
||||||
|
|
||||||
# Add all subfolders as solution-folders:
|
# Add all subfolders as solution-folders:
|
||||||
list(APPEND FOLDERS "Resources")
|
list(APPEND FOLDERS "Resources")
|
||||||
list(APPEND FOLDERS "Bindings")
|
list(APPEND FOLDERS "Bindings")
|
||||||
@ -159,23 +167,16 @@ else ()
|
|||||||
"${PATH}/*.rc"
|
"${PATH}/*.rc"
|
||||||
"${PATH}/*.pkg"
|
"${PATH}/*.pkg"
|
||||||
)
|
)
|
||||||
source_group("${PATH}" FILES ${FOLDER_FILES})
|
string(REPLACE "/" "\\" PROJECT_PATH ${PATH})
|
||||||
|
source_group("${PROJECT_PATH}" FILES ${FOLDER_FILES})
|
||||||
endfunction(includefolder)
|
endfunction(includefolder)
|
||||||
|
|
||||||
foreach(folder ${FOLDERS})
|
foreach(folder ${FOLDERS})
|
||||||
includefolder(${folder})
|
includefolder(${folder})
|
||||||
endforeach(folder)
|
endforeach(folder)
|
||||||
|
|
||||||
file(GLOB_RECURSE SOURCE
|
|
||||||
"*.cpp"
|
|
||||||
"*.h"
|
|
||||||
"*.pkg"
|
|
||||||
)
|
|
||||||
|
|
||||||
include_directories("${PROJECT_SOURCE_DIR}")
|
include_directories("${PROJECT_SOURCE_DIR}")
|
||||||
|
|
||||||
source_group("" FILES ${SOURCE})
|
|
||||||
|
|
||||||
# Precompiled headers (1st part)
|
# Precompiled headers (1st part)
|
||||||
SET_SOURCE_FILES_PROPERTIES(
|
SET_SOURCE_FILES_PROPERTIES(
|
||||||
Globals.cpp PROPERTIES COMPILE_FLAGS "/Yc\"Globals.h\""
|
Globals.cpp PROPERTIES COMPILE_FLAGS "/Yc\"Globals.h\""
|
||||||
@ -231,7 +232,7 @@ endif ()
|
|||||||
|
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
target_link_libraries(${EXECUTABLE} OSSupport HTTPServer Bindings Items Blocks)
|
target_link_libraries(${EXECUTABLE} OSSupport HTTPServer Bindings Items Blocks)
|
||||||
target_link_libraries(${EXECUTABLE} Protocol Generating WorldStorage)
|
target_link_libraries(${EXECUTABLE} Protocol Generating Generating_Prefabs WorldStorage)
|
||||||
target_link_libraries(${EXECUTABLE} Mobs Entities Simulator UI BlockEntities)
|
target_link_libraries(${EXECUTABLE} Mobs Entities Simulator UI BlockEntities)
|
||||||
endif ()
|
endif ()
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "DistortedHeightmap.h"
|
#include "DistortedHeightmap.h"
|
||||||
#include "EndGen.h"
|
#include "EndGen.h"
|
||||||
#include "MineShafts.h"
|
#include "MineShafts.h"
|
||||||
|
#include "NetherFortGen.h"
|
||||||
#include "Noise3DGenerator.h"
|
#include "Noise3DGenerator.h"
|
||||||
#include "POCPieceGenerator.h"
|
#include "POCPieceGenerator.h"
|
||||||
#include "Ravines.h"
|
#include "Ravines.h"
|
||||||
@ -191,9 +192,11 @@ void cComposableGenerator::DoGenerate(int a_ChunkX, int a_ChunkZ, cChunkDesc & a
|
|||||||
m_HeightGen->GenHeightMap(a_ChunkX, a_ChunkZ, a_ChunkDesc.GetHeightMap());
|
m_HeightGen->GenHeightMap(a_ChunkX, a_ChunkZ, a_ChunkDesc.GetHeightMap());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ShouldUpdateHeightmap = false;
|
||||||
if (a_ChunkDesc.IsUsingDefaultComposition())
|
if (a_ChunkDesc.IsUsingDefaultComposition())
|
||||||
{
|
{
|
||||||
m_CompositionGen->ComposeTerrain(a_ChunkDesc);
|
m_CompositionGen->ComposeTerrain(a_ChunkDesc);
|
||||||
|
ShouldUpdateHeightmap = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a_ChunkDesc.IsUsingDefaultFinish())
|
if (a_ChunkDesc.IsUsingDefaultFinish())
|
||||||
@ -202,6 +205,12 @@ void cComposableGenerator::DoGenerate(int a_ChunkX, int a_ChunkZ, cChunkDesc & a
|
|||||||
{
|
{
|
||||||
(*itr)->GenFinish(a_ChunkDesc);
|
(*itr)->GenFinish(a_ChunkDesc);
|
||||||
} // for itr - m_FinishGens[]
|
} // for itr - m_FinishGens[]
|
||||||
|
ShouldUpdateHeightmap = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ShouldUpdateHeightmap)
|
||||||
|
{
|
||||||
|
a_ChunkDesc.UpdateHeightmap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,7 +358,7 @@ void cComposableGenerator::InitFinishGens(cIniFile & a_IniFile)
|
|||||||
int ChanceCrossing = a_IniFile.GetValueSetI("Generator", "MineShaftsChanceCrossing", 200);
|
int ChanceCrossing = a_IniFile.GetValueSetI("Generator", "MineShaftsChanceCrossing", 200);
|
||||||
int ChanceStaircase = a_IniFile.GetValueSetI("Generator", "MineShaftsChanceStaircase", 200);
|
int ChanceStaircase = a_IniFile.GetValueSetI("Generator", "MineShaftsChanceStaircase", 200);
|
||||||
m_FinishGens.push_back(new cStructGenMineShafts(
|
m_FinishGens.push_back(new cStructGenMineShafts(
|
||||||
Seed, GridSize, MaxSystemSize,
|
Seed, GridSize, MaxSystemSize,
|
||||||
ChanceCorridor, ChanceCrossing, ChanceStaircase
|
ChanceCorridor, ChanceCrossing, ChanceStaircase
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@ -361,6 +370,12 @@ void cComposableGenerator::InitFinishGens(cIniFile & a_IniFile)
|
|||||||
{
|
{
|
||||||
m_FinishGens.push_back(new cFinishGenNetherClumpFoliage(Seed));
|
m_FinishGens.push_back(new cFinishGenNetherClumpFoliage(Seed));
|
||||||
}
|
}
|
||||||
|
else if (NoCaseCompare(*itr, "NetherForts") == 0)
|
||||||
|
{
|
||||||
|
int GridSize = a_IniFile.GetValueSetI("Generator", "NetherFortsGridSize", 512);
|
||||||
|
int MaxDepth = a_IniFile.GetValueSetI("Generator", "NetherFortsMaxDepth", 12);
|
||||||
|
m_FinishGens.push_back(new cNetherFortGen(Seed, GridSize, MaxDepth));
|
||||||
|
}
|
||||||
else if (NoCaseCompare(*itr, "OreNests") == 0)
|
else if (NoCaseCompare(*itr, "OreNests") == 0)
|
||||||
{
|
{
|
||||||
m_FinishGens.push_back(new cStructGenOreNests(Seed));
|
m_FinishGens.push_back(new cStructGenOreNests(Seed));
|
||||||
|
@ -1340,7 +1340,7 @@ void cStructGenMineShafts::GetMineShaftSystemsForChunk(
|
|||||||
BaseX -= NEIGHBORHOOD_SIZE / 2;
|
BaseX -= NEIGHBORHOOD_SIZE / 2;
|
||||||
BaseZ -= NEIGHBORHOOD_SIZE / 2;
|
BaseZ -= NEIGHBORHOOD_SIZE / 2;
|
||||||
|
|
||||||
// Walk the cache, move each cave system that we want into a_Caves:
|
// Walk the cache, move each cave system that we want into a_Mineshafts:
|
||||||
int StartX = BaseX * m_GridSize;
|
int StartX = BaseX * m_GridSize;
|
||||||
int EndX = (BaseX + NEIGHBORHOOD_SIZE + 1) * m_GridSize;
|
int EndX = (BaseX + NEIGHBORHOOD_SIZE + 1) * m_GridSize;
|
||||||
int StartZ = BaseZ * m_GridSize;
|
int StartZ = BaseZ * m_GridSize;
|
||||||
|
275
src/Generating/NetherFortGen.cpp
Normal file
275
src/Generating/NetherFortGen.cpp
Normal file
@ -0,0 +1,275 @@
|
|||||||
|
|
||||||
|
// NetherFortGen.cpp
|
||||||
|
|
||||||
|
// Implements the cNetherFortGen class representing the nether fortress generator
|
||||||
|
|
||||||
|
#include "Globals.h"
|
||||||
|
#include "NetherFortGen.h"
|
||||||
|
#include "Prefabs/NetherFortPrefabs.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static const int NEIGHBORHOOD_SIZE = 3;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// cNetherFortGen::cNetherFort:
|
||||||
|
|
||||||
|
class cNetherFortGen::cNetherFort
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cNetherFortGen & m_ParentGen;
|
||||||
|
int m_BlockX, m_BlockZ;
|
||||||
|
int m_GridSize;
|
||||||
|
int m_Seed;
|
||||||
|
cPlacedPieces m_Pieces;
|
||||||
|
|
||||||
|
|
||||||
|
cNetherFort(cNetherFortGen & a_ParentGen, int a_BlockX, int a_BlockZ, int a_GridSize, int a_MaxDepth, int a_Seed) :
|
||||||
|
m_ParentGen(a_ParentGen),
|
||||||
|
m_BlockX(a_BlockX),
|
||||||
|
m_BlockZ(a_BlockZ),
|
||||||
|
m_GridSize(a_GridSize),
|
||||||
|
m_Seed(a_Seed)
|
||||||
|
{
|
||||||
|
// TODO: Proper Y-coord placement
|
||||||
|
int BlockY = 64;
|
||||||
|
|
||||||
|
// Generate pieces:
|
||||||
|
for (int i = 0; m_Pieces.size() < (size_t)(a_MaxDepth * a_MaxDepth / 8 + a_MaxDepth); i++)
|
||||||
|
{
|
||||||
|
cBFSPieceGenerator pg(m_ParentGen, a_Seed + i);
|
||||||
|
pg.PlacePieces(a_BlockX, BlockY, a_BlockZ, a_MaxDepth, m_Pieces);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
~cNetherFort()
|
||||||
|
{
|
||||||
|
cPieceGenerator::FreePieces(m_Pieces);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Carves the system into the chunk data */
|
||||||
|
void ProcessChunk(cChunkDesc & a_Chunk)
|
||||||
|
{
|
||||||
|
for (cPlacedPieces::const_iterator itr = m_Pieces.begin(), end = m_Pieces.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
const cPrefab & Prefab = (const cPrefab &)((*itr)->GetPiece());
|
||||||
|
Prefab.Draw(a_Chunk, *itr);
|
||||||
|
} // for itr - m_PlacedPieces[]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// cNetherFortGen:
|
||||||
|
|
||||||
|
cNetherFortGen::cNetherFortGen(int a_Seed, int a_GridSize, int a_MaxDepth) :
|
||||||
|
m_Seed(a_Seed),
|
||||||
|
m_Noise(a_Seed),
|
||||||
|
m_GridSize(a_GridSize),
|
||||||
|
m_MaxDepth(a_MaxDepth)
|
||||||
|
{
|
||||||
|
// Initialize the prefabs:
|
||||||
|
for (size_t i = 0; i < g_NetherFortPrefabs1Count; i++)
|
||||||
|
{
|
||||||
|
cPrefab * Prefab = new cPrefab(g_NetherFortPrefabs1[i]);
|
||||||
|
m_AllPieces.push_back(Prefab);
|
||||||
|
if (Prefab->HasConnectorType(0))
|
||||||
|
{
|
||||||
|
m_OuterPieces.push_back(Prefab);
|
||||||
|
}
|
||||||
|
if (Prefab->HasConnectorType(1))
|
||||||
|
{
|
||||||
|
m_InnerPieces.push_back(Prefab);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the starting piece prefabs:
|
||||||
|
for (size_t i = 0; i < g_NetherFortStartingPrefabs1Count; i++)
|
||||||
|
{
|
||||||
|
m_StartingPieces.push_back(new cPrefab(g_NetherFortStartingPrefabs1[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// DEBUG: Try one round of placement:
|
||||||
|
cPlacedPieces Pieces;
|
||||||
|
cBFSPieceGenerator pg(*this, a_Seed);
|
||||||
|
pg.PlacePieces(0, 64, 0, a_MaxDepth, Pieces);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cNetherFortGen::~cNetherFortGen()
|
||||||
|
{
|
||||||
|
ClearCache();
|
||||||
|
for (cPieces::iterator itr = m_AllPieces.begin(), end = m_AllPieces.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
delete *itr;
|
||||||
|
} // for itr - m_AllPieces[]
|
||||||
|
m_AllPieces.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cNetherFortGen::ClearCache(void)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cNetherFortGen::GetFortsForChunk(int a_ChunkX, int a_ChunkZ, cNetherForts & a_Forts)
|
||||||
|
{
|
||||||
|
int BaseX = a_ChunkX * cChunkDef::Width / m_GridSize;
|
||||||
|
int BaseZ = a_ChunkZ * cChunkDef::Width / m_GridSize;
|
||||||
|
if (BaseX < 0)
|
||||||
|
{
|
||||||
|
--BaseX;
|
||||||
|
}
|
||||||
|
if (BaseZ < 0)
|
||||||
|
{
|
||||||
|
--BaseZ;
|
||||||
|
}
|
||||||
|
BaseX -= NEIGHBORHOOD_SIZE / 2;
|
||||||
|
BaseZ -= NEIGHBORHOOD_SIZE / 2;
|
||||||
|
|
||||||
|
// Walk the cache, move each cave system that we want into a_Forts:
|
||||||
|
int StartX = BaseX * m_GridSize;
|
||||||
|
int EndX = (BaseX + NEIGHBORHOOD_SIZE + 1) * m_GridSize;
|
||||||
|
int StartZ = BaseZ * m_GridSize;
|
||||||
|
int EndZ = (BaseZ + NEIGHBORHOOD_SIZE + 1) * m_GridSize;
|
||||||
|
for (cNetherForts::iterator itr = m_Cache.begin(), end = m_Cache.end(); itr != end;)
|
||||||
|
{
|
||||||
|
if (
|
||||||
|
((*itr)->m_BlockX >= StartX) && ((*itr)->m_BlockX < EndX) &&
|
||||||
|
((*itr)->m_BlockZ >= StartZ) && ((*itr)->m_BlockZ < EndZ)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// want
|
||||||
|
a_Forts.push_back(*itr);
|
||||||
|
itr = m_Cache.erase(itr);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// don't want
|
||||||
|
++itr;
|
||||||
|
}
|
||||||
|
} // for itr - m_Cache[]
|
||||||
|
|
||||||
|
// Create those forts that haven't been in the cache:
|
||||||
|
for (int x = 0; x < NEIGHBORHOOD_SIZE; x++)
|
||||||
|
{
|
||||||
|
int RealX = (BaseX + x) * m_GridSize;
|
||||||
|
for (int z = 0; z < NEIGHBORHOOD_SIZE; z++)
|
||||||
|
{
|
||||||
|
int RealZ = (BaseZ + z) * m_GridSize;
|
||||||
|
bool Found = false;
|
||||||
|
for (cNetherForts::const_iterator itr = a_Forts.begin(), end = a_Forts.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
if (((*itr)->m_BlockX == RealX) && ((*itr)->m_BlockZ == RealZ))
|
||||||
|
{
|
||||||
|
Found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} // for itr - a_Mineshafts
|
||||||
|
if (!Found)
|
||||||
|
{
|
||||||
|
a_Forts.push_back(new cNetherFort(*this, RealX, RealZ, m_GridSize, m_MaxDepth, m_Seed));
|
||||||
|
}
|
||||||
|
} // for z
|
||||||
|
} // for x
|
||||||
|
|
||||||
|
// Copy a_Forts into m_Cache to the beginning:
|
||||||
|
cNetherForts FortsCopy (a_Forts);
|
||||||
|
m_Cache.splice(m_Cache.begin(), FortsCopy, FortsCopy.begin(), FortsCopy.end());
|
||||||
|
|
||||||
|
// Trim the cache if it's too long:
|
||||||
|
if (m_Cache.size() > 100)
|
||||||
|
{
|
||||||
|
cNetherForts::iterator itr = m_Cache.begin();
|
||||||
|
std::advance(itr, 100);
|
||||||
|
for (cNetherForts::iterator end = m_Cache.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
delete *itr;
|
||||||
|
}
|
||||||
|
itr = m_Cache.begin();
|
||||||
|
std::advance(itr, 100);
|
||||||
|
m_Cache.erase(itr, m_Cache.end());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cNetherFortGen::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||||
|
{
|
||||||
|
int ChunkX = a_ChunkDesc.GetChunkX();
|
||||||
|
int ChunkZ = a_ChunkDesc.GetChunkZ();
|
||||||
|
cNetherForts Forts;
|
||||||
|
GetFortsForChunk(ChunkX, ChunkZ, Forts);
|
||||||
|
for (cNetherForts::const_iterator itr = Forts.begin(); itr != Forts.end(); ++itr)
|
||||||
|
{
|
||||||
|
(*itr)->ProcessChunk(a_ChunkDesc);
|
||||||
|
} // for itr - Forts[]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cPieces cNetherFortGen::GetPiecesWithConnector(int a_ConnectorType)
|
||||||
|
{
|
||||||
|
switch (a_ConnectorType)
|
||||||
|
{
|
||||||
|
case 0: return m_OuterPieces;
|
||||||
|
case 1: return m_InnerPieces;
|
||||||
|
default: return cPieces();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
cPieces cNetherFortGen::GetStartingPieces(void)
|
||||||
|
{
|
||||||
|
return m_StartingPieces;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cNetherFortGen::PiecePlaced(const cPiece & a_Piece)
|
||||||
|
{
|
||||||
|
UNUSED(a_Piece);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cNetherFortGen::Reset(void)
|
||||||
|
{
|
||||||
|
// Nothing needed
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
86
src/Generating/NetherFortGen.h
Normal file
86
src/Generating/NetherFortGen.h
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
|
||||||
|
// NetherFortGen.h
|
||||||
|
|
||||||
|
// Declares the cNetherFortGen class representing the nether fortress generator
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "ComposableGenerator.h"
|
||||||
|
#include "PieceGenerator.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class cNetherFortGen :
|
||||||
|
public cFinishGen,
|
||||||
|
public cPiecePool
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
cNetherFortGen(int a_Seed, int a_GridSize, int a_MaxDepth);
|
||||||
|
|
||||||
|
virtual ~cNetherFortGen();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
class cNetherFort; // fwd: NetherFortGen.cpp
|
||||||
|
typedef std::list<cNetherFort *> cNetherForts;
|
||||||
|
|
||||||
|
|
||||||
|
/** The seed used for generating*/
|
||||||
|
int m_Seed;
|
||||||
|
|
||||||
|
/** The noise used for generating */
|
||||||
|
cNoise m_Noise;
|
||||||
|
|
||||||
|
/** Average spacing between the fortresses*/
|
||||||
|
int m_GridSize;
|
||||||
|
|
||||||
|
/** Maximum depth of the piece-generator tree */
|
||||||
|
int m_MaxDepth;
|
||||||
|
|
||||||
|
/** Cache of the most recently used systems. MoveToFront used. */
|
||||||
|
cNetherForts m_Cache;
|
||||||
|
|
||||||
|
/** All the pieces that are allowed for building.
|
||||||
|
This is the list that's used for memory allocation and deallocation for the pieces. */
|
||||||
|
cPieces m_AllPieces;
|
||||||
|
|
||||||
|
/** The pieces that are used as starting pieces.
|
||||||
|
This list is not shared and the pieces need deallocation. */
|
||||||
|
cPieces m_StartingPieces;
|
||||||
|
|
||||||
|
/** The pieces that have an "outer" connector.
|
||||||
|
The pieces are copies out of m_AllPieces and shouldn't be ever delete-d. */
|
||||||
|
cPieces m_OuterPieces;
|
||||||
|
|
||||||
|
/** The pieces that have an "inner" connector.
|
||||||
|
The pieces are copies out of m_AllPieces and shouldn't be ever delete-d. */
|
||||||
|
cPieces m_InnerPieces;
|
||||||
|
|
||||||
|
|
||||||
|
/** Clears everything from the cache.
|
||||||
|
Also invalidates the forst returned by GetFortsForChunk(). */
|
||||||
|
void ClearCache(void);
|
||||||
|
|
||||||
|
/** Returns all forts that *may* intersect the given chunk.
|
||||||
|
The returned forts live within m_Cache.They are valid until the next call
|
||||||
|
to this function (which may delete some of the pointers). */
|
||||||
|
void GetFortsForChunk(int a_ChunkX, int a_ChunkZ, cNetherForts & a_Forts);
|
||||||
|
|
||||||
|
// cFinishGen overrides:
|
||||||
|
virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
|
||||||
|
|
||||||
|
// cPiecePool overrides:
|
||||||
|
virtual cPieces GetPiecesWithConnector(int a_ConnectorType) override;
|
||||||
|
virtual cPieces GetStartingPieces(void) override;
|
||||||
|
virtual void PiecePlaced(const cPiece & a_Piece) override;
|
||||||
|
virtual void Reset(void) override;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -172,6 +172,8 @@ bool cPrefab::HasConnectorType(int a_ConnectorType) const
|
|||||||
|
|
||||||
void cPrefab::ParseCharMap(CharMap & a_CharMapOut, const char * a_CharMapDef)
|
void cPrefab::ParseCharMap(CharMap & a_CharMapOut, const char * a_CharMapDef)
|
||||||
{
|
{
|
||||||
|
ASSERT(a_CharMapDef != NULL);
|
||||||
|
|
||||||
// Initialize the charmap to all-invalid values:
|
// Initialize the charmap to all-invalid values:
|
||||||
for (size_t i = 0; i < ARRAYCOUNT(a_CharMapOut); i++)
|
for (size_t i = 0; i < ARRAYCOUNT(a_CharMapOut); i++)
|
||||||
{
|
{
|
||||||
@ -231,6 +233,8 @@ void cPrefab::ParseBlockImage(const CharMap & a_CharMap, const char * a_BlockIma
|
|||||||
|
|
||||||
void cPrefab::ParseConnectors(const char * a_ConnectorsDef)
|
void cPrefab::ParseConnectors(const char * a_ConnectorsDef)
|
||||||
{
|
{
|
||||||
|
ASSERT(a_ConnectorsDef != NULL);
|
||||||
|
|
||||||
AStringVector Lines = StringSplitAndTrim(a_ConnectorsDef, "\n");
|
AStringVector Lines = StringSplitAndTrim(a_ConnectorsDef, "\n");
|
||||||
for (AStringVector::const_iterator itr = Lines.begin(), end = Lines.end(); itr != end; ++itr)
|
for (AStringVector::const_iterator itr = Lines.begin(), end = Lines.end(); itr != end; ++itr)
|
||||||
{
|
{
|
||||||
|
13
src/Generating/Prefabs/CMakeLists.txt
Normal file
13
src/Generating/Prefabs/CMakeLists.txt
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
|
||||||
|
cmake_minimum_required (VERSION 2.6)
|
||||||
|
project (MCServer)
|
||||||
|
|
||||||
|
include_directories ("${PROJECT_SOURCE_DIR}/../../")
|
||||||
|
|
||||||
|
file(GLOB SOURCE
|
||||||
|
"*.cpp"
|
||||||
|
)
|
||||||
|
|
||||||
|
add_library(Generating_Prefabs ${SOURCE})
|
||||||
|
|
||||||
|
target_link_libraries(Generating_Prefabs OSSupport iniFile Blocks)
|
2758
src/Generating/Prefabs/NetherFortPrefabs.cpp
Normal file
2758
src/Generating/Prefabs/NetherFortPrefabs.cpp
Normal file
File diff suppressed because it is too large
Load Diff
15
src/Generating/Prefabs/NetherFortPrefabs.h
Normal file
15
src/Generating/Prefabs/NetherFortPrefabs.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
// NetherFortPrefabs.h
|
||||||
|
|
||||||
|
// Declares the data used for nether fortress prefabs
|
||||||
|
|
||||||
|
#include "../Prefab.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern const cPrefab::sDef g_NetherFortPrefabs1[];
|
||||||
|
extern const cPrefab::sDef g_NetherFortStartingPrefabs1[];
|
||||||
|
extern const size_t g_NetherFortPrefabs1Count;
|
||||||
|
extern const size_t g_NetherFortStartingPrefabs1Count;
|
Loading…
Reference in New Issue
Block a user