| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- //
- // 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
- /* $Header: /CounterStrike/SOUNDDLG.CPP 1 3/03/97 10:25a Joe_bostic $ */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : Command & Conquer *
- * *
- * File Name : SOUNDDLG.CPP *
- * *
- * Programmer : Maria del Mar McCready-Legg, Joe L. Bostic *
- * *
- * Start Date : Jan 8, 1995 *
- * *
- * Last Update : September 22, 1995 [JLB] *
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * MusicListClass::Draw_Entry -- Draw the score line in a list box. *
- * SoundControlsClass::Process -- Handles all the options graphic interface. *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "function.h"
- #include "sounddlg.h"
- class MusicListClass : public ListClass
- {
- public:
- MusicListClass(int id, int x, int y, int w, int h) :
- ListClass(id, x, y, w, h, TPF_6PT_GRAD|TPF_NOSHADOW, MFCD::Retrieve("BTN-UP.SHP"), MFCD::Retrieve("BTN-DN.SHP"))
- {};
- virtual ~MusicListClass(void) {};
- protected:
- virtual void Draw_Entry(int index, int x, int y, int width, int selected);
- };
- /***********************************************************************************************
- * SoundControlsClass::Process -- Handles all the options graphic interface. *
- * *
- * This routine is the main control for the visual representation of the options *
- * screen. It handles the visual overlay and the player input. *
- * *
- * INPUT: none *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: 12/31/1994 MML : Created. *
- *=============================================================================================*/
- void SoundControlsClass::Process(void)
- {
- /*
- ** Adjust dialog controls for resolution
- */
- int option_width= OPTION_WIDTH * RESFACTOR;
- int option_height= OPTION_HEIGHT * RESFACTOR;
- int option_x= OPTION_X * RESFACTOR;
- int option_y= OPTION_Y * RESFACTOR;
- int listbox_x= LISTBOX_X * RESFACTOR;
- int listbox_y= LISTBOX_Y * RESFACTOR;
- int listbox_w= LISTBOX_W * RESFACTOR;
- #ifdef FIXIT_CSII // checked - ajw 9/28/98
- #ifdef WIN32
- int listbox_h= (LISTBOX_H * RESFACTOR)+2;
- #else
- int listbox_h= LISTBOX_H * RESFACTOR;
- #endif
- #else
- int listbox_h= LISTBOX_H * RESFACTOR;
- #endif
- int button_width= BUTTON_WIDTH * RESFACTOR;
- int button_x= BUTTON_X * RESFACTOR;
- int button_y= BUTTON_Y * RESFACTOR;
- int stop_x= STOP_X * RESFACTOR;
- int stop_y= STOP_Y * RESFACTOR;
- int play_x= PLAY_X * RESFACTOR;
- int play_y= PLAY_Y * RESFACTOR;
- int onoff_width= ONOFF_WIDTH * RESFACTOR;
- int shuffle_x= SHUFFLE_X * RESFACTOR;
- int shuffle_y= SHUFFLE_Y * RESFACTOR;
- int repeat_x= REPEAT_X * RESFACTOR;
- int repeat_y= REPEAT_Y * RESFACTOR;
- int mslider_x= MSLIDER_X * RESFACTOR;
- int mslider_y= MSLIDER_Y * RESFACTOR;
- int mslider_w= MSLIDER_W * RESFACTOR;
- int mslider_height= MSLIDER_HEIGHT * RESFACTOR;
- int fxslider_x= FXSLIDER_X * RESFACTOR;
- int fxslider_y= FXSLIDER_Y * RESFACTOR;
- int fxslider_w= FXSLIDER_W * RESFACTOR;
- int fxslider_height= FXSLIDER_HEIGHT * RESFACTOR;
- int button_stop= BUTTON_STOP;
- int button_play= BUTTON_PLAY;
- int button_shuffle= BUTTON_SHUFFLE;
- int button_repeat= BUTTON_REPEAT;
- int button_options= BUTTON_OPTIONS;
- int slider_music= SLIDER_MUSIC;
- int slider_sound= SLIDER_SOUND;
- int button_listbox= BUTTON_LISTBOX;
- RemapControlType * scheme = GadgetClass::Get_Color_Scheme();
- // ThemeType theme;
- /*
- ** List box that holds the score text strings.
- */
- MusicListClass listbox(0, option_x+listbox_x, option_y+listbox_y, listbox_w, listbox_h);
- /*
- ** Return to options menu button.
- */
- TextButtonClass returnto(BUTTON_OPTIONS, TXT_OK, TPF_BUTTON, option_x+button_x, option_y+button_y, button_width);
- // TextButtonClass returnto(BUTTON_OPTIONS, TXT_OPTIONS_MENU, TPF_BUTTON,
- /*
- ** Stop playing button.
- */
- ShapeButtonClass stopbtn(BUTTON_STOP, MFCD::Retrieve("BTN-ST.SHP"), option_x+stop_x, option_y+stop_y);
- /*
- ** Start playing button.
- */
- ShapeButtonClass playbtn(BUTTON_PLAY, MFCD::Retrieve("BTN-PL.SHP"), option_x+play_x, option_y+play_y);
- /*
- ** Shuffle control.
- */
- TextButtonClass shufflebtn(BUTTON_SHUFFLE, TXT_OFF, TPF_BUTTON, option_x+shuffle_x, option_y+shuffle_y, onoff_width);
- // TextButtonClass shufflebtn(BUTTON_SHUFFLE, TXT_OFF, TPF_BUTTON, option_x+shuffle_x, option_y+shuffle_y, ONOFF_WIDTH);
- /*
- ** Repeat control.
- */
- TextButtonClass repeatbtn(BUTTON_REPEAT, TXT_OFF, TPF_BUTTON, option_x+repeat_x, option_y+repeat_y, onoff_width);
- /*
- ** Music volume slider.
- */
- SliderClass music(SLIDER_MUSIC, option_x+mslider_x, option_y+mslider_y, mslider_w, mslider_height, true);
- /*
- ** Sound volume slider.
- */
- SliderClass sound(SLIDER_SOUND, option_x+fxslider_x, option_y+fxslider_y, fxslider_w, fxslider_height, true);
- /*
- ** Causes left mouse clicks inside the dialog area, but not on any
- ** particular button, to be ignored.
- */
- GadgetClass area(option_x, option_y, option_width, option_height, GadgetClass::LEFTPRESS);
- /*
- ** Causes right clicks anywhere or left clicks outside of the dialog
- ** box area to be the same a clicking the return to game options button.
- */
- ControlClass ctrl(BUTTON_OPTIONS, 0, 0, SeenBuff.Get_Width(), SeenBuff.Get_Height(), GadgetClass::RIGHTPRESS|GadgetClass::LEFTPRESS);
- /*
- ** The repeat and shuffle buttons are of the toggle type. They toggle
- ** between saying "on" and "off".
- */
- shufflebtn.IsToggleType = true;
- if (Options.IsScoreShuffle) {
- shufflebtn.Turn_On();
- } else {
- shufflebtn.Turn_Off();
- }
- shufflebtn.Set_Text(shufflebtn.IsOn ? TXT_ON : TXT_OFF);
- repeatbtn.IsToggleType = true;
- if (Options.IsScoreRepeat) {
- repeatbtn.Turn_On();
- } else {
- repeatbtn.Turn_Off();
- }
- repeatbtn.Set_Text(repeatbtn.IsOn ? TXT_ON : TXT_OFF);
- /*
- ** Set the initial values of the sliders.
- */
- music.Set_Maximum(255);
- music.Set_Thumb_Size(16);
- music.Set_Value(Options.ScoreVolume * 256);
- sound.Set_Maximum(255);
- sound.Set_Thumb_Size(16);
- sound.Set_Value(Options.Volume * 256);
- /*
- ** Set up the window. Window x-coords are in bytes not pixels.
- */
- Set_Logic_Page(SeenBuff);
- /*
- ** Create Buttons.
- */
- GadgetClass * optionsbtn = &returnto;
- listbox.Add_Tail(*optionsbtn);
- stopbtn.Add_Tail(*optionsbtn);
- playbtn.Add_Tail(*optionsbtn);
- shufflebtn.Add_Tail(*optionsbtn);
- repeatbtn.Add_Tail(*optionsbtn);
- music.Add_Tail(*optionsbtn);
- sound.Add_Tail(*optionsbtn);
- area.Add_Tail(*optionsbtn);
- ctrl.Add_Tail(*optionsbtn);
- /*
- ** Add all the themes to the list box. The list box entries are constructed
- ** and then stored into allocated EMS memory blocks.
- */
- for (ThemeType index = THEME_FIRST; index < Theme.Max_Themes(); index++) {
- if (Theme.Is_Allowed(index)) {
- char buffer[100];
- int length = Theme.Track_Length(index);
- char const * fullname = Theme.Full_Name(index);
- void * ptr = new char [sizeof(buffer)];
- if (ptr) {
- sprintf((char *)ptr, "%cTrack %d\t%d:%02d\t%s", index, listbox.Count()+1, length / 60, length % 60, fullname);
- listbox.Add_Item((char const *)ptr);
- }
- if (Theme.What_Is_Playing() == index) {
- listbox.Set_Selected_Index(listbox.Count()-1);
- }
- }
- }
- static int _tabs[] = {
- 55 * RESFACTOR, 72 * RESFACTOR, 90 * RESFACTOR
- };
- listbox.Set_Tabs(_tabs);
- /*
- ** Main Processing Loop.
- */
- bool display = true;
- bool process = true;
- while (process) {
- /*
- ** Invoke game callback.
- */
- if (Session.Type == GAME_NORMAL || Session.Type == GAME_SKIRMISH) {
- Call_Back();
- } else {
- if (Main_Loop()) {
- process = false;
- }
- }
- #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) {
- Hide_Mouse();
- /*
- ** Draw the background.
- */
- Dialog_Box(option_x, option_y, option_width, option_height);
- Draw_Caption(TXT_SOUND_CONTROLS, option_x, option_y, option_width);
- /*
- ** Draw the Music, Speech & Sound titles.
- */
- Fancy_Text_Print(TXT_MUSIC_VOLUME, option_x+mslider_x-(5 * RESFACTOR), option_y+mslider_y-(2 * RESFACTOR), scheme, TBLACK, TPF_TEXT|TPF_RIGHT);
- Fancy_Text_Print(TXT_SOUND_VOLUME, option_x+fxslider_x-(5 * RESFACTOR), option_y+fxslider_y-(2 * RESFACTOR), scheme, TBLACK, TPF_TEXT|TPF_RIGHT);
- #if defined(GERMAN) || defined(FRENCH)
- Fancy_Text_Print(TXT_SHUFFLE, option_x+4+shuffle_x-(5 * RESFACTOR), option_y+shuffle_y+(1 * RESFACTOR), scheme, TBLACK, TPF_TEXT|TPF_RIGHT);
- #else
- Fancy_Text_Print(TXT_SHUFFLE, option_x+shuffle_x-(5 * RESFACTOR), option_y+shuffle_y+(1 * RESFACTOR), scheme, TBLACK, TPF_TEXT|TPF_RIGHT);
- #endif
- Fancy_Text_Print(TXT_REPEAT, option_x+repeat_x-(5 * RESFACTOR), option_y+repeat_y+(1 * RESFACTOR), scheme, TBLACK, TPF_TEXT|TPF_RIGHT);
- optionsbtn->Draw_All();
- Show_Mouse();
- display = false;
- }
- /*
- ** Get user input.
- */
- KeyNumType input = optionsbtn->Input();
- /*
- ** Process Input.
- */
- switch (input) {
- case KN_ESC:
- case BUTTON_OPTIONS|KN_BUTTON:
- process = false;
- break;
- /*
- ** Control music volume.
- */
- case SLIDER_MUSIC|KN_BUTTON:
- Options.Set_Score_Volume(fixed(music.Get_Value(), 256), true);
- #ifdef FIXIT_VERSION_3
- if( Session.Type != GAME_NORMAL )
- Options.MultiScoreVolume = Options.ScoreVolume;
- #endif
- break;
- /*
- ** Control sound volume.
- */
- case SLIDER_SOUND|KN_BUTTON:
- Options.Set_Sound_Volume(fixed(sound.Get_Value(), 256), true);
- break;
- case BUTTON_LISTBOX|KN_BUTTON:
- break;
- /*
- ** Stop all themes from playing.
- */
- case BUTTON_STOP|KN_BUTTON:
- Theme.Stop();
- Theme.Queue_Song(THEME_QUIET);
- // Theme.Queue_Song(THEME_NONE);
- break;
- /*
- ** Start the currently selected theme to play.
- */
- case KN_SPACE:
- case BUTTON_PLAY|KN_BUTTON:
- Theme.Queue_Song( (ThemeType)*((unsigned char *)listbox.Current_Item()) );
- break;
- /*
- ** Toggle the shuffle button.
- */
- case BUTTON_SHUFFLE|KN_BUTTON:
- shufflebtn.Set_Text(shufflebtn.IsOn ? TXT_ON : TXT_OFF);
- Options.Set_Shuffle(shufflebtn.IsOn);
- break;
- /*
- ** Toggle the repeat button.
- */
- case BUTTON_REPEAT|KN_BUTTON:
- repeatbtn.Set_Text(repeatbtn.IsOn ? TXT_ON : TXT_OFF);
- Options.Set_Repeat(repeatbtn.IsOn);
- break;
- }
- }
- /*
- ** If the score volume was turned all the way down, then actually
- ** stop the scores from being played.
- */
- if (Options.ScoreVolume == 0) {
- Theme.Stop();
- }
- /*
- ** Free the items from the list box.
- */
- while (listbox.Count()) {
- char const * ptr = listbox.Get_Item(0);
- listbox.Remove_Item(ptr);
- delete [] (void*)ptr;
- }
- }
- /***********************************************************************************************
- * MusicListClass::Draw_Entry -- Draw the score line in a list box. *
- * *
- * This routine will display the score line in a list box. It overrides the list box *
- * handler for line drawing. *
- * *
- * INPUT: index -- The index within the list box that is being drawn. *
- * *
- * x,y -- The pixel coordinates of the upper left position of the line. *
- * *
- * width -- The width of the line that drawing is allowed to use. *
- * *
- * selected-- Is the current line selected? *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 09/22/1995 JLB : Created. *
- *=============================================================================================*/
- void MusicListClass::Draw_Entry(int index, int x, int y, int width, int selected)
- {
- RemapControlType * scheme = GadgetClass::Get_Color_Scheme();
- if (TextFlags & TPF_6PT_GRAD) {
- TextPrintType flags = TextFlags;
- if (selected) {
- flags = flags | TPF_BRIGHT_COLOR;
- LogicPage->Fill_Rect (x, y, x + width - 1, y + LineHeight - 1,
- GadgetClass::Get_Color_Scheme()->Shadow);
- } else {
- if (!(flags & TPF_USE_GRAD_PAL)) {
- flags = flags | TPF_MEDIUM_COLOR;
- }
- }
- Conquer_Clip_Text_Print((char *)List[index] + 1, x, y, scheme, TBLACK, flags, width, Tabs);
- } else {
- Conquer_Clip_Text_Print((char *)List[index] + 1, x, y,
- (selected ? &ColorRemaps[PCOLOR_DIALOG_BLUE] : &ColorRemaps[PCOLOR_GREY]), TBLACK, TextFlags, width, Tabs);
- }
- }
|