// // Copyright 2020 Electronic Arts Inc. // // TiberianDawn.DLL and RedAlert.dll and corresponding source code 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. // TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed // in the hope that it will be useful, but with permitted additional restrictions // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT // distributed with this program. You should have received a copy of the // GNU General Public License along with permitted additional restrictions // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection #ifdef WOLAPI_INTEGRATION // wol_gsup.h "WOL Game Setup Dialog" // ajw 08/06/98 // Class WOL_GameSetupDialog is a move away from doing dialogs purely in C, a format that I've maintained in the login and // chat dialogs, mimicking how dialogs are done elsewhere in the code, but became frustrated with. // Though I'll follow the same pattern as before, things will be centralized a little cleaner through the use of this object. // Why a standard dialog class that would handle common input behavior and so forth (one that this class could derive from) // wasn't written 5 years ago, I don't know... #include "WolapiOb.h" //class WolapiObject; class IconListClass; class EditClass; class GaugeClass; class CheckListClass; class TextButtonClass; class StaticButtonClass; class DropListClass; class ShapeButtonClass; class BigCheckBoxClass; class ToolTipClass; //*********************************************************************************************** enum RESULT_WOLGSUP { RESULT_WOLGSUP_BACKTOCHAT, RESULT_WOLGSUP_FATALERROR, RESULT_WOLGSUP_HOSTLEFT, RESULT_WOLGSUP_STARTGAMEHOST, RESULT_WOLGSUP_STARTGAME, RESULT_WOLGSUP_RULESMISMATCH, RESULT_WOLGSUP_LOGOUT, }; struct GAMEPARAMS { GlobalPacketType GPacket; // My additions to game params. - ajw bool bAftermathUnits; bool bSlowUnitBuildRate; }; //*********************************************************************************************** class WOL_GameSetupDialog { public: WOL_GameSetupDialog( WolapiObject* pWO, bool bHost ); ~WOL_GameSetupDialog(); RESULT_WOLGSUP Run(); public: bool bHost; // True when I created the game channel and am the host. bool bHostSayGo; // Trigger host instructing all to start game immediately. bool bHostWaitingForGoTrigger; // True while host is waiting for go message to bounce back to him and trigger start. bool bExitForGameTrigger; // Trigger exiting dialog for game. void ProcessGuestRequest( User* pUser, const char* szRequest ); void ProcessInform( char* szRequest ); void OnGuestJoin( User* pUser ); void OnGuestLeave( User* pUser ); protected: void Initialize(); RESULT_WOLGSUP Show(); void SetSpecialControlStates(); void BindControls( bool bBind ); bool ExitGameChannel(); void DrawScenarioDescripIcon( const char* pDIB ) const; void SetPlayerColor( const char* szName, PlayerColorType Color ); PlayerColorType GetPlayerColor( const char* szName ); void SetPlayerHouse( const char* szName, HousesType House ); HousesType GetPlayerHouse( const char* szName ); bool SetPlayerAccepted( const char* szName, bool bAccepted ); bool IveAccepted(); bool SetPlayerReadyToGo( const char* szName, const char* szReadyState ); void ResetReadyToGo(); bool bPlayerReadyToGo( const char* szName ); bool bAllPlayersReadyToGo(); bool bParamsUnfresh(); void SendParams(); bool AcceptParams( char* szParams ); void SetGParamsToCurrent( GAMEPARAMS& GParams ); void AcceptNewGuestPlayerInfo( char* szMsg ); bool RequestPlayerColor( PlayerColorType Color ); bool InformAboutPlayerColor( const char* szName, PlayerColorType Color, User* pUserPriv ); bool InformAboutPlayerHouse( const char* szName, HousesType House, User* pUserPriv ); bool InformAboutPlayerAccept( const char* szName, User* pUserPriv ); bool InformAboutStart(); bool InformAboutCancelStart(); void ClearAllAccepts(); bool bAllGuestsAccept(); PlayerColorType ColorNextAvailable(); void GuestIsReadyToPlay( const char* szName, const char* szReadyState ); bool bNeedScenarioDownload(); void HostSaysGo(); void TriggerGameStart( char* szGoMessage ); enum SCENARIO_GAMEKIND { SCENARIO_RA = 0, SCENARIO_CS, SCENARIO_AM, SCENARIO_USER, SCENARIO_UNINITIALIZED, }; void ScenarioDisplayMode( SCENARIO_GAMEKIND ScenKind ); // bool bSpecialAftermathScenario( const char* szScenarioDescription ); public: int d_dialog_w; int d_dialog_h; int d_dialog_x; int d_dialog_y; int d_dialog_cx; int d_txt6_h; int d_margin1; int d_house_w; int d_house_h; int d_house_x; int d_house_y; int d_color_w; int d_color_h; int d_color_x; int d_color_y; int d_playerlist_w; int d_playerlist_h; int d_playerlist_x; int d_playerlist_y; int d_scenariolist_w; int d_scenariolist_h; int d_scenariolist_x; int d_scenariolist_y; int d_gamekind_w; int d_gamekind_h; int d_gamekind_x; int d_gamekind_y; int d_count_w; int d_count_h; int d_count_x; int d_count_y; int d_level_w; int d_level_h; int d_level_x; int d_level_y; int d_credits_w; int d_credits_h; int d_credits_x; int d_credits_y; int d_aiplayers_w; int d_aiplayers_h; int d_aiplayers_x; int d_aiplayers_y; int d_options_w; int d_options_h; int d_options_x; int d_options_y; int d_disc_w; int d_disc_h; int d_disc_x; int d_disc_y; int d_send_w; int d_send_h; int d_send_x; int d_send_y; int d_ok_w; int d_ok_h; int d_ok_x; int d_ok_y; int d_cancel_w; int d_cancel_h; int d_cancel_x; int d_cancel_y; int d_accept_w; int d_accept_h; int d_accept_x; int d_accept_y; int d_amunits_w; int d_amunits_h; int d_amunits_x; int d_amunits_y; int d_action_w; int d_action_h; int d_action_x; int d_action_y; protected: GadgetClass* commands; // The controls list. IconListClass* pILPlayers; IconListClass* pILScens; IconListClass* pILDisc; char szSendBuffer[ MAXCHATSENDLENGTH ]; EditClass* pEditSend; GaugeClass* pGaugeCount; GaugeClass* pGaugeLevel; GaugeClass* pGaugeCredits; GaugeClass* pGaugeAIPlayers; CheckListClass* pCheckListOptions; TextButtonClass* pTextBtnOk; TextButtonClass* pTextBtnCancel; TextButtonClass* pTextBtnAcceptStart; TextButtonClass* pTextBtnAction; StaticButtonClass* pStaticDescrip; StaticButtonClass* pStaticUnit; StaticButtonClass* pStaticLevel; StaticButtonClass* pStaticCredits; StaticButtonClass* pStaticAIPlayers; char szHouseBuffer[25]; // buffer for house droplist DropListClass* pDropListHouse; BigCheckBoxClass* pCheckAftermathUnits; ShapeButtonClass* pShpBtnScenarioRA; ShapeButtonClass* pShpBtnScenarioCS; ShapeButtonClass* pShpBtnScenarioAM; ShapeButtonClass* pShpBtnScenarioUser; ToolTipClass* pTTipAcceptStart; ToolTipClass* pTTipCancel; ToolTipClass* pTTipAction; WolapiObject* pWO; GAMEPARAMS GParamsLastSent; // Used merely as a handy container for the vars I need to set. DWORD dwTimeNextParamRefresh; // Param changes are sent by host at certain interval. HousesType HousePrevious; unsigned int nHostLastParamID; // Host's send update tracking packet ID. unsigned int nGuestLastParamID; // Guest's record of last ID received from host. bool bWaitingToStart; bool bProcess; // True means continue doing input loop. RESULT_WOLGSUP ResultReturn; // Value that will be returned from Show(). char szNameOfHostWhoJustBailedOnUs[ WOL_NAME_LEN_MAX ]; // If set, triggers setup cancellation. bool bParamsReceived; // True after any WOL_GAMEOPT_INFPARAMS messages have been received from a host. bool bLeaveDueToRulesMismatchTrigger; bool bRequestedScenarioDownload; char szTriggerGameStartInfo[ ( WOL_NAME_LEN_MAX + 10 ) * 4 + 60 ]; // Tooltips... DWORD timeToolTipAppear; ToolTipClass* pToolTipHead; // Head of list of ToolTips that parallels gadget list. ToolTipClass* pToolTipHitLast; // ToolTip the mouse was last over, or null. // Extra game params... bool bAftermathUnits; // True if aftermath units are to be used in the game. bool bSlowUnitBuildRate; SCENARIO_GAMEKIND ScenKindCurrent; // Describes what gamekind of scenarios we are viewing, if host. DynamicVectorClass< const char* > ar_szScenarios[ 4 ]; // Lists of scenarios, by SCENARIO_GAMEKIND. // ar_szScenIndexes parallels ar_szScenarios, holds ScenarioIndex. It's actually an int, but I'm using void* to avoid // template instantiation problems and the need to change defines.h. DynamicVectorClass< void* > ar_szScenIndexes[ 4 ]; //------------------------------------------------------------------------ // Button Enumerations //------------------------------------------------------------------------ enum { BUTTON_DISCONNECT = 100, // Note: standard WOL button IDs must match values in WolapiObject::PrepareButtonsAndIcons(). BUTTON_LEAVE, BUTTON_REFRESH, BUTTON_SQUELCH, BUTTON_BAN, BUTTON_KICK, BUTTON_FINDPAGE, BUTTON_OPTIONS, BUTTON_LADDER, BUTTON_HELP, BUTTON_PLAYERLIST, BUTTON_HOUSE, BUTTON_SCENARIOLIST, BUTTON_DISCLIST, BUTTON_SENDEDIT, BUTTON_COUNT, BUTTON_LEVEL, BUTTON_CREDITS, BUTTON_AIPLAYERS, BUTTON_PARAMS, // BUTTON_OK, BUTTON_CANCEL, BUTTON_ACCEPTSTART, BUTTON_ACTION, BUTTON_AFTERMATHUNITS, BUTTON_SCENARIO_RA, BUTTON_SCENARIO_CS, BUTTON_SCENARIO_AM, BUTTON_SCENARIO_USER, }; //------------------------------------------------------------------------ // Redraw values: in order from "top" to "bottom" layer of the dialog //------------------------------------------------------------------------ typedef enum { REDRAW_NONE = 0, REDRAW_PARMS, REDRAW_MESSAGE, REDRAW_COLORS, REDRAW_BUTTONS, REDRAW_BACKGROUND, REDRAW_ALL = REDRAW_BACKGROUND } RedrawType; RedrawType display; }; #endif