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 995 by alloc, Wed Apr 9 00:10:18 2014 UTC vs.
Revision 1163 by rossy, Sun Oct 24 02:50:48 2021 UTC

# Line 2 | Line 2
2   #include <string.h>
3   #include <time.h>
4  
5 + #include "Daodan.h"
6   #include "Daodan_Config.h"
7   #include "Daodan_Patch.h"
8   #include "Patches/Utility.h"
# Line 11 | Line 12
12  
13   #include "Inifile_Reader.h"
14  
14 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
15
15   static const char* iniName = "daodan.ini";
16   static const char* helpFile = "daodan_help.txt";
17  
18   static const char* defaultSection = "options";
19  
20 < static char invalidCurParamaters[1000] = "";
21 < static char invalidTotalParamaters[3000] = "";
20 > static char invalidCurParamaters[2000] = "";
21 > static char invalidTotalParamaters[4000] = "";
22  
23   void DDrConfig_PrintHelp();
24  
25  
26   ConfigSection_t config[] = {
27 <        { "patches", "Patches", {
28 <                { "alttab",
29 <                        "Allows to Alt-Tab out of Oni and use Windows key. May enable the screensaver as well.",
27 >        { "", "Command line only", {
28 >                { "help",
29 >                        "Generates this help file.",
30 >                        C_CMD,
31 >                        {.intBoolVal = 0},
32 >                        {.callback = DDrConfig_PrintHelp} },
33 >                { 0, 0, 0, {0}, {0} }
34 >        } },
35 >        { "devmode", "Developer Mode", {
36 >                { "highres_console",
37 >                        "Fixes bug where console line becomes invisible at higher resolutions.",
38                          C_BOOL,
39                          {.intBoolVal = true},
40                          {.intBoolVal = true} },
41 <                { "argb8888",
42 <                        "Allows using textures with ARGB8888.",
41 >                { "showtriggervolumes",
42 >                        "Allows BSL variable \"show_triggervolumes\" and Ctrl+Shift+X (in devmode) to work.",
43                          C_BOOL,
44                          {.intBoolVal = true},
45                          {.intBoolVal = true} },
46 <                { "binkplay",
47 <                        "Fix binkplay calls to use GDI and outro same mode as intro.",
46 >                { 0, 0, 0, {0}, {0} }
47 >        } },
48 >        { "gameplay", "Gameplay", {
49 >                { "bindablecheats",
50 >                        "Allows cheats to be bound to keys. Requires 'customactions' and 'cheattable' to be true.",
51 >                        C_BOOL,
52 >                        {.intBoolVal = true},
53 >                        {.intBoolVal = true} },
54 >                { "characterawareness",
55 >                        "Makes AI remember the player.",
56                          C_BOOL,
57                          {.intBoolVal = true},
58                          {.intBoolVal = true} },
# Line 51 | Line 66 | ConfigSection_t config[] = {
66                          C_BOOL,
67                          {.intBoolVal = true},
68                          {.intBoolVal = true} },
54                { "chinese",
55                        "Allow for chinese fonts to be shown if the required DLL is available.",
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} },
69                  { "cooldowntimer",
70                          "Disables weapon cooldown exploit.",
71                          C_BOOL,
72                          {.intBoolVal = true},
73                          {.intBoolVal = true} },
74 <                { "d_regen",
75 <                        "Enables script command d_regen (query/set regeneration for any character).",
74 >                { "customactions",
75 >                        "Allows more actions to be bound through Daodan.",
76                          C_BOOL,
77                          {.intBoolVal = true},
78                          {.intBoolVal = true} },
79 <                { "daodandisplayenum",
80 <                        "Offers a more accurate list of available display modes in the Options menu.",
79 >                { "kickguns",
80 >                        "EXPERIMENTAL! Unfinished, do not use.",
81                          C_BOOL,
82 <                        {.intBoolVal = true},
83 <                        {.intBoolVal = true} },
84 <                { "directinput",
85 <                        "Enforces the usage of DirectInput on every system. Should be off for Linux/Wine.",
82 >                        {.intBoolVal = false},
83 >                        {.intBoolVal = false} },
84 >                { "pathfinding",
85 >                        "Size of pathfinding grid cache increased by eight times in order to prevent crashes in large levels.",
86                          C_BOOL,
87                          {.intBoolVal = true},
88                          {.intBoolVal = true} },
89 <                { "disablecmdline",
90 <                        "Disables Oni's existing command line parser as Daodan has its own.",
89 >                { "projaware",
90 >                        "Allows AI to dodge incoming gunfire properly.",
91                          C_BOOL,
92                          {.intBoolVal = true},
93                          {.intBoolVal = true} },
94 <                { "fonttexturecache",
95 <                        "Doubles size of font texture cache.",
94 >                { "throwtest",
95 >                        "EXPERIMENTAL! Experiment with allowing enemies to be thrown over railings.",
96 >                        C_BOOL,
97 >                        {.intBoolVal = false},
98 >                        {.intBoolVal = false} },
99 >                { "wpfadetime",
100 >                        "Adds working function for existing BSL command wp_fadetime, sets fade time to 4800.",
101                          C_BOOL,
102                          {.intBoolVal = true},
103                          {.intBoolVal = true} },
104 <                { "hdscreens_lowres",
105 <                        "Allow HD intro/ending screens on game resolutions smaller than 1024x768.",
104 >                { 0, 0, 0, {0}, {0} }
105 >        } },
106 >        { "graphics", "Graphics", {
107 >                { "binkplay",
108 >                        "Fix binkplay calls to use GDI and outro same mode as intro.",
109                          C_BOOL,
110                          {.intBoolVal = true},
111                          {.intBoolVal = true} },
112 <                { "highres_console",
113 <                        "Fixes bug where console line becomes invisible at higher resolutions.",
112 >                { "daodangl",
113 >                        "Provides an improved windowed mode (-noswitch).",
114                          C_BOOL,
115                          {.intBoolVal = true},
116                          {.intBoolVal = true} },
117 <                { "kickguns",
118 <                        "EXPERIMENTAL! Unfinished, do not use.",
106 <                        C_BOOL,
107 <                        {.intBoolVal = false},
108 <                        {.intBoolVal = false} },
109 <                { "killvtune",
110 <                        "Prevent loading of vtuneapi.dll.",
111 <                        C_BOOL,
112 <                        {.intBoolVal = false},
113 <                        {.intBoolVal = false} },
114 <                { "largetextures",
115 <                        "Textures up to 512x512 can be used.",
117 >                { "displayenum",
118 >                        "Offers a more accurate list of available display modes in the Options menu.",
119                          C_BOOL,
120                          {.intBoolVal = true},
121                          {.intBoolVal = true} },
122 <                { "levelplugins",
123 <                        "Allows level files to be loaded which do not end in \"_Final\".",
122 >                { "gamma",
123 >                        "Enable gamma slider in fullscreen, disable in windowed mode.",
124                          C_BOOL,
125                          {.intBoolVal = true},
126                          {.intBoolVal = true} },
# Line 126 | Line 129 | ConfigSection_t config[] = {
129                          C_BOOL,
130                          {.intBoolVal = true},
131                          {.intBoolVal = true} },
129                { "nomultibyte",
130                        "Enables languages which use multibyte coding (such as Chinese).",
131                        C_BOOL,
132                        {.intBoolVal = true},
133                        {.intBoolVal = true} },
132                  { "optionsvisible",
133                          "Always show options button in main menu, even when pausing from a game.",
134                          C_BOOL,
135                          {.intBoolVal = true},
136                          {.intBoolVal = true} },
137 <                { "pathfinding",
138 <                        "Size of pathfinding grid cache increased by eight times in order to prevent crashes in large levels.",
137 >                { "showalllasersights",
138 >                        "Show all (also enemies') weapon lasersights.",
139 >                        C_BOOL,
140 >                        {.intBoolVal = false},
141 >                        {.intBoolVal = false} },
142 >                { "widescreenportraits",
143 >                        "Prevents fly-in portraits from being stretched when playing in widescreen resolutions.",
144                          C_BOOL,
145                          {.intBoolVal = true},
146                          {.intBoolVal = true} },
147 <                { "projaware",
148 <                        "Allows AI to dodge incoming gunfire properly.",
147 >                { 0, 0, 0, {0}, {0} }
148 >        } },
149 >        { "language", "Language", {
150 >                { "chinese",
151 >                        "Allow for chinese fonts to be shown if the required DLL is available.",
152                          C_BOOL,
153                          {.intBoolVal = true},
154                          {.intBoolVal = true} },
155 <                { "safeprintf",
156 <                        "Replaces Oni's function that prints to startup.txt with a safer one.",
155 >                { "fonttexturecache",
156 >                        "Doubles size of font texture cache.",
157                          C_BOOL,
158                          {.intBoolVal = true},
159                          {.intBoolVal = true} },
160 <                { "showalllasersights",
161 <                        "Show all (also enemies') weapon lasersights.",
162 <                        C_BOOL,
163 <                        {.intBoolVal = false},
164 <                        {.intBoolVal = false} },
165 <                { "showtriggervolumes",
166 <                        "Allows BSL variable \"show_triggervolumes\" and Ctrl+Shift+X (in devmode) to work.",
160 >                { "language",
161 >                        "Localization for hardcoded strings (e.g. \"Savepoints\").",
162 >                        C_STRING,
163 >                        {.stringVal = "en"},
164 >                        {.stringVal = "en"} },
165 >                { "nomultibyte",
166 >                        "Enables languages which use multibyte coding (such as Chinese).",
167                          C_BOOL,
168                          {.intBoolVal = true},
169                          {.intBoolVal = true} },
170 <                { "throwtest",
171 <                        "EXPERIMENTAL! Experiment with allowing enemies to be thrown over railings.",
172 <                        C_BOOL,
173 <                        {.intBoolVal = false},
174 <                        {.intBoolVal = false} },
169 <                { "usedaodanbsl",
170 <                        "Adds new BSL commands.",
170 >                { 0, 0, 0, {0}, {0} }
171 >        } },
172 >        { "modding", "Modding", {
173 >                { "argb8888",
174 >                        "Allows using textures with ARGB8888.",
175                          C_BOOL,
176                          {.intBoolVal = true},
177                          {.intBoolVal = true} },
178 <                { "usedaodangl",
179 <                        "Provides an improved windowed mode (-noswitch).",
178 >                { "d_regen",
179 >                        "Enables script command d_regen (query/set regeneration for any character).",
180                          C_BOOL,
181                          {.intBoolVal = true},
182                          {.intBoolVal = true} },
183 <                { "usegettickcount",
184 <                        "Replaces Oni's timing functions with more accurate ones.",
183 >                { "daodanbsl",
184 >                        "Adds new BSL commands.",
185                          C_BOOL,
186                          {.intBoolVal = true},
187                          {.intBoolVal = true} },
188 <                { "widescreenportraits",
189 <                        "Prevents fly-in portraits from being stretched when playing in widescreen resolutions.",
188 >                { "hdscreens_lowres",
189 >                        "Allow HD intro/ending screens on game resolutions smaller than 1024x768.",
190                          C_BOOL,
191                          {.intBoolVal = true},
192                          {.intBoolVal = true} },
193 <                { "wpfadetime",
194 <                        "Adds working function for existing BSL command wp_fadetime, sets fade time to 4800.",
193 >                { "largetextures",
194 >                        "Textures up to 512x512 can be used.",
195                          C_BOOL,
196                          {.intBoolVal = true},
197                          {.intBoolVal = true} },
198 <                { 0, 0, 0, {0}, {0} }
199 <        } },
196 <        { "options", "Options", {
197 <                { "border",
198 <                        "Add a border if in windowed mode and \"usedaodangl\" patch is active.",
198 >                { "levelplugins",
199 >                        "Allows level files to be loaded which do not end in \"_Final\".",
200                          C_BOOL,
201                          {.intBoolVal = true},
202                          {.intBoolVal = true} },
203 +                { 0, 0, 0, {0}, {0} }
204 +        } },
205 +        { "oni", "Original Oni Options", {
206                  { "debug",
207                          "Not useful, probably does nothing.",
208                          EXT_BOOL,
209                          {.intBoolVal = false },
210                          {.extBoolVal = &AKgDebug_DebugMaps } },
211                  { "debugfiles",
212 <                        "Not useful, probably does nothing.",
212 >                        "Logs called BSL functions to script_debug.txt.",
213                          EXT_BOOL,
214                          {.intBoolVal = false },
215                          {.extBoolVal = &BFgDebugFileEnable } },
# Line 214 | Line 218 | ConfigSection_t config[] = {
218                          EXT_BOOL,
219                          {.intBoolVal = false },
220                          {.extBoolVal = &SSgSearchOnDisk } },
217                { "gamma",
218                        "Enable gamma slider in fullscreen, disable in windowed mode.",
219                        C_BOOL,
220                        {.intBoolVal = true},
221                        {.intBoolVal = true} },
222                { "help",
223                        "Generates this help file.",
224                        C_CMD,
225                        {.intBoolVal = 0},
226                        {.callback = DDrConfig_PrintHelp} },
221                  { "ignore_private_data",
222                          "Not useful, probably does nothing.",
223                          EXT_BOOL,
# Line 239 | Line 233 | ConfigSection_t config[] = {
233                          EXT_BOOL,
234                          {.intBoolVal = true},
235                          {.extBoolVal = &M3gResolutionSwitch} },
236 +                { 0, 0, 0, {0}, {0} }
237 +        } },
238 +        { "windows", "Windows", {
239 +                { "alttab",
240 +                        "Allows to Alt-Tab out of Oni and use Windows key. May enable the screensaver as well.",
241 +                        C_BOOL,
242 +                        {.intBoolVal = true},
243 +                        {.intBoolVal = true} },
244 +                { "border",
245 +                        "Add a border if in windowed mode and \"usedaodangl\" patch is active.",
246 +                        C_BOOL,
247 +                        {.intBoolVal = true},
248 +                        {.intBoolVal = true} },
249 +                { "clipcursor",
250 +                        "Limit cursor to Oni's window.",
251 +                        C_BOOL,
252 +                        {.intBoolVal = true},
253 +                        {.intBoolVal = true} },
254 +                { "daodaninput",
255 +                        "New input system that reports input on every frame, supports Raw Input for mice.",
256 +                        C_BOOL,
257 +                        {.intBoolVal = true},
258 +                        {.intBoolVal = true} },
259 +                { "directinput",
260 +                        "Enforces the usage of DirectInput on every system. Should be off for Linux/Wine.",
261 +                        C_BOOL,
262 +                        {.intBoolVal = true},
263 +                        {.intBoolVal = true} },
264 +                { "mousesensitivity",
265 +                        "Multiplier for Oni's mouse sensitivity. 1.0 is Oni's default.",
266 +                        C_FLOAT,
267 +                        {.floatVal = 1.0f},
268 +                        {.floatVal = 1.0f} },
269 +                { "disablecmdline",
270 +                        "Disables Oni's existing command line parser as Daodan has its own.",
271 +                        C_BOOL,
272 +                        {.intBoolVal = true},
273 +                        {.intBoolVal = true} },
274 +                { "killvtune",
275 +                        "Prevent loading of vtuneapi.dll.",
276 +                        C_BOOL,
277 +                        {.intBoolVal = false},
278 +                        {.intBoolVal = false} },
279 +                { "safeprintf",
280 +                        "Replaces Oni's function that prints to startup.txt with a safer one.",
281 +                        C_BOOL,
282 +                        {.intBoolVal = true},
283 +                        {.intBoolVal = true} },
284                  { "topmost",
285                          "Keep game window on top in windowed mode, even when switching applications.",
286                          C_BOOL,
287                          {.intBoolVal = false},
288                          {.intBoolVal = false} },
289 <                { "language",
290 <                        "Localization for hardcoded strings (e.g. \"Savepoints\").",
291 <                        C_STRING,
292 <                        {.stringVal = "en"},
293 <                        {.stringVal = "en"} },
289 >                { "usegettickcount",
290 >                        "Replaces Oni's timing functions with more accurate ones.",
291 >                        C_BOOL,
292 >                        {.intBoolVal = true},
293 >                        {.intBoolVal = true} },
294                  { 0, 0, 0, {0}, {0} }
295          } }
296   };
# Line 267 | Line 309 | void DDrConfig_Print()
309                                          break;
310                                  case C_CMD:
311                                          break;
312 +                                case C_FLOAT:
313 +                                        STARTUPMESSAGE("Option %s.%s = %f (def %f)", config[s].name, co->name, co->value.floatVal, co->defaultValue.floatVal);
314 +                                        break;
315                                  default:
316                                          STARTUPMESSAGE("Option %s.%s = %d (def %d)", config[s].name, co->name, co->value.intBoolVal, co->defaultValue.intBoolVal);
317                          }
# Line 298 | Line 343 | void DDrConfig_PrintHelp()
343                                  char* name = co->name;
344                                  char* desc = co->description;
345                                  const char* tName = DDrConfig_GetOptionTypeName(co->type);
346 <                                int boolV = co->defaultValue.intBoolVal;
347 <                                char* val;
348 <                                switch (co->type) {
304 <                                        case C_STRING:
305 <                                                val = co->defaultValue.stringVal;
306 <                                                break;
307 <                                        case EXT_BOOL:
308 <                                                val = (boolV ? "true" : "false");
309 <                                                break;
310 <                                        case C_BOOL:
311 <                                                val = (boolV ? "true" : "false");
312 <                                                break;
313 <                                        case C_CMD:
314 <                                                val = "";
315 <                                                break;
316 <                                        default:
317 <                                                val = malloc(20);
318 <                                                sprintf(val, "%d", boolV);
319 <                                }
346 >                                const char* val = DDrConfig_GetOptionValueString(co, 1);
347 >                                if (!val)
348 >                                        val = "";
349                                  fprintf(fp, "        %-22s %6s=%-5s %s\n", name, tName, val, desc);
350                          }
351                          fprintf(fp, "\n");
# Line 325 | Line 354 | void DDrConfig_PrintHelp()
354                  fprintf(fp, "In daodan.ini each section of parameters has its own section in the ini file started by [section name]. Parameters are given within that section by their name only, followed by an equals sign and the desired value. Example:\n");
355                  fprintf(fp, "    [sectionX]\n    parameterName = false\n");
356                  fprintf(fp, "\nTo pass the parameter on the command line:\n");
357 <                fprintf(fp, "    Oni.exe -sectionX.parameterName false\n");
357 >                fprintf(fp, "    Oni.exe -parameterName false\n");
358                  fprintf(fp, "For bool parameters the value can be ommitted so it is regarded as \"true\":\n");
359 <                fprintf(fp, "    Oni.exe -sectionX.parameterName\n");
359 >                fprintf(fp, "    Oni.exe -parameterName\n");
360                  fprintf(fp, "To disable a bool parameter you can prefix \"no\" to the parameter name like this:\n");
361 <                fprintf(fp, "    Oni.exe -sectionX.noparameterName\n");
333 <                fprintf(fp, "If no section is given it is assumed to be \"%s\", e.g.\n", defaultSection);
334 <                fprintf(fp, "    Oni.exe -%s.parametername\n", defaultSection);
335 <                fprintf(fp, "can simply be written as\n");
336 <                fprintf(fp, "    Oni.exe -parametername\n");
361 >                fprintf(fp, "    Oni.exe -noparameterName\n");
362  
363                  fclose(fp);
364          }
# Line 348 | Line 373 | const char* DDrConfig_GetOptionTypeName(
373          switch (type) {
374                  case C_INT:
375                          return "Int";
376 +                case C_FLOAT:
377 +                        return "Float";
378                  case C_BOOL:
379                          return "Bool";
380                  case C_STRING:
# Line 361 | Line 388 | const char* DDrConfig_GetOptionTypeName(
388          }
389   }
390  
391 + const char* DDrConfig_GetOptionValueString(ConfigOption_t* opt, char printdefault)
392 + {
393 +        OptionValue_t* optVal = (printdefault ? &opt->defaultValue : &opt->value);
394 +        int boolV = optVal->intBoolVal;
395 +        char* val = 0;
396 +        switch (opt->type) {
397 +                case C_STRING:
398 +                        return optVal->stringVal;
399 +                case EXT_BOOL:
400 +                        if (printdefault)
401 +                                return (boolV ? "true" : "false");
402 +                        else
403 +                                return (*optVal->extBoolVal ? "true" : "false");
404 +                case C_BOOL:
405 +                        return (boolV ? "true" : "false");
406 +                case C_CMD:
407 +                        return 0;
408 +                case C_FLOAT:
409 +                        val = malloc(50);
410 +                        sprintf(val, "%f", optVal->floatVal);
411 +                        return val;
412 +                default:
413 +                        val = malloc(20);
414 +                        sprintf(val, "%d", boolV);
415 +                        return val;
416 +        }
417 + }
418 +
419 + char DDrConfig_NonDefaultOptionValue(ConfigOption_t* opt)
420 + {
421 +        switch (opt->type) {
422 +                case C_STRING:
423 +                        return _stricmp(opt->defaultValue.stringVal, opt->value.stringVal);
424 +                case EXT_BOOL:
425 +                        return !opt->defaultValue.intBoolVal != !*opt->value.extBoolVal;
426 +                case C_BOOL:
427 +                        return !opt->defaultValue.intBoolVal != !opt->value.intBoolVal;
428 +                case C_CMD:
429 +                        return 0;
430 +                case C_INT:
431 +                        return opt->defaultValue.intBoolVal != opt->value.intBoolVal;
432 +                case C_FLOAT:
433 +                        return opt->defaultValue.floatVal != opt->value.floatVal;
434 +        }
435 +        return 0;
436 + }
437 +
438   static ConfigOption_t* DDrConfig_GetOption(const char* fullOptName)
439   {
440          char section[50];
# Line 373 | Line 447 | static ConfigOption_t* DDrConfig_GetOpti
447          }
448          *option++ = 0;
449  
450 +        char isWildcardSection = !_stricmp(section, "*");
451 +
452          for (unsigned int s = 0; s < ARRAY_SIZE(config); s++) {
453 <                if (!_stricmp(config[s].name, section)) {
453 >                if (isWildcardSection || !_stricmp(config[s].name, section)) {
454                          for (ConfigOption_t* co = config[s].options; co->name != 0; co++) {
455                                  if (!_stricmp(co->name, option)) {
456                                          return co;
457                                  }
458                          }
459 <                        STARTUPMESSAGE("Could not find option \"%s\" in section \"%s\"", option, section);
460 <                        return 0;
459 >                        if (!isWildcardSection) {
460 >                                STARTUPMESSAGE("Could not find option \"%s\" in section \"%s\"", option, section);
461 >                                return 0;
462 >                        }
463                  }
464          }
465 <        STARTUPMESSAGE("Could not find section \"%s\" for option \"%s\"", section, option);
465 >        if (!isWildcardSection)
466 >                STARTUPMESSAGE("Could not find section \"%s\" for option \"%s\"", section, option);
467 >        else
468 >                STARTUPMESSAGE("Could not find option \"%s\"", option);
469          return 0;
470   }
471  
# Line 418 | Line 499 | void DDrConfig_InitExtBools()
499  
500  
501  
502 < void DDrConfig_WriteTemplateIni()
502 > void DDrConfig_WriteIni()
503   {
504          FILE* fp;
505          STARTUPMESSAGE("%s doesn't exist, creating", iniName);
# Line 426 | Line 507 | void DDrConfig_WriteTemplateIni()
507          if (fp)
508          {
509                  for (unsigned int s = 0; s < ARRAY_SIZE(config); s++) {
510 <                        fprintf(fp, "[%s]\n", config[s].name);
510 >                        if (strlen(config[s].name)) {
511 >                                fprintf(fp, "[%s]\n", config[s].name);
512 >                                for (ConfigOption_t* co = config[s].options; co->name != 0; co++) {
513 >                                        char* name = co->name;
514 >                                        const char* val = DDrConfig_GetOptionValueString(co, 0);
515 >                                        if (val && DDrConfig_NonDefaultOptionValue(co))
516 >                                                fprintf(fp, "%s = %s\n", name, val);
517 >                                }
518 >                                fprintf(fp, "\n");
519 >                        }
520                  }
521                  fclose(fp);
522          }
# Line 439 | Line 529 | void DDrConfig_WriteTemplateIni()
529  
530   void DDrIniCallback(const char* section, const char* name, const char* value)
531   {
442        static char curSection[20];
532          char fullOptName[50];
533  
534          if (!_stricmp(section, "patch"))
535                  section = "patches";
536  
537 <        strcpy(curSection, section);
538 <
539 <        strcpy(fullOptName, curSection);
451 <        fullOptName[strlen(curSection)] = '.';
452 <        strcpy(fullOptName+strlen(curSection)+1, name);
537 >        strcpy(fullOptName, section);
538 >        fullOptName[strlen(section)] = '.';
539 >        strcpy(fullOptName+strlen(section)+1, name);
540  
541          ConfigOption_t* co = DDrConfig_GetOption(fullOptName);
542  
# Line 460 | Line 547 | void DDrIniCallback(const char* section,
547                          case C_INT:
548                                  co->value.intBoolVal = strtol(value, NULL, 0);
549                                  break;
550 +                        case C_FLOAT:
551 +                                co->value.floatVal = strtof(value, NULL);
552 +                                break;
553                          case C_BOOL:
554                                  co->value.intBoolVal = !_stricmp(value, "true");
555                                  break;
# Line 478 | Line 568 | void DDrIniCallback(const char* section,
568                                  STARTUPMESSAGE("Config value type unknown: %d", co->type);
569                  }
570          } else {
571 <                char buf[50];
572 <                sprintf_s(buf, sizeof(buf), "  %s.%s\n", section, name);
571 >                char buf[100];
572 >                if (!_stricmp(section, "*"))
573 >                        sprintf(buf, "  %s\n", name);
574 >                else
575 >                        sprintf(buf, "  %s.%s\n", section, name);
576                  if (strlen(buf) + strlen(invalidCurParamaters) < sizeof(invalidCurParamaters) - 1) {
577                          strcpy(invalidCurParamaters + strlen(invalidCurParamaters), buf);
578                  }
# Line 493 | Line 586 | bool DDrConfig_ParseCommandLine(int argc
586          {
587                  if (argv[i][0] == '-')
588                  {
496                        const char* section;
497                        char* optionsep;
589                          char* option;
590                          bool invertedOption;
591  
592 <                        if ((optionsep = strchr(argv[i], '.')))
502 <                        // Is "section.option"
503 <                        {
504 <                                *optionsep = 0;
505 <                                option = optionsep+1;
506 <                                section = argv[i]+1;
507 <                        }
508 <                        else
509 <                        // Is just "option"
510 <                        {
511 <                                section = defaultSection;
512 <                                option = argv[i]+1;
513 <                        }
592 >                        option = argv[i]+1;
593  
594                          invertedOption = (option[0] == 'n' || option[0] == 'N') && (option[1] == 'o' || option[1] == 'O');
595                          if (invertedOption)
# Line 519 | Line 598 | bool DDrConfig_ParseCommandLine(int argc
598                          if (i < (argc - 1) && argv[i+1][0] != '-')
599                          // Has value in next field
600                          {
601 <                                DDrIniCallback(section, option, argv[++i]);
601 >                                DDrIniCallback("*", option, argv[++i]);
602                          }
603                          else
604                          // Implicit value
605                          {
606 <                                DDrIniCallback(section, option, (invertedOption ? "false" : "true"));
606 >                                DDrIniCallback("*", option, (invertedOption ? "false" : "true"));
607                          }
529
530                        if (optionsep)
531                                *optionsep = '.';
608                  }
609                  else
610                  {
# Line 545 | Line 621 | void DDrConfig(int argc, char* argv[])
621          DDrConfig_InitExtBools();
622  
623          if (GetFileAttributes(iniName) == INVALID_FILE_ATTRIBUTES)
624 <                DDrConfig_WriteTemplateIni();
624 >                DDrConfig_WriteIni();
625          
626          STARTUPMESSAGE("Parsing daodan.ini...", 0);
627          if (!Inifile_Read(iniName, DDrIniCallback))
# Line 554 | Line 630 | void DDrConfig(int argc, char* argv[])
630  
631          if (strlen(invalidCurParamaters) > 0)
632          {
633 <                sprintf_s(invalidTotalParamaters, sizeof(invalidTotalParamaters), "In %s:\n%s\n", iniName, invalidCurParamaters);
633 >                sprintf(invalidTotalParamaters, "In %s:\n%s\n", iniName, invalidCurParamaters);
634                  invalidCurParamaters[0] = 0;
635          }
636  
# Line 564 | Line 640 | void DDrConfig(int argc, char* argv[])
640  
641          if (strlen(invalidCurParamaters) > 0)
642          {
643 <                sprintf_s(invalidTotalParamaters, sizeof(invalidTotalParamaters), "%sOn command line:\n%s\n", invalidTotalParamaters, invalidCurParamaters);
643 >                sprintf(invalidTotalParamaters, "%sOn command line:\n%s\n", invalidTotalParamaters, invalidCurParamaters);
644          }
645  
646          if (strlen(invalidTotalParamaters) > 0)
647          {
648 <                char msg[3200];
649 <                sprintf_s(msg, sizeof(msg), "Invalid parameters given:\n%sContinue launching Oni?", invalidTotalParamaters);
648 >                char msg[4096];
649 >                sprintf(msg, "Invalid parameters given:\n%sContinue launching Oni?", invalidTotalParamaters);
650                  int res = MessageBox(NULL, msg, "Parameters invalid", MB_ICONWARNING | MB_YESNO | MB_DEFBUTTON1);
651                  if (res == IDNO) {
652                          exit(0);
653                  }
654          }
655  
656 +        DDrConfig_WriteIni();
657 +
658   //      DDrConfig_Print();
659   }
660  

Diff Legend

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