Files
source/Options Screen.cpp
T
Overhaul 7a27e7105d New attack busy system
Added missing #includes

Added LUA scripting and console

Changed the way tracers are visualized, so they work more like real tracers instead of a light fountain

Fixed signedness of many grid variables used in GetMouseMapPos calls

Fixed enemy weapon choosing:  Sometimes a mortar is chosen but later rejected, but the grenade class was not reset.  Caused assertion failure

Added checks so enemies don't try to chuck RPG grenades with their hands

Now possible to shoot a someone in the head if he's in water

Fixed InitSightArrays to also clear soldier interrupt duel points.  This was causing an assertion failure elsewhere in the code because the interrupt list still had soldiers on it sometimes when this function was called.

Soldiers are much less willing to forfeit their turn over an attempt to use more APs than they have

Removed early setting of muzzle flash.  This would allow enemies to get an interrupt before you even fired.

Fixed item dropping by AI.  If AI tried to drop something while standing it would cause deadlock

Change to greatly speed up closing the sector inventory window in an unloaded sector

Added conditional compile flag to always give robot weapon ready advantage, even for 360 degree sighting


Check builddefines.h for the conditional flags.  Of greatest interest might be LUA_CONSOLE.  This will cause the game to bring up a command console when run.  However this console is severely lacking in many areas.  If anybody knows of an open-source terminal/console that could be used instead, it would be appreciated.  The existing console does bad things when you try to close it, and since it counts as a separate app, it pauses the game while it has focus.

