parent
6c25c356c7
commit
ff99373237
@ -362,7 +362,31 @@ cPlacedPiece * cPieceGenerator::PlaceStartingPiece(int a_BlockX, int a_BlockY, i
|
|||||||
|
|
||||||
// Choose a random one of the starting pieces:
|
// Choose a random one of the starting pieces:
|
||||||
cPieces StartingPieces = m_PiecePool.GetStartingPieces();
|
cPieces StartingPieces = m_PiecePool.GetStartingPieces();
|
||||||
cPiece * StartingPiece = StartingPieces[rnd % StartingPieces.size()];
|
int Total = 0;
|
||||||
|
for (cPieces::const_iterator itr = StartingPieces.begin(), end = StartingPieces.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
Total += m_PiecePool.GetStartingPieceWeight(**itr);
|
||||||
|
}
|
||||||
|
cPiece * StartingPiece;
|
||||||
|
if (Total > 0)
|
||||||
|
{
|
||||||
|
int Chosen = rnd % Total;
|
||||||
|
StartingPiece = StartingPieces.front();
|
||||||
|
for (cPieces::const_iterator itr = StartingPieces.begin(), end = StartingPieces.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
Chosen -= m_PiecePool.GetStartingPieceWeight(**itr);
|
||||||
|
if (Chosen <= 0)
|
||||||
|
{
|
||||||
|
StartingPiece = *itr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// All pieces returned zero weight, but we need one to start. Choose with equal chance:
|
||||||
|
StartingPiece = StartingPieces[rnd % StartingPieces.size()];
|
||||||
|
}
|
||||||
rnd = rnd >> 16;
|
rnd = rnd >> 16;
|
||||||
|
|
||||||
// Choose a random supported rotation:
|
// Choose a random supported rotation:
|
||||||
|
@ -120,6 +120,15 @@ public:
|
|||||||
const cPiece & a_NewPiece
|
const cPiece & a_NewPiece
|
||||||
) { return 1; }
|
) { return 1; }
|
||||||
|
|
||||||
|
/** Returns the relative weight with which the a_NewPiece is to be selected for placing as the first piece.
|
||||||
|
This allows the pool to tweak the piece's chances.
|
||||||
|
The higher the number returned, the higher the chance the piece will be chosen. 0 means the piece will not be chosen.
|
||||||
|
If all pieces return 0, a random piece is chosen, with all equal chances.
|
||||||
|
*/
|
||||||
|
virtual int GetStartingPieceWeight(
|
||||||
|
const cPiece & a_NewPiece
|
||||||
|
) { return 1; }
|
||||||
|
|
||||||
/** Called after a piece is placed, to notify the pool that it has been used.
|
/** Called after a piece is placed, to notify the pool that it has been used.
|
||||||
The pool may adjust the pieces it will return the next time. */
|
The pool may adjust the pieces it will return the next time. */
|
||||||
virtual void PiecePlaced(const cPiece & a_Piece) = 0;
|
virtual void PiecePlaced(const cPiece & a_Piece) = 0;
|
||||||
|
@ -101,6 +101,15 @@ int cPrefabPiecePool::GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const c
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int cPrefabPiecePool::GetStartingPieceWeight(const cPiece & a_NewPiece)
|
||||||
|
{
|
||||||
|
return ((const cPrefab &)a_NewPiece).GetDefaultWeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cPrefabPiecePool::PiecePlaced(const cPiece & a_Piece)
|
void cPrefabPiecePool::PiecePlaced(const cPiece & a_Piece)
|
||||||
{
|
{
|
||||||
// Do nothing
|
// Do nothing
|
||||||
|
@ -70,6 +70,7 @@ protected:
|
|||||||
virtual cPieces GetPiecesWithConnector(int a_ConnectorType) override;
|
virtual cPieces GetPiecesWithConnector(int a_ConnectorType) override;
|
||||||
virtual cPieces GetStartingPieces(void) override;
|
virtual cPieces GetStartingPieces(void) override;
|
||||||
virtual int GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece) override;
|
virtual int GetPieceWeight(const cPlacedPiece & a_PlacedPiece, const cPiece::cConnector & a_ExistingConnector, const cPiece & a_NewPiece) override;
|
||||||
|
virtual int GetStartingPieceWeight(const cPiece & a_NewPiece) override;
|
||||||
virtual void PiecePlaced(const cPiece & a_Piece) override;
|
virtual void PiecePlaced(const cPiece & a_Piece) override;
|
||||||
virtual void Reset(void) override;
|
virtual void Reset(void) override;
|
||||||
} ;
|
} ;
|
||||||
|
Loading…
Reference in New Issue
Block a user