1
0

cPieceGenerator chooses starting pieces based on weights.

Fixes #1033.
This commit is contained in:
madmaxoft 2014-05-27 22:05:50 +02:00
parent 6c25c356c7
commit ff99373237
4 changed files with 44 additions and 1 deletions

View File

@ -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:

View File

@ -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;

View File

@ -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

View File

@ -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;
} ; } ;