LUA scripting is very limited, basically just proof of concept.  There is one global variable, the Soldiers array.  An array index gives you the soldier in that slot in the currently loaded sector.  The soldier has a few things that can be accessed:  name (short name); fullname (long name); grid (current grid #, can be changed); walkto(grid) (function to walk to another grid); runto(grid) (function to run to another grid)


git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@924 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2007-06-09 09:01:04 +00:00

1421 lines
44 KiB
C++

#ifdef PRECOMPILEDHEADERS
#include "JA2 All.h"
#else
#include "Types.h"
#include "Options Screen.h"
#include "Video.h"
#include "Font Control.h"
#include "Game Clock.h"
#include "Render Dirty.h"
#include "Text Input.h"
#include "WordWrap.h"
#include "SaveLoadScreen.h"
#include "Render Dirty.h"
#include "WordWrap.h"
#include "WCheck.h"
#include "Utilities.h"
#include "Slider.h"
#include "Debug.h"
#include "Music Control.h"
#include "Sound Control.h"
#include "soundman.h"
#include "Ambient Control.h"
#include "Worlddat.h"
#include "Worlddef.h"
#include "GameSettings.h"
#include "Game Init.h"
#include "English.h"
#include "Overhead.h"
#include "Gap.h"
#include "Cursors.h"
#include "SysUtil.h"
#include "Exit Grids.h"
#include "Text.h"
#include "Interface Control.h"
#include "Message.h"
#include "Language Defines.h"
#include "Multi Language Graphic Utils.h"
#include "Map Information.h"
#include "SmokeEffects.h"
#endif
#include "WorldMan.h"
/////////////////////////////////
//
// Defines
//
/////////////////////////////////
#define OPT_MAIN_FONT FONT10ARIAL
#define OPT_SLIDER_FONT FONT12ARIAL
#define OPT_MAIN_COLOR OPT_BUTTON_ON_COLOR
#define OPT_HIGHLIGHT_COLOR FONT_MCOLOR_WHITE
#define OPTIONS_SCREEN_WIDTH 440
#define OPTIONS_SCREEN_HEIGHT 400
#define OPTIONS__TOP_LEFT_X iScreenWidthOffset + 100
#define OPTIONS__TOP_LEFT_Y iScreenHeightOffset + 40
#define OPTIONS__BOTTOM_RIGHT_X OPTIONS__TOP_LEFT_X + OPTIONS_SCREEN_WIDTH
#define OPTIONS__BOTTOM_RIGHT_Y OPTIONS__TOP_LEFT_Y + OPTIONS_SCREEN_HEIGHT
#define OPT_SAVE_BTN_X iScreenWidthOffset + 51
#define OPT_SAVE_BTN_Y iScreenHeightOffset + 438
#define OPT_LOAD_BTN_X iScreenWidthOffset + 190
#define OPT_LOAD_BTN_Y OPT_SAVE_BTN_Y
#define OPT_QUIT_BTN_X (SCREEN_WIDTH - 640)/ 2 + 329
#define OPT_QUIT_BTN_Y OPT_SAVE_BTN_Y
#define OPT_DONE_BTN_X iScreenWidthOffset + 469
#define OPT_DONE_BTN_Y OPT_SAVE_BTN_Y
#define OPT_GAP_BETWEEN_TOGGLE_BOXES 18
//Text
#define OPT_TOGGLE_BOX_FIRST_COL_TEXT_X OPT_TOGGLE_BOX_FIRST_COLUMN_X + OPT_SPACE_BETWEEN_TEXT_AND_TOGGLE_BOX
#define OPT_TOGGLE_BOX_FIRST_COL_TEXT_Y OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y
#define OPT_TOGGLE_BOX_SECOND_TEXT_X OPT_TOGGLE_BOX_SECOND_COLUMN_X + OPT_SPACE_BETWEEN_TEXT_AND_TOGGLE_BOX
#define OPT_TOGGLE_BOX_SECOND_TEXT_Y OPT_TOGGLE_BOX_SECOND_COLUMN_START_Y
//toggle boxes
#define OPT_SPACE_BETWEEN_TEXT_AND_TOGGLE_BOX 30
#define OPT_TOGGLE_TEXT_OFFSET_Y 2
#define OPT_TOGGLE_BOX_FIRST_COLUMN_X iScreenWidthOffset + 260
#define OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y iScreenHeightOffset + 82
#define OPT_TOGGLE_BOX_SECOND_COLUMN_X iScreenWidthOffset + 435
#define OPT_TOGGLE_BOX_SECOND_COLUMN_START_Y OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y
#define OPT_TOGGLE_BOX_TEXT_WIDTH OPT_TOGGLE_BOX_SECOND_COLUMN_X - OPT_TOGGLE_BOX_FIRST_COLUMN_X - 20
// Slider bar defines
#define OPT_GAP_BETWEEN_SLIDER_BARS 60
#define OPT_SLIDER_BAR_SIZE 258
#define OPT_SLIDER_TEXT_WIDTH 45
#define OPT_SOUND_FX_TEXT_X iScreenWidthOffset + 38
#define OPT_SOUND_FX_TEXT_Y iScreenHeightOffset + 87
#define OPT_SPEECH_TEXT_X iScreenWidthOffset + 85
#define OPT_SPEECH_TEXT_Y OPT_SOUND_FX_TEXT_Y
#define OPT_MUSIC_TEXT_X iScreenWidthOffset + 137
#define OPT_MUSIC_TEXT_Y OPT_SOUND_FX_TEXT_Y
#define OPT_TEXT_TO_SLIDER_OFFSET_Y 25
#define OPT_SOUND_EFFECTS_SLIDER_X iScreenWidthOffset + 56
#define OPT_SOUND_EFFECTS_SLIDER_Y iScreenHeightOffset + 126
#define OPT_SPEECH_SLIDER_X iScreenWidthOffset + 107
#define OPT_SPEECH_SLIDER_Y OPT_SOUND_EFFECTS_SLIDER_Y
#define OPT_MUSIC_SLIDER_X iScreenWidthOffset + 158
#define OPT_MUSIC_SLIDER_Y OPT_SOUND_EFFECTS_SLIDER_Y
#define OPT_MUSIC_SLIDER_PLAY_SOUND_DELAY 75
#define OPT_FIRST_COLUMN_TOGGLE_CUT_OFF 18
/////////////////////////////////
//
// Global Variables
//
/////////////////////////////////
UINT32 guiOptionBackGroundImage;
UINT32 guiOptionsAddOnImages;
UINT32 guiSoundEffectsSliderID;
UINT32 guiSpeechSliderID;
UINT32 guiMusicSliderID;
BOOLEAN gfOptionsScreenEntry = TRUE;
BOOLEAN gfOptionsScreenExit = FALSE;
BOOLEAN gfRedrawOptionsScreen = TRUE;
CHAR8 gzSavedGameName[ 128 ];
BOOLEAN gfEnteredFromMapScreen=FALSE;
UINT32 guiOptionsScreen = OPTIONS_SCREEN;
UINT32 guiPreviousOptionScreen = OPTIONS_SCREEN;
BOOLEAN gfExitOptionsDueToMessageBox=FALSE;
BOOLEAN gfExitOptionsAfterMessageBox = FALSE;
UINT32 guiSoundFxSliderMoving = 0xffffffff;
UINT32 guiSpeechSliderMoving = 0xffffffff;
INT32 giOptionsMessageBox = -1; // Options pop up messages index value
INT8 gbHighLightedOptionText = -1;
BOOLEAN gfHideBloodAndGoreOption=FALSE; //If a germany build we are to hide the blood and gore option
UINT8 gubFirstColOfOptions=OPT_FIRST_COLUMN_TOGGLE_CUT_OFF;
BOOLEAN gfSettingOfTreeTopStatusOnEnterOfOptionScreen;
BOOLEAN gfSettingOfItemGlowStatusOnEnterOfOptionScreen;
BOOLEAN gfSettingOfDontAnimateSmoke;
// Goto save game Button
void BtnOptGotoSaveGameCallback(GUI_BUTTON *btn,INT32 reason);
UINT32 guiOptGotoSaveGameBtn;
INT32 giOptionsButtonImages;
// Goto load game button
void BtnOptGotoLoadGameCallback(GUI_BUTTON *btn,INT32 reason);
UINT32 guiOptGotoLoadGameBtn;
INT32 giGotoLoadBtnImage;
// QuitButton
void BtnOptQuitCallback(GUI_BUTTON *btn,INT32 reason);
UINT32 guiQuitButton;
INT32 giQuitBtnImage;
// Done Button
void BtnDoneCallback(GUI_BUTTON *btn,INT32 reason);
extern UINT32 guiDoneButton; // symbol already declared globally in AimArchives.cpp (jonathanl)
INT32 giDoneBtnImage;
//checkbox to toggle tracking mode on or off
UINT32 guiOptionsToggles[ NUM_GAME_OPTIONS ];
void BtnOptionsTogglesCallback(GUI_BUTTON *btn,INT32 reason);
//Mouse regions for the name of the option
MOUSE_REGION gSelectedOptionTextRegion[ NUM_GAME_OPTIONS ];
void SelectedOptionTextRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason );
void SelectedOptionTextRegionMovementCallBack(MOUSE_REGION * pRegion, INT32 reason );
//Mouse regions for the area around the toggle boxs
MOUSE_REGION gSelectedToggleBoxAreaRegion;
void SelectedToggleBoxAreaRegionMovementCallBack(MOUSE_REGION * pRegion, INT32 reason );
/////////////////////////////////
//
// Function ProtoTypes
//
/////////////////////////////////
BOOLEAN EnterOptionsScreen();
void RenderOptionsScreen();
void ExitOptionsScreen();
void HandleOptionsScreen();
void GetOptionsScreenUserInput();
void SetOptionsExitScreen( UINT32 uiExitScreen );
void SoundFXSliderChangeCallBack( INT32 iNewValue );
void SpeechSliderChangeCallBack( INT32 iNewValue );
void MusicSliderChangeCallBack( INT32 iNewValue );
//BOOLEAN DoOptionsMessageBox( UINT8 ubStyle, STR16zString, UINT32 uiExitScreen, UINT8 ubFlags, MSGBOX_CALLBACK ReturnCallback );
void ConfirmQuitToMainMenuMessageBoxCallBack( UINT8 bExitValue );
void HandleSliderBarMovementSounds();
void HandleOptionToggle( UINT8 ubButton, BOOLEAN fState, BOOLEAN fDown, BOOLEAN fPlaySound );
void HandleHighLightedText( BOOLEAN fHighLight );
extern BOOLEAN CheckIfGameCdromIsInCDromDrive();
extern void ToggleItemGlow( BOOLEAN fOn );
//ppp
/////////////////////////////////
//
// Code
//
/////////////////////////////////
UINT32 OptionsScreenInit()
{
//Set so next time we come in, we can set up
gfOptionsScreenEntry = TRUE;
return( TRUE );
}
UINT32 OptionsScreenHandle()
{
StartFrameBufferRender();
if( gfOptionsScreenEntry )
{
PauseGame();
EnterOptionsScreen();
gfOptionsScreenEntry = FALSE;
gfOptionsScreenExit = FALSE;
gfRedrawOptionsScreen = TRUE;
RenderOptionsScreen();
//Blit the background to the save buffer
BlitBufferToBuffer( guiRENDERBUFFER, guiSAVEBUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
InvalidateRegion( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
}
RestoreBackgroundRects();
GetOptionsScreenUserInput();
HandleOptionsScreen();
// WANNE 2 <redraw>
if( gfRedrawOptionsScreen )
{
RenderOptionsScreen();
RenderButtons();
gfRedrawOptionsScreen = FALSE;
}
//Render the active slider bars
RenderAllSliderBars();
// render buttons marked dirty
MarkButtonsDirty( );
RenderButtons( );
// ATE: Put here to save RECTS before any fast help being drawn...
SaveBackgroundRects( );
RenderButtonsFastHelp();
ExecuteBaseDirtyRectQueue();
EndFrameBufferRender();
if( gfOptionsScreenExit )
{
ExitOptionsScreen();
gfOptionsScreenExit = FALSE;
gfOptionsScreenEntry = TRUE;
UnPauseGame();
}
return( guiOptionsScreen );
}
UINT32 OptionsScreenShutdown()
{
return( TRUE );
}
BOOLEAN EnterOptionsScreen()
{
VOBJECT_DESC VObjectDesc;
UINT16 usPosY;
UINT8 cnt;
UINT16 usTextWidth, usTextHeight;
// WANNE <do not draw the blackground back>
//ColorFillVideoSurfaceArea( FRAME_BUFFER, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0 );
//Default this to off
gfHideBloodAndGoreOption=FALSE;
#ifndef BLOOD_N_GORE_ENABLED
//This will hide blood and gore option
gfHideBloodAndGoreOption = TRUE;
/*
Uncomment this to enable the check for files to activate the blood and gore option for the german build
if( !FileExists( "Germany.dat" ) && FileExists( "Lecken.dat" ) )
{
gfHideBloodAndGoreOption = FALSE;
}
else
*/
{
gGameSettings.fOptions[ TOPTION_BLOOD_N_GORE ] = FALSE;
}
#endif
//if we are coming from mapscreen
if( guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN )
{
guiTacticalInterfaceFlags &= ~INTERFACE_MAPSCREEN;
gfEnteredFromMapScreen = TRUE;
}
// Stop ambients...
StopAmbients( );
guiOptionsScreen = OPTIONS_SCREEN;
//Init the slider bar;
InitSlider();
if( gfExitOptionsDueToMessageBox )
{
gfRedrawOptionsScreen = TRUE;
gfExitOptionsDueToMessageBox = FALSE;
return( TRUE );
}
gfExitOptionsDueToMessageBox = FALSE;
// load the options screen background graphic and add it
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
FilenameForBPP("INTERFACE\\OptionScreenBase.sti", VObjectDesc.ImageFile);
CHECKF(AddVideoObject(&VObjectDesc, &guiOptionBackGroundImage));
// load button, title graphic and add it
VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
GetMLGFilename( VObjectDesc.ImageFile, MLG_OPTIONHEADER );
CHECKF(AddVideoObject(&VObjectDesc, &guiOptionsAddOnImages));
//Save game button
giOptionsButtonImages = LoadButtonImage("INTERFACE\\OptionScreenAddons.sti", -1,2,-1,3,-1 );
guiOptGotoSaveGameBtn = CreateIconAndTextButton( giOptionsButtonImages, zOptionsText[OPT_SAVE_GAME], OPT_BUTTON_FONT,
OPT_BUTTON_ON_COLOR, DEFAULT_SHADOW,
OPT_BUTTON_OFF_COLOR, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
OPT_SAVE_BTN_X, OPT_SAVE_BTN_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
DEFAULT_MOVE_CALLBACK, BtnOptGotoSaveGameCallback);
SpecifyDisabledButtonStyle( guiOptGotoSaveGameBtn, DISABLED_STYLE_HATCHED );
if( guiPreviousOptionScreen == MAINMENU_SCREEN || !CanGameBeSaved() )
{
DisableButton( guiOptGotoSaveGameBtn );
}
//Load game button
giGotoLoadBtnImage = UseLoadedButtonImage( giOptionsButtonImages, -1,2,-1,3,-1 );
guiOptGotoLoadGameBtn = CreateIconAndTextButton( giGotoLoadBtnImage, zOptionsText[OPT_LOAD_GAME], OPT_BUTTON_FONT,
OPT_BUTTON_ON_COLOR, DEFAULT_SHADOW,
OPT_BUTTON_OFF_COLOR, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
OPT_LOAD_BTN_X, OPT_LOAD_BTN_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
DEFAULT_MOVE_CALLBACK, BtnOptGotoLoadGameCallback);
// SpecifyDisabledButtonStyle( guiBobbyRAcceptOrder, DISABLED_STYLE_SHADED );
//Quit to main menu button
giQuitBtnImage = UseLoadedButtonImage( giOptionsButtonImages, -1,2,-1,3,-1 );
guiQuitButton = CreateIconAndTextButton( giQuitBtnImage, zOptionsText[OPT_MAIN_MENU], OPT_BUTTON_FONT,
OPT_BUTTON_ON_COLOR, DEFAULT_SHADOW,
OPT_BUTTON_OFF_COLOR, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
OPT_QUIT_BTN_X, OPT_QUIT_BTN_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
DEFAULT_MOVE_CALLBACK, BtnOptQuitCallback);
SpecifyDisabledButtonStyle( guiQuitButton, DISABLED_STYLE_HATCHED );
// DisableButton( guiQuitButton );
//Done button
giDoneBtnImage = UseLoadedButtonImage( giOptionsButtonImages, -1,2,-1,3,-1 );
guiDoneButton = CreateIconAndTextButton( giDoneBtnImage, zOptionsText[OPT_DONE], OPT_BUTTON_FONT,
OPT_BUTTON_ON_COLOR, DEFAULT_SHADOW,
OPT_BUTTON_OFF_COLOR, DEFAULT_SHADOW,
TEXT_CJUSTIFIED,
OPT_DONE_BTN_X, OPT_DONE_BTN_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
DEFAULT_MOVE_CALLBACK, BtnDoneCallback);
// SpecifyDisabledButtonStyle( guiBobbyRAcceptOrder, DISABLED_STYLE_SHADED );
//
// Toggle Boxes
//
usTextHeight = GetFontHeight( OPT_MAIN_FONT );
//Create the first column of check boxes
usPosY = OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y;
gubFirstColOfOptions = OPT_FIRST_COLUMN_TOGGLE_CUT_OFF;
for( cnt=0; cnt<gubFirstColOfOptions; cnt++)
{
//if this is the blood and gore option, and we are to hide the option
if( cnt == TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
{
gubFirstColOfOptions++;
//advance to the next
continue;
}
//Check box to toggle tracking mode
guiOptionsToggles[ cnt ] = CreateCheckBoxButton( OPT_TOGGLE_BOX_FIRST_COLUMN_X, usPosY,
"INTERFACE\\OptionsCheckBoxes_12x12.sti", MSYS_PRIORITY_HIGH+10,
BtnOptionsTogglesCallback );
MSYS_SetBtnUserData( guiOptionsToggles[ cnt ], 0, cnt );
usTextWidth = StringPixLength( zOptionsToggleText[ cnt ], OPT_MAIN_FONT );
if( usTextWidth > OPT_TOGGLE_BOX_TEXT_WIDTH )
{
//Get how many lines will be used to display the string, without displaying the string
UINT8 ubNumLines = DisplayWrappedString( 0, 0, OPT_TOGGLE_BOX_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_HIGHLIGHT_COLOR, zOptionsToggleText[ cnt ], FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED | DONT_DISPLAY_TEXT ) / GetFontHeight( OPT_MAIN_FONT );
usTextWidth = OPT_TOGGLE_BOX_TEXT_WIDTH;
//Create mouse regions for the option toggle text
MSYS_DefineRegion( &gSelectedOptionTextRegion[cnt], OPT_TOGGLE_BOX_FIRST_COLUMN_X+13, usPosY, (UINT16)(OPT_TOGGLE_BOX_FIRST_COL_TEXT_X+usTextWidth), (UINT16)(usPosY+usTextHeight*ubNumLines), MSYS_PRIORITY_HIGH,
CURSOR_NORMAL, SelectedOptionTextRegionMovementCallBack, SelectedOptionTextRegionCallBack );
MSYS_AddRegion( &gSelectedOptionTextRegion[cnt]);
MSYS_SetRegionUserData( &gSelectedOptionTextRegion[ cnt ], 0, cnt);
}
else
{
//Create mouse regions for the option toggle text
MSYS_DefineRegion( &gSelectedOptionTextRegion[cnt], OPT_TOGGLE_BOX_FIRST_COLUMN_X+13, usPosY, (UINT16)(OPT_TOGGLE_BOX_FIRST_COL_TEXT_X+usTextWidth), (UINT16)(usPosY+usTextHeight), MSYS_PRIORITY_HIGH,
CURSOR_NORMAL, SelectedOptionTextRegionMovementCallBack, SelectedOptionTextRegionCallBack );
MSYS_AddRegion( &gSelectedOptionTextRegion[cnt]);
MSYS_SetRegionUserData( &gSelectedOptionTextRegion[ cnt ], 0, cnt);
}
SetRegionFastHelpText( &gSelectedOptionTextRegion[ cnt ], zOptionsScreenHelpText[cnt] );
SetButtonFastHelpText( guiOptionsToggles[ cnt ], zOptionsScreenHelpText[cnt] );
usPosY += OPT_GAP_BETWEEN_TOGGLE_BOXES;
}
//Create the 2nd column of check boxes
usPosY = OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y;
for( cnt=gubFirstColOfOptions; cnt<NUM_GAME_OPTIONS; cnt++)
{
//Check box to toggle tracking mode
guiOptionsToggles[ cnt ] = CreateCheckBoxButton( OPT_TOGGLE_BOX_SECOND_COLUMN_X, usPosY,
"INTERFACE\\OptionsCheckBoxes_12x12.sti", MSYS_PRIORITY_HIGH+10,
BtnOptionsTogglesCallback );
MSYS_SetBtnUserData( guiOptionsToggles[ cnt ], 0, cnt );
//
// Create mouse regions for the option toggle text
//
usTextWidth = StringPixLength( zOptionsToggleText[ cnt ], OPT_MAIN_FONT );
if( usTextWidth > OPT_TOGGLE_BOX_TEXT_WIDTH )
{
//Get how many lines will be used to display the string, without displaying the string
UINT8 ubNumLines = DisplayWrappedString( 0, 0, OPT_TOGGLE_BOX_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_HIGHLIGHT_COLOR, zOptionsToggleText[ cnt ], FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED | DONT_DISPLAY_TEXT ) / GetFontHeight( OPT_MAIN_FONT );
usTextWidth = OPT_TOGGLE_BOX_TEXT_WIDTH;
MSYS_DefineRegion( &gSelectedOptionTextRegion[cnt], OPT_TOGGLE_BOX_SECOND_COLUMN_X+13, usPosY, (UINT16)(OPT_TOGGLE_BOX_SECOND_TEXT_X+usTextWidth), (UINT16)(usPosY+usTextHeight*ubNumLines), MSYS_PRIORITY_HIGH,
CURSOR_NORMAL, SelectedOptionTextRegionMovementCallBack, SelectedOptionTextRegionCallBack );
MSYS_AddRegion( &gSelectedOptionTextRegion[cnt]);
MSYS_SetRegionUserData( &gSelectedOptionTextRegion[ cnt ], 0, cnt );
}
else
{
MSYS_DefineRegion( &gSelectedOptionTextRegion[cnt], OPT_TOGGLE_BOX_SECOND_COLUMN_X+13, usPosY, (UINT16)(OPT_TOGGLE_BOX_SECOND_TEXT_X+usTextWidth), (UINT16)(usPosY+usTextHeight), MSYS_PRIORITY_HIGH,
CURSOR_NORMAL, SelectedOptionTextRegionMovementCallBack, SelectedOptionTextRegionCallBack );
MSYS_AddRegion( &gSelectedOptionTextRegion[cnt]);
MSYS_SetRegionUserData( &gSelectedOptionTextRegion[ cnt ], 0, cnt );
}
SetRegionFastHelpText( &gSelectedOptionTextRegion[ cnt ], zOptionsScreenHelpText[cnt] );
SetButtonFastHelpText( guiOptionsToggles[ cnt ], zOptionsScreenHelpText[cnt] );
usPosY += OPT_GAP_BETWEEN_TOGGLE_BOXES;
}
//Create a mouse region so when the user leaves a togglebox text region we can detect it then unselect the region
MSYS_DefineRegion( &gSelectedToggleBoxAreaRegion, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, MSYS_PRIORITY_NORMAL,
CURSOR_NORMAL, SelectedToggleBoxAreaRegionMovementCallBack, MSYS_NO_CALLBACK );
MSYS_AddRegion( &gSelectedToggleBoxAreaRegion );
//Render the scene before adding the slider boxes
RenderOptionsScreen();
//Add a slider bar for the Sound Effects
guiSoundEffectsSliderID = AddSlider( SLIDER_VERTICAL_STEEL, CURSOR_NORMAL, OPT_SOUND_EFFECTS_SLIDER_X, OPT_SOUND_EFFECTS_SLIDER_Y, OPT_SLIDER_BAR_SIZE, 127, MSYS_PRIORITY_HIGH, SoundFXSliderChangeCallBack, 0 );
AssertMsg( guiSoundEffectsSliderID, "Failed to AddSlider" );
SetSliderValue( guiSoundEffectsSliderID, GetSoundEffectsVolume() );
//Add a slider bar for the Speech
guiSpeechSliderID = AddSlider( SLIDER_VERTICAL_STEEL, CURSOR_NORMAL, OPT_SPEECH_SLIDER_X, OPT_SPEECH_SLIDER_Y, OPT_SLIDER_BAR_SIZE, 127, MSYS_PRIORITY_HIGH, SpeechSliderChangeCallBack, 0 );
AssertMsg( guiSpeechSliderID, "Failed to AddSlider" );
SetSliderValue( guiSpeechSliderID, GetSpeechVolume() );
//Add a slider bar for the Music
guiMusicSliderID = AddSlider( SLIDER_VERTICAL_STEEL, CURSOR_NORMAL, OPT_MUSIC_SLIDER_X, OPT_MUSIC_SLIDER_Y, OPT_SLIDER_BAR_SIZE, 127, MSYS_PRIORITY_HIGH, MusicSliderChangeCallBack, 0 );
AssertMsg( guiMusicSliderID, "Failed to AddSlider" );
SetSliderValue( guiMusicSliderID, MusicGetVolume() );
//Remove the mouse region over the clock
RemoveMouseRegionForPauseOfClock( );
//Draw the screen
gfRedrawOptionsScreen = TRUE;
//Set the option screen toggle boxes
SetOptionsScreenToggleBoxes();
DisableScrollMessages();
//reset
gbHighLightedOptionText = -1;
//get the status of the tree top option
gfSettingOfTreeTopStatusOnEnterOfOptionScreen = gGameSettings.fOptions[ TOPTION_TOGGLE_TREE_TOPS ];
//Get the status of the item glow option
gfSettingOfItemGlowStatusOnEnterOfOptionScreen = gGameSettings.fOptions[ TOPTION_GLOW_ITEMS ];
gfSettingOfDontAnimateSmoke = gGameSettings.fOptions[ TOPTION_ANIMATE_SMOKE ];
return( TRUE );
}
void ExitOptionsScreen()
{
UINT8 cnt;
if( gfExitOptionsDueToMessageBox )
{
gfOptionsScreenExit = FALSE;
if( !gfExitOptionsAfterMessageBox )
return;
gfExitOptionsAfterMessageBox = FALSE;
gfExitOptionsDueToMessageBox = FALSE;
}
//Get the current status of the toggle boxes
GetOptionsScreenToggleBoxes();
//The save the current settings to disk
SaveGameSettings();
//Create the clock mouse region
CreateMouseRegionForPauseOfClock( CLOCK_REGION_START_X, CLOCK_REGION_START_Y );
if( guiOptionsScreen == GAME_SCREEN )
EnterTacticalScreen( );
RemoveButton( guiOptGotoSaveGameBtn );
RemoveButton( guiOptGotoLoadGameBtn );
RemoveButton( guiQuitButton );
RemoveButton( guiDoneButton );
UnloadButtonImage( giOptionsButtonImages );
UnloadButtonImage( giGotoLoadBtnImage );
UnloadButtonImage( giQuitBtnImage );
UnloadButtonImage( giDoneBtnImage );
DeleteVideoObjectFromIndex( guiOptionBackGroundImage );
DeleteVideoObjectFromIndex( guiOptionsAddOnImages );
//Remove the toggle buttons
for( cnt=0; cnt<NUM_GAME_OPTIONS; cnt++)
{
//if this is the blood and gore option, and we are to hide the option
if( cnt == TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
{
//advance to the next
continue;
}
RemoveButton( guiOptionsToggles[ cnt ] );
MSYS_RemoveRegion( &gSelectedOptionTextRegion[cnt]);
}
//REmove the slider bars
RemoveSliderBar( guiSoundEffectsSliderID );
RemoveSliderBar( guiSpeechSliderID );
RemoveSliderBar( guiMusicSliderID );
MSYS_RemoveRegion( &gSelectedToggleBoxAreaRegion );
ShutDownSlider();
//if we are coming from mapscreen
if( gfEnteredFromMapScreen )
{
gfEnteredFromMapScreen = FALSE;
guiTacticalInterfaceFlags |= INTERFACE_MAPSCREEN;
}
//if the user changed the TREE TOP option, AND a world is loaded
if( gfSettingOfTreeTopStatusOnEnterOfOptionScreen != gGameSettings.fOptions[ TOPTION_TOGGLE_TREE_TOPS ] && gfWorldLoaded )
{
SetTreeTopStateForMap();
}
//if the user has changed the item glow option AND a world is loaded
if( gfSettingOfItemGlowStatusOnEnterOfOptionScreen != gGameSettings.fOptions[ TOPTION_GLOW_ITEMS ] && gfWorldLoaded )
{
ToggleItemGlow( gGameSettings.fOptions[ TOPTION_GLOW_ITEMS ] );
}
if( gfSettingOfDontAnimateSmoke != gGameSettings.fOptions[ TOPTION_ANIMATE_SMOKE ] && gfWorldLoaded )
{
UpdateSmokeEffectGraphics( );
}
}
void HandleOptionsScreen()
{
HandleSliderBarMovementSounds();
HandleHighLightedText( TRUE );
}
void RenderOptionsScreen()
{
HVOBJECT hPixHandle;
UINT16 usPosY;
UINT8 cnt;
UINT16 usWidth=0;
//Get and display the background image
GetVideoObject(&hPixHandle, guiOptionBackGroundImage);
BltVideoObject(FRAME_BUFFER, hPixHandle, 0, iScreenWidthOffset, iScreenHeightOffset, VO_BLT_SRCTRANSPARENCY,NULL);
//Get and display the titla image
GetVideoObject(&hPixHandle, guiOptionsAddOnImages);
BltVideoObject(FRAME_BUFFER, hPixHandle, 0, iScreenWidthOffset, iScreenHeightOffset, VO_BLT_SRCTRANSPARENCY,NULL);
BltVideoObject(FRAME_BUFFER, hPixHandle, 1, iScreenWidthOffset, iScreenHeightOffset + 434, VO_BLT_SRCTRANSPARENCY,NULL);
//
// Text for the toggle boxes
//
usPosY = OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y + OPT_TOGGLE_TEXT_OFFSET_Y;
//Display the First column of toggles
for( cnt=0; cnt<gubFirstColOfOptions; cnt++)
{
//if this is the blood and gore option, and we are to hide the option
if( cnt == TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
{
//advance to the next
continue;
}
usWidth = StringPixLength( zOptionsToggleText[ cnt ], OPT_MAIN_FONT );
//if the string is going to wrap, move the string up a bit
if( usWidth > OPT_TOGGLE_BOX_TEXT_WIDTH )
DisplayWrappedString( OPT_TOGGLE_BOX_FIRST_COL_TEXT_X, usPosY, OPT_TOGGLE_BOX_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_MAIN_COLOR, zOptionsToggleText[ cnt ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
else
DrawTextToScreen( zOptionsToggleText[ cnt ], OPT_TOGGLE_BOX_FIRST_COL_TEXT_X, usPosY, 0, OPT_MAIN_FONT, OPT_MAIN_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
usPosY += OPT_GAP_BETWEEN_TOGGLE_BOXES;
}
usPosY = OPT_TOGGLE_BOX_SECOND_COLUMN_START_Y + OPT_TOGGLE_TEXT_OFFSET_Y;
//Display the 2nd column of toggles
for( cnt=gubFirstColOfOptions; cnt<NUM_GAME_OPTIONS; cnt++)
{
usWidth = StringPixLength( zOptionsToggleText[ cnt ], OPT_MAIN_FONT );
//if the string is going to wrap, move the string up a bit
if( usWidth > OPT_TOGGLE_BOX_TEXT_WIDTH )
DisplayWrappedString( OPT_TOGGLE_BOX_SECOND_TEXT_X, usPosY, OPT_TOGGLE_BOX_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_MAIN_COLOR, zOptionsToggleText[ cnt ], FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
else
DrawTextToScreen( zOptionsToggleText[ cnt ], OPT_TOGGLE_BOX_SECOND_TEXT_X, usPosY, 0, OPT_MAIN_FONT, OPT_MAIN_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
usPosY += OPT_GAP_BETWEEN_TOGGLE_BOXES;
}
//
// Text for the Slider Bars
//
//Display the Sound Fx text
DisplayWrappedString( OPT_SOUND_FX_TEXT_X, OPT_SOUND_FX_TEXT_Y, OPT_SLIDER_TEXT_WIDTH, 2, OPT_SLIDER_FONT, OPT_MAIN_COLOR, zOptionsText[ OPT_SOUND_FX ], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
//Display the Speech text
DisplayWrappedString( OPT_SPEECH_TEXT_X, OPT_SPEECH_TEXT_Y, OPT_SLIDER_TEXT_WIDTH, 2, OPT_SLIDER_FONT, OPT_MAIN_COLOR, zOptionsText[ OPT_SPEECH ], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
//Display the Music text
DisplayWrappedString( OPT_MUSIC_TEXT_X, OPT_MUSIC_TEXT_Y, OPT_SLIDER_TEXT_WIDTH, 2, OPT_SLIDER_FONT, OPT_MAIN_COLOR, zOptionsText[ OPT_MUSIC ], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
// WANNE <I think this is not used>
InvalidateRegion( OPTIONS__TOP_LEFT_X, OPTIONS__TOP_LEFT_Y, OPTIONS__BOTTOM_RIGHT_X, OPTIONS__BOTTOM_RIGHT_Y);
}
void GetOptionsScreenUserInput()
{
InputAtom Event;
POINT MousePos;
GetCursorPos(&MousePos);
while( DequeueEvent( &Event ) )
{
// HOOK INTO MOUSE HOOKS
switch( Event.usEvent)
{
case LEFT_BUTTON_DOWN:
MouseSystemHook(LEFT_BUTTON_DOWN, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
break;
case LEFT_BUTTON_UP:
MouseSystemHook(LEFT_BUTTON_UP, (INT16)MousePos.x, (INT16)MousePos.y ,_LeftButtonDown, _RightButtonDown);
break;
case RIGHT_BUTTON_DOWN:
MouseSystemHook(RIGHT_BUTTON_DOWN, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
break;
case RIGHT_BUTTON_UP:
MouseSystemHook(RIGHT_BUTTON_UP, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
break;
case RIGHT_BUTTON_REPEAT:
MouseSystemHook(RIGHT_BUTTON_REPEAT, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
break;
case LEFT_BUTTON_REPEAT:
MouseSystemHook(LEFT_BUTTON_REPEAT, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
break;
}
if( !HandleTextInput( &Event ) && Event.usEvent == KEY_DOWN )
{
switch( Event.usParam )
{
case ESC:
SetOptionsExitScreen( guiPreviousOptionScreen );
break;
//Enter the save game screen
case 's':
case 'S':
//if the save game button isnt disabled
if( ButtonList[ guiOptGotoSaveGameBtn ]->uiFlags & BUTTON_ENABLED )
{
SetOptionsExitScreen( SAVE_LOAD_SCREEN );
gfSaveGame = TRUE;
}
break;
//Enter the Load game screen
case 'l':
case 'L':
SetOptionsExitScreen( SAVE_LOAD_SCREEN );
gfSaveGame = FALSE;
break;
#ifdef JA2TESTVERSION
case 'r':
gfRedrawOptionsScreen = TRUE;
break;
case 'i':
InvalidateRegion( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
break;
//Test keys
case 'y':
{
static UINT32 uiTest2 = NO_SAMPLE;
if( !SoundIsPlaying( uiTest2 ) )
uiTest2 = PlayJA2SampleFromFile( "Sounds\\RAID Dive.wav", RATE_11025, HIGHVOLUME, 1 , MIDDLEPAN );
}
break;
case 't':
{
/*
{
CHAR8 zCdromRootDrive[512];
HWFILE hFile;
if( !GetCdromLocationFromIniFile( zCdromRootDrive ) )
return;
//Check if a file exists on the cdrom
sprintf( zCdromRootDrive, "%sData\\NPC_Speech.slf", zCdromRootDrive );
// if( FileExistsNoDB( zCdromRootDrive ) )
hFile = FileOpen( zCdromRootDrive, FILE_ACCESS_READ | FILE_OPEN_EXISTING, FALSE );
if( hFile != 0 )
{
FileClose( hFile );
sprintf( zCdromRootDrive, "%sData\\NPC_Speech.slf", zCdromRootDrive );
}
else
{
sprintf( zCdromRootDrive, "%sData\\NPC_Speech.slf", zCdromRootDrive );
}
uiLastTimeToCheckCDromDrive = GetJA2Clock();
}
*/
}
break;
case 'z':
SetErrorMode( SEM_FAILCRITICALERRORS );
break;
case 'q':
// ShouldMercSayPrecedentToRepeatOneSelf( 11, 99 );
break;
#endif
}
}
}
}
void SetOptionsExitScreen( UINT32 uiExitScreen )
{
guiOptionsScreen = uiExitScreen;
gfOptionsScreenExit = TRUE;
}
void BtnOptGotoSaveGameCallback(GUI_BUTTON *btn,INT32 reason)
{
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags |= BUTTON_CLICKED_ON;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
SetOptionsExitScreen( SAVE_LOAD_SCREEN );
gfSaveGame = TRUE;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
}
void BtnOptGotoLoadGameCallback(GUI_BUTTON *btn,INT32 reason)
{
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags |= BUTTON_CLICKED_ON;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
SetOptionsExitScreen( SAVE_LOAD_SCREEN );
gfSaveGame = FALSE;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
}
void BtnOptQuitCallback(GUI_BUTTON *btn,INT32 reason)
{
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags |= BUTTON_CLICKED_ON;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
//Confirm the Exit to the main menu screen
DoOptionsMessageBox( MSG_BOX_BASIC_STYLE, zOptionsText[OPT_RETURN_TO_MAIN], OPTIONS_SCREEN, MSG_BOX_FLAG_YESNO, ConfirmQuitToMainMenuMessageBoxCallBack );
/// SetOptionsExitScreen( MAINMENU_SCREEN );
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
}
void BtnDoneCallback(GUI_BUTTON *btn,INT32 reason)
{
if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
btn->uiFlags |= BUTTON_CLICKED_ON;
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
SetOptionsExitScreen( guiPreviousOptionScreen );
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
{
btn->uiFlags &= (~BUTTON_CLICKED_ON );
InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
}
}
void BtnOptionsTogglesCallback( GUI_BUTTON *btn, INT32 reason )
{
UINT8 ubButton = (UINT8)MSYS_GetBtnUserData( btn, 0 );
if( reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
{
if( btn->uiFlags & BUTTON_CLICKED_ON )
{
HandleOptionToggle( ubButton, TRUE, FALSE, FALSE );
// gGameSettings.fOptions[ ubButton ] = TRUE;
btn->uiFlags |= BUTTON_CLICKED_ON;
}
else
{
btn->uiFlags &= ~BUTTON_CLICKED_ON;
HandleOptionToggle( ubButton, FALSE, FALSE, FALSE);
}
}
else if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
{
if( btn->uiFlags & BUTTON_CLICKED_ON )
{
HandleOptionToggle( ubButton, TRUE, TRUE, FALSE );
btn->uiFlags |= BUTTON_CLICKED_ON;
}
else
{
btn->uiFlags &= ~BUTTON_CLICKED_ON;
HandleOptionToggle( ubButton, FALSE, TRUE, FALSE );
}
}
}
void HandleOptionToggle( UINT8 ubButton, BOOLEAN fState, BOOLEAN fDown, BOOLEAN fPlaySound )
{
static UINT32 uiOptionToggleSound = NO_SAMPLE;
UINT32 uiSideToPlaySoundOn = MIDDLEPAN;
// static BOOLEAN fCheckBoxDrawnDownLastTime = FALSE;
if( fState )
{
gGameSettings.fOptions[ ubButton ] = TRUE;
ButtonList[ guiOptionsToggles[ ubButton ] ]->uiFlags |= BUTTON_CLICKED_ON;
if( fDown )
DrawCheckBoxButtonOn( guiOptionsToggles[ ubButton ] );
}
else
{
gGameSettings.fOptions[ ubButton ] = FALSE;
ButtonList[ guiOptionsToggles[ ubButton ] ]->uiFlags &= ~BUTTON_CLICKED_ON;
if( fDown )
DrawCheckBoxButtonOff( guiOptionsToggles[ ubButton ] );
//check to see if the user is unselecting either the spech or subtitles toggle
if( ubButton == TOPTION_SPEECH || ubButton == TOPTION_SUBTITLES )
{
//make sure that at least of of the toggles is still enabled
if( !(ButtonList[ guiOptionsToggles[ TOPTION_SPEECH ] ]->uiFlags & BUTTON_CLICKED_ON) )
{
if( !( ButtonList[ guiOptionsToggles[ TOPTION_SUBTITLES ] ]->uiFlags & BUTTON_CLICKED_ON ) )
{
gGameSettings.fOptions[ ubButton ] = TRUE;
ButtonList[ guiOptionsToggles[ ubButton ] ]->uiFlags |= BUTTON_CLICKED_ON;
//Confirm the Exit to the main menu screen
DoOptionsMessageBox( MSG_BOX_BASIC_STYLE, zOptionsText[OPT_NEED_AT_LEAST_SPEECH_OR_SUBTITLE_OPTION_ON], OPTIONS_SCREEN, MSG_BOX_FLAG_OK, NULL );
gfExitOptionsDueToMessageBox = FALSE;
}
}
}
}
//stop the sound if
// if( SoundIsPlaying( uiOptionToggleSound ) && !fDown )
{
SoundStop( uiOptionToggleSound );
}
if( fPlaySound )
{
if( fDown )
{
// case BTN_SND_CLICK_OFF:
PlayJA2Sample( BIG_SWITCH3_IN, RATE_11025, BTNVOLUME, 1, MIDDLEPAN );
}
else
{
// case BTN_SND_CLICK_ON:
PlayJA2Sample( BIG_SWITCH3_OUT, RATE_11025, BTNVOLUME, 1, MIDDLEPAN );
}
}
}
void SoundFXSliderChangeCallBack( INT32 iNewValue )
{
SetSoundEffectsVolume( iNewValue );
guiSoundFxSliderMoving = GetJA2Clock();
}
void SpeechSliderChangeCallBack( INT32 iNewValue )
{
SetSpeechVolume( iNewValue );
guiSpeechSliderMoving = GetJA2Clock();
}
void MusicSliderChangeCallBack( INT32 iNewValue )
{
MusicSetVolume( iNewValue );
}
BOOLEAN DoOptionsMessageBoxWithRect( UINT8 ubStyle, const STR16 zString, UINT32 uiExitScreen, UINT16 usFlags, MSGBOX_CALLBACK ReturnCallback, SGPRect *pCenteringRect )
{
// reset exit mode
gfExitOptionsDueToMessageBox = TRUE;
// do message box and return
giOptionsMessageBox = DoMessageBox( ubStyle, zString, uiExitScreen, ( UINT16 ) ( usFlags| MSG_BOX_FLAG_USE_CENTERING_RECT ), ReturnCallback, pCenteringRect );
// send back return state
return( ( giOptionsMessageBox != -1 ) );
}
BOOLEAN DoOptionsMessageBox( UINT8 ubStyle, const STR16 zString, UINT32 uiExitScreen, UINT16 usFlags, MSGBOX_CALLBACK ReturnCallback )
{
SGPRect CenteringRect= {0, 0, SCREEN_WIDTH-1, SCREEN_HEIGHT-1 };
// reset exit mode
gfExitOptionsDueToMessageBox = TRUE;
// do message box and return
giOptionsMessageBox = DoMessageBox( ubStyle, zString, uiExitScreen, ( UINT16 ) ( usFlags| MSG_BOX_FLAG_USE_CENTERING_RECT ), ReturnCallback, &CenteringRect );
// send back return state
return( ( giOptionsMessageBox != -1 ) );
}
void ConfirmQuitToMainMenuMessageBoxCallBack( UINT8 bExitValue )
{
// yes, Quit to main menu
if( bExitValue == MSG_BOX_RETURN_YES )
{
gfEnteredFromMapScreen = FALSE;
gfExitOptionsAfterMessageBox = TRUE;
SetOptionsExitScreen( MAINMENU_SCREEN );
//We want to reinitialize the game
ReStartingGame();
}
else
{
gfExitOptionsAfterMessageBox = FALSE;
gfExitOptionsDueToMessageBox = FALSE;
}
}
void SetOptionsScreenToggleBoxes()
{
UINT8 cnt;
for( cnt=0; cnt<NUM_GAME_OPTIONS; cnt++)
{
if( gGameSettings.fOptions[ cnt ] )
ButtonList[ guiOptionsToggles[ cnt ] ]->uiFlags |= BUTTON_CLICKED_ON;
else
ButtonList[ guiOptionsToggles[ cnt ] ]->uiFlags &= (~BUTTON_CLICKED_ON );
}
}
void GetOptionsScreenToggleBoxes()
{
UINT8 cnt;
for( cnt=0; cnt<NUM_GAME_OPTIONS; cnt++)
{
if( ButtonList[ guiOptionsToggles[ cnt ] ]->uiFlags & BUTTON_CLICKED_ON )
gGameSettings.fOptions[ cnt ] = TRUE;
else
gGameSettings.fOptions[ cnt ] = FALSE;
}
}
void HandleSliderBarMovementSounds()
{
static UINT32 uiLastSoundFxTime=0;
static UINT32 uiLastSpeechTime=0;
UINT32 uiCurTime = GetJA2Clock();
static UINT32 uiLastPlayingSoundID = NO_SAMPLE;
static UINT32 uiLastPlayingSpeechID = NO_SAMPLE;
if( ( uiLastSoundFxTime - OPT_MUSIC_SLIDER_PLAY_SOUND_DELAY ) > guiSoundFxSliderMoving )
{
guiSoundFxSliderMoving = 0xffffffff;
//The slider has stopped moving, reset the ambient sector sounds ( so it will change the volume )
if( !DidGameJustStart() )
HandleNewSectorAmbience( gTilesets[ giCurrentTilesetID ].ubAmbientID );
if( !SoundIsPlaying( uiLastPlayingSoundID ) )
uiLastPlayingSoundID = PlayJA2SampleFromFile( "Sounds\\Weapons\\LMG Reload.wav", RATE_11025, HIGHVOLUME, 1 , MIDDLEPAN );
}
else
uiLastSoundFxTime = GetJA2Clock();
if( ( uiLastSpeechTime - OPT_MUSIC_SLIDER_PLAY_SOUND_DELAY ) > guiSpeechSliderMoving )
{
guiSpeechSliderMoving = 0xffffffff;
if( !SoundIsPlaying( uiLastPlayingSpeechID ) )
uiLastPlayingSpeechID = PlayJA2GapSample( "BattleSnds\\m_cool.wav", RATE_11025, HIGHVOLUME, 1, MIDDLEPAN, NULL );
}
else
uiLastSpeechTime = GetJA2Clock();
}
void SelectedOptionTextRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason )
{
UINT8 ubButton = (UINT8)MSYS_GetRegionUserData( pRegion, 0 );
if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
{
HandleOptionToggle( ubButton, (BOOLEAN)(!gGameSettings.fOptions[ ubButton ]), FALSE, TRUE );
InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
}
else if( iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN )//iReason & MSYS_CALLBACK_REASON_LBUTTON_REPEAT ||
{
if( gGameSettings.fOptions[ ubButton ] )
{
HandleOptionToggle( ubButton, TRUE, TRUE, TRUE );
}
else
{
HandleOptionToggle( ubButton, FALSE, TRUE, TRUE );
}
}
}
void SelectedOptionTextRegionMovementCallBack(MOUSE_REGION * pRegion, INT32 reason )
{
INT8 bButton = (INT8)MSYS_GetRegionUserData( pRegion, 0 );
if( reason & MSYS_CALLBACK_REASON_LOST_MOUSE )
{
HandleHighLightedText( FALSE );
gbHighLightedOptionText = -1;
InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
}
else if( reason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
{
gbHighLightedOptionText = bButton;
InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
}
}
void HandleHighLightedText( BOOLEAN fHighLight )
{
UINT16 usPosX=0;
UINT16 usPosY=0;
UINT8 ubCnt;
INT8 bHighLight=-1;
UINT16 usWidth;
static INT8 bLastRegion = -1;
if( gbHighLightedOptionText == -1 )
fHighLight = FALSE;
//if the user has the mouse in one of the checkboxes
for( ubCnt=0; ubCnt<NUM_GAME_OPTIONS;ubCnt++)
{
if( ubCnt == TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
{
//advance to the next
continue;
}
if( ButtonList[ guiOptionsToggles[ ubCnt ] ]->Area.uiFlags & MSYS_MOUSE_IN_AREA )
{
gbHighLightedOptionText = ubCnt;
fHighLight = TRUE;
}
}
// If there is a valid section being highlighted
if( gbHighLightedOptionText != -1 )
{
bLastRegion = gbHighLightedOptionText;
}
bHighLight = gbHighLightedOptionText;
if( bLastRegion != -1 && gbHighLightedOptionText == -1 )
{
fHighLight = FALSE;
bHighLight = bLastRegion;
bLastRegion = -1;
}
//If we are to hide the blood and gore option, and we are to highlight an option past the blood and gore option
//reduce the highlight number by 1
if( bHighLight >= TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
{
bHighLight--;
}
if( bHighLight != -1 )
{
if( bHighLight < OPT_FIRST_COLUMN_TOGGLE_CUT_OFF )
{
usPosX = OPT_TOGGLE_BOX_FIRST_COL_TEXT_X;
usPosY = OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y + OPT_TOGGLE_TEXT_OFFSET_Y + ( bHighLight * OPT_GAP_BETWEEN_TOGGLE_BOXES ) ;
}
else
{
usPosX = OPT_TOGGLE_BOX_SECOND_TEXT_X;
usPosY = OPT_TOGGLE_BOX_SECOND_COLUMN_START_Y + OPT_TOGGLE_TEXT_OFFSET_Y + ( ( bHighLight - OPT_FIRST_COLUMN_TOGGLE_CUT_OFF ) * OPT_GAP_BETWEEN_TOGGLE_BOXES ) ;
}
//If we are to hide the blood and gore option, and we are to highlight an option past the blood and gore option
//reduce the highlight number by 1
if( bHighLight >= TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
{
bHighLight++;
}
usWidth = StringPixLength( zOptionsToggleText[ bHighLight ], OPT_MAIN_FONT );
//if the string is going to wrap, move the string up a bit
if( usWidth > OPT_TOGGLE_BOX_TEXT_WIDTH )
{
if( fHighLight )
DisplayWrappedString( usPosX, usPosY, OPT_TOGGLE_BOX_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_HIGHLIGHT_COLOR, zOptionsToggleText[ bHighLight ], FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
// DrawTextToScreen( zOptionsToggleText[ bHighLight ], usPosX, usPosY, 0, OPT_MAIN_FONT, OPT_HIGHLIGHT_COLOR, FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
else
DisplayWrappedString( usPosX, usPosY, OPT_TOGGLE_BOX_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_MAIN_COLOR, zOptionsToggleText[ bHighLight ], FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
// DrawTextToScreen( zOptionsToggleText[ bHighLight ], usPosX, usPosY, 0, OPT_MAIN_FONT, OPT_MAIN_COLOR, FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
}
else
{
if( fHighLight )
DrawTextToScreen( zOptionsToggleText[ bHighLight ], usPosX, usPosY, 0, OPT_MAIN_FONT, OPT_HIGHLIGHT_COLOR, FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
else
DrawTextToScreen( zOptionsToggleText[ bHighLight ], usPosX, usPosY, 0, OPT_MAIN_FONT, OPT_MAIN_COLOR, FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
}
}
}
void SelectedToggleBoxAreaRegionMovementCallBack(MOUSE_REGION * pRegion, INT32 reason )
{
if( reason & MSYS_CALLBACK_REASON_LOST_MOUSE )
{
}
else if( reason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
{
UINT8 ubCnt;
//loop through all the toggle box's and remove the in area flag
for( ubCnt=0;ubCnt<NUM_GAME_OPTIONS;ubCnt++)
{
ButtonList[ guiOptionsToggles[ ubCnt ] ]->Area.uiFlags &= ~MSYS_MOUSE_IN_AREA;
}
gbHighLightedOptionText = -1;
InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
}
}