source: Daodan/MSVC/Daodan.c@ 624

Last change on this file since 624 was 589, checked in by gumby, 13 years ago

stuff

File size: 24.3 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#include "Daodan_Console.h"
11#include "Daodan_Update.h"
12#include "Flatline_BSL.h"
13#include "Flatline_Hooks.h"
14#include "Daodan_WindowHack.h"
15
16#include "Oni.h"
17#include "Oni_Persistence.h"
18
19#include "BFW_Utility.h"
20
21#include "oni_gl.h"
22#include "daodan_gl.h"
23
24#include "inifile.h"
25
26HMODULE DDrDLLModule;
27HMODULE DDrONiModule;
28
29bool patch_fonttexturecache = true;
30bool patch_largetextures = true;
31bool patch_levelplugins = true;
32bool patch_pathfinding = true;
33bool patch_projaware = true;
34bool patch_directinput = true;
35bool patch_wpfadetime = true;
36bool patch_kickguns = false;
37bool patch_cooldowntimer = true;
38bool patch_throwtest = false;
39bool patch_alttab = true;
40bool patch_particledisablebit = false;
41bool patch_multibyte = false;
42bool patch_cheattable = true;
43bool patch_argb8888 = true;
44bool patch_killvtune = true;
45bool patch_getcmdline = true;
46bool patch_disablecmdline = true;
47
48bool patch_safeprintf = true;
49bool patch_daodandisplayenum = true;
50bool patch_usegettickcount = true;
51bool patch_cheatsenabled = true;
52bool patch_usedaodangl = true;
53bool patch_windowhack = false;
54bool patch_daodaninit = true;
55bool patch_bsl = true;
56bool patch_cheater = true;
57bool patch_newweapon = true;
58bool opt_usedaodanbsl = true;
59bool opt_border = true;
60bool opt_shadow = false;
61bool opt_topmost = false;
62
63typedef int (__cdecl *CHINESEPROC)(DWORD WINAPI);
64bool patch_chinese = false;
65bool DDrPatch_Init()
66{
67 DDrStartupMessage("patching engine");
68
69 // Font texture cache doubled
70 if (patch_fonttexturecache)
71 {
72 DDrPatch_Byte(OniExe + 0x00020ea7, 0x20);
73 DDrPatch_Byte(OniExe + 0x00020f4a, 0x40);
74 }
75
76 // Now supports textures up to 512x512
77 if (patch_largetextures)
78 DDrPatch_Byte (OniExe + 0x00005251, 0x10);
79
80 // Non-"_Final" levels are now valid
81 if (patch_levelplugins)
82 DDrPatch_Byte (OniExe + 0x000206a8, 0x01);
83
84 // Pathfinding grid cache size x8
85 if (patch_pathfinding)
86 {
87 const char pathfinding[2] = {0x90 , 0xE9 };
88 DDrPatch_Byte (OniExe + 0x0010b03b, 0x20);
89 DDrPatch_Byte (OniExe + 0x0010b04c, 0x20);
90
91 //other stuff
92 DDrPatch_Const(0x440789, pathfinding);
93 }
94
95 // Projectile awareness fixed
96 if (patch_projaware)
97 {
98 DDrPatch_Byte (OniExe + 0x0009c07c, 0x6c);
99 DDrPatch_Byte (OniExe + 0x0009c080, 0x70);
100 DDrPatch_Byte (OniExe + 0x0009c084, 0x74);
101 DDrPatch_Byte (OniExe + 0x0009c110, 0x6c);
102 }
103
104 // Forced DirectInput (for Windows NT)
105 if (patch_directinput)
106 DDrPatch_Byte (OniExe + 0x00002e6d, 0xeb);
107
108 if (patch_wpfadetime)
109 {
110 // Makes wp_fadetime actually have a function
111 const char fadetime_patch[] = { 0x66, 0x8B, 0x1D, 0xC4, 0x7D, 0x62, 0x00, 0x66, 0x89, 0x5E, 0x46, 0x5B, 0x5E, 0x83, 0xC4, 0x14, 0xC3 };
112 DDrPatch_Const (OniExe + 0x0011a889, fadetime_patch);
113 DDrPatch_Byte (OniExe + 0x0011a560, 0x31);
114
115 // Sets the fadetime to 4800 by default
116 DDrPatch_Int16 ((OniExe + 0x0011ab0e), 0x12c0);
117 }
118
119 // FIXME: add switches
120 //pathfinding fix
121
122
123
124
125 // Hackish fix for Konoko not kicking guns
126 // Don't use this, it breaks stairs.
127 if (patch_kickguns)
128 {
129 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 };
130 DDrPatch_Const (OniExe + 0x000dc420, kickgun_patch);
131 }
132
133 // Cooldown timer exploit fix ^_^
134 if (patch_cooldowntimer)
135 {
136 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 };
137 DDrPatch_Const (OniExe + 0x0011a825, cooldown_patch);
138 }
139
140 if (patch_throwtest)
141 {
142 const char throwtest_patch[] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };
143 DDrPatch_Const(OniExe + 0x000dc190, throwtest_patch);
144 }
145
146 // 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.
147 if (patch_alttab)
148 {
149 DDrPatch_Byte ((void*)UUrPlatform_Initialize, 0xC3);
150 DDrPatch_Byte ((void*)UUrPlatform_Terminate, 0xC3);
151 }
152
153 // 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.)
154 if (patch_particledisablebit)
155 DDrPatch_Int16 (OniExe + 0x001b184, 0x9090);
156
157 // Multi-byte patch (multiple language support)
158 if (!patch_multibyte)
159 {
160 DDrPatch_Byte (OniExe + 0x0002d8f8, 0xeb);
161 DDrPatch_Byte (OniExe + 0x0002d9ad, 0xeb);
162 DDrPatch_Byte (OniExe + 0x0002dbe2, 0xeb);
163 DDrPatch_Byte (OniExe + 0x0002dec3, 0xeb);
164 DDrPatch_Byte (OniExe + 0x0002e2ab, 0xeb);
165 DDrPatch_Byte (OniExe + 0x0002e2c4, 0xeb);
166 DDrPatch_Byte (OniExe + 0x0002e379, 0xeb);
167 DDrPatch_Byte (OniExe + 0x0002e48c, 0xeb);
168 DDrPatch_Byte (OniExe + 0x0002e4d0, 0xeb);
169 DDrPatch_Byte (OniExe + 0x0002e4f4, 0xeb);
170 DDrPatch_Byte (OniExe + 0x0002e646, 0xeb);
171 DDrPatch_Byte (OniExe + 0x0002e695, 0xeb);
172 DDrPatch_Byte (OniExe + 0x0002e944, 0xeb);
173 DDrPatch_Byte (OniExe + 0x0002e95d, 0xeb);
174 DDrPatch_Byte (OniExe + 0x0002e98e, 0xeb);
175 DDrPatch_Byte (OniExe + 0x0002e9dc, 0xeb);
176 }
177
178 // Cheat table patch
179 if (patch_cheattable)
180 {
181 DDrPatch_Int32 (0x004f616b, (int)&DDr_CheatTable[0].name);
182 DDrPatch_Int32 (OniExe + 0x000f617a, (int)&DDr_CheatTable[0].message_on);
183 }
184
185 // ARGB8888 textures
186 if (patch_argb8888)
187 {
188 DDrPatch_Byte (OniExe + 0x00135af0, 0x07);
189 DDrPatch_Byte (OniExe + 0x00135af4, 0x0B);
190 }
191
192 //Test newweap patch
193 if (patch_newweapon) {
194
195 //Makes it always say "Recieved weapon_name."
196 //Needs check for loc_4DFC66
197 //DDrPatch_NOOP( OniExe + 0x000E4DF8,2);
198
199 //Adds Weapon name and ammo meter to pickup autoprompt
200 DDrPatch_NOOP( OniExe + 0x000FAC73, 9);
201 DDrPatch_NOOP( OniExe + 0x000FAC80, 5);
202 DDrPatch_MakeCall( OniExe + 0xFAC85, DDrWeapon2Message);
203
204 //Moves location of colors
205 //DDrPatch_Int32( 0x0042E3D5, (int)&DDrDSayColors );
206 //DDrPatch_Int32( 0x0042E3DA, (int)&DDrDSayColors );
207 }
208
209 // Disable loading the vtuneapi.dll
210 //if (patch_killvtune)
211 //DDrPatch_Byte (OniExe + 0x00026340, 0xC3);
212
213 // Disable Oni's internal CLrGetCommandLine function (to eventually replace it with our own)
214 if (patch_getcmdline)
215 DDrPatch_NOOP (OniExe + 0x000d3280, 51);
216
217 // Disable Oni's command line parser so it doesn't interfere with ours
218 if (patch_disablecmdline)
219 DDrPatch_Int32 (OniExe + 0x000d3570, 0xc3c03366);
220
221 if (patch_bsl)
222 {
223 //Calculating the value of the needed offset is much more reliable when the compiler does it for you.
224
225 //TODO: fix moonshadow.
226 Character * Chr = 0;
227 int NoPath = (int)&(Chr[0].RegenHax) & 0x000000FF;
228 const char regen_patch[] =
229 {0x90, 0x90, 0x90, 0x90, 0x90, // mov al, _WPgRegenerationCheat -> NOOP
230 0x90, 0x90, // test al, al -> NOOP
231 0x90, 0x90, // jz short loc_51BB98 -> NOOP
232 0x8B, 0x86, (char)NoPath, 0x01, 0x00, 0x00, // mov eax, [esi+Character.field_1E8]
233 // -> mov eax, [esi+Character.RegenHax]
234 0x85, 0xC0, // test eax, eax
235 0x74, 0x21 // jnz 0x21 -> jz 0x21
236 };
237 DDrPatch_Const(0x0051BB64, regen_patch);
238 }
239
240 if(patch_chinese)
241 {
242 HMODULE dll = LoadLibrary("xfhsm_oni.dll");
243 if( dll )
244 {
245 void* proc = GetProcAddress( dll, "InstallHook" );
246 if(proc)
247 {
248 ((CHINESEPROC)proc)(GetCurrentThreadId());
249 }
250 }
251 }
252
253 //Fix crappy ai2_shownames
254 if(1)
255 {
256 //Set distance above head to 4.0
257 DDrPatch_Int32(0x0048C998, 0x005296C8);
258 //texture height
259 DDrPatch_Byte( 0x0048C9DF, 0x3F );
260 //texture width
261 DDrPatch_NOOP( (char*)0x0048C9CA, 6 );
262 //Set the text color to whatever we like ;)
263 DDrPatch_NOOP( 0x0048C898, 6 );
264 DDrPatch_Byte( 0x0048C898, 0x8B );
265 DDrPatch_Byte( 0x0048C899, 0xCE );
266 DDrPatch_MakeCall( 0x0048C8A3, FLrHook_DebugNameShadeHack);
267
268 //Make the background black for additive blending
269 DDrPatch_MakeCall( 0x0048C802, FLrHook_DebugNameTextureInit );
270 }
271
272 if(1)
273 {
274 //DDrPatch_NOOP( 0x004E1957, 6 );
275 //DDrPatch_MakeCall( 0x004E17F6, FLrHook_Lasers );
276 }
277
278 //Flatline related stuff
279 DDrPatch_MakeCall(0x004FBCEA, DDrText_Hook);
280
281 DDrPatch_Int32( 0x004B24D2, FLrSpawnHack);
282
283 DDrPatch_NOOP(0x004C26CB, 6);
284 DDrPatch_MakeCall( 0x004C26CB, FLrHook_DoorOpen);
285 DDrPatch_MakeCall( 0x004EE3CF, FLrHook_ConsoleActivate);
286 return true;
287}
288
289enum {s_unknown, s_options, s_patch, s_bsl, s_language} ini_section;
290
291bool DDrIniCallback(char* section, bool newsection, char* name, char* value)
292{
293 if (newsection)
294 {
295 if (!_stricmp(section, "options"))
296 ini_section = s_options;
297 else if (!_stricmp(section, "patch"))
298 ini_section = s_patch;
299 else if (!_stricmp(section, "bsl"))
300 ini_section = s_bsl;
301 else if (!_stricmp(section, "language"))
302 ini_section = s_language;
303 else
304 {
305 ini_section = s_unknown;
306 DDrStartupMessage("unrecognised section \"%s\"", section);
307 }
308 }
309
310 switch (ini_section)
311 {
312 case s_options:
313 if (!_stricmp(name, "usedaodanbsl"))
314 opt_usedaodanbsl = !_stricmp(inifile_cleanstr(value), "true");
315 else if (!_stricmp(name, "border"))
316 opt_border = !_stricmp(inifile_cleanstr(value), "true");
317 else if (!_stricmp(name, "shadow"))
318 opt_shadow = !_stricmp(inifile_cleanstr(value), "true");
319 else if (!_stricmp(name, "topmost"))
320 opt_topmost = !_stricmp(inifile_cleanstr(value), "true");
321 else if (!_stricmp(name, "multibyte"))
322 patch_multibyte = !_stricmp(inifile_cleanstr(value), "true");
323 else if (!_stricmp(name, "debug"))
324 AKgDebug_DebugMaps = !_stricmp(inifile_cleanstr(value), "true");
325 else if (!_stricmp(name, "debugfiles"))
326 BFgDebugFileEnable = !_stricmp(inifile_cleanstr(value), "true");
327 else if (!_stricmp(name, "findsounds"))
328 SSgSearchOnDisk = !_stricmp(inifile_cleanstr(value), "true");
329 else if (!_stricmp(name, "ignore_private_data"))
330 opt_ignore_private_data = !_stricmp(inifile_cleanstr(value), "true");
331 else if (!_stricmp(name, "sound"))
332 opt_sound = !_stricmp(inifile_cleanstr(value), "true");
333 else if (!_stricmp(name, "switch"))
334 M3gResolutionSwitch = !_stricmp(inifile_cleanstr(value), "true");
335 //else if (!_stricmp(name, "devmode"))
336 //turn_dev_mode_on = !_stricmp(inifile_cleanstr(value), "true");
337 else
338 DDrStartupMessage("unrecognised option \"%s\"", name);
339 break;
340 case s_patch:
341 if (!_stricmp(name, "fonttexturecache"))
342 patch_fonttexturecache = !_stricmp(inifile_cleanstr(value), "true");
343 else if (!_stricmp(name, "largetextures"))
344 patch_largetextures = !_stricmp(inifile_cleanstr(value), "true");
345 else if (!_stricmp(name, "levelplugins"))
346 patch_levelplugins = !_stricmp(inifile_cleanstr(value), "true");
347 else if (!_stricmp(name, "pathfinding"))
348 patch_pathfinding = !_stricmp(inifile_cleanstr(value), "true");
349 else if (!_stricmp(name, "projaware"))
350 patch_projaware = !_stricmp(inifile_cleanstr(value), "true");
351 else if (!_stricmp(name, "directinput"))
352 patch_directinput = !_stricmp(inifile_cleanstr(value), "true");
353 else if (!_stricmp(name, "wpfadetime"))
354 patch_wpfadetime = !_stricmp(inifile_cleanstr(value), "true");
355 else if (!_stricmp(name, "kickguns"))
356 patch_kickguns = !_stricmp(inifile_cleanstr(value), "true");
357 else if (!_stricmp(name, "cooldowntimer"))
358 patch_cooldowntimer = !_stricmp(inifile_cleanstr(value), "true");
359 else if (!_stricmp(name, "throwtest"))
360 patch_throwtest = !_stricmp(inifile_cleanstr(value), "true");
361 else if (!_stricmp(name, "alttab"))
362 patch_alttab = !_stricmp(inifile_cleanstr(value), "true");
363 else if (!_stricmp(name, "particledisablebit"))
364 patch_particledisablebit = !_stricmp(inifile_cleanstr(value), "true");
365 else if (!_stricmp(name, "multibyte"))
366 patch_multibyte = !_stricmp(inifile_cleanstr(value), "true");
367 else if (!_stricmp(name, "cheattable"))
368 patch_cheattable = !_stricmp(inifile_cleanstr(value), "true");
369 else if (!_stricmp(name, "argb8888"))
370 patch_argb8888 = !_stricmp(inifile_cleanstr(value), "true");
371 else if (!_stricmp(name, "killvtune"))
372 patch_killvtune = !_stricmp(inifile_cleanstr(value), "true");
373 else if (!_stricmp(name, "getcmdline"))
374 patch_getcmdline = !_stricmp(inifile_cleanstr(value), "true");
375 else if (!_stricmp(name, "disablecmdline"))
376 patch_disablecmdline = !_stricmp(inifile_cleanstr(value), "true");
377 else if (!_stricmp(name, "safeprintf"))
378 patch_safeprintf = !_stricmp(inifile_cleanstr(value), "true");
379 else if (!_stricmp(name, "daodandisplayenum"))
380 patch_daodandisplayenum = !_stricmp(inifile_cleanstr(value), "true");
381 else if (!_stricmp(name, "usegettickcount"))
382 patch_usegettickcount = !_stricmp(inifile_cleanstr(value), "true");
383 else if (!_stricmp(name, "cheatsenabled"))
384 patch_cheatsenabled = !_stricmp(inifile_cleanstr(value), "true");
385 else if (!_stricmp(name, "usedaodangl"))
386 patch_usedaodangl = !_stricmp(inifile_cleanstr(value), "true");
387 else if (!_stricmp(name, "windowhack"))
388 patch_windowhack = !_stricmp(inifile_cleanstr(value), "true");
389 else if (!_stricmp(name, "daodaninit"))
390 patch_daodaninit = !_stricmp(inifile_cleanstr(value), "true");
391 else if (!_stricmp(name, "bsl"))
392 patch_bsl = !_stricmp(inifile_cleanstr(value), "true");
393 else if (!_stricmp(name, "cheater"))
394 patch_cheater = !_stricmp(inifile_cleanstr(value), "true");
395 else if (!_stricmp(name, "newweap"))
396 patch_newweapon = !_stricmp(inifile_cleanstr(value), "true");
397 else
398 DDrStartupMessage("unrecognised patch \"%s\"", name);
399 break;
400 case s_language:
401 if (!_stricmp(name, "chinese"))
402 patch_chinese = true;
403 else if (!_stricmp(name, "savepoint"))
404 {
405 char* str = _strdup(value);
406 DDrPatch_Int32(OniExe + 0x000fd730, (int)str);
407 DDrPatch_Int32(OniExe + 0x000fd738, (int)str);
408 }
409 else if (!_stricmp(name, "syndicatewarehouse"))
410 {
411 char* str = _strdup(value);
412 DDrPatch_Int32(OniExe + 0x000fd71a, (int)str);
413 DDrPatch_Int32(OniExe + 0x0010ef75, (int)str);
414 }
415 else if (!_stricmp(name, "damn"))
416 DDrPatch__strdup(OniExe + 0x0010fb6e, value);
417 else if (!_stricmp(name, "blam"))
418 DDrPatch__strdup(OniExe + 0x0010fb73, value);
419 else if (!_stricmp(name, "shapeshifter_on"))
420 DDr_CheatTable[0].message_on = _strdup(value);
421 else if (!_stricmp(name, "shapeshifter_off"))
422 DDr_CheatTable[0].message_off = _strdup(value);
423 else if (!_stricmp(name, "liveforever_on"))
424 DDr_CheatTable[1].message_on = _strdup(value);
425 else if (!_stricmp(name, "liveforever_off"))
426 DDr_CheatTable[1].message_off = _strdup(value);
427 else if (!_stricmp(name, "touchofdeath_on"))
428 DDr_CheatTable[2].message_on = _strdup(value);
429 else if (!_stricmp(name, "touchofdeath_off"))
430 DDr_CheatTable[2].message_off = _strdup(value);
431 else if (!_stricmp(name, "canttouchthis_on"))
432 DDr_CheatTable[3].message_on = _strdup(value);
433 else if (!_stricmp(name, "canttouchthis_off"))
434 DDr_CheatTable[3].message_off = _strdup(value);
435 else if (!_stricmp(name, "fatloot_on"))
436 DDr_CheatTable[4].message_on = _strdup(value);
437 else if (!_stricmp(name, "glassworld_on"))
438 DDr_CheatTable[5].message_on = _strdup(value);
439 else if (!_stricmp(name, "glassworld_off"))
440 DDr_CheatTable[5].message_off = _strdup(value);
441 else if (!_stricmp(name, "winlevel_on"))
442 DDr_CheatTable[6].message_on = _strdup(value);
443 else if (!_stricmp(name, "loselevel_on"))
444 DDr_CheatTable[7].message_on = _strdup(value);
445 else if (!_stricmp(name, "bighead_on"))
446 DDr_CheatTable[8].message_on = _strdup(value);
447 else if (!_stricmp(name, "bighead_off"))
448 DDr_CheatTable[8].message_off = _strdup(value);
449 else if (!_stricmp(name, "minime_on"))
450 DDr_CheatTable[9].message_on = _strdup(value);
451 else if (!_stricmp(name, "minime_off"))
452 DDr_CheatTable[9].message_off = _strdup(value);
453 else if (!_stricmp(name, "superammo_on"))
454 DDr_CheatTable[10].message_on = _strdup(value);
455 else if (!_stricmp(name, "superammo_off"))
456 DDr_CheatTable[10].message_off = _strdup(value);
457 else if (!_stricmp(name, "devmode_on"))
458 {
459 char* str = _strdup(value);
460 DDr_CheatTable[11].message_on = str;
461 DDr_CheatTable[cheat_x].message_on = str;
462 }
463 else if (!_stricmp(name, "devmode_off"))
464 {
465 char* str = _strdup(value);
466 DDr_CheatTable[11].message_off = str;
467 DDr_CheatTable[cheat_x].message_off = str;
468 }
469 else if (!_stricmp(name, "reservoirdogs_on"))
470 DDr_CheatTable[12].message_on = _strdup(value);
471 else if (!_stricmp(name, "reservoirdogs_off"))
472 DDr_CheatTable[12].message_off = _strdup(value);
473 else if (!_stricmp(name, "roughjustice_on"))
474 DDr_CheatTable[13].message_on = _strdup(value);
475 else if (!_stricmp(name, "roughjustice_off"))
476 DDr_CheatTable[13].message_off = _strdup(value);
477 else if (!_stricmp(name, "chenille_on"))
478 DDr_CheatTable[14].message_on = _strdup(value);
479 else if (!_stricmp(name, "chenille_off"))
480 DDr_CheatTable[14].message_off = _strdup(value);
481 else if (!_stricmp(name, "behemoth_on"))
482 DDr_CheatTable[15].message_on = _strdup(value);
483 else if (!_stricmp(name, "behemoth_off"))
484 DDr_CheatTable[15].message_off = _strdup(value);
485 else if (!_stricmp(name, "elderrune_on"))
486 DDr_CheatTable[16].message_on = _strdup(value);
487 else if (!_stricmp(name, "elderrune_off"))
488 DDr_CheatTable[16].message_off = _strdup(value);
489 else if (!_stricmp(name, "moonshadow_on"))
490 DDr_CheatTable[17].message_on = _strdup(value);
491 else if (!_stricmp(name, "moonshadow_off"))
492 DDr_CheatTable[17].message_off = _strdup(value);
493 else if (!_stricmp(name, "munitionfrenzy_on"))
494 DDr_CheatTable[18].message_on = _strdup(value);
495 else if (!_stricmp(name, "fistsoflegend_on"))
496 DDr_CheatTable[19].message_on = _strdup(value);
497 else if (!_stricmp(name, "fistsoflegend_off"))
498 DDr_CheatTable[19].message_off = _strdup(value);
499 else if (!_stricmp(name, "killmequick_on"))
500 DDr_CheatTable[20].message_on = _strdup(value);
501 else if (!_stricmp(name, "killmequick_off"))
502 DDr_CheatTable[20].message_off = _strdup(value);
503 else if (!_stricmp(name, "carousel_on"))
504 DDr_CheatTable[21].message_on = _strdup(value);
505 else if (!_stricmp(name, "carousel_off"))
506 DDr_CheatTable[21].message_off = _strdup(value);
507 else
508 DDrStartupMessage("unrecognised language item \"%s\"", name);
509 break;
510 case s_bsl:
511 default:
512 break;
513 }
514
515 return true;
516}
517
518void DDrConfig()
519{
520
521 if (GetFileAttributes("daodan.ini") == INVALID_FILE_ATTRIBUTES)
522 {
523 FILE* fp;
524 DDrStartupMessage("daodan.ini doesn't exist, creating");
525 fp = fopen("daodan.ini", "w");
526 if (fp)
527 {
528 fputs("[Options]\n", fp);
529 fclose(fp);
530 }
531 }
532
533 DDrStartupMessage("parsing daodan.ini...");
534 if (!inifile_read("daodan.ini", DDrIniCallback))
535 DDrStartupMessage("error reading daodan.ini, check your syntax!");
536 DDrStartupMessage("finished parsing");
537}
538
539void ONICALL DDrGame_Init()
540{
541 if (opt_usedaodanbsl)
542 SLrDaodan_Initalize();
543}
544
545void DDrException() {
546 int* i = 0;
547 *i = 1;
548}
549#include <stdio.h>
550
551//this was broken
552FILE** _UUgError_WarningFile = (FILE**)0x005711B4;
553FILE *__fastcall DDrPrintWarning(int filename, int linenumber, unsigned __int16 errornum, int message)
554{
555
556 FILE *v4; // eax@1
557 FILE *result; // eax@4
558 char v6[512]; // [sp+0h] [bp-100h]@1
559 FILE* UUgError_WarningFile = *_UUgError_WarningFile;
560 sprintf_s(
561 v6, 512,
562 "Error %x reported from File: %s, Line: %d (message follows) \r\n%s",
563 errornum,
564 filename,
565 linenumber,
566 message);
567
568 if ( UUgError_WarningFile
569 || (UUgError_WarningFile = oni_fopen("debugger.txt", "wb"), UUgError_WarningFile ) )
570 {
571 oni_fprintf(UUgError_WarningFile, "%s\r\n", v6);
572 oni_fflush(UUgError_WarningFile);
573 }
574 //oni_fprintf(stdout, v6);
575 //sprintf(&v6, "%s", message);
576 *_UUgError_WarningFile = UUgError_WarningFile;
577 result = UUgError_WarningFile;
578 return result;
579}
580
581void __cdecl DDrMain(int argc, char* argv[])
582{
583 int i;
584 char* section;
585 char* option;
586 bool falseoption;
587
588 DDrStartupMessage("daodan attached!");
589
590 opt_ignore_private_data = false;
591 opt_sound = true;
592
593 DDrStartupMessage("checking for updates...");
594
595 DDr_CheckForUpdates(argc, argv);
596
597 DDrConfig();
598 DDrStartupMessage("parsing command line...");
599 for (i = 1; i < argc; i ++)
600 {
601 if (argv[i][0] == '-')
602 {
603 section = argv[i] + 1;
604 if ((option = strchr(argv[i], '.')))
605 {
606 *option = '\0';
607 falseoption = (option[1] == 'n' || option[1] == 'N') && (option[2] = 'o' || option[2] == 'O');
608 if (i < (argc - 1) && argv[i + 1][0] != '-')
609 DDrIniCallback(section, true, option + 1, argv[++i]);
610 else
611 DDrIniCallback(section, true, option + (falseoption ? 3 : 1), (falseoption ? "false" : "true"));
612 *option = '.';
613 }
614 else
615 {
616 falseoption = (section[0] == 'n' || section[0] == 'N') && (section[1] = 'o' || section[1] == 'O');
617 ini_section = s_options;
618 if (i < (argc - 1) && argv[i + 1][0] != '-')
619 DDrIniCallback(NULL, false, section, argv[++i]);
620 else
621 DDrIniCallback(NULL, false, section + (falseoption ? 2 : 0), (falseoption ? "false" : "true"));
622 }
623 }
624 else
625 {
626 DDrStartupMessage("parse error \"%s\"", argv[i]);
627 break;
628 }
629 }
630 DDrStartupMessage("finished parsing");
631 DDrPatch_Init();
632
633 // Safe startup message printer
634 if (patch_safeprintf)
635 DDrPatch_MakeJump(UUrStartupMessage, DDrStartupMessage);
636
637 // Daodan device mode enumeration function
638 if (patch_daodandisplayenum)
639 DDrPatch_MakeJump(gl_enumerate_valid_display_modes, daodan_enumerate_valid_display_modes);
640
641 // Performance patch
642 if (patch_usegettickcount)
643 {
644 DDrPatch_MakeJump(UUrMachineTime_High, DDrMachineTime_High);
645 DDrPatch_MakeJump(UUrMachineTime_High_Frequency, DDrMachineTime_High_Frequency);
646 DDrPatch_MakeJump(UUrMachineTime_Sixtieths, DDrMachineTime_Sixtieths);
647 }
648
649 // Cheats always enabled
650 if (patch_cheatsenabled)
651 DDrPatch_MakeJump(ONrPersist_GetWonGame, DDrPersist_GetWonGame);
652
653 // Windowed mode
654 if (patch_usedaodangl)
655 {
656 DDrPatch_NOOP((char*)0x004032B7, 6);
657 DDrPatch_MakeCall((char*)0x004032B7, LIiP_SetCursorPosHook);
658
659 DDrPatch_NOOP((char*)0x00403349, 6);
660 DDrPatch_MakeCall((char*)0x00403349, LIiP_SetCursorPosHook);
661 DDrPatch_MakeJump(ONrPlatform_Initialize, DDrPlatform_Initialize);
662 DDrPatch_MakeJump(gl_platform_initialize, daodangl_platform_initialize);
663 }
664 // Hacked windowed mode (for when daodangl isn't working properly)
665 else if (patch_windowhack)
666 DDrWindowHack_Install();
667
668 if (patch_daodaninit)
669 DDrPatch_MakeCall(OniExe + 0x000d345a, DDrGame_Init);
670
671 // Patches for existing BSL functions
672 if (patch_bsl)
673 SLrDaodan_Patch();
674
675 if (patch_cheater)
676 {
677 DDrPatch_MakeCall(OniExe + 0x000f618f, DDrCheater);
678 DDrPatch_Int16(OniExe + 0x000deb45, 0x5590);
679#if 0
680 DDrPatch_MakeCall(OniExe + 0x000deb47, FallingFrames);
681#endif
682 DDrPatch_MakeJump(OniExe + 0x0010f021, DDrCheater_LevelLoad);
683 }
684
685 //DDrPatch_MakeJump(0x004378c0, DDrException);
686 DDrPatch_MakeJump(0x004245A0, DDrPrintWarning);
687 //init_daodan_gl();
688
689 ONiMain(argc, argv);
690}
691/*
692void DDrWrongExe()
693{
694 switch (MessageBox(NULL, "This version of the Daodan DLL is incompatible with your Oni.exe.\n"
695 "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))
696 {
697 case IDOK:
698 {
699 STARTUPINFO si;
700 PROCESS_INFORMATION pi;
701 FillMemory(&si, 0, sizeof(si));
702 FillMemory(&pi, 0, sizeof(pi));
703 si.cb = sizeof(si);
704 if (!CreateProcess(NULL, "cmd /c \"start http://wiki.oni2.net/Daodan_DLL\"", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
705 MessageBox(NULL, "", "", 0);
706 CloseHandle(pi.hProcess);
707 CloseHandle(pi.hThread);
708 }
709 default:
710 ExitProcess(0);
711 }
712}
713*/
714BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
715{
716 switch (fdwReason)
717 {
718 case DLL_PROCESS_ATTACH:
719 DDrDLLModule = hinstDLL;
720 DDrONiModule = GetModuleHandle(NULL);
721
722 if (*(uint32_t*)(OniExe + 0x0011acd0) == 0x09d36852)
723 DDrPatch_MakeCall(OniExe + 0x0010fb49, DDrMain);
724 else
725 ExitProcess(0);
726 break;
727 }
728 return TRUE;
729}
Note: See TracBrowser for help on using the repository browser.