source: Daodan/src/Daodan.c@ 468

Last change on this file since 468 was 468, checked in by rossy, 15 years ago
File size: 19.7 KB
Line 
1#include <string.h>
2
3#include "Daodan.h"
4#include "Daodan_Patch.h"
5#include "Daodan_Utility.h"
6#include "Daodan_Win32.h"
7#include "Daodan_Cheater.h"
8#include "Daodan_Persistence.h"
9#include "Daodan_BSL.h"
10
11#include "Daodan_WindowHack.h"
12
13#include "Oni.h"
14#include "Oni_Persistence.h"
15
16#include "BFW_Utility.h"
17
18#include "oni_gl.h"
19#include "daodan_gl.h"
20
21#include "inifile.h"
22
23HMODULE DDrDLLModule;
24HMODULE DDrONiModule;
25
26bool patch_fonttexturecache = true;
27bool patch_largetextures = true;
28bool patch_levelplugins = true;
29bool patch_pathfinding = true;
30bool patch_projaware = true;
31bool patch_directinput = true;
32bool patch_wpfadetime = true;
33bool patch_kickguns = false;
34bool patch_cooldowntimer = true;
35bool patch_throwtest = false;
36bool patch_alttab = true;
37bool patch_particledisablebit = false;
38bool patch_multibyte = false;
39bool patch_cheattable = true;
40bool patch_argb8888 = true;
41bool patch_killvtune = true;
42bool patch_getcmdline = true;
43bool patch_disablecmdline = true;
44
45bool patch_safeprintf = true;
46bool patch_daodandisplayenum = true;
47bool patch_usegettickcount = true;
48bool patch_cheatsenabled = true;
49bool patch_usedaodangl = false;
50bool patch_windowhack = true;
51bool patch_daodaninit = true;
52bool patch_bsl = true;
53bool patch_cheater = true;
54
55bool opt_usedaodanbsl = true;
56bool opt_border = true;
57bool opt_shadow = true;
58bool opt_topmost = false;
59
60bool DDrPatch_Init()
61{
62 DDrStartupMessage("patching engine");
63
64 // Font texture cache doubled
65 if (patch_fonttexturecache)
66 {
67 DDrPatch_Byte (OniExe + 0x00020ea7, 0x20);
68 DDrPatch_Byte (OniExe + 0x00020f4a, 0x40);
69 }
70
71 // Now supports textures up to 512x512
72 if (patch_largetextures)
73 DDrPatch_Byte (OniExe + 0x00005251, 0x10);
74
75 // Non-"_Final" levels are now valid
76 if (patch_levelplugins)
77 DDrPatch_Byte (OniExe + 0x000206a8, 0x01);
78
79 // Pathfinding grid cache size x8
80 if (patch_pathfinding)
81 {
82 DDrPatch_Byte (OniExe + 0x0010b03b, 0x20);
83 DDrPatch_Byte (OniExe + 0x0010b04c, 0x20);
84 }
85
86 // Projectile awareness fixed
87 if (patch_projaware)
88 {
89 DDrPatch_Byte (OniExe + 0x0009c07c, 0x6c);
90 DDrPatch_Byte (OniExe + 0x0009c080, 0x70);
91 DDrPatch_Byte (OniExe + 0x0009c084, 0x74);
92 DDrPatch_Byte (OniExe + 0x0009c110, 0x6c);
93 }
94
95 // Forced DirectInput (for Windows NT)
96 if (patch_directinput)
97 DDrPatch_Byte (OniExe + 0x00002e6d, 0xeb);
98
99 if (patch_wpfadetime)
100 {
101 // Makes wp_fadetime actually have a function
102 const char fadetime_patch[] = { 0x66, 0x8B, 0x1D, 0xC4, 0x7D, 0x62, 0x00, 0x66, 0x89, 0x5E, 0x46, 0x5B, 0x5E, 0x83, 0xC4, 0x14, 0xC3 };
103 DDrPatch_Const (OniExe + 0x0011a889, fadetime_patch);
104 DDrPatch_Byte (OniExe + 0x0011a560, 0x31);
105
106 // Sets the fadetime to 4800 by default
107 DDrPatch_Int16 (OniExe + 0x0011ab0e, 0x12c0);
108 }
109
110
111 // Hackish fix for Konoko not kicking guns
112 if (patch_kickguns)
113 {
114 const char kickgun_patch[] = { 0x00, 0x05, 0x00, 0x00, 0x00, 0xC7, 0x05, 0x1C, 0xC9, 0x5E, 0x00, 0x70, 0xB8, 0x43, 0x00, 0xC7, 0x05, 0x20, 0xC9, 0x5E, 0x00, 0x20, 0xBE, 0x43 };
115 DDrPatch_Const (OniExe + 0x000dc420, kickgun_patch);
116 }
117
118 // Cooldown timer exploit fix ^_^
119 if (patch_cooldowntimer)
120 {
121 const char cooldown_patch[] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };
122 DDrPatch_Const (OniExe + 0x0011a825, cooldown_patch);
123 }
124
125 if (patch_throwtest)
126 {
127 const char throwtest_patch[] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };
128 DDrPatch_Const(OniExe + 0x000dc190, throwtest_patch);
129 }
130
131 // Disable UUrPlatform_Initalize/Terminate, this enables the Alt-Tab and the Windows key but has the possible side effect of allowing the screensaver to enable itself in-game.
132 if (patch_alttab)
133 {
134 DDrPatch_Byte ((void*)UUrPlatform_Initialize, 0xC3);
135 DDrPatch_Byte ((void*)UUrPlatform_Terminate, 0xC3);
136 }
137
138 // Unlocks particle action disabling/enabling bits for all events. (Will be controlled by a command line switch when I figure out how to do that without Win32 hacks.)
139 if (patch_particledisablebit)
140 DDrPatch_Int16 (OniExe + 0x001b184, 0x9090);
141
142 // Multi-byte patch (multiple language support)
143 if (!patch_multibyte)
144 {
145 DDrPatch_Byte (OniExe + 0x0002d8f8, 0xeb);
146 DDrPatch_Byte (OniExe + 0x0002d9ad, 0xeb);
147 DDrPatch_Byte (OniExe + 0x0002dbe2, 0xeb);
148 DDrPatch_Byte (OniExe + 0x0002dec3, 0xeb);
149 DDrPatch_Byte (OniExe + 0x0002e2ab, 0xeb);
150 DDrPatch_Byte (OniExe + 0x0002e2c4, 0xeb);
151 DDrPatch_Byte (OniExe + 0x0002e379, 0xeb);
152 DDrPatch_Byte (OniExe + 0x0002e48c, 0xeb);
153 DDrPatch_Byte (OniExe + 0x0002e4d0, 0xeb);
154 DDrPatch_Byte (OniExe + 0x0002e4f4, 0xeb);
155 DDrPatch_Byte (OniExe + 0x0002e646, 0xeb);
156 DDrPatch_Byte (OniExe + 0x0002e695, 0xeb);
157 DDrPatch_Byte (OniExe + 0x0002e944, 0xeb);
158 DDrPatch_Byte (OniExe + 0x0002e95d, 0xeb);
159 DDrPatch_Byte (OniExe + 0x0002e98e, 0xeb);
160 DDrPatch_Byte (OniExe + 0x0002e9dc, 0xeb);
161 }
162
163 // Cheat table patch
164 if (patch_cheattable)
165 {
166 DDrPatch_Int32 (OniExe + 0x000f616b, (int)&DDr_CheatTable[0].name);
167 DDrPatch_Int32 (OniExe + 0x000f617a, (int)&DDr_CheatTable[0].message_on);
168 }
169
170 // ARGB8888 textures
171 if (patch_argb8888)
172 {
173 DDrPatch_Byte (OniExe + 0x00135af0, 0x07);
174 DDrPatch_Byte (OniExe + 0x00135af4, 0x0B);
175 }
176
177 // Disable loading the vtuneapi.dll
178 if (patch_killvtune)
179 DDrPatch_Byte (OniExe + 0x00026340, 0xC3);
180
181 // Disable Oni's internal CLrGetCommandLine function (to eventually replace it with our own)
182 if (patch_getcmdline)
183 DDrPatch_NOOP (OniExe + 0x000d3280, 51);
184
185 // Disable Oni's command line parser so it doesn't interfere with ours
186 if (patch_disablecmdline)
187 DDrPatch_Int32 (OniExe + 0x000d3570, 0xc3c03366);
188
189 return true;
190}
191
192enum {s_unknown, s_options, s_patch, s_bsl, s_language} ini_section;
193
194bool DDrIniCallback(char* section, bool newsection, char* name, char* value)
195{
196 if (newsection)
197 {
198 if (!stricmp(section, "options"))
199 ini_section = s_options;
200 else if (!stricmp(section, "patch"))
201 ini_section = s_patch;
202 else if (!stricmp(section, "bsl"))
203 ini_section = s_bsl;
204 else if (!stricmp(section, "language"))
205 ini_section = s_language;
206 else
207 {
208 ini_section = s_unknown;
209 DDrStartupMessage("unrecognised section \"%s\"", section);
210 }
211 }
212
213 switch (ini_section)
214 {
215 case s_options:
216 if (!stricmp(name, "usedaodanbsl"))
217 opt_usedaodanbsl = !stricmp(inifile_cleanstr(value), "true");
218 else if (!stricmp(name, "border"))
219 opt_border = !stricmp(inifile_cleanstr(value), "true");
220 else if (!stricmp(name, "shadow"))
221 opt_shadow = !stricmp(inifile_cleanstr(value), "true");
222 else if (!stricmp(name, "topmost"))
223 opt_topmost = !stricmp(inifile_cleanstr(value), "true");
224 else if (!stricmp(name, "multibyte"))
225 patch_multibyte = !stricmp(inifile_cleanstr(value), "true");
226 else if (!stricmp(name, "debug"))
227 AKgDebug_DebugMaps = !stricmp(inifile_cleanstr(value), "true");
228 else if (!stricmp(name, "debugfiles"))
229 BFgDebugFileEnable = !stricmp(inifile_cleanstr(value), "true");
230 else if (!stricmp(name, "findsounds"))
231 SSgSearchOnDisk = !stricmp(inifile_cleanstr(value), "true");
232 else if (!stricmp(name, "ignore_private_data"))
233 opt_ignore_private_data = !stricmp(inifile_cleanstr(value), "true");
234 else if (!stricmp(name, "sound"))
235 opt_sound = !stricmp(inifile_cleanstr(value), "true");
236 else if (!stricmp(name, "switch"))
237 M3gResolutionSwitch = !stricmp(inifile_cleanstr(value), "true");
238 else
239 DDrStartupMessage("unrecognised option \"%s\"", name);
240 break;
241 case s_patch:
242 if (!stricmp(name, "fonttexturecache"))
243 patch_fonttexturecache = !stricmp(inifile_cleanstr(value), "true");
244 else if (!stricmp(name, "largetextures"))
245 patch_largetextures = !stricmp(inifile_cleanstr(value), "true");
246 else if (!stricmp(name, "levelplugins"))
247 patch_levelplugins = !stricmp(inifile_cleanstr(value), "true");
248 else if (!stricmp(name, "pathfinding"))
249 patch_pathfinding = !stricmp(inifile_cleanstr(value), "true");
250 else if (!stricmp(name, "projaware"))
251 patch_projaware = !stricmp(inifile_cleanstr(value), "true");
252 else if (!stricmp(name, "directinput"))
253 patch_directinput = !stricmp(inifile_cleanstr(value), "true");
254 else if (!stricmp(name, "wpfadetime"))
255 patch_wpfadetime = !stricmp(inifile_cleanstr(value), "true");
256 else if (!stricmp(name, "kickguns"))
257 patch_kickguns = !stricmp(inifile_cleanstr(value), "true");
258 else if (!stricmp(name, "cooldowntimer"))
259 patch_cooldowntimer = !stricmp(inifile_cleanstr(value), "true");
260 else if (!stricmp(name, "throwtest"))
261 patch_throwtest = !stricmp(inifile_cleanstr(value), "true");
262 else if (!stricmp(name, "alttab"))
263 patch_alttab = !stricmp(inifile_cleanstr(value), "true");
264 else if (!stricmp(name, "particledisablebit"))
265 patch_particledisablebit = !stricmp(inifile_cleanstr(value), "true");
266 else if (!stricmp(name, "multibyte"))
267 patch_multibyte = !stricmp(inifile_cleanstr(value), "true");
268 else if (!stricmp(name, "cheattable"))
269 patch_cheattable = !stricmp(inifile_cleanstr(value), "true");
270 else if (!stricmp(name, "argb8888"))
271 patch_argb8888 = !stricmp(inifile_cleanstr(value), "true");
272 else if (!stricmp(name, "killvtune"))
273 patch_killvtune = !stricmp(inifile_cleanstr(value), "true");
274 else if (!stricmp(name, "getcmdline"))
275 patch_getcmdline = !stricmp(inifile_cleanstr(value), "true");
276 else if (!stricmp(name, "disablecmdline"))
277 patch_disablecmdline = !stricmp(inifile_cleanstr(value), "true");
278 else if (!stricmp(name, "safeprintf"))
279 patch_safeprintf = !stricmp(inifile_cleanstr(value), "true");
280 else if (!stricmp(name, "daodandisplayenum"))
281 patch_daodandisplayenum = !stricmp(inifile_cleanstr(value), "true");
282 else if (!stricmp(name, "usegettickcount"))
283 patch_usegettickcount = !stricmp(inifile_cleanstr(value), "true");
284 else if (!stricmp(name, "cheatsenabled"))
285 patch_cheatsenabled = !stricmp(inifile_cleanstr(value), "true");
286 else if (!stricmp(name, "usedaodangl"))
287 patch_usedaodangl = !stricmp(inifile_cleanstr(value), "true");
288 else if (!stricmp(name, "windowhack"))
289 patch_windowhack = !stricmp(inifile_cleanstr(value), "true");
290 else if (!stricmp(name, "daodaninit"))
291 patch_daodaninit = !stricmp(inifile_cleanstr(value), "true");
292 else if (!stricmp(name, "bsl"))
293 patch_bsl = !stricmp(inifile_cleanstr(value), "true");
294 else if (!stricmp(name, "cheater"))
295 patch_cheater = !stricmp(inifile_cleanstr(value), "true");
296 else
297 DDrStartupMessage("unrecognised patch \"%s\"", name);
298 break;
299 case s_language:
300 if (!stricmp(name, "savepoint"))
301 {
302 char* str = strdup(value);
303 DDrPatch_Int32(OniExe + 0x000fd730, (int)str);
304 DDrPatch_Int32(OniExe + 0x000fd738, (int)str);
305 }
306 else if (!stricmp(name, "syndicatewarehouse"))
307 {
308 char* str = strdup(value);
309 DDrPatch_Int32(OniExe + 0x000fd71a, (int)str);
310 DDrPatch_Int32(OniExe + 0x0010ef75, (int)str);
311 }
312 else if (!stricmp(name, "damn"))
313 DDrPatch_StrDup(OniExe + 0x0010fb6e, value);
314 else if (!stricmp(name, "blam"))
315 DDrPatch_StrDup(OniExe + 0x0010fb73, value);
316 else if (!stricmp(name, "shapeshifter_on"))
317 DDr_CheatTable[0].message_on = strdup(value);
318 else if (!stricmp(name, "shapeshifter_off"))
319 DDr_CheatTable[0].message_off = strdup(value);
320 else if (!stricmp(name, "liveforever_on"))
321 DDr_CheatTable[1].message_on = strdup(value);
322 else if (!stricmp(name, "liveforever_off"))
323 DDr_CheatTable[1].message_off = strdup(value);
324 else if (!stricmp(name, "touchofdeath_on"))
325 DDr_CheatTable[2].message_on = strdup(value);
326 else if (!stricmp(name, "touchofdeath_off"))
327 DDr_CheatTable[2].message_off = strdup(value);
328 else if (!stricmp(name, "canttouchthis_on"))
329 DDr_CheatTable[3].message_on = strdup(value);
330 else if (!stricmp(name, "canttouchthis_off"))
331 DDr_CheatTable[3].message_off = strdup(value);
332 else if (!stricmp(name, "fatloot_on"))
333 DDr_CheatTable[4].message_on = strdup(value);
334 else if (!stricmp(name, "glassworld_on"))
335 DDr_CheatTable[5].message_on = strdup(value);
336 else if (!stricmp(name, "glassworld_off"))
337 DDr_CheatTable[5].message_off = strdup(value);
338 else if (!stricmp(name, "winlevel_on"))
339 DDr_CheatTable[6].message_on = strdup(value);
340 else if (!stricmp(name, "loselevel_on"))
341 DDr_CheatTable[7].message_on = strdup(value);
342 else if (!stricmp(name, "bighead_on"))
343 DDr_CheatTable[8].message_on = strdup(value);
344 else if (!stricmp(name, "bighead_off"))
345 DDr_CheatTable[8].message_off = strdup(value);
346 else if (!stricmp(name, "minime_on"))
347 DDr_CheatTable[9].message_on = strdup(value);
348 else if (!stricmp(name, "minime_off"))
349 DDr_CheatTable[9].message_off = strdup(value);
350 else if (!stricmp(name, "superammo_on"))
351 DDr_CheatTable[10].message_on = strdup(value);
352 else if (!stricmp(name, "superammo_off"))
353 DDr_CheatTable[10].message_off = strdup(value);
354 else if (!stricmp(name, "devmode_on"))
355 {
356 char* str = strdup(value);
357 DDr_CheatTable[11].message_on = str;
358 DDr_CheatTable[cheat_x].message_on = str;
359 }
360 else if (!stricmp(name, "devmode_off"))
361 {
362 char* str = strdup(value);
363 DDr_CheatTable[11].message_off = str;
364 DDr_CheatTable[cheat_x].message_off = str;
365 }
366 else if (!stricmp(name, "reservoirdogs_on"))
367 DDr_CheatTable[12].message_on = strdup(value);
368 else if (!stricmp(name, "reservoirdogs_off"))
369 DDr_CheatTable[12].message_off = strdup(value);
370 else if (!stricmp(name, "roughjustice_on"))
371 DDr_CheatTable[13].message_on = strdup(value);
372 else if (!stricmp(name, "roughjustice_off"))
373 DDr_CheatTable[13].message_off = strdup(value);
374 else if (!stricmp(name, "chenille_on"))
375 DDr_CheatTable[14].message_on = strdup(value);
376 else if (!stricmp(name, "chenille_off"))
377 DDr_CheatTable[14].message_off = strdup(value);
378 else if (!stricmp(name, "behemoth_on"))
379 DDr_CheatTable[15].message_on = strdup(value);
380 else if (!stricmp(name, "behemoth_off"))
381 DDr_CheatTable[15].message_off = strdup(value);
382 else if (!stricmp(name, "elderrune_on"))
383 DDr_CheatTable[16].message_on = strdup(value);
384 else if (!stricmp(name, "elderrune_off"))
385 DDr_CheatTable[16].message_off = strdup(value);
386 else if (!stricmp(name, "moonshadow_on"))
387 DDr_CheatTable[17].message_on = strdup(value);
388 else if (!stricmp(name, "moonshadow_off"))
389 DDr_CheatTable[17].message_off = strdup(value);
390 else if (!stricmp(name, "munitionfrenzy_on"))
391 DDr_CheatTable[18].message_on = strdup(value);
392 else if (!stricmp(name, "fistsoflegend_on"))
393 DDr_CheatTable[19].message_on = strdup(value);
394 else if (!stricmp(name, "fistsoflegend_off"))
395 DDr_CheatTable[19].message_off = strdup(value);
396 else if (!stricmp(name, "killmequick_on"))
397 DDr_CheatTable[20].message_on = strdup(value);
398 else if (!stricmp(name, "killmequick_off"))
399 DDr_CheatTable[20].message_off = strdup(value);
400 else if (!stricmp(name, "carousel_on"))
401 DDr_CheatTable[21].message_on = strdup(value);
402 else if (!stricmp(name, "carousel_off"))
403 DDr_CheatTable[21].message_off = strdup(value);
404 else
405 DDrStartupMessage("unrecognised language item \"%s\"", name);
406 break;
407 case s_bsl:
408 default:
409 break;
410 }
411
412 return true;
413}
414
415void DDrConfig()
416{
417 if (GetFileAttributes("daodan.ini") == INVALID_FILE_ATTRIBUTES)
418 {
419 DDrStartupMessage("daodan.ini doesn't exist, creating");
420 FILE* fp = fopen("daodan.ini", "w");
421 if (fp)
422 {
423 fputs("[Options]\n", fp);
424 fclose(fp);
425 }
426 }
427
428 DDrStartupMessage("parsing daodan.ini...");
429 if (!inifile_read("daodan.ini", DDrIniCallback))
430 DDrStartupMessage("error reading daodan.ini, check your syntax!");
431 DDrStartupMessage("finished parsing");
432}
433
434void ONICALL DDrGame_Init()
435{
436 if (opt_usedaodanbsl)
437 SLrDaodan_Initalize();
438}
439
440void __cdecl DDrMain(int argc, char* argv[])
441{
442 DDrStartupMessage("daodan attached!");
443
444 opt_ignore_private_data = false;
445 opt_sound = true;
446
447 DDrConfig();
448 DDrStartupMessage("parsing command line...");
449 int i;
450 char* section;
451 char* option;
452 bool falseoption;
453 for (i = 1; i < argc; i ++)
454 {
455 if (argv[i][0] == '-')
456 {
457 section = argv[i] + 1;
458 if ((option = strchr(argv[i], '.')))
459 {
460 *option = '\0';
461 falseoption = (option[1] == 'n' || option[1] == 'N') && (option[2] = 'o' || option[2] == 'O');
462 if (i < (argc - 1) && argv[i + 1][0] != '-')
463 DDrIniCallback(section, true, option + 1, argv[++i]);
464 else
465 DDrIniCallback(section, true, option + (falseoption ? 3 : 1), (falseoption ? "false" : "true"));
466 *option = '.';
467 }
468 else
469 {
470 falseoption = (section[0] == 'n' || section[0] == 'N') && (section[1] = 'o' || section[1] == 'O');
471 ini_section = s_options;
472 if (i < (argc - 1) && argv[i + 1][0] != '-')
473 DDrIniCallback(NULL, false, section, argv[++i]);
474 else
475 DDrIniCallback(NULL, false, section + (falseoption ? 2 : 0), (falseoption ? "false" : "true"));
476 }
477 }
478 else
479 {
480 DDrStartupMessage("parse error \"%s\"", argv[i]);
481 break;
482 }
483 }
484 DDrStartupMessage("finished parsing");
485 DDrPatch_Init();
486
487 // Safe startup message printer
488 if (patch_safeprintf)
489 DDrPatch_MakeJump(UUrStartupMessage, DDrStartupMessage);
490
491 // Daodan device mode enumeration function
492 if (patch_daodandisplayenum)
493 DDrPatch_MakeJump(gl_enumerate_valid_display_modes, daodan_enumerate_valid_display_modes);
494
495 // Performance patch
496 if (patch_usegettickcount)
497 {
498 DDrPatch_MakeJump(UUrMachineTime_High, DDrMachineTime_High);
499 DDrPatch_MakeJump(UUrMachineTime_High_Frequency, DDrMachineTime_High_Frequency);
500 DDrPatch_MakeJump(UUrMachineTime_Sixtieths, DDrMachineTime_Sixtieths);
501 }
502
503 // Cheats always enabled
504 if (patch_cheatsenabled)
505 DDrPatch_MakeJump(ONrPersist_GetWonGame, DDrPersist_GetWonGame);
506
507 // Windowed mode
508 if (patch_usedaodangl)
509 {
510 DDrPatch_MakeJump(ONrPlatform_Initialize, DDrPlatform_Initialize);
511 DDrPatch_MakeJump(gl_platform_initialize, daodangl_platform_initialize);
512 }
513
514 // Hacked windowed mode (for when daodangl isn't working properly)
515 if (patch_windowhack)
516 DDrWindowHack_Install();
517
518 if (patch_daodaninit)
519 DDrPatch_MakeCall(OniExe + 0x000d345a, DDrGame_Init);
520
521 // Patches for existing BSL functions
522 if (patch_bsl)
523 SLrDaodan_Patch();
524
525 if (patch_cheater)
526 {
527 DDrPatch_MakeCall(OniExe + 0x000f618f, DDrCheater);
528 DDrPatch_Int16(OniExe + 0x000deb45, 0x5590);
529 DDrPatch_MakeCall(OniExe + 0x000deb47, FallingFrames);
530 DDrPatch_MakeJump(OniExe + 0x0010f021, DDrCheater_LevelLoad);
531 }
532
533 init_daodan_gl();
534
535 ONiMain(argc, argv);
536}
537/*
538void DDrWrongExe()
539{
540 switch (MessageBox(NULL, "This version of the Daodan DLL is incompatible with your Oni.exe.\n"
541 "Click OK for more information. To continue using Oni without the patch, replace the downloaded binkw32.dll with the original.", "Daodan", MB_OKCANCEL | MB_ICONERROR))
542 {
543 case IDOK:
544 {
545 STARTUPINFO si;
546 PROCESS_INFORMATION pi;
547 FillMemory(&si, 0, sizeof(si));
548 FillMemory(&pi, 0, sizeof(pi));
549 si.cb = sizeof(si);
550 if (!CreateProcess(NULL, "cmd /c \"start http://wiki.oni2.net/Daodan_DLL\"", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
551 MessageBox(NULL, "", "", 0);
552 CloseHandle(pi.hProcess);
553 CloseHandle(pi.hThread);
554 }
555 default:
556 ExitProcess(0);
557 }
558}
559*/
560BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
561{
562 switch (fdwReason)
563 {
564 case DLL_PROCESS_ATTACH:
565 DDrDLLModule = hinstDLL;
566 DDrONiModule = GetModuleHandle(NULL);
567
568 if (*(uint32_t*)((void*)OniExe + 0x0011acd0) == 0x09d36852)
569 DDrPatch_MakeCall(OniExe + 0x0010fb49, DDrMain);
570 else
571 ExitProcess(0);
572 break;
573 }
574 return TRUE;
575}
Note: See TracBrowser for help on using the repository browser.