This repository has been archived on 2025-02-27. You can view files and clone it, but cannot push or open issues or pull requests.
CnC_Renegade/Code/Commando/DlgQuickmatch.cpp

499 lines
9.7 KiB
C++
Raw Permalink Normal View History

/*
** Command & Conquer Renegade(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/******************************************************************************
*
* NAME
* $Archive: /Commando/Code/Commando/DlgQuickmatch.cpp $
*
* DESCRIPTION
* Quick match dialog
*
* PROGRAMMER
* Denzil E. Long, Jr.
* $Author: Denzil_l $
*
* VERSION INFO
* $Revision: 21 $
* $Modtime: 1/16/02 5:06p $
*
******************************************************************************/
#include "DlgQuickMatch.h"
#include "DlgWOLWait.h"
#include "DlgMessageBox.h"
#include "DlgMPWolQuickMatchOptions.h"
#include "Resource.h"
#include "DialogResource.h"
#include "gameinitmgr.h"
#include "WOLJoinGame.h"
#include "String_IDs.h"
#include <WWTranslateDB\TranslateDB.h>
#include <WWOnline\WaitCondition.h>
#include <WWUI\ListCtrl.h>
#include <WWDebug\WWDebug.h>
#ifdef _MSC_VER
#pragma warning (push,3)
#endif
#include "systimer.h"
#ifdef _MSC_VER
#pragma warning (pop)
#endif
using namespace WWOnline;
/******************************************************************************
*
* NAME
* DlgQuickMatch::DoDialog
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* Success - True if dialog successfully started.
*
******************************************************************************/
bool DlgQuickMatch::DoDialog(void)
{
DlgQuickMatch* dialog = new DlgQuickMatch;
if (dialog)
{
if (dialog->FinalizeCreate())
{
dialog->Start_Dialog();
}
dialog->Release_Ref();
}
return (dialog != NULL);
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::DlgQuickMatch
*
* DESCRIPTION
* Constructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
DlgQuickMatch::DlgQuickMatch() :
MenuDialogClass(IDD_MP_WOL_QUICKMATCH_CONNECT),
mTimeoutTime(0),
mResendTime(0)
{
WWDEBUG_SAY(("DlgQuickMatch: Instantiating\n"));
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::~DlgQuickMatch
*
* DESCRIPTION
* Destructor
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
DlgQuickMatch::~DlgQuickMatch()
{
WWDEBUG_SAY(("DlgQuickMatch: Destructing\n"));
if (mQuickMatch)
{
mQuickMatch->Release_Ref();
}
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::FinalizeCreate
*
* DESCRIPTION
* Finalize the creation of this object (Initialize).
*
* INPUTS
*
* RESULT
*
******************************************************************************/
bool DlgQuickMatch::FinalizeCreate(void)
{
mQuickMatch = WOLQuickMatch::Create();
if (!mQuickMatch)
{
return false;
}
Observer<QuickMatchEvent>::NotifyMe(*mQuickMatch);
return true;
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::On_Init_Dialog
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void DlgQuickMatch::On_Init_Dialog(void)
{
ListCtrlClass* output = (ListCtrlClass*)Get_Dlg_Item(IDC_OUTPUT);
WWASSERT_PRINT(output, "IDC_OUTOUT list control missing from dialog!");
if (output)
{
output->Add_Column(L"", 1.0F, Vector3 (1, 1, 1));
}
Connect();
MenuDialogClass::On_Init_Dialog();
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::On_Frame_Update
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void DlgQuickMatch::On_Frame_Update(void)
{
if (mConnectWait.IsValid())
{
WaitCondition::WaitResult waitStatus = mConnectWait->GetResult();
if (waitStatus != WaitCondition::Waiting)
{
if (waitStatus == WaitCondition::ConditionMet)
{
SendMatchingInfo();
}
else
{
OutputMessage(mConnectWait->GetResultText());
}
mConnectWait.Release();
}
}
unsigned long theTime = TIMEGETTIME();
if ((mResendTime > 0) && (theTime >= mResendTime))
{
mQuickMatch->SendClientInfo();
mResendTime = 0;
}
// Watch for timeout
if ((mTimeoutTime > 0) && (theTime >= mTimeoutTime))
{
OutputMessage(TRANSLATE(IDS_WOL_TIMEDOUT));
mTimeoutTime = 0;
}
MenuDialogClass::On_Frame_Update();
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void DlgQuickMatch::On_Command(int ctrl, int message, DWORD param)
{
if (ctrl == IDC_MENU_BACK_BUTTON)
{
OutputMessage(IDS_QM_DISCONNECT);
RefPtr<WaitCondition> wait = mQuickMatch->Disconnect();
if (wait.IsValid())
{
DlgWOLWait::DoDialog(IDS_QM_DISCONNECT, wait);
}
}
MenuDialogClass::On_Command(ctrl, message, param);
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::Connect
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void DlgQuickMatch::Connect(void)
{
OutputMessage(IDS_QM_CONNECTING);
mConnectWait = mQuickMatch->ConnectClient();
if (mConnectWait.IsValid())
{
mConnectWait->WaitBeginning();
}
mTimeoutTime = (TIMEGETTIME() + 60000);
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::SendMatchingInfo
*
* DESCRIPTION
*
* INPUTS
* NONE
*
* RESULT
* NONE
*
******************************************************************************/
void DlgQuickMatch::SendMatchingInfo(void)
{
OutputMessage(IDS_QM_SENDINGMATCHINFO);
bool sent = mQuickMatch->SendClientInfo();
if (sent)
{
OutputMessage(TRANSLATE (IDS_MENU_SEARCHING_FOR_MATCH));
}
else
{
OutputMessage(TRANSLATE (IDS_MENU_CANT_LOCATE_MATCH));
}
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::OutputMessage
*
* DESCRIPTION
*
* INPUTS
* Message - Message to add to output.
*
* RESULT
* NONE
*
******************************************************************************/
void DlgQuickMatch::OutputMessage(int messageID)
{
const WCHAR* message = TranslateDBClass::Get_String(messageID);
OutputMessage(message);
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::OutputMessage
*
* DESCRIPTION
*
* INPUTS
* Message - Message to add to output.
*
* RESULT
* NONE
*
******************************************************************************/
void DlgQuickMatch::OutputMessage(const WCHAR* message)
{
WWDEBUG_SAY(("QM: %S\n", message));
ListCtrlClass* output = (ListCtrlClass*)Get_Dlg_Item(IDC_OUTPUT);
if (output)
{
int entryCount = output->Get_Entry_Count();
output->Insert_Entry(entryCount, message);
// Limit message entries.
if (entryCount > 100)
{
output->Delete_Entry(0);
}
}
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::HandleNotification(QuickMatchEvent)
*
* DESCRIPTION
* Handle status information from quickmatch.
*
* INPUTS
* Status -
*
* RESULT
* NONE
*
******************************************************************************/
void DlgQuickMatch::HandleNotification(QuickMatchEvent& status)
{
QuickMatchEvent::Event event = status.GetEvent();
const WCHAR* msg = (const WCHAR*)status.Subject();
if (QuickMatchEvent::QMERROR == event)
{
const WideStringClass& statusMsg = status.Subject();
// If no match then resend the request in 10 seconds.
if (statusMsg.Compare_No_Case(L"QM:NoMatch") == 0)
{
msg = TRANSLATE(IDS_QM_NOMATCH);
}
else
{
#ifdef QUICKMATCH_OPTIONS
// Unable to match user because preferred modes are all zero.
if (statusMsg.Compare_No_Case(L"QM:NoModes") == 0)
{
DlgMsgBox::DoDialog(TRANSLATE (IDS_MENU_INVALID_QM_SETTINGS_TITLE), TRANSLATE (IDS_MENU_INVALID_QM_SETTINGS),
DlgMsgBox::Okay, this);
return;
}
#endif
}
}
else if (QuickMatchEvent::QMMATCHED == event)
{
GameInitMgrClass::Set_WOL_Return_Dialog(RenegadeDialogMgrClass::LOC_INTERNET_MAIN);
// Join the game
const WCHAR* gameName = (const WCHAR*)status.Subject();
WOLJoinGame::JoinTheGame(gameName, L"", false);
return;
}
// Assume any other message is for the user.
OutputMessage(msg);
}
/******************************************************************************
*
* NAME
* DlgQuickMatch::HandleNotification(DlgMsgBoxEvent)
*
* DESCRIPTION
*
* INPUTS
*
* RESULT
* NONE
*
******************************************************************************/
void DlgQuickMatch::HandleNotification(DlgMsgBoxEvent& msgbox)
{
#ifdef QUICKMATCH_OPTIONS
Add_Ref();
if (msgbox.Event() == DlgMsgBoxEvent::Okay)
{
End_Dialog();
START_DIALOG(MPWolQuickMatchOptionsMenuClass);
}
Release_Ref();
#endif // QUICKMATCH_OPTIONS
}