void TMFieldScene::SendMissionCollect()
{
	MSG_STANDARDPARM stParm{};
	stParm.Header.Size = sizeof(stParm);
	stParm.Header.Type = MissionCollectPacket;
	stParm.Header.ID = g_pObjectManager->m_dwCharID;
	stParm.Parm = 0;
	SendOneMessage((char*)&stParm, sizeof(stParm));
}

void TMFieldScene::SendMissionTeleport()
{
	if (!m_bHasDailyMission || !m_stMissionInfo.IsAccepted)
		return;

	unsigned int now = g_pTimerManager ? g_pTimerManager->GetServerTime() : 0;
	if (now && m_dwLastMissionTeleport && now < m_dwLastMissionTeleport + 5000)
		return;

	m_dwLastMissionTeleport = now;

	MSG_STANDARDPARM stParm{};
	stParm.Header.Size = sizeof(stParm);
	stParm.Header.Type = MissionTeleportPacket;
	stParm.Header.ID = g_pObjectManager->m_dwCharID;
	stParm.Parm = 0;
	SendOneMessage((char*)&stParm, sizeof(stParm));
}

void TMFieldScene::LayoutQuestTabs()
{
	// Painel ~512px: redistribui 5 abas para Quest Celestial e Diaria nao se sobreporem.
	// Coords base do FieldScene2 (antes do ratio).
	const float wr = RenderDevice::m_fWidthRatio;
	const float hr = RenderDevice::m_fHeightRatio;
	const float y = 30.0f * hr;
	const float h = 16.0f * hr;

	struct TabLayout { SButton* btn; float x; float w; const char* label; };
	TabLayout tabs[5] = {
		{ m_pQuestButton[0],  32.0f,  82.0f, "Quest Mortal" },
		{ m_pQuestButton[1], 118.0f,  82.0f, "Quest Evento" },
		{ m_pQuestButton[2], 204.0f,  72.0f, "Quest Arch" },
		{ m_pQuestButton[3], 280.0f, 110.0f, "Quest Celestial" },
		{ m_pDailyQuestButton, 396.0f,  70.0f, "Diaria" },
	};

	for (int i = 0; i < 5; ++i)
	{
		SButton* btn = tabs[i].btn;
		if (!btn)
			continue;
		btn->SetPos(tabs[i].x * wr, y);
		btn->SetSize(tabs[i].w * wr, h);
		btn->SetText((char*)tabs[i].label);
		if (btn->m_pAltText)
			btn->m_pAltText->SetText((char*)tabs[i].label, 0);
		btn->SetVisible(1);
	}
}

void TMFieldScene::SetVisibleDailyQuestPanel(int bShow)
{
	if (!bShow)
	{
		if (m_pDailyQuestList)
		{
			m_pDailyQuestList->SetVisible(0);
			m_pDailyQuestList->m_bSelectEnable = 0;
		}
		if (m_pDailyQuestContent)
			m_pDailyQuestContent->SetVisible(0);
		return;
	}

	if (m_pQuestPanel && !m_pQuestPanel->IsVisible())
	{
		m_pQuestPanel->SetVisible(1);
		if (m_pQuestBtn)
			m_pQuestBtn->SetSelected(1);
	}

	for (int i = 0; i < 4; ++i)
	{
		if (m_pQuestList[i])
		{
			m_pQuestList[i]->SetVisible(0);
			m_pQuestList[i]->m_bSelectEnable = 0;
		}
		if (m_pQuestContentList[i])
			m_pQuestContentList[i]->SetVisible(0);
	}

	if (m_pDailyQuestButton)
		m_pDailyQuestButton->SetVisible(1);
	if (m_pDailyQuestList)
	{
		m_pDailyQuestList->SetVisible(1);
		m_pDailyQuestList->m_bSelectEnable = 1;
	}
	if (m_pDailyQuestContent)
		m_pDailyQuestContent->SetVisible(1);

	UpdateDailyQuestUI();
}

void TMFieldScene::UpdateDailyQuestUI()
{
	if (!m_pDailyQuestList || !m_pDailyQuestContent)
		return;

	m_pDailyQuestList->Empty();
	m_pDailyQuestContent->Empty();
	m_pDailyQuestList->m_bSelectEnable = 1;
	m_pDailyQuestContent->m_bSelectEnable = 0;

	auto addListItem = [](SListBox* list, const char* text, unsigned int color) {
		auto* item = new SListBoxItem(
			text, color, 0.0f, 0.0f,
			200.0f * RenderDevice::m_fWidthRatio,
			16.0f * RenderDevice::m_fHeightRatio,
			0, 0x77777777u, 1u, 0);
		list->AddItem(item);
	};

	auto addContentItem = [](SListBox* list, const char* text, unsigned int color) {
		auto* item = new SListBoxItem(
			text, color, 0.0f, 0.0f,
			300.0f * RenderDevice::m_fWidthRatio,
			16.0f * RenderDevice::m_fHeightRatio,
			0, 0x77777777u, 1u, 0);
		list->AddItem(item);
	};

	if (!m_bHasDailyMission)
	{
		m_nDailyTeleportContentIndex = -1;
		m_pDailyQuestContent->m_bSelectEnable = 0;
		addListItem(m_pDailyQuestList, "Nenhuma missao", 0xFFAAAAAA);
		addContentItem(m_pDailyQuestContent, "Sem missao diaria no momento.", 0xFFAAAAAA);
		addContentItem(m_pDailyQuestContent, "Aguarde a proxima carta/SMS.", 0xFF888888);
