//check all reels status;
GTArray<BSReelColumn::ColumnStatus> BSSlotsContainer::CheckAllReelsStatus()
{
	GTArray<BSReelColumn::ColumnStatus> reelColumnsStatus;
	for(int i = 0; i < m_reelColumnCount; i++)
	{
		BSReelColumn::ColumnStatus status = m_reelColumns[i]->GetStatus();
		reelColumnsStatus.Add(status);
	}
	return reelColumnsStatus;
}
//************************************
// Method:    CheckBonusAndLock
// FullName:  BSSlotsContainer::CheckBonusAndLock
// Access:    protected 
// Returns:   bool
// Qualifier: depends on locked(2rd round) or not lock(1st round), to check bonus symbols and play respin or freespin
// Parameter: bool haveReelsLocked   :
//************************************
bool BSSlotsContainer::CheckBonusSymbolsAndLock(bool haveReelsLocked)
{
	int bonusMiniCount = 0;

	if(haveReelsLocked)	
	{
		//means to get final locked reels, this is 2rd round, which some reels had been locked 
		//in this round, even 1 reel should be lock and play;
		bonusMiniCount = 0;	
	}
	else
	{
		//this is 1st round, only bonus count larger than bonusMiniCount, 
		//then lock and play respin;
		 bonusMiniCount = 2;
	}

	bool haveNewLockReel = false;
	GTArray<int> newLockReelIDs;	//store all new lock reels
	
	//check bonus symbol;
	int bonusSymbolID = m_pTicketGenerator->GetBonusSymbolID();
	//GTArray<int> slotSymbols = m_pTicketGenerator->GetSlotSymbols();

	for(int i = 0; i < m_slotsSymbols.Length(); i++)
	{
		int reelID = i % m_reelColumnCount;
		int slotSymbolValue = m_slotsSymbols[i];

		//find bonus symbol, then add this reelID into dictionary for later lock;
		if(slotSymbolValue == bonusSymbolID)
		{
			if(!m_lockReelsDict.KeyExists(reelID))	
			{
				newLockReelIDs.Add(reelID);
			}
		}
	}

	if(newLockReelIDs.Length() < bonusMiniCount)
		return false;

	//initialize all new lock reels
	for(int i = 0; i < newLockReelIDs.Length(); i++)
	{
		m_lockReelsDict.Add(newLockReelIDs[i], NULL);
	}

	//build new respin for every one new lock reels
	for(int i = 0; i < newLockReelIDs.Length(); i++)
	{
		int reelID = newLockReelIDs[i];
		GTGameObject* pGameObject = GTGameObjectManager::Inst()->CreateGameObject(NULL, CTEXT("respin1"), CTEXT("SlotGame/Respin.property"));
		if(pGameObject)
		{
			//add new lock reel into dictionary;
			m_lockReelsDict.Remove(reelID);
			m_lockReelsDict.Add(reelID, pGameObject);

			//get every reel position
			BSReelColumn* reelColum = m_reelColumns[reelID];
			GTPoint2 reelPos = reelColum->GetGameObjectPosition();		

			//set respin to there and play animation
			BSRespin* pRespin = (BSRespin*)(pGameObject->GetBehaviour(CTEXT("BSRespin")));
			if(pRespin)
			{			
				pRespin->SetGameObjectPosition(reelPos);

				GTLogManager::SLogFormatTrace("repsin lock: (%f, %f)  -> playing lock animtion", reelPos.x, reelPos.y);
				pRespin->PlayLockAnimation();
				haveNewLockReel = true;
			}
		}
	}
	return haveNewLockReel;
}