Prefabs support connectors, rotations and merge strategy.
This commit is contained in:
parent
1b00b62a4b
commit
8c2c4f2463
|
@ -17,13 +17,14 @@ uses a prefabricate in a cBlockArea for drawing itself.
|
||||||
cPrefab::cPrefab(const cPrefab::sDef & a_Def) :
|
cPrefab::cPrefab(const cPrefab::sDef & a_Def) :
|
||||||
m_Size(a_Def.m_SizeX, a_Def.m_SizeY, a_Def.m_SizeZ),
|
m_Size(a_Def.m_SizeX, a_Def.m_SizeY, a_Def.m_SizeZ),
|
||||||
m_HitBox(0, 0, 0, a_Def.m_SizeX, a_Def.m_SizeY, a_Def.m_SizeZ),
|
m_HitBox(0, 0, 0, a_Def.m_SizeX, a_Def.m_SizeY, a_Def.m_SizeZ),
|
||||||
m_AllowedRotations(7), // TODO: All rotations allowed (not in the definition yet)
|
m_AllowedRotations(a_Def.m_AllowedRotations),
|
||||||
m_MergeStrategy(cBlockArea::msImprint)
|
m_MergeStrategy(a_Def.m_MergeStrategy)
|
||||||
{
|
{
|
||||||
m_BlockArea.Create(m_Size);
|
m_BlockArea.Create(m_Size);
|
||||||
CharMap cm;
|
CharMap cm;
|
||||||
ParseCharMap(cm, a_Def.m_CharMap);
|
ParseCharMap(cm, a_Def.m_CharMap);
|
||||||
ParseBlockImage(cm, a_Def.m_Image);
|
ParseBlockImage(cm, a_Def.m_Image);
|
||||||
|
ParseConnectors(a_Def.m_Connectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,6 +43,22 @@ void cPrefab::Draw(cBlockArea & a_Dest, const cPlacedPiece * a_Placement)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool cPrefab::HasConnectorType(int a_ConnectorType) const
|
||||||
|
{
|
||||||
|
for (cConnectors::const_iterator itr = m_Connectors.begin(), end = m_Connectors.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
if (itr->m_Type == a_ConnectorType)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} // for itr - m_Connectors[]
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cPrefab::ParseCharMap(CharMap & a_CharMapOut, const char * a_CharMapDef)
|
void cPrefab::ParseCharMap(CharMap & a_CharMapOut, const char * a_CharMapDef)
|
||||||
{
|
{
|
||||||
// Initialize the charmap to all-invalid values:
|
// Initialize the charmap to all-invalid values:
|
||||||
|
@ -102,6 +119,50 @@ void cPrefab::ParseBlockImage(const CharMap & a_CharMap, const char * a_BlockIma
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cPrefab::ParseConnectors(const char * a_ConnectorsDef)
|
||||||
|
{
|
||||||
|
AStringVector Lines = StringSplitAndTrim(a_ConnectorsDef, "\n");
|
||||||
|
for (AStringVector::const_iterator itr = Lines.begin(), end = Lines.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
if (itr->empty())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// Split into components: "Type: X, Y, Z: Face":
|
||||||
|
AStringVector Defs = StringSplitAndTrim(*itr, ":");
|
||||||
|
if (Defs.size() != 3)
|
||||||
|
{
|
||||||
|
LOGWARNING("Bad prefab Connector definition line: \"%s\", skipping.", itr->c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
AStringVector Coords = StringSplitAndTrim(Defs[1], ",");
|
||||||
|
if (Coords.size() != 3)
|
||||||
|
{
|
||||||
|
LOGWARNING("Bad prefab Connector coords definition: \"%s\", skipping.", Defs[1].c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check that the BlockFace is within range:
|
||||||
|
int BlockFace = atoi(Defs[2].c_str());
|
||||||
|
if ((BlockFace < 0) || (BlockFace >= 6))
|
||||||
|
{
|
||||||
|
LOGWARNING("Bad prefab Connector Blockface: \"%s\", skipping.", Defs[2].c_str());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add the connector:
|
||||||
|
m_Connectors.push_back(cPiece::cConnector(
|
||||||
|
atoi(Coords[0].c_str()), atoi(Coords[1].c_str()), atoi(Coords[2].c_str()), // Connector pos
|
||||||
|
atoi(Defs[0].c_str()), // Connector type
|
||||||
|
(eBlockFace)BlockFace
|
||||||
|
));
|
||||||
|
} // for itr - Lines[]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cPiece::cConnectors cPrefab::GetConnectors(void) const
|
cPiece::cConnectors cPrefab::GetConnectors(void) const
|
||||||
{
|
{
|
||||||
return m_Connectors;
|
return m_Connectors;
|
||||||
|
|
|
@ -33,13 +33,18 @@ public:
|
||||||
int m_SizeZ;
|
int m_SizeZ;
|
||||||
const char * m_CharMap;
|
const char * m_CharMap;
|
||||||
const char * m_Image;
|
const char * m_Image;
|
||||||
// TODO: Connectors
|
const char * m_Connectors;
|
||||||
|
int m_AllowedRotations;
|
||||||
|
cBlockArea::eMergeStrategy m_MergeStrategy;
|
||||||
};
|
};
|
||||||
|
|
||||||
cPrefab(const sDef & a_Def);
|
cPrefab(const sDef & a_Def);
|
||||||
|
|
||||||
/** Draws the prefab into the specified block area, according to the placement stored in the PlacedPiece. */
|
/** Draws the prefab into the specified block area, according to the placement stored in the PlacedPiece. */
|
||||||
void Draw(cBlockArea & a_Dest, const cPlacedPiece * a_Placement);
|
void Draw(cBlockArea & a_Dest, const cPlacedPiece * a_Placement);
|
||||||
|
|
||||||
|
/** Returns true if the prefab has any connector of the specified type. */
|
||||||
|
bool HasConnectorType(int a_ConnectorType) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** Maps letters in the sDef::m_Image onto a number, BlockType * 16 | BlockMeta */
|
/** Maps letters in the sDef::m_Image onto a number, BlockType * 16 | BlockMeta */
|
||||||
|
@ -76,6 +81,9 @@ protected:
|
||||||
|
|
||||||
/** Parses the Image in the definition into m_BlockArea's block types and metas, using the specified CharMap. */
|
/** Parses the Image in the definition into m_BlockArea's block types and metas, using the specified CharMap. */
|
||||||
void ParseBlockImage(const CharMap & a_CharMap, const char * a_BlockImage);
|
void ParseBlockImage(const CharMap & a_CharMap, const char * a_BlockImage);
|
||||||
|
|
||||||
|
/** Parses the connectors definition text into m_Connectors member. */
|
||||||
|
void ParseConnectors(const char * a_ConnectorsDef);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user