| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- /*
- ** Command & Conquer Red Alert(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/>.
- */
- #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
|