Options Screen.c 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428
  1. #ifdef PRECOMPILEDHEADERS
  2. #include "JA2 All.h"
  3. #else
  4. #include "Types.h"
  5. #include "Options Screen.h"
  6. #include "Video.h"
  7. #include "Font Control.h"
  8. #include "Game Clock.h"
  9. #include "Render Dirty.h"
  10. #include "Text Input.h"
  11. #include "WordWrap.h"
  12. #include "SaveLoadScreen.h"
  13. #include "Render Dirty.h"
  14. #include "WordWrap.h"
  15. #include "WCheck.h"
  16. #include "Utilities.h"
  17. #include "Slider.h"
  18. #include "Debug.h"
  19. #include "Music Control.h"
  20. #include "Sound Control.h"
  21. #include "soundman.h"
  22. #include "Ambient Control.h"
  23. #include "Worlddat.h"
  24. #include "Worlddef.h"
  25. #include "GameSettings.h"
  26. #include "Game Init.h"
  27. #include "English.h"
  28. #include "Overhead.h"
  29. #include "Gap.h"
  30. #include "Cursors.h"
  31. #include "SysUtil.h"
  32. #include "Exit Grids.h"
  33. #include "Text.h"
  34. #include "Interface Control.h"
  35. #include "Message.h"
  36. #include "Language Defines.h"
  37. #include "Multi Language Graphic Utils.h"
  38. #endif
  39. #include "WorldMan.h"
  40. /////////////////////////////////
  41. //
  42. // Defines
  43. //
  44. /////////////////////////////////
  45. #define OPTIONS_TITLE_FONT FONT14ARIAL
  46. #define OPTIONS_TITLE_COLOR FONT_MCOLOR_WHITE
  47. #define OPT_MAIN_FONT FONT12ARIAL
  48. #define OPT_MAIN_COLOR OPT_BUTTON_ON_COLOR//FONT_MCOLOR_WHITE
  49. #define OPT_HIGHLIGHT_COLOR FONT_MCOLOR_WHITE//FONT_MCOLOR_LTYELLOW
  50. #define OPTIONS_SCREEN_WIDTH 440
  51. #define OPTIONS_SCREEN_HEIGHT 400
  52. #define OPTIONS__TOP_LEFT_X 100
  53. #define OPTIONS__TOP_LEFT_Y 40
  54. #define OPTIONS__BOTTOM_RIGHT_X OPTIONS__TOP_LEFT_X + OPTIONS_SCREEN_WIDTH
  55. #define OPTIONS__BOTTOM_RIGHT_Y OPTIONS__TOP_LEFT_Y + OPTIONS_SCREEN_HEIGHT
  56. #define OPT_SAVE_BTN_X 51
  57. #define OPT_SAVE_BTN_Y 438
  58. #define OPT_LOAD_BTN_X 190
  59. #define OPT_LOAD_BTN_Y OPT_SAVE_BTN_Y
  60. #define OPT_QUIT_BTN_X 329
  61. #define OPT_QUIT_BTN_Y OPT_SAVE_BTN_Y
  62. #define OPT_DONE_BTN_X 469
  63. #define OPT_DONE_BTN_Y OPT_SAVE_BTN_Y
  64. #define OPT_GAP_BETWEEN_TOGGLE_BOXES 31//40
  65. //Text
  66. #define OPT_TOGGLE_BOX_FIRST_COL_TEXT_X OPT_TOGGLE_BOX_FIRST_COLUMN_X + OPT_SPACE_BETWEEN_TEXT_AND_TOGGLE_BOX//350
  67. #define OPT_TOGGLE_BOX_FIRST_COL_TEXT_Y OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y//100
  68. #define OPT_TOGGLE_BOX_SECOND_TEXT_X OPT_TOGGLE_BOX_SECOND_COLUMN_X + OPT_SPACE_BETWEEN_TEXT_AND_TOGGLE_BOX//350
  69. #define OPT_TOGGLE_BOX_SECOND_TEXT_Y OPT_TOGGLE_BOX_SECOND_COLUMN_START_Y//100
  70. //toggle boxes
  71. #define OPT_SPACE_BETWEEN_TEXT_AND_TOGGLE_BOX 30//220
  72. #define OPT_TOGGLE_TEXT_OFFSET_Y 2//3
  73. #define OPT_TOGGLE_BOX_FIRST_COLUMN_X 265 //257 //OPT_TOGGLE_BOX_TEXT_X + OPT_SPACE_BETWEEN_TEXT_AND_TOGGLE_BOX
  74. #define OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y 89//OPT_TOGGLE_BOX_TEXT_Y
  75. #define OPT_TOGGLE_BOX_SECOND_COLUMN_X 428 //OPT_TOGGLE_BOX_TEXT_X + OPT_SPACE_BETWEEN_TEXT_AND_TOGGLE_BOX
  76. #define OPT_TOGGLE_BOX_SECOND_COLUMN_START_Y OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y
  77. #define OPT_TOGGLE_BOX_TEXT_WIDTH OPT_TOGGLE_BOX_SECOND_COLUMN_X - OPT_TOGGLE_BOX_FIRST_COLUMN_X - 20
  78. // Slider bar defines
  79. #define OPT_GAP_BETWEEN_SLIDER_BARS 60
  80. //#define OPT_SLIDER_BAR_WIDTH 200
  81. #define OPT_SLIDER_BAR_SIZE 258
  82. #define OPT_SLIDER_TEXT_WIDTH 45
  83. #define OPT_SOUND_FX_TEXT_X 38
  84. #define OPT_SOUND_FX_TEXT_Y 87//116//110
  85. #define OPT_SPEECH_TEXT_X 85//OPT_SOUND_FX_TEXT_X + OPT_SLIDER_TEXT_WIDTH
  86. #define OPT_SPEECH_TEXT_Y OPT_SOUND_FX_TEXT_Y//OPT_SOUND_FX_TEXT_Y + OPT_GAP_BETWEEN_SLIDER_BARS
  87. #define OPT_MUSIC_TEXT_X 137
  88. #define OPT_MUSIC_TEXT_Y OPT_SOUND_FX_TEXT_Y//OPT_SPEECH_TEXT_Y + OPT_GAP_BETWEEN_SLIDER_BARS
  89. #define OPT_TEXT_TO_SLIDER_OFFSET_Y 25
  90. #define OPT_SOUND_EFFECTS_SLIDER_X 56
  91. #define OPT_SOUND_EFFECTS_SLIDER_Y 126//110 + OPT_TEXT_TO_SLIDER_OFFSET_Y
  92. #define OPT_SPEECH_SLIDER_X 107
  93. #define OPT_SPEECH_SLIDER_Y OPT_SOUND_EFFECTS_SLIDER_Y
  94. #define OPT_MUSIC_SLIDER_X 158
  95. #define OPT_MUSIC_SLIDER_Y OPT_SOUND_EFFECTS_SLIDER_Y
  96. #define OPT_MUSIC_SLIDER_PLAY_SOUND_DELAY 75
  97. #define OPT_FIRST_COLUMN_TOGGLE_CUT_OFF 10//8
  98. /////////////////////////////////
  99. //
  100. // Global Variables
  101. //
  102. /////////////////////////////////
  103. UINT32 guiOptionBackGroundImage;
  104. UINT32 guiOptionsAddOnImages;
  105. UINT32 guiSoundEffectsSliderID;
  106. UINT32 guiSpeechSliderID;
  107. UINT32 guiMusicSliderID;
  108. BOOLEAN gfOptionsScreenEntry = TRUE;
  109. BOOLEAN gfOptionsScreenExit = FALSE;
  110. BOOLEAN gfRedrawOptionsScreen = TRUE;
  111. CHAR8 gzSavedGameName[ 128 ];
  112. BOOLEAN gfEnteredFromMapScreen=FALSE;
  113. UINT32 guiOptionsScreen = OPTIONS_SCREEN;
  114. UINT32 guiPreviousOptionScreen = OPTIONS_SCREEN;
  115. BOOLEAN gfExitOptionsDueToMessageBox=FALSE;
  116. BOOLEAN gfExitOptionsAfterMessageBox = FALSE;
  117. UINT32 guiSoundFxSliderMoving = 0xffffffff;
  118. UINT32 guiSpeechSliderMoving = 0xffffffff;
  119. INT32 giOptionsMessageBox = -1; // Options pop up messages index value
  120. INT8 gbHighLightedOptionText = -1;
  121. BOOLEAN gfHideBloodAndGoreOption=FALSE; //If a germany build we are to hide the blood and gore option
  122. UINT8 gubFirstColOfOptions=OPT_FIRST_COLUMN_TOGGLE_CUT_OFF;
  123. BOOLEAN gfSettingOfTreeTopStatusOnEnterOfOptionScreen;
  124. BOOLEAN gfSettingOfItemGlowStatusOnEnterOfOptionScreen;
  125. BOOLEAN gfSettingOfDontAnimateSmoke;
  126. // Goto save game Button
  127. void BtnOptGotoSaveGameCallback(GUI_BUTTON *btn,INT32 reason);
  128. UINT32 guiOptGotoSaveGameBtn;
  129. INT32 giOptionsButtonImages;
  130. // Goto load game button
  131. void BtnOptGotoLoadGameCallback(GUI_BUTTON *btn,INT32 reason);
  132. UINT32 guiOptGotoLoadGameBtn;
  133. INT32 giGotoLoadBtnImage;
  134. // QuitButton
  135. void BtnOptQuitCallback(GUI_BUTTON *btn,INT32 reason);
  136. UINT32 guiQuitButton;
  137. INT32 giQuitBtnImage;
  138. // Done Button
  139. void BtnDoneCallback(GUI_BUTTON *btn,INT32 reason);
  140. UINT32 guiDoneButton;
  141. INT32 giDoneBtnImage;
  142. //checkbox to toggle tracking mode on or off
  143. UINT32 guiOptionsToggles[ NUM_GAME_OPTIONS ];
  144. void BtnOptionsTogglesCallback(GUI_BUTTON *btn,INT32 reason);
  145. //Mouse regions for the name of the option
  146. MOUSE_REGION gSelectedOptionTextRegion[ NUM_GAME_OPTIONS ];
  147. void SelectedOptionTextRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason );
  148. void SelectedOptionTextRegionMovementCallBack(MOUSE_REGION * pRegion, INT32 reason );
  149. //Mouse regions for the area around the toggle boxs
  150. MOUSE_REGION gSelectedToggleBoxAreaRegion;
  151. void SelectedToggleBoxAreaRegionMovementCallBack(MOUSE_REGION * pRegion, INT32 reason );
  152. /////////////////////////////////
  153. //
  154. // Function ProtoTypes
  155. //
  156. /////////////////////////////////
  157. BOOLEAN EnterOptionsScreen();
  158. void RenderOptionsScreen();
  159. void ExitOptionsScreen();
  160. void HandleOptionsScreen();
  161. void GetOptionsScreenUserInput();
  162. void SetOptionsExitScreen( UINT32 uiExitScreen );
  163. void SoundFXSliderChangeCallBack( INT32 iNewValue );
  164. void SpeechSliderChangeCallBack( INT32 iNewValue );
  165. void MusicSliderChangeCallBack( INT32 iNewValue );
  166. //BOOLEAN DoOptionsMessageBox( UINT8 ubStyle, INT16 *zString, UINT32 uiExitScreen, UINT8 ubFlags, MSGBOX_CALLBACK ReturnCallback );
  167. void ConfirmQuitToMainMenuMessageBoxCallBack( UINT8 bExitValue );
  168. void HandleSliderBarMovementSounds();
  169. void HandleOptionToggle( UINT8 ubButton, BOOLEAN fState, BOOLEAN fDown, BOOLEAN fPlaySound );
  170. void HandleHighLightedText( BOOLEAN fHighLight );
  171. extern BOOLEAN CheckIfGameCdromIsInCDromDrive();
  172. extern void ToggleItemGlow( BOOLEAN fOn );
  173. //ppp
  174. /////////////////////////////////
  175. //
  176. // Code
  177. //
  178. /////////////////////////////////
  179. UINT32 OptionsScreenInit()
  180. {
  181. //Set so next time we come in, we can set up
  182. gfOptionsScreenEntry = TRUE;
  183. return( TRUE );
  184. }
  185. UINT32 OptionsScreenHandle()
  186. {
  187. StartFrameBufferRender();
  188. if( gfOptionsScreenEntry )
  189. {
  190. PauseGame();
  191. EnterOptionsScreen();
  192. gfOptionsScreenEntry = FALSE;
  193. gfOptionsScreenExit = FALSE;
  194. gfRedrawOptionsScreen = TRUE;
  195. RenderOptionsScreen();
  196. //Blit the background to the save buffer
  197. BlitBufferToBuffer( guiRENDERBUFFER, guiSAVEBUFFER, 0, 0, 640, 480 );
  198. InvalidateRegion( 0, 0, 640, 480 );
  199. }
  200. RestoreBackgroundRects();
  201. GetOptionsScreenUserInput();
  202. HandleOptionsScreen();
  203. if( gfRedrawOptionsScreen )
  204. {
  205. RenderOptionsScreen();
  206. RenderButtons();
  207. gfRedrawOptionsScreen = FALSE;
  208. }
  209. //Render the active slider bars
  210. RenderAllSliderBars();
  211. // render buttons marked dirty
  212. MarkButtonsDirty( );
  213. RenderButtons( );
  214. // ATE: Put here to save RECTS before any fast help being drawn...
  215. SaveBackgroundRects( );
  216. RenderButtonsFastHelp();
  217. ExecuteBaseDirtyRectQueue();
  218. EndFrameBufferRender();
  219. if( gfOptionsScreenExit )
  220. {
  221. ExitOptionsScreen();
  222. gfOptionsScreenExit = FALSE;
  223. gfOptionsScreenEntry = TRUE;
  224. UnPauseGame();
  225. }
  226. return( guiOptionsScreen );
  227. }
  228. UINT32 OptionsScreenShutdown()
  229. {
  230. return( TRUE );
  231. }
  232. BOOLEAN EnterOptionsScreen()
  233. {
  234. VOBJECT_DESC VObjectDesc;
  235. UINT16 usPosY;
  236. UINT8 cnt;
  237. UINT16 usTextWidth, usTextHeight;
  238. //Default this to off
  239. gfHideBloodAndGoreOption=FALSE;
  240. #ifndef BLOOD_N_GORE_ENABLED
  241. //This will hide blood and gore option
  242. gfHideBloodAndGoreOption = TRUE;
  243. /*
  244. Uncomment this to enable the check for files to activate the blood and gore option for the german build
  245. if( !FileExists( "Germany.dat" ) && FileExists( "Lecken.dat" ) )
  246. {
  247. gfHideBloodAndGoreOption = FALSE;
  248. }
  249. else
  250. */
  251. {
  252. gGameSettings.fOptions[ TOPTION_BLOOD_N_GORE ] = FALSE;
  253. }
  254. #endif
  255. //if we are coming from mapscreen
  256. if( guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN )
  257. {
  258. guiTacticalInterfaceFlags &= ~INTERFACE_MAPSCREEN;
  259. gfEnteredFromMapScreen = TRUE;
  260. }
  261. // Stop ambients...
  262. StopAmbients( );
  263. guiOptionsScreen = OPTIONS_SCREEN;
  264. //Init the slider bar;
  265. InitSlider();
  266. if( gfExitOptionsDueToMessageBox )
  267. {
  268. gfRedrawOptionsScreen = TRUE;
  269. gfExitOptionsDueToMessageBox = FALSE;
  270. return( TRUE );
  271. }
  272. gfExitOptionsDueToMessageBox = FALSE;
  273. // load the options screen background graphic and add it
  274. VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
  275. FilenameForBPP("INTERFACE\\OptionScreenBase.sti", VObjectDesc.ImageFile);
  276. CHECKF(AddVideoObject(&VObjectDesc, &guiOptionBackGroundImage));
  277. // load button, title graphic and add it
  278. VObjectDesc.fCreateFlags=VOBJECT_CREATE_FROMFILE;
  279. GetMLGFilename( VObjectDesc.ImageFile, MLG_OPTIONHEADER );
  280. CHECKF(AddVideoObject(&VObjectDesc, &guiOptionsAddOnImages));
  281. //Save game button
  282. giOptionsButtonImages = LoadButtonImage("INTERFACE\\OptionScreenAddons.sti", -1,2,-1,3,-1 );
  283. guiOptGotoSaveGameBtn = CreateIconAndTextButton( giOptionsButtonImages, zOptionsText[OPT_SAVE_GAME], OPT_BUTTON_FONT,
  284. OPT_BUTTON_ON_COLOR, DEFAULT_SHADOW,
  285. OPT_BUTTON_OFF_COLOR, DEFAULT_SHADOW,
  286. TEXT_CJUSTIFIED,
  287. OPT_SAVE_BTN_X, OPT_SAVE_BTN_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
  288. DEFAULT_MOVE_CALLBACK, BtnOptGotoSaveGameCallback);
  289. SpecifyDisabledButtonStyle( guiOptGotoSaveGameBtn, DISABLED_STYLE_HATCHED );
  290. if( guiPreviousOptionScreen == MAINMENU_SCREEN || !CanGameBeSaved() )
  291. {
  292. DisableButton( guiOptGotoSaveGameBtn );
  293. }
  294. //Load game button
  295. giGotoLoadBtnImage = UseLoadedButtonImage( giOptionsButtonImages, -1,2,-1,3,-1 );
  296. guiOptGotoLoadGameBtn = CreateIconAndTextButton( giGotoLoadBtnImage, zOptionsText[OPT_LOAD_GAME], OPT_BUTTON_FONT,
  297. OPT_BUTTON_ON_COLOR, DEFAULT_SHADOW,
  298. OPT_BUTTON_OFF_COLOR, DEFAULT_SHADOW,
  299. TEXT_CJUSTIFIED,
  300. OPT_LOAD_BTN_X, OPT_LOAD_BTN_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
  301. DEFAULT_MOVE_CALLBACK, BtnOptGotoLoadGameCallback);
  302. // SpecifyDisabledButtonStyle( guiBobbyRAcceptOrder, DISABLED_STYLE_SHADED );
  303. //Quit to main menu button
  304. giQuitBtnImage = UseLoadedButtonImage( giOptionsButtonImages, -1,2,-1,3,-1 );
  305. guiQuitButton = CreateIconAndTextButton( giQuitBtnImage, zOptionsText[OPT_MAIN_MENU], OPT_BUTTON_FONT,
  306. OPT_BUTTON_ON_COLOR, DEFAULT_SHADOW,
  307. OPT_BUTTON_OFF_COLOR, DEFAULT_SHADOW,
  308. TEXT_CJUSTIFIED,
  309. OPT_QUIT_BTN_X, OPT_QUIT_BTN_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
  310. DEFAULT_MOVE_CALLBACK, BtnOptQuitCallback);
  311. SpecifyDisabledButtonStyle( guiQuitButton, DISABLED_STYLE_HATCHED );
  312. // DisableButton( guiQuitButton );
  313. //Done button
  314. giDoneBtnImage = UseLoadedButtonImage( giOptionsButtonImages, -1,2,-1,3,-1 );
  315. guiDoneButton = CreateIconAndTextButton( giDoneBtnImage, zOptionsText[OPT_DONE], OPT_BUTTON_FONT,
  316. OPT_BUTTON_ON_COLOR, DEFAULT_SHADOW,
  317. OPT_BUTTON_OFF_COLOR, DEFAULT_SHADOW,
  318. TEXT_CJUSTIFIED,
  319. OPT_DONE_BTN_X, OPT_DONE_BTN_Y, BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
  320. DEFAULT_MOVE_CALLBACK, BtnDoneCallback);
  321. // SpecifyDisabledButtonStyle( guiBobbyRAcceptOrder, DISABLED_STYLE_SHADED );
  322. //
  323. // Toggle Boxes
  324. //
  325. usTextHeight = GetFontHeight( OPT_MAIN_FONT );
  326. //Create the first column of check boxes
  327. usPosY = OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y;
  328. gubFirstColOfOptions = OPT_FIRST_COLUMN_TOGGLE_CUT_OFF;
  329. for( cnt=0; cnt<gubFirstColOfOptions; cnt++)
  330. {
  331. //if this is the blood and gore option, and we are to hide the option
  332. if( cnt == TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
  333. {
  334. gubFirstColOfOptions++;
  335. //advance to the next
  336. continue;
  337. }
  338. //Check box to toggle tracking mode
  339. guiOptionsToggles[ cnt ] = CreateCheckBoxButton( OPT_TOGGLE_BOX_FIRST_COLUMN_X, usPosY,
  340. "INTERFACE\\OptionsCheckBoxes.sti", MSYS_PRIORITY_HIGH+10,
  341. BtnOptionsTogglesCallback );
  342. MSYS_SetBtnUserData( guiOptionsToggles[ cnt ], 0, cnt );
  343. usTextWidth = StringPixLength( zOptionsToggleText[ cnt ], OPT_MAIN_FONT );
  344. if( usTextWidth > OPT_TOGGLE_BOX_TEXT_WIDTH )
  345. {
  346. //Get how many lines will be used to display the string, without displaying the string
  347. 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 );
  348. usTextWidth = OPT_TOGGLE_BOX_TEXT_WIDTH;
  349. //Create mouse regions for the option toggle text
  350. 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,
  351. CURSOR_NORMAL, SelectedOptionTextRegionMovementCallBack, SelectedOptionTextRegionCallBack );
  352. MSYS_AddRegion( &gSelectedOptionTextRegion[cnt]);
  353. MSYS_SetRegionUserData( &gSelectedOptionTextRegion[ cnt ], 0, cnt);
  354. }
  355. else
  356. {
  357. //Create mouse regions for the option toggle text
  358. 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,
  359. CURSOR_NORMAL, SelectedOptionTextRegionMovementCallBack, SelectedOptionTextRegionCallBack );
  360. MSYS_AddRegion( &gSelectedOptionTextRegion[cnt]);
  361. MSYS_SetRegionUserData( &gSelectedOptionTextRegion[ cnt ], 0, cnt);
  362. }
  363. SetRegionFastHelpText( &gSelectedOptionTextRegion[ cnt ], zOptionsScreenHelpText[cnt] );
  364. SetButtonFastHelpText( guiOptionsToggles[ cnt ], zOptionsScreenHelpText[cnt] );
  365. usPosY += OPT_GAP_BETWEEN_TOGGLE_BOXES;
  366. }
  367. //Create the 2nd column of check boxes
  368. usPosY = OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y;
  369. for( cnt=gubFirstColOfOptions; cnt<NUM_GAME_OPTIONS; cnt++)
  370. {
  371. //Check box to toggle tracking mode
  372. guiOptionsToggles[ cnt ] = CreateCheckBoxButton( OPT_TOGGLE_BOX_SECOND_COLUMN_X, usPosY,
  373. "INTERFACE\\OptionsCheckBoxes.sti", MSYS_PRIORITY_HIGH+10,
  374. BtnOptionsTogglesCallback );
  375. MSYS_SetBtnUserData( guiOptionsToggles[ cnt ], 0, cnt );
  376. //
  377. // Create mouse regions for the option toggle text
  378. //
  379. usTextWidth = StringPixLength( zOptionsToggleText[ cnt ], OPT_MAIN_FONT );
  380. if( usTextWidth > OPT_TOGGLE_BOX_TEXT_WIDTH )
  381. {
  382. //Get how many lines will be used to display the string, without displaying the string
  383. 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 );
  384. usTextWidth = OPT_TOGGLE_BOX_TEXT_WIDTH;
  385. 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,
  386. CURSOR_NORMAL, SelectedOptionTextRegionMovementCallBack, SelectedOptionTextRegionCallBack );
  387. MSYS_AddRegion( &gSelectedOptionTextRegion[cnt]);
  388. MSYS_SetRegionUserData( &gSelectedOptionTextRegion[ cnt ], 0, cnt );
  389. }
  390. else
  391. {
  392. 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,
  393. CURSOR_NORMAL, SelectedOptionTextRegionMovementCallBack, SelectedOptionTextRegionCallBack );
  394. MSYS_AddRegion( &gSelectedOptionTextRegion[cnt]);
  395. MSYS_SetRegionUserData( &gSelectedOptionTextRegion[ cnt ], 0, cnt );
  396. }
  397. SetRegionFastHelpText( &gSelectedOptionTextRegion[ cnt ], zOptionsScreenHelpText[cnt] );
  398. SetButtonFastHelpText( guiOptionsToggles[ cnt ], zOptionsScreenHelpText[cnt] );
  399. usPosY += OPT_GAP_BETWEEN_TOGGLE_BOXES;
  400. }
  401. //Create a mouse region so when the user leaves a togglebox text region we can detect it then unselect the region
  402. MSYS_DefineRegion( &gSelectedToggleBoxAreaRegion, 0, 0, 640, 480, MSYS_PRIORITY_NORMAL,
  403. CURSOR_NORMAL, SelectedToggleBoxAreaRegionMovementCallBack, MSYS_NO_CALLBACK );
  404. MSYS_AddRegion( &gSelectedToggleBoxAreaRegion );
  405. //Render the scene before adding the slider boxes
  406. RenderOptionsScreen();
  407. //Add a slider bar for the Sound Effects
  408. 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 );
  409. AssertMsg( guiSoundEffectsSliderID, "Failed to AddSlider" );
  410. SetSliderValue( guiSoundEffectsSliderID, GetSoundEffectsVolume() );
  411. //Add a slider bar for the Speech
  412. 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 );
  413. AssertMsg( guiSpeechSliderID, "Failed to AddSlider" );
  414. SetSliderValue( guiSpeechSliderID, GetSpeechVolume() );
  415. //Add a slider bar for the Music
  416. 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 );
  417. AssertMsg( guiMusicSliderID, "Failed to AddSlider" );
  418. SetSliderValue( guiMusicSliderID, MusicGetVolume() );
  419. //Remove the mouse region over the clock
  420. RemoveMouseRegionForPauseOfClock( );
  421. //Draw the screen
  422. gfRedrawOptionsScreen = TRUE;
  423. //Set the option screen toggle boxes
  424. SetOptionsScreenToggleBoxes();
  425. DisableScrollMessages();
  426. //reset
  427. gbHighLightedOptionText = -1;
  428. //get the status of the tree top option
  429. gfSettingOfTreeTopStatusOnEnterOfOptionScreen = gGameSettings.fOptions[ TOPTION_TOGGLE_TREE_TOPS ];
  430. //Get the status of the item glow option
  431. gfSettingOfItemGlowStatusOnEnterOfOptionScreen = gGameSettings.fOptions[ TOPTION_GLOW_ITEMS ];
  432. gfSettingOfDontAnimateSmoke = gGameSettings.fOptions[ TOPTION_ANIMATE_SMOKE ];
  433. return( TRUE );
  434. }
  435. void ExitOptionsScreen()
  436. {
  437. UINT8 cnt;
  438. if( gfExitOptionsDueToMessageBox )
  439. {
  440. gfOptionsScreenExit = FALSE;
  441. if( !gfExitOptionsAfterMessageBox )
  442. return;
  443. gfExitOptionsAfterMessageBox = FALSE;
  444. gfExitOptionsDueToMessageBox = FALSE;
  445. }
  446. //Get the current status of the toggle boxes
  447. GetOptionsScreenToggleBoxes();
  448. //The save the current settings to disk
  449. SaveGameSettings();
  450. //Create the clock mouse region
  451. CreateMouseRegionForPauseOfClock( CLOCK_REGION_START_X, CLOCK_REGION_START_Y );
  452. if( guiOptionsScreen == GAME_SCREEN )
  453. EnterTacticalScreen( );
  454. RemoveButton( guiOptGotoSaveGameBtn );
  455. RemoveButton( guiOptGotoLoadGameBtn );
  456. RemoveButton( guiQuitButton );
  457. RemoveButton( guiDoneButton );
  458. UnloadButtonImage( giOptionsButtonImages );
  459. UnloadButtonImage( giGotoLoadBtnImage );
  460. UnloadButtonImage( giQuitBtnImage );
  461. UnloadButtonImage( giDoneBtnImage );
  462. DeleteVideoObjectFromIndex( guiOptionBackGroundImage );
  463. DeleteVideoObjectFromIndex( guiOptionsAddOnImages );
  464. //Remove the toggle buttons
  465. for( cnt=0; cnt<NUM_GAME_OPTIONS; cnt++)
  466. {
  467. //if this is the blood and gore option, and we are to hide the option
  468. if( cnt == TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
  469. {
  470. //advance to the next
  471. continue;
  472. }
  473. RemoveButton( guiOptionsToggles[ cnt ] );
  474. MSYS_RemoveRegion( &gSelectedOptionTextRegion[cnt]);
  475. }
  476. //REmove the slider bars
  477. RemoveSliderBar( guiSoundEffectsSliderID );
  478. RemoveSliderBar( guiSpeechSliderID );
  479. RemoveSliderBar( guiMusicSliderID );
  480. MSYS_RemoveRegion( &gSelectedToggleBoxAreaRegion );
  481. ShutDownSlider();
  482. //if we are coming from mapscreen
  483. if( gfEnteredFromMapScreen )
  484. {
  485. gfEnteredFromMapScreen = FALSE;
  486. guiTacticalInterfaceFlags |= INTERFACE_MAPSCREEN;
  487. }
  488. //if the user changed the TREE TOP option, AND a world is loaded
  489. if( gfSettingOfTreeTopStatusOnEnterOfOptionScreen != gGameSettings.fOptions[ TOPTION_TOGGLE_TREE_TOPS ] && gfWorldLoaded )
  490. {
  491. SetTreeTopStateForMap();
  492. }
  493. //if the user has changed the item glow option AND a world is loaded
  494. if( gfSettingOfItemGlowStatusOnEnterOfOptionScreen != gGameSettings.fOptions[ TOPTION_GLOW_ITEMS ] && gfWorldLoaded )
  495. {
  496. ToggleItemGlow( gGameSettings.fOptions[ TOPTION_GLOW_ITEMS ] );
  497. }
  498. if( gfSettingOfDontAnimateSmoke != gGameSettings.fOptions[ TOPTION_ANIMATE_SMOKE ] && gfWorldLoaded )
  499. {
  500. UpdateSmokeEffectGraphics( );
  501. }
  502. }
  503. void HandleOptionsScreen()
  504. {
  505. HandleSliderBarMovementSounds();
  506. HandleHighLightedText( TRUE );
  507. }
  508. void RenderOptionsScreen()
  509. {
  510. HVOBJECT hPixHandle;
  511. UINT16 usPosY;
  512. UINT8 cnt;
  513. UINT16 usWidth=0;
  514. //Get and display the background image
  515. GetVideoObject(&hPixHandle, guiOptionBackGroundImage);
  516. BltVideoObject(FRAME_BUFFER, hPixHandle, 0, 0, 0, VO_BLT_SRCTRANSPARENCY,NULL);
  517. //Get and display the titla image
  518. GetVideoObject(&hPixHandle, guiOptionsAddOnImages);
  519. BltVideoObject(FRAME_BUFFER, hPixHandle, 0, 0, 0, VO_BLT_SRCTRANSPARENCY,NULL);
  520. BltVideoObject(FRAME_BUFFER, hPixHandle, 1, 0, 434, VO_BLT_SRCTRANSPARENCY,NULL);
  521. //
  522. // Text for the toggle boxes
  523. //
  524. usPosY = OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y + OPT_TOGGLE_TEXT_OFFSET_Y;
  525. //Display the First column of toggles
  526. for( cnt=0; cnt<gubFirstColOfOptions; cnt++)
  527. {
  528. //if this is the blood and gore option, and we are to hide the option
  529. if( cnt == TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
  530. {
  531. //advance to the next
  532. continue;
  533. }
  534. usWidth = StringPixLength( zOptionsToggleText[ cnt ], OPT_MAIN_FONT );
  535. //if the string is going to wrap, move the string up a bit
  536. if( usWidth > OPT_TOGGLE_BOX_TEXT_WIDTH )
  537. 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 );
  538. else
  539. DrawTextToScreen( zOptionsToggleText[ cnt ], OPT_TOGGLE_BOX_FIRST_COL_TEXT_X, usPosY, 0, OPT_MAIN_FONT, OPT_MAIN_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
  540. usPosY += OPT_GAP_BETWEEN_TOGGLE_BOXES;
  541. }
  542. usPosY = OPT_TOGGLE_BOX_SECOND_COLUMN_START_Y + OPT_TOGGLE_TEXT_OFFSET_Y;
  543. //Display the 2nd column of toggles
  544. for( cnt=gubFirstColOfOptions; cnt<NUM_GAME_OPTIONS; cnt++)
  545. {
  546. usWidth = StringPixLength( zOptionsToggleText[ cnt ], OPT_MAIN_FONT );
  547. //if the string is going to wrap, move the string up a bit
  548. if( usWidth > OPT_TOGGLE_BOX_TEXT_WIDTH )
  549. 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 );
  550. else
  551. DrawTextToScreen( zOptionsToggleText[ cnt ], OPT_TOGGLE_BOX_SECOND_TEXT_X, usPosY, 0, OPT_MAIN_FONT, OPT_MAIN_COLOR, FONT_MCOLOR_BLACK, FALSE, LEFT_JUSTIFIED );
  552. usPosY += OPT_GAP_BETWEEN_TOGGLE_BOXES;
  553. }
  554. //
  555. // Text for the Slider Bars
  556. //
  557. //Display the Sound Fx text
  558. DisplayWrappedString( OPT_SOUND_FX_TEXT_X, OPT_SOUND_FX_TEXT_Y, OPT_SLIDER_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_MAIN_COLOR, zOptionsText[ OPT_SOUND_FX ], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
  559. //Display the Speech text
  560. DisplayWrappedString( OPT_SPEECH_TEXT_X, OPT_SPEECH_TEXT_Y, OPT_SLIDER_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_MAIN_COLOR, zOptionsText[ OPT_SPEECH ], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
  561. //Display the Music text
  562. DisplayWrappedString( OPT_MUSIC_TEXT_X, OPT_MUSIC_TEXT_Y, OPT_SLIDER_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_MAIN_COLOR, zOptionsText[ OPT_MUSIC ], FONT_MCOLOR_BLACK, FALSE, CENTER_JUSTIFIED );
  563. InvalidateRegion( OPTIONS__TOP_LEFT_X, OPTIONS__TOP_LEFT_Y, OPTIONS__BOTTOM_RIGHT_X, OPTIONS__BOTTOM_RIGHT_Y);
  564. }
  565. void GetOptionsScreenUserInput()
  566. {
  567. InputAtom Event;
  568. POINT MousePos;
  569. GetCursorPos(&MousePos);
  570. while( DequeueEvent( &Event ) )
  571. {
  572. // HOOK INTO MOUSE HOOKS
  573. switch( Event.usEvent)
  574. {
  575. case LEFT_BUTTON_DOWN:
  576. MouseSystemHook(LEFT_BUTTON_DOWN, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
  577. break;
  578. case LEFT_BUTTON_UP:
  579. MouseSystemHook(LEFT_BUTTON_UP, (INT16)MousePos.x, (INT16)MousePos.y ,_LeftButtonDown, _RightButtonDown);
  580. break;
  581. case RIGHT_BUTTON_DOWN:
  582. MouseSystemHook(RIGHT_BUTTON_DOWN, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
  583. break;
  584. case RIGHT_BUTTON_UP:
  585. MouseSystemHook(RIGHT_BUTTON_UP, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
  586. break;
  587. case RIGHT_BUTTON_REPEAT:
  588. MouseSystemHook(RIGHT_BUTTON_REPEAT, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
  589. break;
  590. case LEFT_BUTTON_REPEAT:
  591. MouseSystemHook(LEFT_BUTTON_REPEAT, (INT16)MousePos.x, (INT16)MousePos.y,_LeftButtonDown, _RightButtonDown);
  592. break;
  593. }
  594. if( !HandleTextInput( &Event ) && Event.usEvent == KEY_DOWN )
  595. {
  596. switch( Event.usParam )
  597. {
  598. case ESC:
  599. SetOptionsExitScreen( guiPreviousOptionScreen );
  600. break;
  601. //Enter the save game screen
  602. case 's':
  603. case 'S':
  604. //if the save game button isnt disabled
  605. if( ButtonList[ guiOptGotoSaveGameBtn ]->uiFlags & BUTTON_ENABLED )
  606. {
  607. SetOptionsExitScreen( SAVE_LOAD_SCREEN );
  608. gfSaveGame = TRUE;
  609. }
  610. break;
  611. //Enter the Load game screen
  612. case 'l':
  613. case 'L':
  614. SetOptionsExitScreen( SAVE_LOAD_SCREEN );
  615. gfSaveGame = FALSE;
  616. break;
  617. #ifdef JA2TESTVERSION
  618. case 'r':
  619. gfRedrawOptionsScreen = TRUE;
  620. break;
  621. case 'i':
  622. InvalidateRegion( 0, 0, 640, 480 );
  623. break;
  624. //Test keys
  625. case 'y':
  626. {
  627. static UINT32 uiTest2 = NO_SAMPLE;
  628. if( !SoundIsPlaying( uiTest2 ) )
  629. uiTest2 = PlayJA2SampleFromFile( "Sounds\\RAID Dive.wav", RATE_11025, HIGHVOLUME, 1 , MIDDLEPAN );
  630. }
  631. break;
  632. case 't':
  633. {
  634. /*
  635. {
  636. CHAR8 zCdromRootDrive[512];
  637. HWFILE hFile;
  638. if( !GetCdromLocationFromIniFile( zCdromRootDrive ) )
  639. return;
  640. //Check if a file exists on the cdrom
  641. sprintf( zCdromRootDrive, "%sData\\NPC_Speech.slf", zCdromRootDrive );
  642. // if( FileExistsNoDB( zCdromRootDrive ) )
  643. hFile = FileOpen( zCdromRootDrive, FILE_ACCESS_READ | FILE_OPEN_EXISTING, FALSE );
  644. if( hFile != 0 )
  645. {
  646. FileClose( hFile );
  647. sprintf( zCdromRootDrive, "%sData\\NPC_Speech.slf", zCdromRootDrive );
  648. }
  649. else
  650. {
  651. sprintf( zCdromRootDrive, "%sData\\NPC_Speech.slf", zCdromRootDrive );
  652. }
  653. uiLastTimeToCheckCDromDrive = GetJA2Clock();
  654. }
  655. */
  656. }
  657. break;
  658. case 'z':
  659. SetErrorMode( SEM_FAILCRITICALERRORS );
  660. break;
  661. case 'q':
  662. // ShouldMercSayPrecedentToRepeatOneSelf( 11, 99 );
  663. break;
  664. #endif
  665. }
  666. }
  667. }
  668. }
  669. void SetOptionsExitScreen( UINT32 uiExitScreen )
  670. {
  671. guiOptionsScreen = uiExitScreen;
  672. gfOptionsScreenExit = TRUE;
  673. }
  674. void BtnOptGotoSaveGameCallback(GUI_BUTTON *btn,INT32 reason)
  675. {
  676. if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
  677. {
  678. btn->uiFlags |= BUTTON_CLICKED_ON;
  679. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  680. }
  681. if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
  682. {
  683. btn->uiFlags &= (~BUTTON_CLICKED_ON );
  684. SetOptionsExitScreen( SAVE_LOAD_SCREEN );
  685. gfSaveGame = TRUE;
  686. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  687. }
  688. if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
  689. {
  690. btn->uiFlags &= (~BUTTON_CLICKED_ON );
  691. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  692. }
  693. }
  694. void BtnOptGotoLoadGameCallback(GUI_BUTTON *btn,INT32 reason)
  695. {
  696. if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
  697. {
  698. btn->uiFlags |= BUTTON_CLICKED_ON;
  699. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  700. }
  701. if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
  702. {
  703. btn->uiFlags &= (~BUTTON_CLICKED_ON );
  704. SetOptionsExitScreen( SAVE_LOAD_SCREEN );
  705. gfSaveGame = FALSE;
  706. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  707. }
  708. if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
  709. {
  710. btn->uiFlags &= (~BUTTON_CLICKED_ON );
  711. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  712. }
  713. }
  714. void BtnOptQuitCallback(GUI_BUTTON *btn,INT32 reason)
  715. {
  716. if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
  717. {
  718. btn->uiFlags |= BUTTON_CLICKED_ON;
  719. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  720. }
  721. if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
  722. {
  723. btn->uiFlags &= (~BUTTON_CLICKED_ON );
  724. //Confirm the Exit to the main menu screen
  725. DoOptionsMessageBox( MSG_BOX_BASIC_STYLE, zOptionsText[OPT_RETURN_TO_MAIN], OPTIONS_SCREEN, MSG_BOX_FLAG_YESNO, ConfirmQuitToMainMenuMessageBoxCallBack );
  726. /// SetOptionsExitScreen( MAINMENU_SCREEN );
  727. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  728. }
  729. if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
  730. {
  731. btn->uiFlags &= (~BUTTON_CLICKED_ON );
  732. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  733. }
  734. }
  735. void BtnDoneCallback(GUI_BUTTON *btn,INT32 reason)
  736. {
  737. if(reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
  738. {
  739. btn->uiFlags |= BUTTON_CLICKED_ON;
  740. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  741. }
  742. if(reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
  743. {
  744. btn->uiFlags &= (~BUTTON_CLICKED_ON );
  745. SetOptionsExitScreen( guiPreviousOptionScreen );
  746. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  747. }
  748. if(reason & MSYS_CALLBACK_REASON_LOST_MOUSE)
  749. {
  750. btn->uiFlags &= (~BUTTON_CLICKED_ON );
  751. InvalidateRegion(btn->Area.RegionTopLeftX, btn->Area.RegionTopLeftY, btn->Area.RegionBottomRightX, btn->Area.RegionBottomRightY);
  752. }
  753. }
  754. void BtnOptionsTogglesCallback( GUI_BUTTON *btn, INT32 reason )
  755. {
  756. UINT8 ubButton = (UINT8)MSYS_GetBtnUserData( btn, 0 );
  757. if( reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
  758. {
  759. if( btn->uiFlags & BUTTON_CLICKED_ON )
  760. {
  761. HandleOptionToggle( ubButton, TRUE, FALSE, FALSE );
  762. // gGameSettings.fOptions[ ubButton ] = TRUE;
  763. btn->uiFlags |= BUTTON_CLICKED_ON;
  764. }
  765. else
  766. {
  767. btn->uiFlags &= ~BUTTON_CLICKED_ON;
  768. HandleOptionToggle( ubButton, FALSE, FALSE, FALSE);
  769. }
  770. }
  771. else if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
  772. {
  773. if( btn->uiFlags & BUTTON_CLICKED_ON )
  774. {
  775. HandleOptionToggle( ubButton, TRUE, TRUE, FALSE );
  776. btn->uiFlags |= BUTTON_CLICKED_ON;
  777. }
  778. else
  779. {
  780. btn->uiFlags &= ~BUTTON_CLICKED_ON;
  781. HandleOptionToggle( ubButton, FALSE, TRUE, FALSE );
  782. }
  783. }
  784. }
  785. void HandleOptionToggle( UINT8 ubButton, BOOLEAN fState, BOOLEAN fDown, BOOLEAN fPlaySound )
  786. {
  787. static UINT32 uiOptionToggleSound = NO_SAMPLE;
  788. UINT32 uiSideToPlaySoundOn = MIDDLEPAN;
  789. // static BOOLEAN fCheckBoxDrawnDownLastTime = FALSE;
  790. if( fState )
  791. {
  792. gGameSettings.fOptions[ ubButton ] = TRUE;
  793. ButtonList[ guiOptionsToggles[ ubButton ] ]->uiFlags |= BUTTON_CLICKED_ON;
  794. if( fDown )
  795. DrawCheckBoxButtonOn( guiOptionsToggles[ ubButton ] );
  796. }
  797. else
  798. {
  799. gGameSettings.fOptions[ ubButton ] = FALSE;
  800. ButtonList[ guiOptionsToggles[ ubButton ] ]->uiFlags &= ~BUTTON_CLICKED_ON;
  801. if( fDown )
  802. DrawCheckBoxButtonOff( guiOptionsToggles[ ubButton ] );
  803. //check to see if the user is unselecting either the spech or subtitles toggle
  804. if( ubButton == TOPTION_SPEECH || ubButton == TOPTION_SUBTITLES )
  805. {
  806. //make sure that at least of of the toggles is still enabled
  807. if( !(ButtonList[ guiOptionsToggles[ TOPTION_SPEECH ] ]->uiFlags & BUTTON_CLICKED_ON) )
  808. {
  809. if( !( ButtonList[ guiOptionsToggles[ TOPTION_SUBTITLES ] ]->uiFlags & BUTTON_CLICKED_ON ) )
  810. {
  811. gGameSettings.fOptions[ ubButton ] = TRUE;
  812. ButtonList[ guiOptionsToggles[ ubButton ] ]->uiFlags |= BUTTON_CLICKED_ON;
  813. //Confirm the Exit to the main menu screen
  814. DoOptionsMessageBox( MSG_BOX_BASIC_STYLE, zOptionsText[OPT_NEED_AT_LEAST_SPEECH_OR_SUBTITLE_OPTION_ON], OPTIONS_SCREEN, MSG_BOX_FLAG_OK, NULL );
  815. gfExitOptionsDueToMessageBox = FALSE;
  816. }
  817. }
  818. }
  819. }
  820. //stop the sound if
  821. // if( SoundIsPlaying( uiOptionToggleSound ) && !fDown )
  822. {
  823. SoundStop( uiOptionToggleSound );
  824. }
  825. if( fPlaySound )
  826. {
  827. if( fDown )
  828. {
  829. // case BTN_SND_CLICK_OFF:
  830. PlayJA2Sample( BIG_SWITCH3_IN, RATE_11025, BTNVOLUME, 1, MIDDLEPAN );
  831. }
  832. else
  833. {
  834. // case BTN_SND_CLICK_ON:
  835. PlayJA2Sample( BIG_SWITCH3_OUT, RATE_11025, BTNVOLUME, 1, MIDDLEPAN );
  836. }
  837. }
  838. }
  839. void SoundFXSliderChangeCallBack( INT32 iNewValue )
  840. {
  841. SetSoundEffectsVolume( iNewValue );
  842. guiSoundFxSliderMoving = GetJA2Clock();
  843. }
  844. void SpeechSliderChangeCallBack( INT32 iNewValue )
  845. {
  846. SetSpeechVolume( iNewValue );
  847. guiSpeechSliderMoving = GetJA2Clock();
  848. }
  849. void MusicSliderChangeCallBack( INT32 iNewValue )
  850. {
  851. MusicSetVolume( iNewValue );
  852. }
  853. BOOLEAN DoOptionsMessageBoxWithRect( UINT8 ubStyle, INT16 *zString, UINT32 uiExitScreen, UINT16 usFlags, MSGBOX_CALLBACK ReturnCallback, SGPRect *pCenteringRect )
  854. {
  855. // reset exit mode
  856. gfExitOptionsDueToMessageBox = TRUE;
  857. // do message box and return
  858. giOptionsMessageBox = DoMessageBox( ubStyle, zString, uiExitScreen, ( UINT16 ) ( usFlags| MSG_BOX_FLAG_USE_CENTERING_RECT ), ReturnCallback, pCenteringRect );
  859. // send back return state
  860. return( ( giOptionsMessageBox != -1 ) );
  861. }
  862. BOOLEAN DoOptionsMessageBox( UINT8 ubStyle, INT16 *zString, UINT32 uiExitScreen, UINT16 usFlags, MSGBOX_CALLBACK ReturnCallback )
  863. {
  864. SGPRect CenteringRect= {0, 0, 639, 479 };
  865. // reset exit mode
  866. gfExitOptionsDueToMessageBox = TRUE;
  867. // do message box and return
  868. giOptionsMessageBox = DoMessageBox( ubStyle, zString, uiExitScreen, ( UINT16 ) ( usFlags| MSG_BOX_FLAG_USE_CENTERING_RECT ), ReturnCallback, &CenteringRect );
  869. // send back return state
  870. return( ( giOptionsMessageBox != -1 ) );
  871. }
  872. void ConfirmQuitToMainMenuMessageBoxCallBack( UINT8 bExitValue )
  873. {
  874. // yes, Quit to main menu
  875. if( bExitValue == MSG_BOX_RETURN_YES )
  876. {
  877. gfEnteredFromMapScreen = FALSE;
  878. gfExitOptionsAfterMessageBox = TRUE;
  879. SetOptionsExitScreen( MAINMENU_SCREEN );
  880. //We want to reinitialize the game
  881. ReStartingGame();
  882. }
  883. else
  884. {
  885. gfExitOptionsAfterMessageBox = FALSE;
  886. gfExitOptionsDueToMessageBox = FALSE;
  887. }
  888. }
  889. void SetOptionsScreenToggleBoxes()
  890. {
  891. UINT8 cnt;
  892. for( cnt=0; cnt<NUM_GAME_OPTIONS; cnt++)
  893. {
  894. if( gGameSettings.fOptions[ cnt ] )
  895. ButtonList[ guiOptionsToggles[ cnt ] ]->uiFlags |= BUTTON_CLICKED_ON;
  896. else
  897. ButtonList[ guiOptionsToggles[ cnt ] ]->uiFlags &= (~BUTTON_CLICKED_ON );
  898. }
  899. }
  900. void GetOptionsScreenToggleBoxes()
  901. {
  902. UINT8 cnt;
  903. for( cnt=0; cnt<NUM_GAME_OPTIONS; cnt++)
  904. {
  905. if( ButtonList[ guiOptionsToggles[ cnt ] ]->uiFlags & BUTTON_CLICKED_ON )
  906. gGameSettings.fOptions[ cnt ] = TRUE;
  907. else
  908. gGameSettings.fOptions[ cnt ] = FALSE;
  909. }
  910. }
  911. void HandleSliderBarMovementSounds()
  912. {
  913. static UINT32 uiLastSoundFxTime=0;
  914. static UINT32 uiLastSpeechTime=0;
  915. UINT32 uiCurTime = GetJA2Clock();
  916. static UINT32 uiLastPlayingSoundID = NO_SAMPLE;
  917. static UINT32 uiLastPlayingSpeechID = NO_SAMPLE;
  918. if( ( uiLastSoundFxTime - OPT_MUSIC_SLIDER_PLAY_SOUND_DELAY ) > guiSoundFxSliderMoving )
  919. {
  920. guiSoundFxSliderMoving = 0xffffffff;
  921. //The slider has stopped moving, reset the ambient sector sounds ( so it will change the volume )
  922. if( !DidGameJustStart() )
  923. HandleNewSectorAmbience( gTilesets[ giCurrentTilesetID ].ubAmbientID );
  924. if( !SoundIsPlaying( uiLastPlayingSoundID ) )
  925. uiLastPlayingSoundID = PlayJA2SampleFromFile( "Sounds\\Weapons\\LMG Reload.wav", RATE_11025, HIGHVOLUME, 1 , MIDDLEPAN );
  926. }
  927. else
  928. uiLastSoundFxTime = GetJA2Clock();
  929. if( ( uiLastSpeechTime - OPT_MUSIC_SLIDER_PLAY_SOUND_DELAY ) > guiSpeechSliderMoving )
  930. {
  931. guiSpeechSliderMoving = 0xffffffff;
  932. if( !SoundIsPlaying( uiLastPlayingSpeechID ) )
  933. uiLastPlayingSpeechID = PlayJA2GapSample( "BattleSnds\\m_cool.wav", RATE_11025, HIGHVOLUME, 1, MIDDLEPAN, NULL );
  934. }
  935. else
  936. uiLastSpeechTime = GetJA2Clock();
  937. }
  938. void SelectedOptionTextRegionCallBack(MOUSE_REGION * pRegion, INT32 iReason )
  939. {
  940. UINT8 ubButton = (UINT8)MSYS_GetRegionUserData( pRegion, 0 );
  941. if (iReason & MSYS_CALLBACK_REASON_LBUTTON_UP)
  942. {
  943. HandleOptionToggle( ubButton, (BOOLEAN)(!gGameSettings.fOptions[ ubButton ]), FALSE, TRUE );
  944. InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
  945. }
  946. else if( iReason & MSYS_CALLBACK_REASON_LBUTTON_DWN )//iReason & MSYS_CALLBACK_REASON_LBUTTON_REPEAT ||
  947. {
  948. if( gGameSettings.fOptions[ ubButton ] )
  949. {
  950. HandleOptionToggle( ubButton, TRUE, TRUE, TRUE );
  951. }
  952. else
  953. {
  954. HandleOptionToggle( ubButton, FALSE, TRUE, TRUE );
  955. }
  956. }
  957. }
  958. void SelectedOptionTextRegionMovementCallBack(MOUSE_REGION * pRegion, INT32 reason )
  959. {
  960. INT8 bButton = (INT8)MSYS_GetRegionUserData( pRegion, 0 );
  961. if( reason & MSYS_CALLBACK_REASON_LOST_MOUSE )
  962. {
  963. HandleHighLightedText( FALSE );
  964. gbHighLightedOptionText = -1;
  965. InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
  966. }
  967. else if( reason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
  968. {
  969. gbHighLightedOptionText = bButton;
  970. InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
  971. }
  972. }
  973. void HandleHighLightedText( BOOLEAN fHighLight )
  974. {
  975. UINT16 usPosX=0;
  976. UINT16 usPosY=0;
  977. UINT8 ubCnt;
  978. INT8 bHighLight=-1;
  979. UINT16 usWidth;
  980. static INT8 bLastRegion = -1;
  981. if( gbHighLightedOptionText == -1 )
  982. fHighLight = FALSE;
  983. //if the user has the mouse in one of the checkboxes
  984. for( ubCnt=0; ubCnt<NUM_GAME_OPTIONS;ubCnt++)
  985. {
  986. if( ubCnt == TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
  987. {
  988. //advance to the next
  989. continue;
  990. }
  991. if( ButtonList[ guiOptionsToggles[ ubCnt ] ]->Area.uiFlags & MSYS_MOUSE_IN_AREA )
  992. {
  993. gbHighLightedOptionText = ubCnt;
  994. fHighLight = TRUE;
  995. }
  996. }
  997. // If there is a valid section being highlighted
  998. if( gbHighLightedOptionText != -1 )
  999. {
  1000. bLastRegion = gbHighLightedOptionText;
  1001. }
  1002. bHighLight = gbHighLightedOptionText;
  1003. if( bLastRegion != -1 && gbHighLightedOptionText == -1 )
  1004. {
  1005. fHighLight = FALSE;
  1006. bHighLight = bLastRegion;
  1007. bLastRegion = -1;
  1008. }
  1009. //If we are to hide the blood and gore option, and we are to highlight an option past the blood and gore option
  1010. //reduce the highlight number by 1
  1011. if( bHighLight >= TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
  1012. {
  1013. bHighLight--;
  1014. }
  1015. if( bHighLight != -1 )
  1016. {
  1017. if( bHighLight < OPT_FIRST_COLUMN_TOGGLE_CUT_OFF )
  1018. {
  1019. usPosX = OPT_TOGGLE_BOX_FIRST_COL_TEXT_X;
  1020. usPosY = OPT_TOGGLE_BOX_FIRST_COLUMN_START_Y + OPT_TOGGLE_TEXT_OFFSET_Y + ( bHighLight * OPT_GAP_BETWEEN_TOGGLE_BOXES ) ;
  1021. }
  1022. else
  1023. {
  1024. usPosX = OPT_TOGGLE_BOX_SECOND_TEXT_X;
  1025. 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 ) ;
  1026. }
  1027. //If we are to hide the blood and gore option, and we are to highlight an option past the blood and gore option
  1028. //reduce the highlight number by 1
  1029. if( bHighLight >= TOPTION_BLOOD_N_GORE && gfHideBloodAndGoreOption )
  1030. {
  1031. bHighLight++;
  1032. }
  1033. usWidth = StringPixLength( zOptionsToggleText[ bHighLight ], OPT_MAIN_FONT );
  1034. //if the string is going to wrap, move the string up a bit
  1035. if( usWidth > OPT_TOGGLE_BOX_TEXT_WIDTH )
  1036. {
  1037. if( fHighLight )
  1038. DisplayWrappedString( usPosX, usPosY, OPT_TOGGLE_BOX_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_HIGHLIGHT_COLOR, zOptionsToggleText[ bHighLight ], FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
  1039. // DrawTextToScreen( zOptionsToggleText[ bHighLight ], usPosX, usPosY, 0, OPT_MAIN_FONT, OPT_HIGHLIGHT_COLOR, FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
  1040. else
  1041. DisplayWrappedString( usPosX, usPosY, OPT_TOGGLE_BOX_TEXT_WIDTH, 2, OPT_MAIN_FONT, OPT_MAIN_COLOR, zOptionsToggleText[ bHighLight ], FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
  1042. // DrawTextToScreen( zOptionsToggleText[ bHighLight ], usPosX, usPosY, 0, OPT_MAIN_FONT, OPT_MAIN_COLOR, FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
  1043. }
  1044. else
  1045. {
  1046. if( fHighLight )
  1047. DrawTextToScreen( zOptionsToggleText[ bHighLight ], usPosX, usPosY, 0, OPT_MAIN_FONT, OPT_HIGHLIGHT_COLOR, FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
  1048. else
  1049. DrawTextToScreen( zOptionsToggleText[ bHighLight ], usPosX, usPosY, 0, OPT_MAIN_FONT, OPT_MAIN_COLOR, FONT_MCOLOR_BLACK, TRUE, LEFT_JUSTIFIED );
  1050. }
  1051. }
  1052. }
  1053. void SelectedToggleBoxAreaRegionMovementCallBack(MOUSE_REGION * pRegion, INT32 reason )
  1054. {
  1055. if( reason & MSYS_CALLBACK_REASON_LOST_MOUSE )
  1056. {
  1057. }
  1058. else if( reason & MSYS_CALLBACK_REASON_GAIN_MOUSE )
  1059. {
  1060. UINT8 ubCnt;
  1061. //loop through all the toggle box's and remove the in area flag
  1062. for( ubCnt=0;ubCnt<NUM_GAME_OPTIONS;ubCnt++)
  1063. {
  1064. ButtonList[ guiOptionsToggles[ ubCnt ] ]->Area.uiFlags &= ~MSYS_MOUSE_IN_AREA;
  1065. }
  1066. gbHighLightedOptionText = -1;
  1067. InvalidateRegion(pRegion->RegionTopLeftX, pRegion->RegionTopLeftY, pRegion->RegionBottomRightX, pRegion->RegionBottomRightY);
  1068. }
  1069. }