// // 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_Opt.cpp - WW online options dialog. // ajw 09/1/98 #include "function.h" #include "IconList.h" #include "WolapiOb.h" #include "WolStrng.h" #include "BigCheck.h" //#include "WolDebug.h" extern bool cancel_current_msgbox; //*********************************************************************************************** bool WOL_Options_Dialog( WolapiObject* pWO, bool bCalledFromGame ) { // Returns true only if called from inside game, and the game ended on us unexpectedly. bool bReturn = false; bool bEscapeDown = false; bool bReturnDown = false; bool bIgnoreReturnDown = false; if( ( ::GetAsyncKeyState( VK_RETURN ) & 0x8000 ) ) { // The return key is already down, as we enter the dialog. // Until it comes up again, ignore this fact, so that we don't act on a return press that's not valid. bIgnoreReturnDown = true; } /* ** Dialog & button dimensions */ #ifdef GERMAN int d_list_w = 180 * RESFACTOR; #else #ifdef FRENCH int d_list_w = 165 * RESFACTOR; #else int d_list_w = 165 * RESFACTOR; #endif #endif int d_dialog_w = d_list_w + 40 * RESFACTOR; // dialog width int d_dialog_h = 90 * RESFACTOR; // dialog height int d_dialog_x = (((320 * RESFACTOR) - d_dialog_w) / 2); int d_dialog_y = (((200 * RESFACTOR) - d_dialog_h) / 2); int d_dialog_cx = d_dialog_x + (d_dialog_w / 2); // coord of x-center int d_txt8_h = 11 * RESFACTOR; // ht of 8-pt text int d_margin = 7 * RESFACTOR; // margin width/height int x_margin = 16 * RESFACTOR; // margin width/height int top_margin = 0; // int d_list_w = 100 * RESFACTOR; int d_list_h = 7 * RESFACTOR; int d_list_x = d_dialog_cx - d_list_w / 2; int d_list_y = d_dialog_y + d_margin + 24; #if (GERMAN | FRENCH) int d_ok_w = 40 * RESFACTOR; #else int d_ok_w = 40 * RESFACTOR; #endif int d_ok_h = 13 * RESFACTOR; int d_ok_x = d_dialog_cx - d_ok_w / 2; int d_ok_y = d_dialog_y + d_dialog_h - d_ok_h - d_margin; /* ** Button enumerations */ enum { BUTTON_OK = 100, CHECK_FIND, CHECK_PAGE, CHECK_LANGUAGE, CHECK_ALLGAMES, CHECK_RANKAM, }; /* ** Buttons */ ControlClass* commands = NULL; // the button list TextButtonClass OkBtn( BUTTON_OK, TXT_OK, TPF_BUTTON, d_ok_x, d_ok_y, d_ok_w ); BigCheckBoxClass FindCheck( CHECK_FIND, d_list_x, d_list_y, d_list_w, d_list_h, TXT_WOL_OPTFIND, TPF_6PT_GRAD | TPF_NOSHADOW, pWO->bFindEnabled ); BigCheckBoxClass PageCheck( CHECK_PAGE, d_list_x, d_list_y + d_list_h + 2, d_list_w, d_list_h, TXT_WOL_OPTPAGE, TPF_6PT_GRAD | TPF_NOSHADOW, pWO->bPageEnabled ); BigCheckBoxClass LanguageCheck( CHECK_LANGUAGE, d_list_x, d_list_y + 2 * ( d_list_h + 2 ), d_list_w, d_list_h, TXT_WOL_OPTLANGUAGE, TPF_6PT_GRAD | TPF_NOSHADOW, pWO->bLangFilter ); BigCheckBoxClass GamescopeCheck( CHECK_ALLGAMES, d_list_x, d_list_y + 3 * ( d_list_h + 2 ), d_list_w, d_list_h, TXT_WOL_OPTGAMESCOPE, TPF_6PT_GRAD | TPF_NOSHADOW, !pWO->bAllGamesShown ); BigCheckBoxClass RankAMCheck( CHECK_RANKAM, d_list_x, d_list_y + 4 * ( d_list_h + 2 ), d_list_w, d_list_h, TXT_WOL_OPTRANKAM, TPF_6PT_GRAD | TPF_NOSHADOW, !pWO->bShowRankRA ); /* ** Initialize. */ Set_Logic_Page(SeenBuff); /* ** Create the button list. */ commands = &OkBtn; FindCheck.Add_Tail(*commands); PageCheck.Add_Tail(*commands); LanguageCheck.Add_Tail(*commands); GamescopeCheck.Add_Tail(*commands); RankAMCheck.Add_Tail(*commands); /* ** Main Processing Loop. */ Keyboard->Clear(); bool display = true; bool process = true; while (process) { /* ** Invoke game callback. */ if( !bCalledFromGame ) Call_Back(); else { if( Main_Loop() ) // Game ended on us in the background. { process = false; bReturn = true; } } #ifdef WIN32 /* ** If we have just received input focus again after running in the background then ** we need to redraw. */ if (AllSurfaces.SurfacesRestored) { AllSurfaces.SurfacesRestored=FALSE; display = true; } #endif /* ** Refresh display if needed. */ if (display) { /* ** Display the dialog box. */ Hide_Mouse(); Dialog_Box(d_dialog_x, d_dialog_y, d_dialog_w, d_dialog_h); Draw_Caption( TXT_WOL_OPTTITLE, d_dialog_x, d_dialog_y, d_dialog_w ); commands->Flag_List_To_Redraw(); Show_Mouse(); display = false; } // Force mouse visible, as some beta testers report unexplicable disappearing cursors. while( Get_Mouse_State() ) Show_Mouse(); // Be nice to other apps. Sleep( 50 ); /* ** Get user input. */ KeyNumType input = commands->Input(); // My hack for triggering escape and return on key up instead of down... // The problem that was occurring was that the calling dialog would act on the key up, // though this dialog handled the key down. ajw if( ( ::GetAsyncKeyState( VK_ESCAPE ) & 0x8000 ) ) { bEscapeDown = true; } else if( bEscapeDown ) { input = (KeyNumType)( BUTTON_OK | KN_BUTTON ); bEscapeDown = false; } if( ( ::GetAsyncKeyState( VK_RETURN ) & 0x8000 ) ) { if( !bIgnoreReturnDown ) bReturnDown = true; } else { bIgnoreReturnDown = false; if( bReturnDown ) { input = (KeyNumType)( BUTTON_OK | KN_BUTTON ); bReturnDown = false; } } /* ** Process input. */ if( cancel_current_msgbox ) { cancel_current_msgbox = false; input = (KeyNumType)( BUTTON_OK | KN_BUTTON ); } switch( input ) { case ( BUTTON_OK | KN_BUTTON ): process = false; break; case ( CHECK_FIND | KN_BUTTON ): case ( CHECK_PAGE | KN_BUTTON ): case ( CHECK_LANGUAGE | KN_BUTTON ): case ( CHECK_ALLGAMES | KN_BUTTON ): pWO->SetOptions( FindCheck.IsOn, PageCheck.IsOn, LanguageCheck.IsOn, !GamescopeCheck.IsOn ); break; case ( CHECK_RANKAM | KN_BUTTON ): pWO->bShowRankRA = !RankAMCheck.IsOn; pWO->bMyRecordUpdated = true; pWO->bShowRankUpdated = true; break; default: break; } } return bReturn; } #endif