source: Daodan/MSVC/Daodan.c@ 581

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