/* ** 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 . */ /****************************************************************************** * * FILE * $Archive: /Commando/Code/WWOnline/WOLGame.cpp $ * * DESCRIPTION * * PROGRAMMER * $Author: Steve_t $ * * VERSION INFO * $Revision: 10 $ * $Modtime: 8/21/02 12:30p $ * ******************************************************************************/ #include "always.h" #include "WOLGame.h" #include "WOLSession.h" #include "WOLChannel.h" #include "WOLString.h" #include "WOLErrorUtil.h" namespace WWOnline { /****************************************************************************** * * NAME * GameStartEvent::GameStartEvent * * DESCRIPTION * Constructor * * INPUTS * Channel - Channel game is in. * UserList - List of users in game. * GameID - Game ID for this game. * * RESULT * NONE * ******************************************************************************/ GameStartEvent::GameStartEvent(const RefPtr& channel, const UserList& users, unsigned long gameID) : mResult(S_OK), mChannel(channel), mGameID(gameID) { for (unsigned int index = 0; index < users.size(); index++) { mPlayers.push_back(users[index]); } } /****************************************************************************** * * NAME * GameStartEvent::GetErrorDescription * * DESCRIPTION * Get text description of error condition. * * INPUTS * NONE * * RESULT * ErrorText - Error text description. * ******************************************************************************/ const char* GameStartEvent::GetErrorDescription(void) const { return GetChatErrorString(mResult); } /****************************************************************************** * * NAME * GameStartWait::Create * * DESCRIPTION * Create a game start wait condition. * * INPUTS * Players - Players in game. * * RESULT * Wait - Wait condition to process for game start. * ******************************************************************************/ RefPtr GameStartWait::Create(const UserList& players, void(*timeout_callback)(void)) { return new GameStartWait(players, timeout_callback); } /****************************************************************************** * * NAME * GameStartWait::GameStartWait * * DESCRIPTION * Constructor * * INPUTS * Players - * * RESULT * NONE * ******************************************************************************/ GameStartWait::GameStartWait(const UserList& players, void(*timeout_callback)(void)) : SingleWait(WOLSTRING("WOL_GAMEIDFETCH")), mPlayers(players) { mTimeoutCallback = timeout_callback; WWDEBUG_SAY(("WOL: GameStartWait Create\n")); } /****************************************************************************** * * NAME * GameStartWait::~GameStartWait * * DESCRIPTION * Destructor * * INPUTS * NONE * * RESULT * NONE * ******************************************************************************/ GameStartWait::~GameStartWait() { WWDEBUG_SAY(("WOL: GameStartWait End %S\n", mEndText)); } /****************************************************************************** * * NAME * GameStartWait::WaitBeginning * * DESCRIPTION * Begin game start wait condition. * * INPUTS * NONE * * RESULT * NONE * ******************************************************************************/ void GameStartWait::WaitBeginning(void) { WWDEBUG_SAY(("WOL: GameStartWait Begin\n")); RefPtr session = Session::GetInstance(false); if (!session.IsValid()) { WWDEBUG_SAY(("WOLERROR: WOLSession not initialized\n")); EndWait(Error, WOLSTRING("WOL_NOTINITIALIZED")); } Observer::NotifyMe(*session); HRESULT hr = session->GetChatObject()->RequestGameStart(mPlayers); if (FAILED(hr)) { WWDEBUG_SAY(("WOLERROR: GameStartWait %s\n", GetChatErrorString(hr))); EndWait(Error, WOLSTRING("WOL_GAMEIDERROR")); } } /****************************************************************************** * * NAME * GameStartWait::HandleNotification(GameStartEvent) * * DESCRIPTION * Handle game start. * * INPUTS * Event - Game start event. * * RESULT * NONE * ******************************************************************************/ void GameStartWait::HandleNotification(GameStartEvent& start) { if (mEndResult == Waiting) { if (start.IsSuccess()) { EndWait(ConditionMet, WOLSTRING("WOL_GAMEIDRECEIVED")); } else { const char* text = start.GetErrorDescription(); WWDEBUG_SAY(("WOLERROR: GameStartWait %s\n", text)); EndWait(Error, WOLSTRING(text)); } } } // // Override base class to check for timeout // void GameStartWait::EndWait(WaitResult result, const wchar_t* endText) { WWDEBUG_SAY(("GameStartWait::EndWait\n")); if (result == TimeOut && mTimeoutCallback) { mTimeoutCallback(); } SingleWait::EndWait(result, endText); } } // namespace WWOnline