OptionsMenu.cpp 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064
  1. /*
  2. ** Command & Conquer Generals(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. ////////////////////////////////////////////////////////////////////////////////
  19. // //
  20. // (c) 2001-2003 Electronic Arts Inc. //
  21. // //
  22. ////////////////////////////////////////////////////////////////////////////////
  23. // FILE: OptionsMenu.cpp //////////////////////////////////////////////////////////////////////////
  24. // Author: Colin Day, October 2001
  25. // Description: options menu window callbacks
  26. ///////////////////////////////////////////////////////////////////////////////////////////////////
  27. // INCLUDES ///////////////////////////////////////////////////////////////////////////////////////
  28. #include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine
  29. #include "GameSpy/ghttp/ghttp.h"
  30. #include "Common/AudioAffect.h"
  31. #include "Common/AudioSettings.h"
  32. #include "Common/GameAudio.h"
  33. #include "Common/GameEngine.h"
  34. #include "Common/UserPreferences.h"
  35. #include "Common/GameLOD.h"
  36. #include "Common/Registry.h"
  37. #include "Common/Version.h"
  38. #include "GameClient/GameClient.h"
  39. #include "GameClient/InGameUI.h"
  40. #include "GameClient/WindowLayout.h"
  41. #include "GameClient/Gadget.h"
  42. #include "GameClient/GadgetCheckBox.h"
  43. #include "GameClient/GadgetStaticText.h"
  44. #include "GameClient/GadgetTextEntry.h"
  45. #include "GameClient/GadgetComboBox.h"
  46. #include "GameClient/GadgetRadioButton.h"
  47. #include "GameClient/GadgetSlider.h"
  48. #include "GameClient/HeaderTemplate.h"
  49. #include "GameClient/Shell.h"
  50. #include "GameClient/KeyDefs.h"
  51. #include "GameClient/GameWindowManager.h"
  52. #include "GameClient/Mouse.h"
  53. #include "GameClient/GameText.h"
  54. #include "GameClient/Display.h"
  55. #include "GameClient/IMEManager.h"
  56. #include "GameClient/ShellHooks.h"
  57. #include "GameClient/GUICallbacks.h"
  58. #include "GameNetwork/FirewallHelper.h"
  59. #include "GameNetwork/IPEnumeration.h"
  60. #include "GameNetwork/GameSpyOverlay.h"
  61. #include "GameNetwork/GameSpy/PeerDefs.h"
  62. #include "GameLogic/GameLogic.h"
  63. #include "GameLogic/ScriptEngine.h"
  64. #include "WWDownload/Registry.h"
  65. //added by saad
  66. //used to access a messagebox that does "ok" and "cancel"
  67. #include "GameClient/MessageBox.h"
  68. // This is for non-RC builds only!!!
  69. #define VERBOSE_VERSION L"Release"
  70. #ifdef _INTERNAL
  71. // for occasional debugging...
  72. //#pragma optimize("", off)
  73. //#pragma MESSAGE("************************************** WARNING, optimization disabled for debugging purposes")
  74. #endif
  75. static NameKeyType comboBoxOnlineIPID = NAMEKEY_INVALID;
  76. static GameWindow * comboBoxOnlineIP = NULL;
  77. static NameKeyType comboBoxLANIPID = NAMEKEY_INVALID;
  78. static GameWindow * comboBoxLANIP = NULL;
  79. static NameKeyType comboBoxAntiAliasingID = NAMEKEY_INVALID;
  80. static GameWindow * comboBoxAntiAliasing = NULL;
  81. static NameKeyType comboBoxResolutionID = NAMEKEY_INVALID;
  82. static GameWindow * comboBoxResolution = NULL;
  83. static NameKeyType comboBoxDetailID = NAMEKEY_INVALID;
  84. static GameWindow * comboBoxDetail = NULL;
  85. static NameKeyType checkAlternateMouseID = NAMEKEY_INVALID;
  86. static GameWindow * checkAlternateMouse = NULL;
  87. static NameKeyType sliderScrollSpeedID = NAMEKEY_INVALID;
  88. static GameWindow * sliderScrollSpeed = NULL;
  89. static NameKeyType checkLanguageFilterID = NAMEKEY_INVALID;
  90. static GameWindow * checkLanguageFilter = NULL;
  91. static NameKeyType checkUseCameraID = NAMEKEY_INVALID;
  92. static GameWindow * checkUseCamera = NULL;
  93. static NameKeyType checkSaveCameraID = NAMEKEY_INVALID;
  94. static GameWindow * checkSaveCamera = NULL;
  95. static NameKeyType checkSendDelayID = NAMEKEY_INVALID;
  96. static GameWindow * checkSendDelay = NULL;
  97. static NameKeyType checkDrawAnchorID = NAMEKEY_INVALID;
  98. static GameWindow * checkDrawAnchor = NULL;
  99. static NameKeyType checkMoveAnchorID = NAMEKEY_INVALID;
  100. static GameWindow * checkMoveAnchor = NULL;
  101. static NameKeyType buttonFirewallRefreshID = NAMEKEY_INVALID;
  102. static GameWindow * buttonFirewallRefresh = NULL;
  103. //
  104. //static NameKeyType checkAudioHardwareID = NAMEKEY_INVALID;
  105. //static GameWindow * checkAudioHardware = NULL;
  106. //
  107. //static NameKeyType checkAudioSurroundID = NAMEKEY_INVALID;
  108. //static GameWindow * checkAudioSurround = NULL;
  109. ////volume controls
  110. //
  111. static NameKeyType sliderMusicVolumeID = NAMEKEY_INVALID;
  112. static GameWindow * sliderMusicVolume = NULL;
  113. static NameKeyType sliderSFXVolumeID = NAMEKEY_INVALID;
  114. static GameWindow * sliderSFXVolume = NULL;
  115. static NameKeyType sliderVoiceVolumeID = NAMEKEY_INVALID;
  116. static GameWindow * sliderVoiceVolume = NULL;
  117. static NameKeyType sliderGammaID = NAMEKEY_INVALID;
  118. static GameWindow * sliderGamma = NULL;
  119. //Advanced Options Screen
  120. static NameKeyType WinAdvancedDisplayID = NAMEKEY_INVALID;
  121. static GameWindow * WinAdvancedDisplay = NULL;
  122. static NameKeyType ButtonAdvancedAcceptID = NAMEKEY_INVALID;
  123. static GameWindow * ButtonAdvancedAccept = NULL;
  124. static NameKeyType ButtonAdvancedCancelID = NAMEKEY_INVALID;
  125. static GameWindow * ButtonAdvancedCancel = NULL;
  126. static NameKeyType sliderTextureResolutionID = NAMEKEY_INVALID;
  127. static GameWindow * sliderTextureResolution = NULL;
  128. static NameKeyType sliderParticleCapID = NAMEKEY_INVALID;
  129. static GameWindow * sliderParticleCap = NULL;
  130. static NameKeyType check3DShadowsID = NAMEKEY_INVALID;
  131. static GameWindow * check3DShadows = NULL;
  132. static NameKeyType check2DShadowsID = NAMEKEY_INVALID;
  133. static GameWindow * check2DShadows = NULL;
  134. static NameKeyType checkCloudShadowsID = NAMEKEY_INVALID;
  135. static GameWindow * checkCloudShadows = NULL;
  136. static NameKeyType checkGroundLightingID = NAMEKEY_INVALID;
  137. static GameWindow * checkGroundLighting = NULL;
  138. static NameKeyType checkSmoothWaterID = NAMEKEY_INVALID;
  139. static GameWindow * checkSmoothWater = NULL;
  140. static NameKeyType checkBuildingOcclusionID = NAMEKEY_INVALID;
  141. static GameWindow * checkBuildingOcclusion = NULL;
  142. static NameKeyType checkPropsID = NAMEKEY_INVALID;
  143. static GameWindow * checkProps = NULL;
  144. static NameKeyType checkExtraAnimationsID = NAMEKEY_INVALID;
  145. static GameWindow * checkExtraAnimations = NULL;
  146. static NameKeyType checkNoDynamicLodID = NAMEKEY_INVALID;
  147. static GameWindow * checkNoDynamicLod = NULL;
  148. static NameKeyType checkUnlockFpsID = NAMEKEY_INVALID;
  149. static GameWindow * checkUnlockFps = NULL;
  150. /*
  151. static NameKeyType radioHighID = NAMEKEY_INVALID;
  152. static GameWindow * radioHigh = NULL;
  153. static NameKeyType radioMediumID = NAMEKEY_INVALID;
  154. static GameWindow * radioMedium = NULL;
  155. static NameKeyType radioLowID = NAMEKEY_INVALID;
  156. static GameWindow * radioLow = NULL;
  157. */
  158. //Added By Saad for the resolution confirmation dialog box
  159. DisplaySettings oldDispSettings, newDispSettings;
  160. Bool dispChanged = FALSE;
  161. extern Int timer;
  162. extern void DoResolutionDialog();
  163. //
  164. static Bool ignoreSelected = FALSE;
  165. WindowLayout *OptionsLayout = NULL;
  166. enum Detail
  167. {
  168. HIGHDETAIL = 0,
  169. MEDIUMDETAIL,
  170. LOWDETAIL,
  171. CUSTOMDETAIL,
  172. DETAIL,
  173. };
  174. OptionPreferences::OptionPreferences( void )
  175. {
  176. // note, the superclass will put this in the right dir automatically, this is just a leaf name
  177. load("Options.ini");
  178. }
  179. OptionPreferences::~OptionPreferences()
  180. {
  181. }
  182. Int OptionPreferences::getCampaignDifficulty(void)
  183. {
  184. OptionPreferences::const_iterator it = find("CampaignDifficulty");
  185. if (it == end())
  186. return TheScriptEngine->getGlobalDifficulty();
  187. Int factor = atoi(it->second.str());
  188. if (factor < DIFFICULTY_EASY)
  189. factor = DIFFICULTY_EASY;
  190. if (factor > DIFFICULTY_HARD)
  191. factor = DIFFICULTY_HARD;
  192. return factor;
  193. }
  194. void OptionPreferences::setCampaignDifficulty( Int diff )
  195. {
  196. AsciiString prefString;
  197. prefString.format("%d", diff );
  198. (*this)["CampaignDifficulty"] = prefString;
  199. }
  200. UnsignedInt OptionPreferences::getLANIPAddress(void)
  201. {
  202. AsciiString selectedIP = (*this)["IPAddress"];
  203. IPEnumeration IPs;
  204. EnumeratedIP *IPlist = IPs.getAddresses();
  205. while (IPlist)
  206. {
  207. if (selectedIP.compareNoCase(IPlist->getIPstring()) == 0)
  208. {
  209. return IPlist->getIP();
  210. }
  211. IPlist = IPlist->getNext();
  212. }
  213. return TheGlobalData->m_defaultIP;
  214. }
  215. void OptionPreferences::setLANIPAddress( AsciiString IP )
  216. {
  217. (*this)["IPAddress"] = IP;
  218. }
  219. void OptionPreferences::setLANIPAddress( UnsignedInt IP )
  220. {
  221. AsciiString tmp;
  222. tmp.format("%d.%d.%d.%d", ((IP & 0xff000000) >> 24), ((IP & 0xff0000) >> 16), ((IP & 0xff00) >> 8), (IP & 0xff));
  223. (*this)["IPAddress"] = tmp;
  224. }
  225. UnsignedInt OptionPreferences::getOnlineIPAddress(void)
  226. {
  227. AsciiString selectedIP = (*this)["GameSpyIPAddress"];
  228. IPEnumeration IPs;
  229. EnumeratedIP *IPlist = IPs.getAddresses();
  230. while (IPlist)
  231. {
  232. if (selectedIP.compareNoCase(IPlist->getIPstring()) == 0)
  233. {
  234. return IPlist->getIP();
  235. }
  236. IPlist = IPlist->getNext();
  237. }
  238. return TheGlobalData->m_defaultIP;
  239. }
  240. void OptionPreferences::setOnlineIPAddress( AsciiString IP )
  241. {
  242. (*this)["GameSpyIPAddress"] = IP;
  243. }
  244. void OptionPreferences::setOnlineIPAddress( UnsignedInt IP )
  245. {
  246. AsciiString tmp;
  247. tmp.format("%d.%d.%d.%d", ((IP & 0xff000000) >> 24), ((IP & 0xff0000) >> 16), ((IP & 0xff00) >> 8), (IP & 0xff));
  248. (*this)["GameSpyIPAddress"] = tmp;
  249. }
  250. Bool OptionPreferences::getAlternateMouseModeEnabled(void)
  251. {
  252. OptionPreferences::const_iterator it = find("UseAlternateMouse");
  253. if (it == end())
  254. return TheGlobalData->m_useAlternateMouse;
  255. if (stricmp(it->second.str(), "yes") == 0) {
  256. return TRUE;
  257. }
  258. return FALSE;
  259. }
  260. Real OptionPreferences::getScrollFactor(void)
  261. {
  262. OptionPreferences::const_iterator it = find("ScrollFactor");
  263. if (it == end())
  264. return TheGlobalData->m_keyboardDefaultScrollFactor;
  265. Int factor = atoi(it->second.str());
  266. if (factor < 0)
  267. factor = 0;
  268. if (factor > 100)
  269. factor = 100;
  270. return factor/100.0f;
  271. }
  272. Bool OptionPreferences::usesSystemMapDir(void)
  273. {
  274. OptionPreferences::const_iterator it = find("UseSystemMapDir");
  275. if (it == end())
  276. return TRUE;
  277. if (stricmp(it->second.str(), "yes") == 0) {
  278. return TRUE;
  279. }
  280. return FALSE;
  281. }
  282. Bool OptionPreferences::saveCameraInReplays(void)
  283. {
  284. OptionPreferences::const_iterator it = find("SaveCameraInReplays");
  285. if (it == end())
  286. return TRUE;
  287. if (stricmp(it->second.str(), "yes") == 0) {
  288. return TRUE;
  289. }
  290. return FALSE;
  291. }
  292. Bool OptionPreferences::useCameraInReplays(void)
  293. {
  294. OptionPreferences::const_iterator it = find("UseCameraInReplays");
  295. if (it == end())
  296. return TRUE;
  297. if (stricmp(it->second.str(), "yes") == 0) {
  298. return TRUE;
  299. }
  300. return FALSE;
  301. }
  302. Int OptionPreferences::getIdealStaticGameDetail(void)
  303. {
  304. OptionPreferences::const_iterator it = find("IdealStaticGameLOD");
  305. if (it == end())
  306. return STATIC_GAME_LOD_UNKNOWN;
  307. return TheGameLODManager->getStaticGameLODIndex(it->second);
  308. }
  309. Int OptionPreferences::getStaticGameDetail(void)
  310. {
  311. OptionPreferences::const_iterator it = find("StaticGameLOD");
  312. if (it == end())
  313. return TheGameLODManager->getStaticLODLevel();
  314. return TheGameLODManager->getStaticGameLODIndex(it->second);
  315. }
  316. Bool OptionPreferences::getSendDelay(void)
  317. {
  318. OptionPreferences::const_iterator it = find("SendDelay");
  319. if (it == end())
  320. return TheGlobalData->m_firewallSendDelay;
  321. if (stricmp(it->second.str(), "yes") == 0) {
  322. return TRUE;
  323. }
  324. return FALSE;
  325. }
  326. Int OptionPreferences::getFirewallBehavior()
  327. {
  328. OptionPreferences::const_iterator it = find("FirewallBehavior");
  329. if (it == end())
  330. return TheGlobalData->m_firewallBehavior;
  331. Int behavior = atoi(it->second.str());
  332. if (behavior < 0)
  333. {
  334. behavior = 0;
  335. }
  336. return behavior;
  337. }
  338. Short OptionPreferences::getFirewallPortAllocationDelta()
  339. {
  340. OptionPreferences::const_iterator it = find("FirewallPortAllocationDelta");
  341. if (it == end()) {
  342. return TheGlobalData->m_firewallPortAllocationDelta;
  343. }
  344. Short delta = atoi(it->second.str());
  345. return delta;
  346. }
  347. UnsignedShort OptionPreferences::getFirewallPortOverride()
  348. {
  349. OptionPreferences::const_iterator it = find("FirewallPortOverride");
  350. if (it == end()) {
  351. return TheGlobalData->m_firewallPortOverride;
  352. }
  353. Int override = atoi(it->second.str());
  354. if (override < 0 || override > 65535)
  355. override = 0;
  356. return override;
  357. }
  358. Bool OptionPreferences::getFirewallNeedToRefresh()
  359. {
  360. OptionPreferences::const_iterator it = find("FirewallNeedToRefresh");
  361. if (it == end()) {
  362. return FALSE;
  363. }
  364. Bool retval = FALSE;
  365. AsciiString str = it->second;
  366. if (str.compareNoCase("TRUE") == 0) {
  367. retval = TRUE;
  368. }
  369. return retval;
  370. }
  371. AsciiString OptionPreferences::getPreferred3DProvider(void)
  372. {
  373. OptionPreferences::const_iterator it = find("3DAudioProvider");
  374. if (it == end())
  375. return TheAudio->getAudioSettings()->m_preferred3DProvider[MAX_HW_PROVIDERS];
  376. return it->second;
  377. }
  378. AsciiString OptionPreferences::getSpeakerType(void)
  379. {
  380. OptionPreferences::const_iterator it = find("SpeakerType");
  381. if (it == end())
  382. return TheAudio->translateUnsignedIntToSpeakerType(TheAudio->getAudioSettings()->m_defaultSpeakerType2D);
  383. return it->second;
  384. }
  385. Real OptionPreferences::getSoundVolume(void)
  386. {
  387. OptionPreferences::const_iterator it = find("SFXVolume");
  388. if (it == end())
  389. {
  390. Real relative = TheAudio->getAudioSettings()->m_relative2DVolume;
  391. if( relative < 0 )
  392. {
  393. Real scale = 1.0f + relative;
  394. return TheAudio->getAudioSettings()->m_defaultSoundVolume * 100.0f * scale;
  395. }
  396. return TheAudio->getAudioSettings()->m_defaultSoundVolume * 100.0f;
  397. }
  398. Real volume = (Real) atof(it->second.str());
  399. if (volume < 0.0f)
  400. {
  401. volume = 0.0f;
  402. }
  403. return volume;
  404. }
  405. Real OptionPreferences::get3DSoundVolume(void)
  406. {
  407. OptionPreferences::const_iterator it = find("SFX3DVolume");
  408. if (it == end())
  409. {
  410. Real relative = TheAudio->getAudioSettings()->m_relative2DVolume;
  411. if( relative > 0 )
  412. {
  413. Real scale = 1.0f - relative;
  414. return TheAudio->getAudioSettings()->m_default3DSoundVolume * 100.0f * scale;
  415. }
  416. return TheAudio->getAudioSettings()->m_default3DSoundVolume * 100.0f;
  417. }
  418. Real volume = (Real) atof(it->second.str());
  419. if (volume < 0.0f)
  420. {
  421. volume = 0.0f;
  422. }
  423. return volume;
  424. }
  425. Real OptionPreferences::getSpeechVolume(void)
  426. {
  427. OptionPreferences::const_iterator it = find("VoiceVolume");
  428. if (it == end())
  429. return TheAudio->getAudioSettings()->m_defaultSpeechVolume * 100.0f;
  430. Real volume = (Real) atof(it->second.str());
  431. if (volume < 0.0f)
  432. {
  433. volume = 0.0f;
  434. }
  435. return volume;
  436. }
  437. Bool OptionPreferences::getCloudShadowsEnabled(void)
  438. {
  439. OptionPreferences::const_iterator it = find("UseCloudMap");
  440. if (it == end())
  441. return TheGlobalData->m_useCloudMap;
  442. if (stricmp(it->second.str(), "yes") == 0) {
  443. return TRUE;
  444. }
  445. return FALSE;
  446. }
  447. Bool OptionPreferences::getLightmapEnabled(void)
  448. {
  449. OptionPreferences::const_iterator it = find("UseLightMap");
  450. if (it == end())
  451. return TheGlobalData->m_useLightMap;
  452. if (stricmp(it->second.str(), "yes") == 0) {
  453. return TRUE;
  454. }
  455. return FALSE;
  456. }
  457. Bool OptionPreferences::getSmoothWaterEnabled(void)
  458. {
  459. OptionPreferences::const_iterator it = find("ShowSoftWaterEdge");
  460. if (it == end())
  461. return TheGlobalData->m_showSoftWaterEdge;
  462. if (stricmp(it->second.str(), "yes") == 0) {
  463. return TRUE;
  464. }
  465. return FALSE;
  466. }
  467. Bool OptionPreferences::getTreesEnabled(void)
  468. {
  469. OptionPreferences::const_iterator it = find("ShowTrees");
  470. if (it == end())
  471. return TheGlobalData->m_useTrees;
  472. if (stricmp(it->second.str(), "yes") == 0) {
  473. return TRUE;
  474. }
  475. return FALSE;
  476. }
  477. Bool OptionPreferences::getExtraAnimationsDisabled(void)
  478. {
  479. OptionPreferences::const_iterator it = find("ExtraAnimations");
  480. if (it == end())
  481. return TheGlobalData->m_useDrawModuleLOD;
  482. if (stricmp(it->second.str(), "yes") == 0) {
  483. return FALSE; //we are enabling extra animations, so disabled LOD
  484. }
  485. return TRUE;
  486. }
  487. Bool OptionPreferences::getDynamicLODEnabled(void)
  488. {
  489. OptionPreferences::const_iterator it = find("DynamicLOD");
  490. if (it == end())
  491. return TheGlobalData->m_enableDynamicLOD;
  492. if (stricmp(it->second.str(), "yes") == 0) {
  493. return TRUE;
  494. }
  495. return FALSE;
  496. }
  497. Bool OptionPreferences::getFPSLimitEnabled(void)
  498. {
  499. OptionPreferences::const_iterator it = find("FPSLimit");
  500. if (it == end())
  501. return TheGlobalData->m_useFpsLimit;
  502. if (stricmp(it->second.str(), "yes") == 0) {
  503. return TRUE;
  504. }
  505. return FALSE;
  506. }
  507. Bool OptionPreferences::get3DShadowsEnabled(void)
  508. {
  509. OptionPreferences::const_iterator it = find("UseShadowVolumes");
  510. if (it == end())
  511. return TheGlobalData->m_useShadowVolumes;
  512. if (stricmp(it->second.str(), "yes") == 0) {
  513. return TRUE;
  514. }
  515. return FALSE;
  516. }
  517. Bool OptionPreferences::get2DShadowsEnabled(void)
  518. {
  519. OptionPreferences::const_iterator it = find("UseShadowDecals");
  520. if (it == end())
  521. return TheGlobalData->m_useShadowDecals;
  522. if (stricmp(it->second.str(), "yes") == 0) {
  523. return TRUE;
  524. }
  525. return FALSE;
  526. }
  527. Bool OptionPreferences::getBuildingOcclusionEnabled(void)
  528. {
  529. OptionPreferences::const_iterator it = find("BuildingOcclusion");
  530. if (it == end())
  531. return TheGlobalData->m_enableBehindBuildingMarkers;
  532. if (stricmp(it->second.str(), "yes") == 0) {
  533. return TRUE;
  534. }
  535. return FALSE;
  536. }
  537. Int OptionPreferences::getParticleCap(void)
  538. {
  539. OptionPreferences::const_iterator it = find("MaxParticleCount");
  540. if (it == end())
  541. return TheGlobalData->m_maxParticleCount;
  542. Int factor = (Int) atoi(it->second.str());
  543. if (factor < 100) //clamp to at least 100 particles.
  544. factor = 100;
  545. return factor;
  546. }
  547. Int OptionPreferences::getTextureReduction(void)
  548. {
  549. OptionPreferences::const_iterator it = find("TextureReduction");
  550. if (it == end())
  551. return -1; //unknown texture reduction
  552. Int factor = (Int) atoi(it->second.str());
  553. if (factor > 2) //clamp it.
  554. factor=2;
  555. return factor;
  556. }
  557. Real OptionPreferences::getGammaValue(void)
  558. {
  559. OptionPreferences::const_iterator it = find("Gamma");
  560. if (it == end())
  561. return 50.0f;
  562. Real gamma = (Real) atoi(it->second.str());
  563. return gamma;
  564. }
  565. void OptionPreferences::getResolution(Int *xres, Int *yres)
  566. {
  567. *xres = TheGlobalData->m_xResolution;
  568. *yres = TheGlobalData->m_yResolution;
  569. OptionPreferences::const_iterator it = find("Resolution");
  570. if (it == end())
  571. return;
  572. Int selectedXRes,selectedYRes;
  573. if (sscanf(it->second.str(),"%d%d", &selectedXRes, &selectedYRes) != 2)
  574. return;
  575. *xres=selectedXRes;
  576. *yres=selectedYRes;
  577. }
  578. Real OptionPreferences::getMusicVolume(void)
  579. {
  580. OptionPreferences::const_iterator it = find("MusicVolume");
  581. if (it == end())
  582. return TheAudio->getAudioSettings()->m_defaultMusicVolume * 100.0f;
  583. Real volume = (Real) atof(it->second.str());
  584. if (volume < 0.0f)
  585. {
  586. volume = 0.0f;
  587. }
  588. return volume;
  589. }
  590. static OptionPreferences *pref = NULL;
  591. static void setDefaults( void )
  592. {
  593. //-------------------------------------------------------------------------------------------------
  594. // provider type
  595. // GadgetCheckBoxSetChecked(checkAudioHardware, FALSE);
  596. //-------------------------------------------------------------------------------------------------
  597. // speaker type
  598. // GadgetCheckBoxSetChecked(checkAudioSurround, FALSE);
  599. //-------------------------------------------------------------------------------------------------
  600. // language filter
  601. GadgetCheckBoxSetChecked( checkLanguageFilter, TRUE );
  602. //-------------------------------------------------------------------------------------------------
  603. // send Delay
  604. GadgetCheckBoxSetChecked(checkSendDelay, FALSE);
  605. //-------------------------------------------------------------------------------------------------
  606. // LOD
  607. if ((TheGameLogic->isInGame() == FALSE) || (TheGameLogic->isInShellGame() == TRUE)) {
  608. TheGameLODManager->setStaticLODLevel(TheGameLODManager->findStaticLODLevel());
  609. switch (TheGameLODManager->getStaticLODLevel())
  610. {
  611. case STATIC_GAME_LOD_LOW:
  612. GadgetComboBoxSetSelectedPos(comboBoxDetail, LOWDETAIL);
  613. break;
  614. case STATIC_GAME_LOD_MEDIUM:
  615. GadgetComboBoxSetSelectedPos(comboBoxDetail, MEDIUMDETAIL);
  616. break;
  617. case STATIC_GAME_LOD_HIGH:
  618. GadgetComboBoxSetSelectedPos(comboBoxDetail, HIGHDETAIL);
  619. break;
  620. case STATIC_GAME_LOD_CUSTOM:
  621. GadgetComboBoxSetSelectedPos(comboBoxDetail, CUSTOMDETAIL);
  622. break;
  623. default:
  624. DEBUG_ASSERTCRASH(FALSE,("Tried to set comboBoxDetail to a value of %d ", TheGameLODManager->getStaticLODLevel()) );
  625. };
  626. }
  627. //-------------------------------------------------------------------------------------------------
  628. // Resolution
  629. //Find index of 800x600 mode.
  630. if ((TheGameLogic->isInGame() == FALSE) || (TheGameLogic->isInShellGame() == TRUE) && !TheGameSpyInfo) {
  631. Int numResolutions = TheDisplay->getDisplayModeCount();
  632. Int defaultResIndex=0;
  633. for( Int i = 0; i < numResolutions; ++i )
  634. { Int xres,yres,bitDepth;
  635. TheDisplay->getDisplayModeDescription(i,&xres,&yres,&bitDepth);
  636. if (xres == 800 && yres == 600) //keep track of default mode in case we need it.
  637. { defaultResIndex=i;
  638. break;
  639. }
  640. }
  641. GadgetComboBoxSetSelectedPos( comboBoxResolution, defaultResIndex ); //should be 800x600 (our lowest supported mode)
  642. }
  643. //-------------------------------------------------------------------------------------------------
  644. // Mouse Mode
  645. GadgetCheckBoxSetChecked(checkAlternateMouse, FALSE);
  646. //-------------------------------------------------------------------------------------------------
  647. // // scroll speed val
  648. Int valMin, valMax;
  649. // GadgetSliderGetMinMax(sliderScrollSpeed,&valMin, &valMax);
  650. // GadgetSliderSetPosition(sliderScrollSpeed, ((valMax - valMin) / 2 + valMin));
  651. Int scrollPos = (Int)(TheGlobalData->m_keyboardDefaultScrollFactor*100.0f);
  652. GadgetSliderSetPosition( sliderScrollSpeed, scrollPos );
  653. //-------------------------------------------------------------------------------------------------
  654. // slider music volume
  655. GadgetSliderGetMinMax(sliderMusicVolume,&valMin, &valMax);
  656. GadgetSliderSetPosition(sliderMusicVolume,REAL_TO_INT(TheAudio->getAudioSettings()->m_defaultMusicVolume * 100.0f));
  657. //-------------------------------------------------------------------------------------------------
  658. // slider SFX volume
  659. GadgetSliderGetMinMax(sliderSFXVolume,&valMin, &valMax);
  660. Real maxVolume = MAX( TheAudio->getAudioSettings()->m_defaultSoundVolume, TheAudio->getAudioSettings()->m_default3DSoundVolume );
  661. GadgetSliderSetPosition( sliderSFXVolume, REAL_TO_INT( maxVolume * 100.0f ) );
  662. //-------------------------------------------------------------------------------------------------
  663. // slider Voice volume
  664. GadgetSliderGetMinMax(sliderVoiceVolume,&valMin, &valMax);
  665. GadgetSliderSetPosition(sliderVoiceVolume, REAL_TO_INT(TheAudio->getAudioSettings()->m_defaultSpeechVolume * 100.0f));
  666. //-------------------------------------------------------------------------------------------------
  667. // slider Gamma
  668. GadgetSliderGetMinMax(sliderGamma,&valMin, &valMax);
  669. GadgetSliderSetPosition(sliderGamma, ((valMax - valMin) / 2 + valMin));
  670. //-------------------------------------------------------------------------------------------------
  671. // Texture resolution slider
  672. //
  673. if ((TheGameLogic->isInGame() == FALSE) || (TheGameLogic->isInShellGame() == TRUE))
  674. {
  675. Int txtFact=TheGameLODManager->getRecommendedTextureReduction();
  676. GadgetSliderSetPosition( sliderTextureResolution, 2-txtFact);
  677. //-------------------------------------------------------------------------------------------------
  678. // 3D Shadows checkbox
  679. //
  680. GadgetCheckBoxSetChecked( check3DShadows, TheGlobalData->m_useShadowVolumes);
  681. //-------------------------------------------------------------------------------------------------
  682. // 2D Shadows checkbox
  683. //
  684. GadgetCheckBoxSetChecked( check2DShadows, TheGlobalData->m_useShadowDecals);
  685. //-------------------------------------------------------------------------------------------------
  686. // Cloud Shadows checkbox
  687. //
  688. GadgetCheckBoxSetChecked( checkCloudShadows, TheGlobalData->m_useCloudMap);
  689. //-------------------------------------------------------------------------------------------------
  690. // Ground Lighting (lightmap) checkbox
  691. //
  692. GadgetCheckBoxSetChecked( checkGroundLighting, TheGlobalData->m_useLightMap);
  693. //-------------------------------------------------------------------------------------------------
  694. // Smooth Water Border checkbox
  695. //
  696. GadgetCheckBoxSetChecked( checkSmoothWater, TheGlobalData->m_showSoftWaterEdge);
  697. //-------------------------------------------------------------------------------------------------
  698. // Extra Animations (tree sway and buildups) checkbox
  699. //
  700. GadgetCheckBoxSetChecked( checkExtraAnimations, !TheGlobalData->m_useDrawModuleLOD);
  701. //-------------------------------------------------------------------------------------------------
  702. // DisableDynamicLOD
  703. //
  704. GadgetCheckBoxSetChecked( checkNoDynamicLod, !TheGlobalData->m_enableDynamicLOD);
  705. //-------------------------------------------------------------------------------------------------
  706. // Disable FPS Limit
  707. //
  708. GadgetCheckBoxSetChecked( checkUnlockFps, !TheGlobalData->m_useFpsLimit);
  709. //-------------------------------------------------------------------------------------------------
  710. // Building Occlusion checkbox
  711. //
  712. GadgetCheckBoxSetChecked( checkBuildingOcclusion, TheGlobalData->m_enableBehindBuildingMarkers);
  713. //-------------------------------------------------------------------------------------------------
  714. // Particle Cap slider
  715. //
  716. GadgetSliderSetPosition( sliderParticleCap, TheGlobalData->m_maxParticleCount);
  717. //-------------------------------------------------------------------------------------------------
  718. // Trees and Shrubs
  719. //
  720. GadgetCheckBoxSetChecked( checkProps, TheGlobalData->m_useTrees);
  721. }
  722. }
  723. static void saveOptions( void )
  724. {
  725. Int index;
  726. Int val;
  727. //-------------------------------------------------------------------------------------------------
  728. // // provider type
  729. // Bool isChecked = GadgetCheckBoxIsChecked(checkAudioHardware);
  730. // TheAudio->setHardwareAccelerated(isChecked);
  731. // (*pref)["3DAudioProvider"] = TheAudio->getProviderName(TheAudio->getSelectedProvider());
  732. //
  733. //-------------------------------------------------------------------------------------------------
  734. // // speaker type
  735. // isChecked = GadgetCheckBoxIsChecked(checkAudioSurround);
  736. // TheAudio->setSpeakerSurround(isChecked);
  737. // (*pref)["SpeakerType"] = TheAudio->translateUnsignedIntToSpeakerType(TheAudio->getSpeakerType());
  738. //
  739. //-------------------------------------------------------------------------------------------------
  740. // language filter
  741. if( GadgetCheckBoxIsChecked( checkLanguageFilter ) )
  742. {
  743. //GadgetCheckBoxSetChecked( checkLanguageFilter, true);
  744. TheWritableGlobalData->m_languageFilterPref = true;
  745. (*pref)["LanguageFilter"] = "true";
  746. }
  747. else
  748. {
  749. //GadgetCheckBoxSetChecked( checkLanguageFilter, false);
  750. TheWritableGlobalData->m_languageFilterPref = false;
  751. (*pref)["LanguageFilter"] = "false";
  752. }
  753. //-------------------------------------------------------------------------------------------------
  754. // send Delay
  755. TheWritableGlobalData->m_firewallSendDelay = GadgetCheckBoxIsChecked(checkSendDelay);
  756. if (TheGlobalData->m_firewallSendDelay) {
  757. (*pref)["SendDelay"] = AsciiString("yes");
  758. } else {
  759. (*pref)["SendDelay"] = AsciiString("no");
  760. }
  761. //-------------------------------------------------------------------------------------------------
  762. // Custom game detail settings.
  763. GadgetComboBoxGetSelectedPos( comboBoxDetail, &index );
  764. if (index == CUSTOMDETAIL)
  765. {
  766. //-------------------------------------------------------------------------------------------------
  767. // Texture resolution slider
  768. {
  769. AsciiString prefString;
  770. val = GadgetSliderGetPosition(sliderTextureResolution);
  771. val = 2-val;
  772. prefString.format("%d",val);
  773. (*pref)["TextureReduction"] = prefString;
  774. if (TheGlobalData->m_textureReductionFactor != val)
  775. {
  776. TheGameClient->adjustLOD(val-TheGlobalData->m_textureReductionFactor); //apply the new setting
  777. }
  778. }
  779. TheWritableGlobalData->m_useShadowVolumes = GadgetCheckBoxIsChecked( check3DShadows );
  780. (*pref)["UseShadowVolumes"] = TheWritableGlobalData->m_useShadowVolumes ? AsciiString("yes") : AsciiString("no");
  781. TheWritableGlobalData->m_useShadowDecals = GadgetCheckBoxIsChecked( check2DShadows );
  782. (*pref)["UseShadowDecals"] = TheWritableGlobalData->m_useShadowDecals ? AsciiString("yes") : AsciiString("no");
  783. TheWritableGlobalData->m_useCloudMap = GadgetCheckBoxIsChecked( checkCloudShadows );
  784. (*pref)["UseCloudMap"] = TheGlobalData->m_useCloudMap ? AsciiString("yes") : AsciiString("no");
  785. TheWritableGlobalData->m_useLightMap = GadgetCheckBoxIsChecked( checkGroundLighting );
  786. (*pref)["UseLightMap"] = TheGlobalData->m_useLightMap ? AsciiString("yes") : AsciiString("no");
  787. TheWritableGlobalData->m_showSoftWaterEdge = GadgetCheckBoxIsChecked( checkSmoothWater );
  788. (*pref)["ShowSoftWaterEdge"] = TheGlobalData->m_showSoftWaterEdge ? AsciiString("yes") : AsciiString("no");
  789. TheWritableGlobalData->m_useDrawModuleLOD = !GadgetCheckBoxIsChecked( checkExtraAnimations );
  790. TheWritableGlobalData->m_useTreeSway = !TheWritableGlobalData->m_useDrawModuleLOD; //borrow same setting.
  791. (*pref)["ExtraAnimations"] = TheGlobalData->m_useDrawModuleLOD ? AsciiString("no") : AsciiString("yes");
  792. TheWritableGlobalData->m_enableDynamicLOD = !GadgetCheckBoxIsChecked( checkNoDynamicLod );
  793. (*pref)["DynamicLOD"] = TheGlobalData->m_enableDynamicLOD ? AsciiString("yes") : AsciiString("no");
  794. // Never write this out
  795. //TheWritableGlobalData->m_useFpsLimit = !GadgetCheckBoxIsChecked( checkUnlockFps );
  796. //(*pref)["FPSLimit"] = TheGlobalData->m_useFpsLimit ? AsciiString("yes") : AsciiString("no");
  797. TheWritableGlobalData->m_enableBehindBuildingMarkers = GadgetCheckBoxIsChecked( checkBuildingOcclusion );
  798. (*pref)["BuildingOcclusion"] = TheWritableGlobalData->m_enableBehindBuildingMarkers ? AsciiString("yes") : AsciiString("no");
  799. TheWritableGlobalData->m_useTrees = GadgetCheckBoxIsChecked( checkProps);
  800. (*pref)["ShowTrees"] = TheWritableGlobalData->m_useTrees ? AsciiString("yes") : AsciiString("no");
  801. //-------------------------------------------------------------------------------------------------
  802. // Particle Cap slider
  803. {
  804. AsciiString prefString;
  805. val = GadgetSliderGetPosition(sliderParticleCap);
  806. prefString.format("%d",val);
  807. (*pref)["MaxParticleCount"] = prefString;
  808. TheWritableGlobalData->m_maxParticleCount = val;
  809. }
  810. }
  811. //-------------------------------------------------------------------------------------------------
  812. // LOD
  813. Bool levelChanged=FALSE;
  814. GadgetComboBoxGetSelectedPos( comboBoxDetail, &index );
  815. //The levels stored by the LOD Manager are inverted compared to GUI so find correct one:
  816. switch (index) {
  817. case HIGHDETAIL:
  818. levelChanged=TheGameLODManager->setStaticLODLevel(STATIC_GAME_LOD_HIGH);
  819. break;
  820. case MEDIUMDETAIL:
  821. levelChanged=TheGameLODManager->setStaticLODLevel(STATIC_GAME_LOD_MEDIUM);
  822. break;
  823. case LOWDETAIL:
  824. levelChanged=TheGameLODManager->setStaticLODLevel(STATIC_GAME_LOD_LOW);
  825. break;
  826. case CUSTOMDETAIL:
  827. levelChanged=TheGameLODManager->setStaticLODLevel(STATIC_GAME_LOD_CUSTOM);
  828. break;
  829. default:
  830. DEBUG_ASSERTCRASH(FALSE,("LOD passed in was %d, %d is not a supported LOD",index,index));
  831. break;
  832. }
  833. if (levelChanged)
  834. (*pref)["StaticGameLOD"] = TheGameLODManager->getStaticGameLODLevelName(TheGameLODManager->getStaticLODLevel());
  835. //-------------------------------------------------------------------------------------------------
  836. // Resolution
  837. GadgetComboBoxGetSelectedPos( comboBoxResolution, &index );
  838. Int xres, yres, bitDepth;
  839. oldDispSettings.xRes = TheDisplay->getWidth();
  840. oldDispSettings.yRes = TheDisplay->getHeight();
  841. oldDispSettings.bitDepth = TheDisplay->getBitDepth();
  842. oldDispSettings.windowed = TheDisplay->getWindowed();
  843. if (index < TheDisplay->getDisplayModeCount() && index >= 0)
  844. {
  845. TheDisplay->getDisplayModeDescription(index,&xres,&yres,&bitDepth);
  846. if (TheGlobalData->m_xResolution != xres || TheGlobalData->m_yResolution != yres)
  847. {
  848. if (TheDisplay->setDisplayMode(xres,yres,bitDepth,TheDisplay->getWindowed()))
  849. {
  850. dispChanged = TRUE;
  851. TheWritableGlobalData->m_xResolution = xres;
  852. TheWritableGlobalData->m_yResolution = yres;
  853. TheHeaderTemplateManager->headerNotifyResolutionChange();
  854. TheMouse->mouseNotifyResolutionChange();
  855. //Save new settings for a dialog box confirmation after options are accepted
  856. newDispSettings.xRes = xres;
  857. newDispSettings.yRes = yres;
  858. newDispSettings.bitDepth = bitDepth;
  859. newDispSettings.windowed = TheDisplay->getWindowed();
  860. AsciiString prefString;
  861. prefString.format("%d %d", xres, yres );
  862. (*pref)["Resolution"] = prefString;
  863. // delete the shell
  864. delete TheShell;
  865. TheShell = NULL;
  866. // create the shell
  867. TheShell = MSGNEW("GameClientSubsystem") Shell;
  868. if( TheShell )
  869. TheShell->init();
  870. TheInGameUI->recreateControlBar();
  871. TheShell->push( AsciiString("Menus/MainMenu.wnd") );
  872. }
  873. }
  874. }
  875. //-------------------------------------------------------------------------------------------------
  876. // IP address
  877. UnsignedInt ip;
  878. GadgetComboBoxGetSelectedPos(comboBoxLANIP, &index);
  879. if (index>=0 && TheGlobalData)
  880. {
  881. ip = (UnsignedInt)GadgetComboBoxGetItemData(comboBoxLANIP, index);
  882. TheWritableGlobalData->m_defaultIP = ip;
  883. pref->setLANIPAddress(ip);
  884. }
  885. GadgetComboBoxGetSelectedPos(comboBoxOnlineIP, &index);
  886. if (index>=0)
  887. {
  888. ip = (UnsignedInt)GadgetComboBoxGetItemData(comboBoxOnlineIP, index);
  889. pref->setOnlineIPAddress(ip);
  890. }
  891. //-------------------------------------------------------------------------------------------------
  892. // HTTP Proxy
  893. GameWindow *textEntryHTTPProxy = TheWindowManager->winGetWindowFromId(NULL, NAMEKEY("OptionsMenu.wnd:TextEntryHTTPProxy"));
  894. if (textEntryHTTPProxy)
  895. {
  896. UnicodeString uStr = GadgetTextEntryGetText(textEntryHTTPProxy);
  897. AsciiString aStr;
  898. aStr.translate(uStr);
  899. SetStringInRegistry("", "Proxy", aStr.str());
  900. ghttpSetProxy(aStr.str());
  901. }
  902. //-------------------------------------------------------------------------------------------------
  903. // Firewall Port Override
  904. GameWindow *textEntryFirewallPortOverride = TheWindowManager->winGetWindowFromId(NULL, NAMEKEY("OptionsMenu.wnd:TextEntryFirewallPortOverride"));
  905. if (textEntryFirewallPortOverride)
  906. {
  907. UnicodeString uStr = GadgetTextEntryGetText(textEntryFirewallPortOverride);
  908. AsciiString aStr;
  909. aStr.translate(uStr);
  910. Int override = atoi(aStr.str());
  911. if (override < 0 || override > 65535)
  912. override = 0;
  913. if (TheGlobalData->m_firewallPortOverride != override)
  914. { TheWritableGlobalData->m_firewallPortOverride = override;
  915. aStr.format("%d", override);
  916. (*pref)["FirewallPortOverride"] = aStr;
  917. }
  918. }
  919. //-------------------------------------------------------------------------------------------------
  920. // antialiasing
  921. GadgetComboBoxGetSelectedPos(comboBoxAntiAliasing, &index);
  922. if( index >= 0 && TheGlobalData->m_antiAliasBoxValue != index )
  923. {
  924. TheWritableGlobalData->m_antiAliasBoxValue = index;
  925. AsciiString prefString;
  926. prefString.format("%d", index);
  927. (*pref)["AntiAliasing"] = prefString;
  928. }
  929. //-------------------------------------------------------------------------------------------------
  930. // mouse mode
  931. TheWritableGlobalData->m_useAlternateMouse = GadgetCheckBoxIsChecked(checkAlternateMouse);
  932. (*pref)["UseAlternateMouse"] = TheWritableGlobalData->m_useAlternateMouse ? AsciiString("yes") : AsciiString("no");
  933. //-------------------------------------------------------------------------------------------------
  934. // scroll speed val
  935. val = GadgetSliderGetPosition(sliderScrollSpeed);
  936. if(val != -1)
  937. {
  938. TheWritableGlobalData->m_keyboardScrollFactor = val/100.0f;
  939. DEBUG_LOG(("Scroll Spped val %d, keyboard scroll factor %f\n", val, TheGlobalData->m_keyboardScrollFactor));
  940. AsciiString prefString;
  941. prefString.format("%d", val);
  942. (*pref)["ScrollFactor"] = prefString;
  943. }
  944. //-------------------------------------------------------------------------------------------------
  945. // slider music volume
  946. val = GadgetSliderGetPosition(sliderMusicVolume);
  947. if(val != -1)
  948. {
  949. TheWritableGlobalData->m_musicVolumeFactor = val;
  950. AsciiString prefString;
  951. prefString.format("%d", val);
  952. (*pref)["MusicVolume"] = prefString;
  953. TheAudio->setVolume(val / 100.0f, (AudioAffect) (AudioAffect_Music | AudioAffect_SystemSetting));
  954. }
  955. //-------------------------------------------------------------------------------------------------
  956. // slider SFX volume
  957. val = GadgetSliderGetPosition(sliderSFXVolume);
  958. if(val != -1)
  959. {
  960. //Both 2D and 3D sound effects are sharing the same slider. However, there is a
  961. //relative slider that gets applied to one of these values to lower that sound volume.
  962. Real sound2DVolume = val / 100.0f;
  963. Real sound3DVolume = val / 100.0f;
  964. Real relative2DVolume = TheAudio->getAudioSettings()->m_relative2DVolume;
  965. relative2DVolume = MIN( 1.0f, MAX( -1.0, relative2DVolume ) );
  966. if( relative2DVolume < 0.0f )
  967. {
  968. //Lower the 2D volume
  969. sound2DVolume *= 1.0f + relative2DVolume;
  970. }
  971. else
  972. {
  973. //Lower the 3D volume
  974. sound3DVolume *= 1.0f - relative2DVolume;
  975. }
  976. //Apply the sound volumes in the audio system now.
  977. TheAudio->setVolume( sound2DVolume, (AudioAffect) (AudioAffect_Sound | AudioAffect_SystemSetting) );
  978. TheAudio->setVolume( sound3DVolume, (AudioAffect) (AudioAffect_Sound3D | AudioAffect_SystemSetting) );
  979. //Save the settings in the options.ini.
  980. TheWritableGlobalData->m_SFXVolumeFactor = val;
  981. AsciiString prefString;
  982. prefString.format("%d", REAL_TO_INT( sound2DVolume * 100.0f ) );
  983. (*pref)["SFXVolume"] = prefString;
  984. prefString.format("%d", REAL_TO_INT( sound3DVolume * 100.0f ) );
  985. (*pref)["SFX3DVolume"] = prefString;
  986. }
  987. //-------------------------------------------------------------------------------------------------
  988. // slider Voice volume
  989. val = GadgetSliderGetPosition(sliderVoiceVolume);
  990. if(val != -1)
  991. {
  992. TheWritableGlobalData->m_voiceVolumeFactor = val;
  993. AsciiString prefString;
  994. prefString.format("%d", val);
  995. (*pref)["VoiceVolume"] = prefString;
  996. TheAudio->setVolume(val / 100.0f, (AudioAffect) (AudioAffect_Speech | AudioAffect_SystemSetting));
  997. }
  998. //-------------------------------------------------------------------------------------------------
  999. // slider Gamma
  1000. val = GadgetSliderGetPosition(sliderGamma);
  1001. if(val != -1)
  1002. {
  1003. Real gammaval=1.0f;
  1004. //generate a value between 0.6 and 2.0.
  1005. if (val < 50)
  1006. { //darker gamma
  1007. if (val <= 0)
  1008. gammaval = 0.6f;
  1009. else
  1010. gammaval=1.0f-(0.4f) * (Real)(50-val)/50.0f;
  1011. }
  1012. else
  1013. if (val > 50)
  1014. gammaval=1.0f+(1.0f) * (Real)(val-50)/50.0f;
  1015. AsciiString prefString;
  1016. prefString.format("%d", val);
  1017. (*pref)["Gamma"] = prefString;
  1018. if (TheGlobalData->m_displayGamma != gammaval)
  1019. { TheWritableGlobalData->m_displayGamma = gammaval;
  1020. TheDisplay->setGamma(TheGlobalData->m_displayGamma,0.0f, 1.0f, FALSE);
  1021. }
  1022. }
  1023. }
  1024. static void DestroyOptionsLayout() {
  1025. SignalUIInteraction(SHELL_SCRIPT_HOOK_OPTIONS_CLOSED);
  1026. TheShell->destroyOptionsLayout();
  1027. OptionsLayout = NULL;
  1028. }
  1029. static void showAdvancedOptions()
  1030. {
  1031. WinAdvancedDisplay->winHide(FALSE);
  1032. }
  1033. static void acceptAdvancedOptions()
  1034. {
  1035. WinAdvancedDisplay->winHide(TRUE);
  1036. }
  1037. static void cancelAdvancedOptions()
  1038. {
  1039. //restore the detail selection back to initial state
  1040. switch (TheGameLODManager->getStaticLODLevel())
  1041. {
  1042. case STATIC_GAME_LOD_LOW:
  1043. GadgetComboBoxSetSelectedPos(comboBoxDetail, LOWDETAIL);
  1044. break;
  1045. case STATIC_GAME_LOD_MEDIUM:
  1046. GadgetComboBoxSetSelectedPos(comboBoxDetail, MEDIUMDETAIL);
  1047. break;
  1048. case STATIC_GAME_LOD_HIGH:
  1049. GadgetComboBoxSetSelectedPos(comboBoxDetail, HIGHDETAIL);
  1050. break;
  1051. case STATIC_GAME_LOD_CUSTOM:
  1052. GadgetComboBoxSetSelectedPos(comboBoxDetail, CUSTOMDETAIL);
  1053. break;
  1054. default:
  1055. DEBUG_ASSERTCRASH(FALSE,("Tried to set comboBoxDetail to a value of %d ", TheGameLODManager->getStaticLODLevel()) );
  1056. };
  1057. WinAdvancedDisplay->winHide(TRUE);
  1058. }
  1059. //-------------------------------------------------------------------------------------------------
  1060. /** Initialize the options menu */
  1061. //-------------------------------------------------------------------------------------------------
  1062. void OptionsMenuInit( WindowLayout *layout, void *userData )
  1063. {
  1064. ignoreSelected = TRUE;
  1065. if (TheGameEngine->getQuitting())
  1066. return;
  1067. OptionsLayout = layout;
  1068. if (!pref)
  1069. {
  1070. pref = NEW OptionPreferences;
  1071. }
  1072. SignalUIInteraction(SHELL_SCRIPT_HOOK_OPTIONS_OPENED);
  1073. comboBoxLANIPID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:ComboBoxIP" ) );
  1074. comboBoxLANIP = TheWindowManager->winGetWindowFromId( NULL, comboBoxLANIPID);
  1075. comboBoxOnlineIPID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:ComboBoxOnlineIP" ) );
  1076. comboBoxOnlineIP = TheWindowManager->winGetWindowFromId( NULL, comboBoxOnlineIPID);
  1077. checkAlternateMouseID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckAlternateMouse" ) );
  1078. checkAlternateMouse = TheWindowManager->winGetWindowFromId( NULL, checkAlternateMouseID);
  1079. sliderScrollSpeedID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:SliderScrollSpeed" ) );
  1080. sliderScrollSpeed = TheWindowManager->winGetWindowFromId( NULL, sliderScrollSpeedID);
  1081. comboBoxAntiAliasingID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:ComboBoxAntiAliasing" ) );
  1082. comboBoxAntiAliasing = TheWindowManager->winGetWindowFromId( NULL, comboBoxAntiAliasingID );
  1083. comboBoxResolutionID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:ComboBoxResolution" ) );
  1084. comboBoxResolution = TheWindowManager->winGetWindowFromId( NULL, comboBoxResolutionID );
  1085. #ifdef _PLAYTEST
  1086. if (comboBoxResolution)
  1087. comboBoxResolution->winEnable(FALSE);
  1088. #endif _PLAYTEST
  1089. comboBoxDetailID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:ComboBoxDetail" ) );
  1090. comboBoxDetail = TheWindowManager->winGetWindowFromId( NULL, comboBoxDetailID );
  1091. checkLanguageFilterID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckLanguageFilter" ) );
  1092. checkLanguageFilter = TheWindowManager->winGetWindowFromId( NULL, checkLanguageFilterID );
  1093. checkSendDelayID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckSendDelay" ) );
  1094. checkSendDelay = TheWindowManager->winGetWindowFromId( NULL, checkSendDelayID);
  1095. buttonFirewallRefreshID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:ButtonFirewallRefresh" ) );
  1096. buttonFirewallRefresh = TheWindowManager->winGetWindowFromId( NULL, buttonFirewallRefreshID);
  1097. checkDrawAnchorID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckBoxDrawAnchor" ) );
  1098. checkDrawAnchor = TheWindowManager->winGetWindowFromId( NULL, checkDrawAnchorID);
  1099. checkMoveAnchorID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckBoxMoveAnchor" ) );
  1100. checkMoveAnchor = TheWindowManager->winGetWindowFromId( NULL, checkMoveAnchorID);
  1101. // Replay camera
  1102. checkSaveCameraID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckBoxSaveCamera" ) );
  1103. checkSaveCamera = TheWindowManager->winGetWindowFromId( NULL, checkSaveCameraID );
  1104. checkUseCameraID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckBoxUseCamera" ) );
  1105. checkUseCamera = TheWindowManager->winGetWindowFromId( NULL, checkUseCameraID );
  1106. // // Speakers and 3-D Audio
  1107. // checkAudioSurroundID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckAudioSurround" ) );
  1108. // checkAudioSurround = TheWindowManager->winGetWindowFromId( NULL, checkAudioSurroundID );
  1109. // checkAudioHardwareID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckAudioHardware" ) );
  1110. // checkAudioHardware = TheWindowManager->winGetWindowFromId( NULL, checkAudioHardwareID );
  1111. //
  1112. // Volume Controls
  1113. sliderMusicVolumeID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:SliderMusicVolume" ) );
  1114. sliderMusicVolume = TheWindowManager->winGetWindowFromId( NULL, sliderMusicVolumeID );
  1115. sliderSFXVolumeID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:SliderSFXVolume" ) );
  1116. sliderSFXVolume = TheWindowManager->winGetWindowFromId( NULL, sliderSFXVolumeID );
  1117. sliderVoiceVolumeID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:SliderVoiceVolume" ) );
  1118. sliderVoiceVolume = TheWindowManager->winGetWindowFromId( NULL, sliderVoiceVolumeID );
  1119. sliderGammaID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:SliderGamma" ) );
  1120. sliderGamma = TheWindowManager->winGetWindowFromId( NULL, sliderGammaID );
  1121. // checkBoxLowTextureDetailID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckLowTextureDetail" ) );
  1122. // checkBoxLowTextureDetail = TheWindowManager->winGetWindowFromId( NULL, checkBoxLowTextureDetailID );
  1123. WinAdvancedDisplayID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:WinAdvancedDisplayOptions" ) );
  1124. WinAdvancedDisplay = TheWindowManager->winGetWindowFromId( NULL, WinAdvancedDisplayID );
  1125. ButtonAdvancedAcceptID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:ButtonAdvanceAccept" ) );
  1126. ButtonAdvancedAccept = TheWindowManager->winGetWindowFromId( NULL, ButtonAdvancedAcceptID );
  1127. ButtonAdvancedCancelID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:ButtonAdvanceBack" ) );
  1128. ButtonAdvancedCancel = TheWindowManager->winGetWindowFromId( NULL, ButtonAdvancedCancelID );
  1129. sliderTextureResolutionID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:LowResSlider" ) );
  1130. sliderTextureResolution = TheWindowManager->winGetWindowFromId( NULL, sliderTextureResolutionID );
  1131. check3DShadowsID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:Check3DShadows" ) );
  1132. check3DShadows = TheWindowManager->winGetWindowFromId( NULL, check3DShadowsID);
  1133. check2DShadowsID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:Check2DShadows" ) );
  1134. check2DShadows = TheWindowManager->winGetWindowFromId( NULL, check2DShadowsID);
  1135. checkCloudShadowsID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckCloudShadows" ) );
  1136. checkCloudShadows = TheWindowManager->winGetWindowFromId( NULL, checkCloudShadowsID);
  1137. checkGroundLightingID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckGroundLighting" ) );
  1138. checkGroundLighting = TheWindowManager->winGetWindowFromId( NULL, checkGroundLightingID);
  1139. checkSmoothWaterID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckSmoothWater" ) );
  1140. checkSmoothWater = TheWindowManager->winGetWindowFromId( NULL, checkSmoothWaterID);
  1141. checkExtraAnimationsID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckExtraAnimations" ) );
  1142. checkExtraAnimations = TheWindowManager->winGetWindowFromId( NULL, checkExtraAnimationsID);
  1143. checkNoDynamicLodID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckNoDynamicLOD" ) );
  1144. checkNoDynamicLod = TheWindowManager->winGetWindowFromId( NULL, checkNoDynamicLodID);
  1145. checkUnlockFpsID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckUnlockFPS" ) );
  1146. checkUnlockFps = TheWindowManager->winGetWindowFromId( NULL, checkUnlockFpsID);
  1147. checkBuildingOcclusionID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckBehindBuilding" ) );
  1148. checkBuildingOcclusion = TheWindowManager->winGetWindowFromId( NULL, checkBuildingOcclusionID);
  1149. checkPropsID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:CheckShowProps" ) );
  1150. checkProps = TheWindowManager->winGetWindowFromId( NULL, checkPropsID);
  1151. sliderParticleCapID = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:ParticleCapSlider" ) );
  1152. sliderParticleCap = TheWindowManager->winGetWindowFromId( NULL, sliderParticleCapID );
  1153. WinAdvancedDisplay->winHide(TRUE);
  1154. Color color = GameMakeColor(255,255,255,255);
  1155. enum AliasingMode
  1156. {
  1157. OFF = 0,
  1158. LOW,
  1159. HIGH,
  1160. NUM_ALIASING_MODES
  1161. };
  1162. NameKeyType versionID = TheNameKeyGenerator->nameToKey( AsciiString("OptionsMenu.wnd:LabelVersion") );
  1163. GameWindow *labelVersion = TheWindowManager->winGetWindowFromId( NULL, versionID );
  1164. UnicodeString versionString;
  1165. versionString.format(TheGameText->fetch("Version:Format2").str(), (GetRegistryVersion() >> 16), (GetRegistryVersion() & 0xffff));
  1166. if (TheVersion->showFullVersion())
  1167. {
  1168. if (TheVersion)
  1169. {
  1170. UnicodeString version;
  1171. version.format(L"(%s) %s -- %s", versionString.str(), TheVersion->getFullUnicodeVersion().str(), TheVersion->getUnicodeBuildTime().str());
  1172. GadgetStaticTextSetText( labelVersion, version );
  1173. }
  1174. else
  1175. {
  1176. labelVersion->winHide( TRUE );
  1177. }
  1178. }
  1179. else
  1180. {
  1181. GadgetStaticTextSetText( labelVersion, versionString );
  1182. }
  1183. // Choose an IP address, then initialize the IP combo box
  1184. UnsignedInt selectedIP = pref->getLANIPAddress();
  1185. UnicodeString str;
  1186. IPEnumeration IPs;
  1187. EnumeratedIP *IPlist = IPs.getAddresses();
  1188. Int index;
  1189. Int selectedIndex = -1;
  1190. Int count = 0;
  1191. GadgetComboBoxReset(comboBoxLANIP);
  1192. while (IPlist)
  1193. {
  1194. count++;
  1195. str.translate(IPlist->getIPstring());
  1196. index = GadgetComboBoxAddEntry(comboBoxLANIP, str, color);
  1197. GadgetComboBoxSetItemData(comboBoxLANIP, index, (void *)(IPlist->getIP()));
  1198. if (selectedIP == IPlist->getIP())
  1199. {
  1200. selectedIndex = index;
  1201. }
  1202. IPlist = IPlist->getNext();
  1203. }
  1204. if (selectedIndex >= 0)
  1205. {
  1206. GadgetComboBoxSetSelectedPos(comboBoxLANIP, selectedIndex);
  1207. }
  1208. else
  1209. {
  1210. GadgetComboBoxSetSelectedPos(comboBoxLANIP, 0);
  1211. if (IPs.getAddresses())
  1212. {
  1213. pref->setLANIPAddress(IPs.getAddresses()->getIPstring());
  1214. }
  1215. }
  1216. // And now the GameSpy one
  1217. if (comboBoxOnlineIP)
  1218. {
  1219. UnsignedInt selectedIP = pref->getOnlineIPAddress();
  1220. UnicodeString str;
  1221. IPEnumeration IPs;
  1222. EnumeratedIP *IPlist = IPs.getAddresses();
  1223. Int index;
  1224. Int selectedIndex = -1;
  1225. Int count = 0;
  1226. GadgetComboBoxReset(comboBoxOnlineIP);
  1227. while (IPlist)
  1228. {
  1229. count++;
  1230. str.translate(IPlist->getIPstring());
  1231. index = GadgetComboBoxAddEntry(comboBoxOnlineIP, str, color);
  1232. GadgetComboBoxSetItemData(comboBoxOnlineIP, index, (void *)(IPlist->getIP()));
  1233. if (selectedIP == IPlist->getIP())
  1234. {
  1235. selectedIndex = index;
  1236. }
  1237. IPlist = IPlist->getNext();
  1238. }
  1239. if (selectedIndex >= 0)
  1240. {
  1241. GadgetComboBoxSetSelectedPos(comboBoxOnlineIP, selectedIndex);
  1242. }
  1243. else
  1244. {
  1245. GadgetComboBoxSetSelectedPos(comboBoxOnlineIP, 0);
  1246. if (IPs.getAddresses())
  1247. {
  1248. pref->setOnlineIPAddress(IPs.getAddresses()->getIPstring());
  1249. }
  1250. }
  1251. }
  1252. // HTTP Proxy
  1253. GameWindow *textEntryHTTPProxy = TheWindowManager->winGetWindowFromId(NULL, NAMEKEY("OptionsMenu.wnd:TextEntryHTTPProxy"));
  1254. if (textEntryHTTPProxy)
  1255. {
  1256. UnicodeString uStr;
  1257. std::string proxy;
  1258. GetStringFromRegistry("", "Proxy", proxy);
  1259. uStr.translate(proxy.c_str());
  1260. GadgetTextEntrySetText(textEntryHTTPProxy, uStr);
  1261. }
  1262. // Firewall Port Override
  1263. GameWindow *textEntryFirewallPortOverride = TheWindowManager->winGetWindowFromId(NULL, NAMEKEY("OptionsMenu.wnd:TextEntryFirewallPortOverride"));
  1264. if (textEntryFirewallPortOverride)
  1265. {
  1266. UnicodeString uStr;
  1267. if (TheGlobalData->m_firewallPortOverride != 0)
  1268. { AsciiString aStr;
  1269. aStr.format("%d",TheGlobalData->m_firewallPortOverride);
  1270. uStr.translate(aStr);
  1271. }
  1272. GadgetTextEntrySetText(textEntryFirewallPortOverride,uStr);
  1273. }
  1274. // populate anti aliasing modes
  1275. AsciiString selectedAliasingMode = (*pref)["AntiAliasing"];
  1276. GadgetComboBoxReset(comboBoxAntiAliasing);
  1277. AsciiString temp;
  1278. for (Int i=0; i < NUM_ALIASING_MODES; ++i)
  1279. {
  1280. temp.format("GUI:AntiAliasing%d", i);
  1281. str = TheGameText->fetch( temp );
  1282. index = GadgetComboBoxAddEntry(comboBoxAntiAliasing, str, color);
  1283. }
  1284. Int val = atoi(selectedAliasingMode.str());
  1285. if( val < 0 || val > NUM_ALIASING_MODES )
  1286. {
  1287. TheWritableGlobalData->m_antiAliasBoxValue = val = 0;
  1288. }
  1289. GadgetComboBoxSetSelectedPos(comboBoxAntiAliasing, val);
  1290. // get resolution from saved preferences file
  1291. AsciiString selectedResolution = (*pref) ["Resolution"];
  1292. Int selectedXRes=800,selectedYRes=600;
  1293. Int selectedResIndex=-1;
  1294. Int defaultResIndex=0; //index of default video mode that should always exist
  1295. if (!selectedResolution.isEmpty())
  1296. { //try to parse 2 integers out of string
  1297. if (sscanf(selectedResolution.str(),"%d%d", &selectedXRes, &selectedYRes) != 2)
  1298. { selectedXRes=800; selectedYRes=600;
  1299. }
  1300. }
  1301. // populate resolution modes
  1302. GadgetComboBoxReset(comboBoxResolution);
  1303. Int numResolutions = TheDisplay->getDisplayModeCount();
  1304. for( i = 0; i < numResolutions; ++i )
  1305. { Int xres,yres,bitDepth;
  1306. TheDisplay->getDisplayModeDescription(i,&xres,&yres,&bitDepth);
  1307. str.format(L"%d x %d",xres,yres);
  1308. GadgetComboBoxAddEntry( comboBoxResolution, str, color);
  1309. if (xres == 800 && yres == 600) //keep track of default mode in case we need it.
  1310. defaultResIndex=i;
  1311. if (xres == selectedXRes && yres == selectedYRes)
  1312. selectedResIndex=i;
  1313. }
  1314. if (selectedResIndex == -1) //check if saved mode no longer available
  1315. { //pick default resolution
  1316. selectedXRes = 800;
  1317. selectedXRes = 600;
  1318. selectedResIndex = defaultResIndex;
  1319. }
  1320. TheWritableGlobalData->m_xResolution = selectedXRes;
  1321. TheWritableGlobalData->m_yResolution = selectedYRes;
  1322. GadgetComboBoxSetSelectedPos( comboBoxResolution, selectedResIndex );
  1323. // set the display detail
  1324. GadgetComboBoxReset(comboBoxDetail);
  1325. GadgetComboBoxAddEntry(comboBoxDetail, TheGameText->fetch("GUI:High"), color);
  1326. GadgetComboBoxAddEntry(comboBoxDetail, TheGameText->fetch("GUI:Medium"), color);
  1327. GadgetComboBoxAddEntry(comboBoxDetail, TheGameText->fetch("GUI:Low"), color);
  1328. GadgetComboBoxAddEntry(comboBoxDetail, TheGameText->fetch("GUI:Custom"), color);
  1329. //Check if level was never set and default to setting most suitable for system.
  1330. if (TheGameLODManager->getStaticLODLevel() == STATIC_GAME_LOD_UNKNOWN)
  1331. TheGameLODManager->setStaticLODLevel(TheGameLODManager->findStaticLODLevel());
  1332. switch (TheGameLODManager->getStaticLODLevel())
  1333. {
  1334. case STATIC_GAME_LOD_LOW:
  1335. GadgetComboBoxSetSelectedPos(comboBoxDetail, LOWDETAIL);
  1336. break;
  1337. case STATIC_GAME_LOD_MEDIUM:
  1338. GadgetComboBoxSetSelectedPos(comboBoxDetail, MEDIUMDETAIL);
  1339. break;
  1340. case STATIC_GAME_LOD_HIGH:
  1341. GadgetComboBoxSetSelectedPos(comboBoxDetail, HIGHDETAIL);
  1342. break;
  1343. case STATIC_GAME_LOD_CUSTOM:
  1344. GadgetComboBoxSetSelectedPos(comboBoxDetail, CUSTOMDETAIL);
  1345. break;
  1346. default:
  1347. DEBUG_ASSERTCRASH(FALSE,("Tried to set comboBoxDetail to a value of %d ", TheGameLODManager->getStaticLODLevel()) );
  1348. };
  1349. Int txtFact=TheGameLODManager->getCurrentTextureReduction();
  1350. GadgetSliderSetPosition( sliderTextureResolution, 2-txtFact);
  1351. GadgetCheckBoxSetChecked( check3DShadows, TheGlobalData->m_useShadowVolumes);
  1352. GadgetCheckBoxSetChecked( check2DShadows, TheGlobalData->m_useShadowDecals);
  1353. GadgetCheckBoxSetChecked( checkCloudShadows, TheGlobalData->m_useCloudMap);
  1354. GadgetCheckBoxSetChecked( checkGroundLighting, TheGlobalData->m_useLightMap);
  1355. GadgetCheckBoxSetChecked( checkSmoothWater, TheGlobalData->m_showSoftWaterEdge);
  1356. GadgetCheckBoxSetChecked( checkExtraAnimations, !TheGlobalData->m_useDrawModuleLOD);
  1357. GadgetCheckBoxSetChecked( checkNoDynamicLod, !TheGlobalData->m_enableDynamicLOD);
  1358. GadgetCheckBoxSetChecked( checkUnlockFps, !TheGlobalData->m_useFpsLimit);
  1359. GadgetCheckBoxSetChecked( checkBuildingOcclusion, TheGlobalData->m_enableBehindBuildingMarkers);
  1360. GadgetCheckBoxSetChecked( checkProps, TheGlobalData->m_useTrees);
  1361. //checkProps->winEnable(false); //gray out the option for now.
  1362. GadgetSliderSetPosition( sliderParticleCap, TheGlobalData->m_maxParticleCount );
  1363. //set language filter
  1364. AsciiString languageFilter = (*pref)["LanguageFilter"];
  1365. if (languageFilter == "true" )
  1366. {
  1367. GadgetCheckBoxSetChecked( checkLanguageFilter, true);
  1368. TheWritableGlobalData->m_languageFilterPref = true;
  1369. }
  1370. else
  1371. {
  1372. GadgetCheckBoxSetChecked( checkLanguageFilter, false);
  1373. TheWritableGlobalData->m_languageFilterPref = false;
  1374. }
  1375. //set replay camera
  1376. if (pref->saveCameraInReplays())
  1377. {
  1378. GadgetCheckBoxSetChecked( checkSaveCamera, true);
  1379. TheWritableGlobalData->m_saveCameraInReplay = true;
  1380. }
  1381. else
  1382. {
  1383. GadgetCheckBoxSetChecked( checkSaveCamera, false);
  1384. TheWritableGlobalData->m_saveCameraInReplay = false;
  1385. }
  1386. if (pref->useCameraInReplays())
  1387. {
  1388. GadgetCheckBoxSetChecked( checkUseCamera, true);
  1389. TheWritableGlobalData->m_useCameraInReplay = true;
  1390. }
  1391. else
  1392. {
  1393. GadgetCheckBoxSetChecked( checkUseCamera, false);
  1394. TheWritableGlobalData->m_useCameraInReplay = false;
  1395. }
  1396. //set scroll options
  1397. AsciiString test = (*pref)["DrawScrollAnchor"];
  1398. DEBUG_LOG(("DrawScrollAnchor == [%s]\n", test.str()));
  1399. if (test == "Yes" || (test.isEmpty() && TheInGameUI->getDrawRMBScrollAnchor()))
  1400. {
  1401. GadgetCheckBoxSetChecked( checkDrawAnchor, true);
  1402. TheInGameUI->setDrawRMBScrollAnchor(true);
  1403. }
  1404. else
  1405. {
  1406. GadgetCheckBoxSetChecked( checkDrawAnchor, false);
  1407. TheInGameUI->setDrawRMBScrollAnchor(false);
  1408. }
  1409. test = (*pref)["MoveScrollAnchor"];
  1410. DEBUG_LOG(("MoveScrollAnchor == [%s]\n", test.str()));
  1411. if (test == "Yes" || (test.isEmpty() && TheInGameUI->getMoveRMBScrollAnchor()))
  1412. {
  1413. GadgetCheckBoxSetChecked( checkMoveAnchor, true);
  1414. TheInGameUI->setMoveRMBScrollAnchor(true);
  1415. }
  1416. else
  1417. {
  1418. GadgetCheckBoxSetChecked( checkMoveAnchor, false);
  1419. TheInGameUI->setMoveRMBScrollAnchor(false);
  1420. }
  1421. // // Audio Init shiznat
  1422. // GadgetCheckBoxSetChecked(checkAudioHardware, TheAudio->getHardwareAccelerated());
  1423. // GadgetCheckBoxSetChecked(checkAudioSurround, TheAudio->getSpeakerSurround());
  1424. // set the mouse mode
  1425. GadgetCheckBoxSetChecked(checkAlternateMouse, TheGlobalData->m_useAlternateMouse);
  1426. // set scroll speed slider
  1427. Int scrollPos = (Int)(TheGlobalData->m_keyboardScrollFactor*100.0f);
  1428. GadgetSliderSetPosition( sliderScrollSpeed, scrollPos );
  1429. DEBUG_LOG(("Scroll SPeed %d\n", scrollPos));
  1430. // set the send delay check box
  1431. GadgetCheckBoxSetChecked(checkSendDelay, TheGlobalData->m_firewallSendDelay);
  1432. // set volume sliders
  1433. // set music volume slider
  1434. GadgetSliderSetPosition( sliderMusicVolume, REAL_TO_INT(pref->getMusicVolume()) );
  1435. //set SFX volume slider
  1436. Real maxVolume = MAX( pref->getSoundVolume(), pref->get3DSoundVolume() );
  1437. GadgetSliderSetPosition( sliderSFXVolume, REAL_TO_INT( maxVolume ) );
  1438. //set voice volume slider
  1439. GadgetSliderSetPosition( sliderVoiceVolume, REAL_TO_INT(pref->getSpeechVolume()) );
  1440. // set the gamma slider
  1441. GadgetSliderSetPosition( sliderGamma, REAL_TO_INT(pref->getGammaValue()) );
  1442. // show menu
  1443. layout->hide( FALSE );
  1444. // set keyboard focus to main parent
  1445. AsciiString parentName( "OptionsMenu.wnd:OptionsMenuParent" );
  1446. NameKeyType parentID = TheNameKeyGenerator->nameToKey( parentName );
  1447. GameWindow *parent = TheWindowManager->winGetWindowFromId( NULL, parentID );
  1448. TheWindowManager->winSetFocus( parent );
  1449. if( (TheGameLogic->isInGame() && TheGameLogic->getGameMode() != GAME_SHELL) || TheGameSpyInfo )
  1450. {
  1451. // disable controls that you can't change the options for in game
  1452. comboBoxLANIP->winEnable(FALSE);
  1453. if (comboBoxOnlineIP)
  1454. comboBoxOnlineIP->winEnable(FALSE);
  1455. checkSendDelay->winEnable(FALSE);
  1456. buttonFirewallRefresh->winEnable(FALSE);
  1457. if (comboBoxDetail)
  1458. comboBoxDetail->winEnable(FALSE);
  1459. if (comboBoxResolution)
  1460. comboBoxResolution->winEnable(FALSE);
  1461. // if (checkAudioSurround)
  1462. // checkAudioSurround->winEnable(FALSE);
  1463. //
  1464. // if (checkAudioHardware)
  1465. // checkAudioHardware->winEnable(FALSE);
  1466. }
  1467. TheWindowManager->winSetModal(parent);
  1468. ignoreSelected = FALSE;
  1469. } // end OptionsMenuInit
  1470. //-------------------------------------------------------------------------------------------------
  1471. /** options menu shutdown method */
  1472. //-------------------------------------------------------------------------------------------------
  1473. void OptionsMenuShutdown( WindowLayout *layout, void *userData )
  1474. {
  1475. /* moved into the back button stuff
  1476. if (pref)
  1477. {
  1478. pref->write();
  1479. delete pref;
  1480. pref = NULL;
  1481. }
  1482. comboBoxIP = NULL;
  1483. // hide menu
  1484. layout->hide( TRUE );
  1485. // our shutdown is complete
  1486. TheShell->shutdownComplete( layout );
  1487. */
  1488. } // end OptionsMenuShutdown
  1489. //-------------------------------------------------------------------------------------------------
  1490. /** options menu update method */
  1491. //-------------------------------------------------------------------------------------------------
  1492. void OptionsMenuUpdate( WindowLayout *layout, void *userData )
  1493. {
  1494. } // end OptionsMenuUpdate
  1495. //-------------------------------------------------------------------------------------------------
  1496. /** Options menu input callback */
  1497. //-------------------------------------------------------------------------------------------------
  1498. WindowMsgHandledType OptionsMenuInput( GameWindow *window, UnsignedInt msg,
  1499. WindowMsgData mData1, WindowMsgData mData2 )
  1500. {
  1501. switch( msg )
  1502. {
  1503. // --------------------------------------------------------------------------------------------
  1504. case GWM_CHAR:
  1505. {
  1506. UnsignedByte key = mData1;
  1507. UnsignedByte state = mData2;
  1508. switch( key )
  1509. {
  1510. // ----------------------------------------------------------------------------------------
  1511. case KEY_ESC:
  1512. {
  1513. //
  1514. // send a simulated selected event to the parent window of the
  1515. // back/exit button
  1516. //
  1517. if( BitTest( state, KEY_STATE_UP ) )
  1518. {
  1519. AsciiString buttonName( "OptionsMenu.wnd:ButtonBack" );
  1520. NameKeyType buttonID = TheNameKeyGenerator->nameToKey( buttonName );
  1521. GameWindow *button = TheWindowManager->winGetWindowFromId( window, buttonID );
  1522. TheWindowManager->winSendSystemMsg( window, GBM_SELECTED,
  1523. (WindowMsgData)button, buttonID );
  1524. } // end if
  1525. // don't let key fall through anywhere else
  1526. return MSG_HANDLED;
  1527. } // end escape
  1528. } // end switch( key )
  1529. } // end char
  1530. } // end switch( msg )
  1531. return MSG_IGNORED;
  1532. } // end OptionsMenuInput
  1533. //-------------------------------------------------------------------------------------------------
  1534. /** options menu window system callback */
  1535. //-------------------------------------------------------------------------------------------------
  1536. WindowMsgHandledType OptionsMenuSystem( GameWindow *window, UnsignedInt msg,
  1537. WindowMsgData mData1, WindowMsgData mData2 )
  1538. {
  1539. static NameKeyType buttonBack = NAMEKEY_INVALID;
  1540. static NameKeyType buttonDefaults = NAMEKEY_INVALID;
  1541. static NameKeyType buttonAccept = NAMEKEY_INVALID;
  1542. static NameKeyType buttonReplayMenu = NAMEKEY_INVALID;
  1543. static NameKeyType buttonKeyboardOptionsMenu = NAMEKEY_INVALID;
  1544. switch( msg )
  1545. {
  1546. // --------------------------------------------------------------------------------------------
  1547. case GWM_CREATE:
  1548. {
  1549. // get ids for our children controls
  1550. buttonBack = TheNameKeyGenerator->nameToKey( AsciiString("OptionsMenu.wnd:ButtonBack") );
  1551. buttonDefaults = TheNameKeyGenerator->nameToKey( AsciiString("OptionsMenu.wnd:ButtonDefaults") );
  1552. buttonAccept = TheNameKeyGenerator->nameToKey( AsciiString("OptionsMenu.wnd:ButtonAccept") );
  1553. buttonKeyboardOptionsMenu = TheNameKeyGenerator->nameToKey( AsciiString( "OptionsMenu.wnd:ButtonKeyboardOptions" ) );
  1554. break;
  1555. } // end create
  1556. //---------------------------------------------------------------------------------------------
  1557. case GWM_DESTROY:
  1558. {
  1559. break;
  1560. } // end case
  1561. // --------------------------------------------------------------------------------------------
  1562. case GWM_INPUT_FOCUS:
  1563. {
  1564. // if we're givin the opportunity to take the keyboard focus we must say we want it
  1565. if( mData1 == TRUE )
  1566. *(Bool *)mData2 = TRUE;
  1567. return MSG_HANDLED;
  1568. } // end input
  1569. //---------------------------------------------------------------------------------------------
  1570. case GCM_SELECTED:
  1571. {
  1572. if(ignoreSelected)
  1573. break;
  1574. GameWindow *control = (GameWindow *)mData1;
  1575. Int controlID = control->winGetWindowId();
  1576. if (controlID == comboBoxDetailID)
  1577. {
  1578. Int index;
  1579. GadgetComboBoxGetSelectedPos( comboBoxDetail, &index );
  1580. if(index != CUSTOMDETAIL)
  1581. break;
  1582. showAdvancedOptions();
  1583. }
  1584. break;
  1585. }
  1586. //---------------------------------------------------------------------------------------------
  1587. case GBM_SELECTED:
  1588. {
  1589. if(ignoreSelected)
  1590. break;
  1591. GameWindow *control = (GameWindow *)mData1;
  1592. Int controlID = control->winGetWindowId();
  1593. if( controlID == buttonBack )
  1594. {
  1595. // go back one screen
  1596. //TheShell->pop();
  1597. if (pref)
  1598. {
  1599. delete pref;
  1600. pref = NULL;
  1601. }
  1602. comboBoxLANIP = NULL;
  1603. comboBoxOnlineIP = NULL;
  1604. if(GameSpyIsOverlayOpen(GSOVERLAY_OPTIONS))
  1605. GameSpyCloseOverlay(GSOVERLAY_OPTIONS);
  1606. else
  1607. {
  1608. DestroyOptionsLayout();
  1609. }
  1610. } // end if
  1611. else if (controlID == buttonAccept )
  1612. {
  1613. saveOptions();
  1614. if (pref)
  1615. {
  1616. pref->write();
  1617. delete pref;
  1618. pref = NULL;
  1619. }
  1620. comboBoxLANIP = NULL;
  1621. comboBoxOnlineIP = NULL;
  1622. if(!TheGameLogic->isInGame() || TheGameLogic->isInShellGame())
  1623. destroyQuitMenu(); // if we're in a game, the change res then enter the same kind of game, we nee the quit menu to be gone.
  1624. if(GameSpyIsOverlayOpen(GSOVERLAY_OPTIONS))
  1625. GameSpyCloseOverlay(GSOVERLAY_OPTIONS);
  1626. else
  1627. {
  1628. DestroyOptionsLayout();
  1629. if (dispChanged)
  1630. {
  1631. DoResolutionDialog();
  1632. }
  1633. }
  1634. }
  1635. else if (controlID == buttonDefaults )
  1636. {
  1637. setDefaults();
  1638. }
  1639. else if (controlID == ButtonAdvancedAcceptID )
  1640. {
  1641. acceptAdvancedOptions();
  1642. }
  1643. else if (controlID == ButtonAdvancedCancelID )
  1644. {
  1645. cancelAdvancedOptions();
  1646. }
  1647. else if ( controlID == buttonKeyboardOptionsMenu )
  1648. {
  1649. TheShell->push( AsciiString( "Menus/KeyboardOptionsMenu.wnd" ) );
  1650. }
  1651. else if(controlID == checkDrawAnchorID )
  1652. {
  1653. if( GadgetCheckBoxIsChecked( control ) )
  1654. {
  1655. TheInGameUI->setDrawRMBScrollAnchor(true);
  1656. (*pref)["DrawScrollAnchor"] = "Yes";
  1657. }
  1658. else
  1659. {
  1660. TheInGameUI->setDrawRMBScrollAnchor(false);
  1661. (*pref)["DrawScrollAnchor"] = "No";
  1662. }
  1663. }
  1664. else if(controlID == checkMoveAnchorID )
  1665. {
  1666. if( GadgetCheckBoxIsChecked( control ) )
  1667. {
  1668. TheInGameUI->setMoveRMBScrollAnchor(true);
  1669. (*pref)["MoveScrollAnchor"] = "Yes";
  1670. }
  1671. else
  1672. {
  1673. TheInGameUI->setMoveRMBScrollAnchor(false);
  1674. (*pref)["MoveScrollAnchor"] = "No";
  1675. }
  1676. }
  1677. else if(controlID == checkSaveCameraID )
  1678. {
  1679. if( GadgetCheckBoxIsChecked( control ) )
  1680. {
  1681. TheWritableGlobalData->m_saveCameraInReplay = true;
  1682. (*pref)["SaveCameraInReplays"] = "yes";
  1683. }
  1684. else
  1685. {
  1686. TheWritableGlobalData->m_saveCameraInReplay = false;
  1687. (*pref)["SaveCameraInReplays"] = "no";
  1688. }
  1689. }
  1690. else if(controlID == checkUseCameraID )
  1691. {
  1692. if( GadgetCheckBoxIsChecked( control ) )
  1693. {
  1694. TheWritableGlobalData->m_useCameraInReplay = true;
  1695. (*pref)["UseCameraInReplays"] = "yes";
  1696. }
  1697. else
  1698. {
  1699. TheWritableGlobalData->m_useCameraInReplay = false;
  1700. (*pref)["UseCameraInReplays"] = "no";
  1701. }
  1702. }
  1703. else if (controlID == buttonFirewallRefreshID)
  1704. {
  1705. // setting the behavior to unknown will force the firewall helper to detect the firewall behavior
  1706. // the next time we log into gamespy/WOL/whatever.
  1707. char num[16];
  1708. num[0] = 0;
  1709. TheWritableGlobalData->m_firewallBehavior = FirewallHelperClass::FIREWALL_TYPE_UNKNOWN;
  1710. itoa(TheGlobalData->m_firewallBehavior, num, 10);
  1711. AsciiString numstr;
  1712. numstr = num;
  1713. (*pref)["FirewallBehavior"] = numstr;
  1714. }
  1715. break;
  1716. } // end selected
  1717. default:
  1718. return MSG_IGNORED;
  1719. } // end switch
  1720. return MSG_HANDLED;
  1721. } // end OptionsMenuSystem