1 /*
2 ** c_cvars.cpp
3 **
4 **---------------------------------------------------------------------------
5 ** Copyright 2011 Braden Obrzut
6 ** All rights reserved.
7 **
8 ** Redistribution and use in source and binary forms, with or without
9 ** modification, are permitted provided that the following conditions
10 ** are met:
11 **
12 ** 1. Redistributions of source code must retain the above copyright
13 **    notice, this list of conditions and the following disclaimer.
14 ** 2. Redistributions in binary form must reproduce the above copyright
15 **    notice, this list of conditions and the following disclaimer in the
16 **    documentation and/or other materials provided with the distribution.
17 ** 3. The name of the author may not be used to endorse or promote products
18 **    derived from this software without specific prior written permission.
19 **
20 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 **---------------------------------------------------------------------------
31 **
32 **
33 */
34 
35 #include "c_cvars.h"
36 #include "config.h"
37 #include "wl_def.h"
38 #include "am_map.h"
39 #include "id_sd.h"
40 #include "id_in.h"
41 #include "id_us.h"
42 #include "wl_main.h"
43 #include "wl_play.h"
44 
45 static bool doWriteConfig = false;
46 
47 Aspect r_ratio = ASPECT_4_3, vid_aspect = ASPECT_NONE;
48 bool forcegrabmouse = false;
49 bool vid_fullscreen = false;
50 bool vid_vsync = false;
51 bool quitonescape = false;
52 fixed movebob = FRACUNIT;
53 
54 bool alwaysrun;
55 bool mouseenabled, mouseyaxisdisabled, joystickenabled;
56 
57 #if SDL_VERSION_ATLEAST(1,3,0)
58 // Convert SDL1 keycode to SDL2 scancode
59 static const SDL_Scancode SDL2ConversionTable[323] = {
60 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
61 	SDL_SCANCODE_BACKSPACE,SDL_SCANCODE_TAB,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_CLEAR,SDL_SCANCODE_RETURN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
62 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_PAUSE,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
63 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_ESCAPE,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
64 	SDL_SCANCODE_SPACE,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_APOSTROPHE,
65 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_COMMA,SDL_SCANCODE_MINUS,SDL_SCANCODE_PERIOD,SDL_SCANCODE_SLASH,
66 	SDL_SCANCODE_0,SDL_SCANCODE_1,SDL_SCANCODE_2,SDL_SCANCODE_3,SDL_SCANCODE_4,SDL_SCANCODE_5,SDL_SCANCODE_6,SDL_SCANCODE_7,
67 	SDL_SCANCODE_8,SDL_SCANCODE_9,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_SEMICOLON,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_EQUALS,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
68 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
69 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
70 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
71 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_LEFTBRACKET,SDL_SCANCODE_BACKSLASH,SDL_SCANCODE_RIGHTBRACKET,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
72 	SDL_SCANCODE_GRAVE,SDL_SCANCODE_A,SDL_SCANCODE_B,SDL_SCANCODE_C,SDL_SCANCODE_D,SDL_SCANCODE_E,SDL_SCANCODE_F,SDL_SCANCODE_G,
73 	SDL_SCANCODE_H,SDL_SCANCODE_I,SDL_SCANCODE_J,SDL_SCANCODE_K,SDL_SCANCODE_L,SDL_SCANCODE_M,SDL_SCANCODE_N,SDL_SCANCODE_O,
74 	SDL_SCANCODE_P,SDL_SCANCODE_Q,SDL_SCANCODE_R,SDL_SCANCODE_S,SDL_SCANCODE_T,SDL_SCANCODE_U,SDL_SCANCODE_V,SDL_SCANCODE_W,
75 	SDL_SCANCODE_X,SDL_SCANCODE_Y,SDL_SCANCODE_Z,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_DELETE,
76 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
77 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
78 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
79 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
80 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
81 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
82 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
83 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
84 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
85 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
86 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
87 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
88 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
89 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
90 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
91 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,
92 	SDL_SCANCODE_KP_0,SDL_SCANCODE_KP_1,SDL_SCANCODE_KP_2,SDL_SCANCODE_KP_3,SDL_SCANCODE_KP_4,SDL_SCANCODE_KP_5,SDL_SCANCODE_KP_6,SDL_SCANCODE_KP_7,
93 	SDL_SCANCODE_KP_8,SDL_SCANCODE_KP_9,SDL_SCANCODE_KP_PERIOD,SDL_SCANCODE_KP_DIVIDE,SDL_SCANCODE_KP_MULTIPLY,SDL_SCANCODE_KP_MINUS,SDL_SCANCODE_KP_PLUS,SDL_SCANCODE_KP_ENTER,
94 	SDL_SCANCODE_KP_EQUALS,SDL_SCANCODE_UP,SDL_SCANCODE_DOWN,SDL_SCANCODE_RIGHT,SDL_SCANCODE_LEFT,SDL_SCANCODE_INSERT,SDL_SCANCODE_HOME,SDL_SCANCODE_END,
95 	SDL_SCANCODE_PAGEUP,SDL_SCANCODE_PAGEDOWN,SDL_SCANCODE_F1,SDL_SCANCODE_F2,SDL_SCANCODE_F3,SDL_SCANCODE_F4,SDL_SCANCODE_F5,SDL_SCANCODE_F6,
96 	SDL_SCANCODE_F7,SDL_SCANCODE_F8,SDL_SCANCODE_F9,SDL_SCANCODE_F10,SDL_SCANCODE_F11,SDL_SCANCODE_F12,SDL_SCANCODE_F13,SDL_SCANCODE_F14,
97 	SDL_SCANCODE_F15,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_NUMLOCKCLEAR,SDL_SCANCODE_CAPSLOCK,SDL_SCANCODE_SCROLLLOCK,SDL_SCANCODE_RSHIFT,
98 	SDL_SCANCODE_LSHIFT,SDL_SCANCODE_RCTRL,SDL_SCANCODE_LCTRL,SDL_SCANCODE_RALT,SDL_SCANCODE_LALT,SDL_SCANCODE_RGUI,SDL_SCANCODE_LGUI,SDL_SCANCODE_UNKNOWN,
99 	SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_MODE,SDL_SCANCODE_APPLICATION,SDL_SCANCODE_HELP,SDL_SCANCODE_PRINTSCREEN,SDL_SCANCODE_SYSREQ,SDL_SCANCODE_PAUSE,SDL_SCANCODE_MENU,
100 	SDL_SCANCODE_POWER,SDL_SCANCODE_UNKNOWN,SDL_SCANCODE_UNDO,
101 };
102 
SDL2Convert(int sc)103 int SDL2Convert(int sc)
104 {
105 	if(sc < 0)
106 		return sc;
107 
108 	return SDL2ConversionTable[sc];
109 }
110 
SDL2Backconvert(int sc)111 int SDL2Backconvert(int sc)
112 {
113 	if(sc < 0)
114 		return sc;
115 
116 	for(unsigned int i = 0;i < 323;++i)
117 	{
118 		if(SDL2ConversionTable[i] == sc)
119 			return i;
120 	}
121 	return 0;
122 }
123 #else
SDL2Convert(int sc)124 int SDL2Convert(int sc) { return sc; }
SDL2Backconvert(int sc)125 int SDL2Backconvert(int sc) { return sc; }
126 #endif
127 
FinalReadConfig()128 void FinalReadConfig()
129 {
130 	SDMode  sd;
131 	SMMode  sm;
132 	SDSMode sds;
133 
134 	sd = static_cast<SDMode> (config.GetSetting("SoundDevice")->GetInteger());
135 	sm = static_cast<SMMode> (config.GetSetting("MusicDevice")->GetInteger());
136 	sds = static_cast<SDSMode> (config.GetSetting("DigitalSoundDevice")->GetInteger());
137 
138 	if ((sd == sdm_AdLib || sm == smm_AdLib) && !AdLibPresent
139 			&& !SoundBlasterPresent)
140 	{
141 		sd = sdm_PC;
142 		sm = smm_Off;
143 	}
144 
145 	if ((sds == sds_SoundBlaster && !SoundBlasterPresent))
146 		sds = sds_Off;
147 
148 	SD_SetMusicMode(sm);
149 	SD_SetSoundMode(sd);
150 	SD_SetDigiDevice(sds);
151 
152 	AM_UpdateFlags();
153 
154 	doWriteConfig = true;
155 }
156 
157 /*
158 ====================
159 =
160 = ReadConfig
161 =
162 ====================
163 */
164 
ReadConfig(void)165 void ReadConfig(void)
166 {
167 	config.CreateSetting("ForceGrabMouse", false);
168 	config.CreateSetting("MouseEnabled", 1);
169 	config.CreateSetting("JoystickEnabled", true);
170 	config.CreateSetting("ViewSize", 19);
171 	config.CreateSetting("MouseXAdjustment", 5);
172 	config.CreateSetting("MouseYAdjustment", 5);
173 	config.CreateSetting("PanXAdjustment", 5);
174 	config.CreateSetting("PanYAdjustment", 5);
175 	config.CreateSetting("SoundDevice", sdm_AdLib);
176 	config.CreateSetting("MusicDevice", smm_AdLib);
177 	config.CreateSetting("DigitalSoundDevice", sds_SoundBlaster);
178 	config.CreateSetting("AlwaysRun", 0);
179 	config.CreateSetting("MouseYAxisDisabled", 0);
180 	config.CreateSetting("SoundVolume", MAX_VOLUME);
181 	config.CreateSetting("MusicVolume", MAX_VOLUME);
182 	config.CreateSetting("DigitizedVolume", MAX_VOLUME);
183 	config.CreateSetting("Vid_FullScreen", false);
184 	config.CreateSetting("Vid_Aspect", ASPECT_NONE);
185 	config.CreateSetting("Vid_Vsync", false);
186 	config.CreateSetting("ScreenWidth", screenWidth);
187 	config.CreateSetting("ScreenHeight", screenHeight);
188 	config.CreateSetting("QuitOnEscape", quitonescape);
189 	config.CreateSetting("MoveBob", FRACUNIT);
190 	config.CreateSetting("Gamma", 1.0f);
191 	config.CreateSetting("AM_Rotate", 0);
192 	config.CreateSetting("AM_DrawTexturedWalls", true);
193 	config.CreateSetting("AM_DrawFloors", false);
194 	config.CreateSetting("AM_Overlay", 0);
195 	config.CreateSetting("AM_OverlayTextured", false);
196 	config.CreateSetting("AM_Pause", true);
197 	config.CreateSetting("AM_ShowRatios", false);
198 
199 	char joySettingName[50] = {0};
200 	char keySettingName[50] = {0};
201 	char mseSettingName[50] = {0};
202 	forcegrabmouse = config.GetSetting("ForceGrabMouse")->GetInteger() != 0;
203 	mouseenabled = config.GetSetting("MouseEnabled")->GetInteger() != 0;
204 	joystickenabled = config.GetSetting("JoystickEnabled")->GetInteger() != 0;
205 	for(unsigned int i = 0;controlScheme[i].button != bt_nobutton;i++)
206 	{
207 		sprintf(joySettingName, "Joystick_%s", controlScheme[i].name);
208 		sprintf(keySettingName, "Keybaord_%s", controlScheme[i].name);
209 		sprintf(mseSettingName, "Mouse_%s", controlScheme[i].name);
210 		for(unsigned int j = 0;j < 50;j++)
211 		{
212 			if(joySettingName[j] == ' ')
213 				joySettingName[j] = '_';
214 			if(keySettingName[j] == ' ')
215 				keySettingName[j] = '_';
216 			if(mseSettingName[j] == ' ')
217 				mseSettingName[j] = '_';
218 		}
219 		config.CreateSetting(joySettingName, controlScheme[i].joystick);
220 		config.CreateSetting(keySettingName, SDL2Backconvert(controlScheme[i].keyboard));
221 		config.CreateSetting(mseSettingName, controlScheme[i].mouse);
222 		controlScheme[i].joystick = config.GetSetting(joySettingName)->GetInteger();
223 		controlScheme[i].keyboard = SDL2Convert(config.GetSetting(keySettingName)->GetInteger());
224 		controlScheme[i].mouse = config.GetSetting(mseSettingName)->GetInteger();
225 	}
226 	viewsize = config.GetSetting("ViewSize")->GetInteger();
227 	mousexadjustment = config.GetSetting("MouseXAdjustment")->GetInteger();
228 	mouseyadjustment = config.GetSetting("MouseYAdjustment")->GetInteger();
229 	panxadjustment = config.GetSetting("PanXAdjustment")->GetInteger();
230 	panyadjustment = config.GetSetting("PanYAdjustment")->GetInteger();
231 	mouseyaxisdisabled = config.GetSetting("MouseYAxisDisabled")->GetInteger() != 0;
232 	alwaysrun = config.GetSetting("AlwaysRun")->GetInteger() != 0;
233 	AdlibVolume = config.GetSetting("SoundVolume")->GetInteger();
234 	SD_UpdatePCSpeakerVolume();
235 	MusicVolume = config.GetSetting("MusicVolume")->GetInteger();
236 	SoundVolume = config.GetSetting("DigitizedVolume")->GetInteger();
237 	vid_fullscreen = config.GetSetting("Vid_FullScreen")->GetInteger() != 0;
238 	vid_aspect = static_cast<Aspect>(config.GetSetting("Vid_Aspect")->GetInteger());
239 	vid_vsync = config.GetSetting("Vid_Vsync")->GetInteger() != 0;
240 	screenWidth = config.GetSetting("ScreenWidth")->GetInteger();
241 	screenHeight = config.GetSetting("ScreenHeight")->GetInteger();
242 	quitonescape = config.GetSetting("QuitOnEscape")->GetInteger() != 0;
243 	movebob = config.GetSetting("MoveBob")->GetInteger();
244 	screenGamma = static_cast<float>(config.GetSetting("Gamma")->GetFloat());
245 	am_rotate = config.GetSetting("AM_Rotate")->GetInteger();
246 	am_drawtexturedwalls = config.GetSetting("AM_DrawTexturedWalls")->GetInteger() != 0;
247 	am_drawfloors = config.GetSetting("AM_DrawFloors")->GetInteger() != 0;
248 	am_overlay = config.GetSetting("AM_Overlay")->GetInteger();
249 	am_overlaytextured = config.GetSetting("AM_OverlayTextured")->GetInteger() != 0;
250 	am_pause = config.GetSetting("AM_Pause")->GetInteger() != 0;
251 	am_showratios = config.GetSetting("AM_ShowRatios")->GetInteger() != 0;
252 
253 	char hsName[50];
254 	char hsScore[50];
255 	char hsCompleted[50];
256 	char hsGraphic[50];
257 	for(unsigned int i = 0;i < MaxScores;i++)
258 	{
259 		sprintf(hsName, "HighScore%u_Name", i);
260 		sprintf(hsScore, "HighScore%u_Score", i);
261 		sprintf(hsCompleted, "HighScore%u_Completed", i);
262 		sprintf(hsGraphic, "HighScore%u_Graphic", i);
263 
264 		config.CreateSetting(hsName, Scores[i].name);
265 		config.CreateSetting(hsScore, Scores[i].score);
266 		config.CreateSetting(hsCompleted, Scores[i].completed);
267 		config.CreateSetting(hsGraphic, Scores[i].graphic);
268 
269 		strcpy(Scores[i].name, config.GetSetting(hsName)->GetString());
270 		Scores[i].score = config.GetSetting(hsScore)->GetInteger();
271 		if(config.GetSetting(hsCompleted)->GetType() == SettingsData::ST_STR)
272 			Scores[i].completed = config.GetSetting(hsCompleted)->GetString();
273 		else
274 			Scores[i].completed.Format("%d", config.GetSetting(hsCompleted)->GetInteger());
275 		strncpy(Scores[i].graphic, config.GetSetting(hsGraphic)->GetString(), 8);
276 		Scores[i].graphic[8] = 0;
277 	}
278 
279 	// make sure values are correct
280 	if (mousexadjustment<0) mousexadjustment = 0;
281 	else if (mousexadjustment>20) mousexadjustment = 20;
282 
283 	if (mouseyadjustment<0) mouseyadjustment = 0;
284 	else if (mouseyadjustment>20) mouseyadjustment = 20;
285 
286 	if (panxadjustment<0) panxadjustment = 0;
287 	else if (panxadjustment>20) panxadjustment = 20;
288 
289 	if (panyadjustment<0) panyadjustment = 0;
290 	else if (panyadjustment>20) panyadjustment = 20;
291 
292 	if(viewsize<4) viewsize=4;
293 	else if(viewsize>21) viewsize=21;
294 }
295 
296 /*
297 ====================
298 =
299 = WriteConfig
300 =
301 ====================
302 */
303 
WriteConfig(void)304 void WriteConfig(void)
305 {
306 	if(!doWriteConfig)
307 		return;
308 
309 	char joySettingName[50] = {0};
310 	char keySettingName[50] = {0};
311 	char mseSettingName[50] = {0};
312 	config.GetSetting("ForceGrabMouse")->SetValue(forcegrabmouse);
313 	config.GetSetting("MouseEnabled")->SetValue(mouseenabled);
314 	config.GetSetting("JoystickEnabled")->SetValue(joystickenabled);
315 	for(unsigned int i = 0;controlScheme[i].button != bt_nobutton;i++)
316 	{
317 		sprintf(joySettingName, "Joystick_%s", controlScheme[i].name);
318 		sprintf(keySettingName, "Keybaord_%s", controlScheme[i].name);
319 		sprintf(mseSettingName, "Mouse_%s", controlScheme[i].name);
320 		for(unsigned int j = 0;j < 50;j++)
321 		{
322 			if(joySettingName[j] == ' ')
323 				joySettingName[j] = '_';
324 			if(keySettingName[j] == ' ')
325 				keySettingName[j] = '_';
326 			if(mseSettingName[j] == ' ')
327 				mseSettingName[j] = '_';
328 		}
329 		config.GetSetting(joySettingName)->SetValue(controlScheme[i].joystick);
330 		config.GetSetting(keySettingName)->SetValue(SDL2Backconvert(controlScheme[i].keyboard));
331 		config.GetSetting(mseSettingName)->SetValue(controlScheme[i].mouse);
332 	}
333 	config.GetSetting("ViewSize")->SetValue(viewsize);
334 	config.GetSetting("MouseXAdjustment")->SetValue(mousexadjustment);
335 	config.GetSetting("MouseYAdjustment")->SetValue(mouseyadjustment);
336 	config.GetSetting("PanXAdjustment")->SetValue(panxadjustment);
337 	config.GetSetting("PanYAdjustment")->SetValue(panyadjustment);
338 	config.GetSetting("MouseYAxisDisabled")->SetValue(mouseyaxisdisabled);
339 	config.GetSetting("AlwaysRun")->SetValue(alwaysrun);
340 	config.GetSetting("SoundDevice")->SetValue(SoundMode);
341 	config.GetSetting("MusicDevice")->SetValue(MusicMode);
342 	config.GetSetting("DigitalSoundDevice")->SetValue(DigiMode);
343 	config.GetSetting("SoundVolume")->SetValue(AdlibVolume);
344 	config.GetSetting("MusicVolume")->SetValue(MusicVolume);
345 	config.GetSetting("DigitizedVolume")->SetValue(SoundVolume);
346 	config.GetSetting("Vid_FullScreen")->SetValue(vid_fullscreen);
347 	config.GetSetting("Vid_Aspect")->SetValue(vid_aspect);
348 	config.GetSetting("Vid_Vsync")->SetValue(vid_vsync);
349 	config.GetSetting("ScreenWidth")->SetValue(screenWidth);
350 	config.GetSetting("ScreenHeight")->SetValue(screenHeight);
351 	config.GetSetting("QuitOnEscape")->SetValue(quitonescape);
352 	config.GetSetting("MoveBob")->SetValue(movebob);
353 	config.GetSetting("Gamma")->SetValue(screenGamma);
354 	config.GetSetting("AM_Rotate")->SetValue(am_rotate);
355 	config.GetSetting("AM_DrawTexturedWalls")->SetValue(am_drawtexturedwalls);
356 	config.GetSetting("AM_DrawFloors")->SetValue(am_drawfloors);
357 	config.GetSetting("AM_Overlay")->SetValue(am_overlay);
358 	config.GetSetting("AM_OverlayTextured")->SetValue(am_overlaytextured);
359 	config.GetSetting("AM_Pause")->SetValue(am_pause);
360 	config.GetSetting("AM_ShowRatios")->SetValue(am_showratios);
361 
362 	char hsName[50];
363 	char hsScore[50];
364 	char hsCompleted[50];
365 	char hsGraphic[50];
366 	for(unsigned int i = 0;i < MaxScores;i++)
367 	{
368 		sprintf(hsName, "HighScore%u_Name", i);
369 		sprintf(hsScore, "HighScore%u_Score", i);
370 		sprintf(hsCompleted, "HighScore%u_Completed", i);
371 		sprintf(hsGraphic, "HighScore%u_Graphic", i);
372 
373 		config.GetSetting(hsName)->SetValue(Scores[i].name);
374 		config.GetSetting(hsScore)->SetValue(Scores[i].score);
375 		config.GetSetting(hsCompleted)->SetValue(Scores[i].completed);
376 		config.GetSetting(hsGraphic)->SetValue(Scores[i].graphic);
377 	}
378 
379 	config.SaveConfig();
380 }
381