1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
// Prefab.h
/*
Declares the cPrefab class, representing a cPiece descendant for the cPieceGenerator that
uses a prefabricate in a cBlockArea for drawing itself.
The class can be constructed from data that is stored directly in the executable, in a sPrefabDef structure
declared in this file as well; the Gallery server exports areas in this format.
*/
#pragma once
#include "PieceGenerator.h"
#include "../BlockArea.h"
// fwd:
class cChunkDesc;
class cPrefab :
public cPiece
{
public:
struct sDef
{
int m_SizeX;
int m_SizeY;
int m_SizeZ;
const char * m_CharMap;
const char * m_Image;
const char * m_Connectors;
int m_AllowedRotations;
cBlockArea::eMergeStrategy m_MergeStrategy;
};
cPrefab(const sDef & a_Def);
/** Draws the prefab into the specified chunk, according to the placement stored in the PlacedPiece. */
void Draw(cChunkDesc & a_Dest, const cPlacedPiece * a_Placement) const;
/** Returns true if the prefab has any connector of the specified type. */
bool HasConnectorType(int a_ConnectorType) const;
protected:
/** Packs complete definition of a single block, for per-letter assignment. */
struct sBlockTypeDef
{
BLOCKTYPE m_BlockType;
NIBBLETYPE m_BlockMeta;
};
/** Maps letters in the sDef::m_Image onto a number, BlockType * 16 | BlockMeta */
typedef sBlockTypeDef CharMap[256];
/** The cBlockArea that contains the block definitions for the prefab.
The index identifies the number of CCW rotations applied (0 = no rotation, 1 = 1 CCW rotation, ...). */
cBlockArea m_BlockArea[4];
/** The size of the prefab */
Vector3i m_Size;
/** The hitbox of the prefab. In first version is the same as the m_BlockArea dimensions */
cCuboid m_HitBox;
/** The connectors through which the piece connects to other pieces */
cConnectors m_Connectors;
/** Bitmask, bit N set -> N rotations CCW supported */
int m_AllowedRotations;
/** The merge strategy to use when drawing the prefab into a block area */
cBlockArea::eMergeStrategy m_MergeStrategy;
// cPiece overrides:
virtual cConnectors GetConnectors(void) const override;
virtual Vector3i GetSize(void) const override;
virtual cCuboid GetHitBox(void) const override;
virtual bool CanRotateCCW(int a_NumRotations) const override;
/** Parses the CharMap in the definition into a CharMap binary data used for translating the definition into BlockArea. */
void ParseCharMap(CharMap & a_CharMapOut, const char * a_CharMapDef);
/** Parses the Image in the definition into m_BlockArea[0]'s block types and metas, using the specified CharMap. */
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);
};
|