ribi::tictactoe::Game::Game() noexcept
  : m_signal_changed{},
    m_board(new Board),
    m_current_player(Player::player1)

{
  #ifndef NDEBUG
  Test();
  #endif

  assert(GetCurrentTurn() == 0);
}
void CGameManager::LoadUnitsFromScript(void)
{
	for (decltype(m_vScriptSpawns.size()) i = 0; i < m_vScriptSpawns.size(); ++i)
	{
		ScriptedSpawn s = m_vScriptSpawns[i];
		if (GetCurrentTurn() == s.first)
		{
			CSpawnUnitMessage* pMSG = new CSpawnUnitMessage(Vec2D(s.second.sPos), s.second.nPlayerID, s.second.eType, s.second.nFacing);
			CMessageSystem::GetInstance()->SendMessageW(pMSG);
			m_vScriptSpawns.erase(m_vScriptSpawns.begin() + i);
			--i;
		}
	}

	CMessageSystem::GetInstance()->ProcessMessages();

}
void CGameManager::NextPhase(void)
{
	int numcols= CTileManager::GetInstance()->GetNumColumns();
	int numrows= CTileManager::GetInstance()->GetNumRows();

	m_nPhaseCount++;
	if (m_nCurrentLevel != 5)
	{
		if (GetCurrentTurn() % 2 == 0)
			CGameplayState::GetInstance()->SetDayTime(false);
		else
			CGameplayState::GetInstance()->SetDayTime(true);

	}

	if (m_nCurrentPhase == GP_MOVE)
	{
		CAIManager::GetInstance()->BeginAttack();
		//Attack!!!(Attack Phase Transition)-DG
		CStateStack::GetInstance()->Push(CAttackPhaseTransState::GetInstance());

		m_nCurrentPhase = GP_ATTACK;

		if (GetTutorial()==true && GetCurrentPlayer()->GetPlayerID()==0 && GetCurrentTurn()==1)
		{
			CTutorialTextState::GetInstance()->SetTexttoShow(TTU_ATTACK);
			CStateStack::GetInstance()->Push(CTutorialTextState::GetInstance());
		}

		if (GetTutorial()==true && GetCurrentPlayer()->GetPlayerID()==0 && GetCurrentTurn()==2)
		{
			CTutorialTextState::GetInstance()->SetTexttoShow(TTU_SPELLS);
			CStateStack::GetInstance()->Push(CTutorialTextState::GetInstance());
		}
		if (GetTutorial()==true && GetCurrentPlayer()->GetPlayerID()==0 && GetCurrentTurn()==3)
		{
			CTutorialTextState::GetInstance()->SetTexttoShow(TTU_ATTACKTACTICS);
			CStateStack::GetInstance()->Push(CTutorialTextState::GetInstance());
		}


	}
	else if (m_nCurrentPhase == GP_ATTACK)
	{
		if( m_bExtraTurn == false )
		{
			CPlayer* pTemp = m_pCurrentPlayer;
			m_nCurrentPhase = GP_MOVE;
			m_pCurrentPlayer = m_pNextPlayer;
			m_pNextPlayer = pTemp;
		}
		else
		{
			m_nCurrentPhase = GP_MOVE;
			m_bExtraTurn = false;
		}

		//Chilling the cooldown: this function does the cooldowndown each turn  -DG
		CHero* Hero =  dynamic_cast <CHero*>(GetChampion(m_pCurrentPlayer->GetPlayerID()));
		Hero->ChillCooldown();		
		m_pCurrentPlayer->SetAP(nStartingAP);
		m_pCurrentPlayer->SetMaxPopCap(STARTING_CAP_PER_TURN);
		
		//Look At That, TileManager Takeing care of business! This added resoruces based on the owned tiles -DG
		CTileManager::GetInstance()->EvaluateResources(m_pCurrentPlayer->GetPlayerID());
		
		CGameplayState::GetInstance()->ClearSelections();
		if (GetChampion(m_pCurrentPlayer->GetPlayerID()) != nullptr)
		{
			CGameplayState::GetInstance()->SnapToPosition(GetChampion(m_pCurrentPlayer->GetPlayerID())->GetPos(), true);
		}

		CAIManager::GetInstance()->BeginMovement();

		for (decltype(m_vUnits.size()) i = 0; i < m_vUnits.size(); ++i)
		{
			if (m_vUnits[i]->GetPlayerID() == m_pCurrentPlayer->GetPlayerID())
			{
				m_vUnits[i]->SetTilesMoved(0);
				m_vUnits[i]->SetHasAttacked(false);
				m_vUnits[i]->UpdateEffects();
			}
		}
		//RAISE THE CASTLE WALLS!!!(Do the movement transition)-DG
		CStateStack::GetInstance()->Push(CMovetPhaseTransState::GetInstance());

		if (GetTutorial()==true && GetCurrentPlayer()->GetPlayerID()==0 && GetCurrentTurn()==2)
		{
			CTutorialTextState::GetInstance()->SetTexttoShow(TTU_MOVETACTICS);
			CStateStack::GetInstance()->Push(CTutorialTextState::GetInstance());
		}

	}
}