ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/Daodan/src/Daodan_Config.c
(Generate patch)

Comparing Daodan/src/Daodan_Config.c (file contents):
Revision 992 by alloc, Sat Apr 5 10:19:11 2014 UTC vs.
Revision 993 by alloc, Sun Apr 6 17:06:02 2014 UTC

# Line 10 | Line 10
10  
11   #include "Inifile_Reader.h"
12  
13 < bool patch_alttab = true;
14 < bool patch_argb8888 = true;
15 < bool patch_binkplay = true;
16 < bool patch_bsl = true;
17 < bool patch_cheater = true;
18 < bool patch_cheatsenabled = true;
19 < bool patch_cheattable = true;
20 < bool patch_clipcursor = true;
21 < bool patch_cooldowntimer = true;
22 < bool patch_daodandisplayenum = true;
23 < bool patch_directinput = true;
24 < bool patch_disablecmdline = true;
25 < bool patch_flatline = true;
26 < bool patch_fonttexturecache = true;
27 < bool patch_getcmdline = true;
28 < bool patch_hdscreens_lowres = true;
29 < bool patch_highres_console = true;
30 < bool patch_kickguns = false;
31 < bool patch_killvtune = true;
32 < bool patch_largetextures = true;
33 < bool patch_levelplugins = true;
34 < bool patch_newweapon = true;
35 < bool patch_nomultibyte = true;
36 < bool patch_optionsvisible = true;
37 < bool patch_particledisablebit = false;
38 < bool patch_pathfinding = true;
39 < bool patch_projaware = true;
40 < bool patch_safeprintf = true;
41 < bool patch_showalllasersights = false;
42 < bool patch_showtriggervolumes = true;
43 < bool patch_throwtest = false;
44 < bool patch_usedaodangl = true;
45 < bool patch_usegettickcount = true;
46 < bool patch_wpfadetime = true;
47 <
48 < bool opt_border = true;
49 < bool opt_gamma = true;
50 < bool opt_topmost = false;
51 < bool opt_usedaodanbsl = true;
13 > #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
14  
15 < bool patch_chinese = true;
15 > static const char* iniName = "daodan.ini";
16  
17 + ConfigSection_t config[] = {
18 +        { "patches", "Patches", {
19 +                { "alttab",
20 +                        "Allows user to switch applications while in Oni (Alt-Tab) and use Windows key, however it may enable the screensaver as well.",
21 +                        C_BOOL,
22 +                        {.intBoolVal = true},
23 +                        {.intBoolVal = true} },
24 +                { "argb8888",
25 +                        "Textures using ARGB8888 can be used.",
26 +                        C_BOOL,
27 +                        {.intBoolVal = true},
28 +                        {.intBoolVal = true} },
29 +                { "binkplay",
30 +                        "Fix binkplay calls to use GDI and outro same mode as intro.",
31 +                        C_BOOL,
32 +                        {.intBoolVal = true},
33 +                        {.intBoolVal = true} },
34 +                { "bsl",
35 +                        "Enables d_regen (unfinished) and prevents fly-in portraits from being stretched when playing in widescreen resolutions.",
36 +                        C_BOOL,
37 +                        {.intBoolVal = true},
38 +                        {.intBoolVal = true} },
39 +                { "cheater",
40 +                        "Adds new cheat codes (see section below).",
41 +                        C_BOOL,
42 +                        {.intBoolVal = true},
43 +                        {.intBoolVal = true} },
44 +                { "cheatsenabled",
45 +                        "Enables cheats without having to beat the game first.",
46 +                        C_BOOL,
47 +                        {.intBoolVal = true},
48 +                        {.intBoolVal = true} },
49 +                { "cheattable",
50 +                        "Replaces Oni's cheat table with table that includes new cheats (see section below).",
51 +                        C_BOOL,
52 +                        {.intBoolVal = true},
53 +                        {.intBoolVal = true} },
54 +                { "chinese",
55 +                        "Allow for chinese fonts to be shown.",
56 +                        C_BOOL,
57 +                        {.intBoolVal = true},
58 +                        {.intBoolVal = true} },
59 +                { "clipcursor",
60 +                        "Limit cursor to Oni's window.",
61 +                        C_BOOL,
62 +                        {.intBoolVal = true},
63 +                        {.intBoolVal = true} },
64 +                { "cooldowntimer",
65 +                        "Disables weapon cooldown exploit.",
66 +                        C_BOOL,
67 +                        {.intBoolVal = true},
68 +                        {.intBoolVal = true} },
69 +                { "daodandisplayenum",
70 +                        "Offers more display modes in the Options menu.",
71 +                        C_BOOL,
72 +                        {.intBoolVal = true},
73 +                        {.intBoolVal = true} },
74 +                { "directinput",
75 +                        "Forces on DirectInput.",
76 +                        C_BOOL,
77 +                        {.intBoolVal = true},
78 +                        {.intBoolVal = true} },
79 +                { "disablecmdline",
80 +                        "Replaces existing command line parser with Daodan's in order to add new commands. Meant to be used with getcmdline.",
81 +                        C_BOOL,
82 +                        {.intBoolVal = true},
83 +                        {.intBoolVal = true} },
84 +                { "fonttexturecache",
85 +                        "Doubles size of font texture cache.",
86 +                        C_BOOL,
87 +                        {.intBoolVal = true},
88 +                        {.intBoolVal = true} },
89 +                { "getcmdline",
90 +                        "Replaces existing command line parser with Daodan's in order to add new commands. Meant to be used with disablecmdline.",
91 +                        C_BOOL,
92 +                        {.intBoolVal = true},
93 +                        {.intBoolVal = true} },
94 +                { "hdscreens_lowres",
95 +                        "???",
96 +                        C_BOOL,
97 +                        {.intBoolVal = true},
98 +                        {.intBoolVal = true} },
99 +                { "highres_console",
100 +                        "Fixes bug where console line becomes invisible at higher resolutions.",
101 +                        C_BOOL,
102 +                        {.intBoolVal = true},
103 +                        {.intBoolVal = true} },
104 +                { "kickguns",
105 +                        "Unfinished, do not use.",
106 +                        C_BOOL,
107 +                        {.intBoolVal = false},
108 +                        {.intBoolVal = false} },
109 +                { "largetextures",
110 +                        "Textures up to 512x512 can be used.",
111 +                        C_BOOL,
112 +                        {.intBoolVal = true},
113 +                        {.intBoolVal = true} },
114 +                { "levelplugins",
115 +                        "Allows level files to be loaded from the GDF which do not end in \"_Final\".",
116 +                        C_BOOL,
117 +                        {.intBoolVal = true},
118 +                        {.intBoolVal = true} },
119 +                { "newweap",
120 +                        "Picking up a weapon displays a message containing the weapon name and amount of ammo.",
121 +                        C_BOOL,
122 +                        {.intBoolVal = true},
123 +                        {.intBoolVal = true} },
124 +                { "nomultibyte",
125 +                        "Enables languages which use multibyte coding (such as Chinese).",
126 +                        C_BOOL,
127 +                        {.intBoolVal = true},
128 +                        {.intBoolVal = true} },
129 +                { "optionsvisible",
130 +                        "Always show options button in main menu, even when pausing from a game.",
131 +                        C_BOOL,
132 +                        {.intBoolVal = true},
133 +                        {.intBoolVal = true} },
134 +                { "particledisablebit",
135 +                        "Unlocks particle action disabling/enabling bits for all events so that a particle event can occur multiple times.",
136 +                        C_BOOL,
137 +                        {.intBoolVal = false},
138 +                        {.intBoolVal = false} },
139 +                { "pathfinding",
140 +                        "Multiplies size of pathfinding grid cache by eight in order to prevent crashes in large levels.",
141 +                        C_BOOL,
142 +                        {.intBoolVal = true},
143 +                        {.intBoolVal = true} },
144 +                { "projaware",
145 +                        "Allows AI to dodge incoming gunfire properly.",
146 +                        C_BOOL,
147 +                        {.intBoolVal = true},
148 +                        {.intBoolVal = true} },
149 +                { "safeprintf",
150 +                        "Replaces Oni's function that prints to startup.txt with a safer one.",
151 +                        C_BOOL,
152 +                        {.intBoolVal = true},
153 +                        {.intBoolVal = true} },
154 +                { "showalllasersights",
155 +                        "Show all (also enemies') weapon lasersights.",
156 +                        C_BOOL,
157 +                        {.intBoolVal = false},
158 +                        {.intBoolVal = false} },
159 +                { "showtriggervolumes",
160 +                        "Allows BSL variable \"show_triggervolumes\" to work when set to 1.",
161 +                        C_BOOL,
162 +                        {.intBoolVal = true},
163 +                        {.intBoolVal = true} },
164 +                { "throwtest",
165 +                        "Not recommended for use; experiment with allowing enemies to be thrown over railings.",
166 +                        C_BOOL,
167 +                        {.intBoolVal = false},
168 +                        {.intBoolVal = false} },
169 +                { "usedaodangl",
170 +                        "Provides an improved windowed mode (-noswitch); this patch is known to break the hiding of the Windows taskbar in fullscreen mode.",
171 +                        C_BOOL,
172 +                        {.intBoolVal = true},
173 +                        {.intBoolVal = true} },
174 +                { "usegettickcount",
175 +                        "Replaces Oni's timing functions with more accurate ones.",
176 +                        C_BOOL,
177 +                        {.intBoolVal = true},
178 +                        {.intBoolVal = true} },
179 +                { "wpfadetime",
180 +                        "Adds working function for existing BSL command wp_fadetime, sets fade time to 4800.",
181 +                        C_BOOL,
182 +                        {.intBoolVal = true},
183 +                        {.intBoolVal = true} },
184 +                { 0, 0, 0, {0}, {0} }
185 +        } },
186 +        { "options", "Options", {
187 +                { "border",
188 +                        "If \"windowhack\" patch is active, make sure game window has border in windowed mode.",
189 +                        C_BOOL,
190 +                        {.intBoolVal = true},
191 +                        {.intBoolVal = true} },
192 +                { "debug",
193 +                        "???",
194 +                        EXT_BOOL,
195 +                        {.intBoolVal = false },
196 +                        {.extBoolVal = &AKgDebug_DebugMaps } },
197 +                { "debugfiles",
198 +                        "???",
199 +                        EXT_BOOL,
200 +                        {.intBoolVal = false },
201 +                        {.extBoolVal = &BFgDebugFileEnable } },
202 +                { "findsounds",
203 +                        "???",
204 +                        EXT_BOOL,
205 +                        {.intBoolVal = false },
206 +                        {.extBoolVal = &SSgSearchOnDisk } },
207 +                { "gamma",
208 +                        "Enable gamma slider in fullscreen.",
209 +                        C_BOOL,
210 +                        {.intBoolVal = true},
211 +                        {.intBoolVal = true} },
212 +                { "ignore_private_data",
213 +                        "???",
214 +                        EXT_BOOL,
215 +                        {.intBoolVal = false },
216 +                        {.extBoolVal = &opt_ignore_private_data } },
217 +                { "sound",
218 +                        "???",
219 +                        EXT_BOOL,
220 +                        {.intBoolVal = true },
221 +                        {.extBoolVal = &opt_sound } },
222 +                { "switch",
223 +                        "Always switch screen to resolution on Oni's Options screen, making the game fullscreen; opposite of Oni's built-in argument \"noswitch\".",
224 +                        EXT_BOOL,
225 +                        {.intBoolVal = true},
226 +                        {.extBoolVal = &M3gResolutionSwitch} },
227 +                { "topmost",
228 +                        "Keep game window on top in windowed mode, even when switching applications.",
229 +                        C_BOOL,
230 +                        {.intBoolVal = false},
231 +                        {.intBoolVal = false} },
232 +                { "usedaodanbsl",
233 +                        "Adds new BSL commands (see below).",
234 +                        C_BOOL,
235 +                        {.intBoolVal = true},
236 +                        {.intBoolVal = true} },
237 +                { "language",
238 +                        "Localization for hardcoded strings (e.g. \"Savepoints\").",
239 +                        C_STRING,
240 +                        {.stringVal = "en"},
241 +                        {.stringVal = "en"} },
242 +                { 0, 0, 0, {0}, {0} }
243 +        } }
244 + };
245  
56 enum {s_unknown, s_options, s_patch, s_bsl, s_language} ini_section;
246  
247 < bool DDrIniCallback(char* section, bool newsection, char* name, char* value)
247 > void DDrConfig_Print()
248   {
249 <        if (newsection)
249 >        for (unsigned int s = 0; s < ARRAY_SIZE(config); s++) {
250 >                for (ConfigOption_t* co = config[s].options; co->name != 0; co++) {
251 >                        switch (co->type) {
252 >                                case C_STRING:
253 >                                        STARTUPMESSAGE("Option %s.%s = %s (def %s)", config[s].name, co->name, co->value.stringVal, co->defaultValue.stringVal);
254 >                                        break;
255 >                                case EXT_BOOL:
256 >                                        STARTUPMESSAGE("Option %s.%s = %d (def %d)", config[s].name, co->name, *co->value.extBoolVal, co->defaultValue.intBoolVal);
257 >                                        break;
258 >                                default:
259 >                                        STARTUPMESSAGE("Option %s.%s = %d (def %d)", config[s].name, co->name, co->value.intBoolVal, co->defaultValue.intBoolVal);
260 >                        }
261 >                }
262 >        }
263 > }
264 >
265 > const char* DDrConfig_GetOptionTypeName(OptionType_t type)
266 > {
267 >        switch (type) {
268 >                case C_INT:
269 >                        return "Int";
270 >                case C_BOOL:
271 >                        return "Bool";
272 >                case C_STRING:
273 >                        return "String";
274 >                case EXT_BOOL:
275 >                        return "pBool";
276 >                default:
277 >                        return "unknown";
278 >        }
279 > }
280 >
281 > static ConfigOption_t* DDrConfig_GetOption(const char* fullOptName)
282 > {
283 >        char section[50];
284 >        strcpy(section, fullOptName);
285 >
286 >        char* option = strchr(section, '.');
287 >        if (option == 0) {
288 >                STARTUPMESSAGE("Could not find option separator in \"%s\"", fullOptName);
289 >                return 0;
290 >        }
291 >        *option++ = 0;
292 >
293 >        for (unsigned int s = 0; s < ARRAY_SIZE(config); s++) {
294 >                if (!_stricmp(config[s].name, section)) {
295 >                        for (ConfigOption_t* co = config[s].options; co->name != 0; co++) {
296 >                                if (!_stricmp(co->name, option)) {
297 >                                        return co;
298 >                                }
299 >                        }
300 >                        STARTUPMESSAGE("Could not find option \"%s\" in section \"%s\"", option, section);
301 >                        return 0;
302 >                }
303 >        }
304 >        STARTUPMESSAGE("Could not find section \"%s\" for option \"%s\"", section, option);
305 >        return 0;
306 > }
307 >
308 >
309 >
310 > ConfigOption_t* DDrConfig_GetOptOfType(const char* fullOptName, OptionType_t type)
311 > {
312 >        ConfigOption_t* co = DDrConfig_GetOption(fullOptName);
313 >        if (co == 0)
314 >                return 0;
315 >
316 >        if (co->type != type) {
317 >                STARTUPMESSAGE("Option \"%s\" is not of type %s", fullOptName, DDrConfig_GetOptionTypeName(type));
318 >                return 0;
319 >        }
320 >        return co;
321 > }
322 >
323 >
324 > void DDrConfig_InitExtBools()
325 > {
326 >        for (unsigned int s = 0; s < ARRAY_SIZE(config); s++) {
327 >                for (ConfigOption_t* co = config[s].options; co->name != 0; co++) {
328 >                        if (co->type == EXT_BOOL) {
329 >                                *co->value.extBoolVal = co->defaultValue.intBoolVal;
330 >                        }
331 >                }
332 >        }
333 > }
334 >
335 >
336 >
337 > void DDrIniCallback(char* section, char* name, char* value)
338 > {
339 >        static char curSection[20];
340 >        char fullOptName[50];
341 >
342 >        if (!_stricmp(section, "patch"))
343 >                section = "patches";
344 >
345 >        strcpy(curSection, section);
346 >
347 >        strcpy(fullOptName, curSection);
348 >        fullOptName[strlen(curSection)] = '.';
349 >        strcpy(fullOptName+strlen(curSection)+1, name);
350 >
351 >        ConfigOption_t* co = DDrConfig_GetOption(fullOptName);
352 >
353 >        if (co)
354          {
355 <                if (!_stricmp(section, "options"))
356 <                        ini_section = s_options;
357 <                else if (!_stricmp(section, "patch") || !_stricmp(section, "patches"))
358 <                        ini_section = s_patch;
359 <                else if (!_stricmp(section, "bsl"))
360 <                        ini_section = s_bsl;
361 <                else if (!_stricmp(section, "language"))
362 <                        ini_section = s_language;
363 <                else
364 <                {
365 <                        ini_section = s_unknown;
366 <                        DDrStartupMessage("Daodan: Unrecognised ini section \"%s\"", section);
355 >                switch (co->type) {
356 >                        case C_INT:
357 >                                co->value.intBoolVal = strtol(value, NULL, 0);
358 >                                break;
359 >                        case C_BOOL:
360 >                                co->value.intBoolVal = !_stricmp(value, "true");
361 >                                break;
362 >                        case C_STRING:
363 >                                co->value.stringVal = value;
364 >                                break;
365 >                        case EXT_BOOL:
366 >                                *(co->value.extBoolVal) = !_stricmp(value, "true");
367 >                                break;
368 >                        default:
369 >                                STARTUPMESSAGE("Config value type unknown: %d", co->type);
370 >                }
371 >        }
372 > }
373 >
374 > void DDrConfig_WriteTemplateIni()
375 > {
376 >        FILE* fp;
377 >        STARTUPMESSAGE("%s doesn't exist, creating", iniName);
378 >        fp = fopen(iniName, "w");
379 >        if (fp)
380 >        {
381 >                for (unsigned int s = 0; s < ARRAY_SIZE(config); s++) {
382 >                        fprintf(fp, "[%s]\n", config[s].name);
383                  }
384 +                fclose(fp);
385          }
386 + }
387 +
388 +
389 + void DDrConfig(int argc, char* argv[])
390 + {
391 +        int i;
392 +        char* section;
393 +        char* option;
394 +        bool falseoption;
395 +
396 +        DDrConfig_InitExtBools();
397 +
398 +        if (GetFileAttributes(iniName) == INVALID_FILE_ATTRIBUTES)
399 +                DDrConfig_WriteTemplateIni();
400          
401 <        switch (ini_section)
401 >        STARTUPMESSAGE("Parsing daodan.ini...", 0);
402 >        if (!Inifile_Read(iniName, DDrIniCallback))
403 >                STARTUPMESSAGE("Error reading daodan.ini, check your syntax!", 0);
404 >        STARTUPMESSAGE("Finished parsing", 0);
405 >
406 >
407 >
408 >        STARTUPMESSAGE("Parsing command line...", 0);
409 >        for (i = 1; i < argc; i ++)
410          {
411 <                case s_options:
412 <                        if (!_stricmp(name, "border"))
413 <                                opt_border = !_stricmp(inifile_cleanstr(value), "true");
414 <                        else if (!_stricmp(name, "debug"))
415 <                                AKgDebug_DebugMaps = !_stricmp(inifile_cleanstr(value), "true");
416 <                        else if (!_stricmp(name, "debugfiles"))
417 <                                BFgDebugFileEnable = !_stricmp(inifile_cleanstr(value), "true");
418 <                        else if (!_stricmp(name, "findsounds"))
419 <                                SSgSearchOnDisk = !_stricmp(inifile_cleanstr(value), "true");
420 <                        else if (!_stricmp(name, "gamma"))
421 <                                opt_gamma = !_stricmp(inifile_cleanstr(value), "true");
422 <                        else if (!_stricmp(name, "ignore_private_data"))
423 <                                opt_ignore_private_data = !_stricmp(inifile_cleanstr(value), "true");
92 <                        else if (!_stricmp(name, "nomultibyte"))
93 <                                patch_nomultibyte = !_stricmp(inifile_cleanstr(value), "true");
94 <                        else if (!_stricmp(name, "sound"))
95 <                                opt_sound = !_stricmp(inifile_cleanstr(value), "true");
96 <                        else if (!_stricmp(name, "switch"))
97 <                                M3gResolutionSwitch = !_stricmp(inifile_cleanstr(value), "true");
98 <                        else if (!_stricmp(name, "topmost"))
99 <                                opt_topmost = !_stricmp(inifile_cleanstr(value), "true");
100 <                        else if (!_stricmp(name, "usedaodanbsl"))
101 <                                opt_usedaodanbsl = !_stricmp(inifile_cleanstr(value), "true");
102 <                        else
103 <                                DDrStartupMessage("Daodan: Unrecognised ini option \"%s\"", name);
104 <                        break;
105 <                case s_patch:
106 <                        if (!_stricmp(name, "alttab"))
107 <                                patch_alttab = !_stricmp(inifile_cleanstr(value), "true");
108 <                        else if (!_stricmp(name, "argb8888"))
109 <                                patch_argb8888 = !_stricmp(inifile_cleanstr(value), "true");
110 <                        else if (!_stricmp(name, "binkplay"))
111 <                                patch_binkplay = !_stricmp(inifile_cleanstr(value), "true");
112 <                        else if (!_stricmp(name, "bsl"))
113 <                                patch_bsl = !_stricmp(inifile_cleanstr(value), "true");
114 <                        else if (!_stricmp(name, "cheater"))
115 <                                patch_cheater = !_stricmp(inifile_cleanstr(value), "true");
116 <                        else if (!_stricmp(name, "cheatsenabled"))
117 <                                patch_cheatsenabled = !_stricmp(inifile_cleanstr(value), "true");
118 <                        else if (!_stricmp(name, "cheattable"))
119 <                                patch_cheattable = !_stricmp(inifile_cleanstr(value), "true");
120 <                        else if (!_stricmp(name, "clipcursor"))
121 <                                patch_clipcursor = !_stricmp(inifile_cleanstr(value), "true");
122 <                        else if (!_stricmp(name, "cooldowntimer"))
123 <                                patch_cooldowntimer = !_stricmp(inifile_cleanstr(value), "true");
124 <                        else if (!_stricmp(name, "daodandisplayenum"))
125 <                                patch_daodandisplayenum = !_stricmp(inifile_cleanstr(value), "true");
126 <                        else if (!_stricmp(name, "directinput"))
127 <                                patch_directinput = !_stricmp(inifile_cleanstr(value), "true");
128 <                        else if (!_stricmp(name, "disablecmdline"))
129 <                                patch_disablecmdline = !_stricmp(inifile_cleanstr(value), "true");
130 <                        else if (!_stricmp(name, "flatline"))
131 <                                patch_flatline = !_stricmp(inifile_cleanstr(value), "true");
132 <                        else if (!_stricmp(name, "fonttexturecache"))
133 <                                patch_fonttexturecache = !_stricmp(inifile_cleanstr(value), "true");
134 <                        else if (!_stricmp(name, "getcmdline"))
135 <                                patch_getcmdline = !_stricmp(inifile_cleanstr(value), "true");
136 <                        else if (!_stricmp(name, "hdscreens_lowres"))
137 <                                patch_hdscreens_lowres = !_stricmp(inifile_cleanstr(value), "true");
138 <                        else if (!_stricmp(name, "highres_console"))
139 <                                patch_highres_console = !_stricmp(inifile_cleanstr(value), "true");
140 <                        else if (!_stricmp(name, "kickguns"))
141 <                                patch_kickguns = !_stricmp(inifile_cleanstr(value), "true");
142 <                        else if (!_stricmp(name, "killvtune"))
143 <                                patch_killvtune = !_stricmp(inifile_cleanstr(value), "true");
144 <                        else if (!_stricmp(name, "largetextures"))
145 <                                patch_largetextures = !_stricmp(inifile_cleanstr(value), "true");
146 <                        else if (!_stricmp(name, "levelplugins"))
147 <                                patch_levelplugins = !_stricmp(inifile_cleanstr(value), "true");
148 <                        else if (!_stricmp(name, "nomultibyte"))
149 <                                patch_nomultibyte = !_stricmp(inifile_cleanstr(value), "true");
150 <                        else if (!_stricmp(name, "newweap"))
151 <                                patch_newweapon = !_stricmp(inifile_cleanstr(value), "true");
152 <                        else if (!_stricmp(name, "optionsvisible"))
153 <                                patch_optionsvisible = !_stricmp(inifile_cleanstr(value), "true");
154 <                        else if (!_stricmp(name, "particledisablebit"))
155 <                                patch_particledisablebit = !_stricmp(inifile_cleanstr(value), "true");
156 <                        else if (!_stricmp(name, "pathfinding"))
157 <                                patch_pathfinding = !_stricmp(inifile_cleanstr(value), "true");
158 <                        else if (!_stricmp(name, "projaware"))
159 <                                patch_projaware = !_stricmp(inifile_cleanstr(value), "true");
160 <                        else if (!_stricmp(name, "safeprintf"))
161 <                                patch_safeprintf = !_stricmp(inifile_cleanstr(value), "true");
162 <                        else if (!_stricmp(name, "showalllasersights"))
163 <                                patch_showalllasersights = !_stricmp(inifile_cleanstr(value), "true");
164 <                        else if (!_stricmp(name, "showtriggervolumes"))
165 <                                patch_showtriggervolumes = !_stricmp(inifile_cleanstr(value), "true");
166 <                        else if (!_stricmp(name, "throwtest"))
167 <                                patch_throwtest = !_stricmp(inifile_cleanstr(value), "true");
168 <                        else if (!_stricmp(name, "usedaodangl"))
169 <                                patch_usedaodangl = !_stricmp(inifile_cleanstr(value), "true");
170 <                        else if (!_stricmp(name, "usegettickcount"))
171 <                                patch_usegettickcount = !_stricmp(inifile_cleanstr(value), "true");
172 <                        else if (!_stricmp(name, "wpfadetime"))
173 <                                patch_wpfadetime = !_stricmp(inifile_cleanstr(value), "true");
411 >                if (argv[i][0] == '-')
412 >                {
413 >                        section = argv[i] + 1;
414 >                        if ((option = strchr(argv[i], '.')))
415 >                        {
416 >                                *option = '\0';
417 >                                falseoption = (option[1] == 'n' || option[1] == 'N') && (option[2] == 'o' || option[2] == 'O');
418 >                                if (i < (argc - 1) && argv[i + 1][0] != '-')
419 >                                        DDrIniCallback(section, option + 1, argv[++i]);
420 >                                else
421 >                                        DDrIniCallback(section, option + (falseoption ? 3 : 1), (falseoption ? "false" : "true"));
422 >                                *option = '.';
423 >                        }
424                          else
425 <                                DDrStartupMessage("Daodan: Unrecognised ini patch \"%s\"", name);
425 >                        {
426 >                                falseoption = (section[0] == 'n' || section[0] == 'N') && (section[1] == 'o' || section[1] == 'O');
427 >                                if (i < (argc - 1) && argv[i + 1][0] != '-')
428 >                                        DDrIniCallback("options", section, argv[++i]);
429 >                                else
430 >                                        DDrIniCallback("options", section + (falseoption ? 2 : 0), (falseoption ? "false" : "true"));
431 >                        }
432 >                }
433 >                else
434 >                {
435 >                        STARTUPMESSAGE("Parse error \"%s\"", argv[i]);
436                          break;
437 +                }
438 +        }
439 +        STARTUPMESSAGE("Finished parsing", 0);
440 + }
441 +
442 +
443 + /*
444                  case s_language:
178                        if (!_stricmp(name, "chinese"))
179                                patch_chinese = !_stricmp(inifile_cleanstr(value), "true");
445                          else if (!_stricmp(name, "blam"))
446                                  DDrPatch__strdup((int*)(OniExe + 0x0010fb73), value);
447                          else if (!_stricmp(name, "damn"))
# Line 281 | Line 546 | bool DDrIniCallback(char* section, bool
546                                  DDr_CheatTable[21].message_on = _strdup(value);
547                          else if (!_stricmp(name, "carousel_off"))
548                                  DDr_CheatTable[21].message_off = _strdup(value);
549 <                        else
285 <                                DDrStartupMessage("Daodan: Unrecognised ini language item \"%s\"", name);
286 <                        break;
287 <                case s_bsl:
288 <                default:
289 <                        break;
290 <        }
291 <        
292 <        return true;
293 < }
294 <
295 < void DDrConfig(int argc, char* argv[])
296 < {
297 <        int i;
298 <        char* section;
299 <        char* option;
300 <        bool falseoption;
301 <
302 <
303 <        // Tell Oni to not load non levelX_final-files by default:
304 <        opt_ignore_private_data = false;
305 <
306 <        // Enable sound by default:
307 <        opt_sound = true;
308 <
309 <
310 <        if (GetFileAttributes("daodan.ini") == INVALID_FILE_ATTRIBUTES)
311 <        {
312 <                FILE* fp;
313 <                DDrStartupMessage("Daodan: daodan.ini doesn't exist, creating");
314 <                fp = fopen("daodan.ini", "w");
315 <                if (fp)
316 <                {
317 <                        fputs("[Options]\n", fp);
318 <                        fputs("[Patch]\n", fp);
319 <                        fputs("[BSL]\n", fp);
320 <                        fputs("[Language]\n", fp);
321 <                        fclose(fp);
322 <                }
323 <        }
324 <        
325 <        DDrStartupMessage("Daodan: Parsing daodan.ini...");
326 <        if (!inifile_read("daodan.ini", DDrIniCallback))
327 <                DDrStartupMessage("Daodan: Error reading daodan.ini, check your syntax!");
328 <        DDrStartupMessage("Daodan: Finished parsing");
329 <
330 <
331 <
332 <        DDrStartupMessage("Daodan: Parsing command line...");
333 <        for (i = 1; i < argc; i ++)
334 <        {
335 <                if (argv[i][0] == '-')
336 <                {
337 <                        section = argv[i] + 1;
338 <                        if ((option = strchr(argv[i], '.')))
339 <                        {
340 <                                *option = '\0';
341 <                                falseoption = (option[1] == 'n' || option[1] == 'N') && (option[2] == 'o' || option[2] == 'O');
342 <                                if (i < (argc - 1) && argv[i + 1][0] != '-')
343 <                                        DDrIniCallback(section, true, option + 1, argv[++i]);
344 <                                else
345 <                                        DDrIniCallback(section, true, option + (falseoption ? 3 : 1), (falseoption ? "false" : "true"));
346 <                                *option = '.';
347 <                        }
348 <                        else
349 <                        {
350 <                                falseoption = (section[0] == 'n' || section[0] == 'N') && (section[1] == 'o' || section[1] == 'O');
351 <                                ini_section = s_options;
352 <                                if (i < (argc - 1) && argv[i + 1][0] != '-')
353 <                                        DDrIniCallback(NULL, false, section, argv[++i]);
354 <                                else
355 <                                        DDrIniCallback(NULL, false, section + (falseoption ? 2 : 0), (falseoption ? "false" : "true"));
356 <                        }
357 <                }
358 <                else
359 <                {
360 <                        DDrStartupMessage("Daodan: Parse error \"%s\"", argv[i]);
361 <                        break;
362 <                }
363 <        }
364 <        DDrStartupMessage("Daodan: Finished parsing");
365 < }
549 > */      
550  

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)