source: Daodan/MSVC/Daodan.c@ 573

Last change on this file since 573 was 573, checked in by gumby, 14 years ago
File size: 23.0 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
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
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 {
85 const char pathfinding[2] = {0x90 , 0xE9 };
86 DDrPatch_Byte (OniExe + 0x0010b03b, 0x20);
87 DDrPatch_Byte (OniExe + 0x0010b04c, 0x20);
88
89 //other stuff
90 DDrPatch_Const(0x440789, pathfinding);
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);
105
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
117 // FIXME: add switches
118 //pathfinding fix
119
120
121
122
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
191 if (patch_newweapon) {
192
193 //Makes it always say "Recieved weapon_name."
194 //Needs check for loc_4DFC66
195 //DDrPatch_NOOP( OniExe + 0x000E4DF8,2);
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 );
205 }
206
207 // Disable loading the vtuneapi.dll
208 if (patch_killvtune)
209 DDrPatch_Byte (OniExe + 0x00026340, 0xC3);
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
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 }
237 DDrPatch_MakeCall(0x004FBCEA, DDrText_Hook);
238 DDrPatch_Int32( 0x004B24D2, FLrSpawnHack);
239 DDrPatch_NOOP(0x004C26CB, 6);
240 DDrPatch_MakeCall( 0x004C26CB, FLrHook_DoorOpen);
241
242 return true;
243}
244
245enum {s_unknown, s_options, s_patch, s_bsl, s_language} ini_section;
246
247bool DDrIniCallback(char* section, bool newsection, char* name, char* value)
248{
249 if (newsection)
250 {
251 if (!_stricmp(section, "options"))
252 ini_section = s_options;
253 else if (!_stricmp(section, "patch"))
254 ini_section = s_patch;
255 else if (!_stricmp(section, "bsl"))
256 ini_section = s_bsl;
257 else if (!_stricmp(section, "language"))
258 ini_section = s_language;
259 else
260 {
261 ini_section = s_unknown;
262 DDrStartupMessage("unrecognised section \"%s\"", section);
263 }
264 }
265
266 switch (ini_section)
267 {
268 case s_options:
269 if (!_stricmp(name, "usedaodanbsl"))
270 opt_usedaodanbsl = !_stricmp(inifile_cleanstr(value), "true");
271 else if (!_stricmp(name, "border"))
272 opt_border = !_stricmp(inifile_cleanstr(value), "true");
273 else if (!_stricmp(name, "shadow"))
274 opt_shadow = !_stricmp(inifile_cleanstr(value), "true");
275 else if (!_stricmp(name, "topmost"))
276 opt_topmost = !_stricmp(inifile_cleanstr(value), "true");
277 else if (!_stricmp(name, "multibyte"))
278 patch_multibyte = !_stricmp(inifile_cleanstr(value), "true");
279 else if (!_stricmp(name, "debug"))
280 AKgDebug_DebugMaps = !_stricmp(inifile_cleanstr(value), "true");
281 else if (!_stricmp(name, "debugfiles"))
282 BFgDebugFileEnable = !_stricmp(inifile_cleanstr(value), "true");
283 else if (!_stricmp(name, "findsounds"))
284 SSgSearchOnDisk = !_stricmp(inifile_cleanstr(value), "true");
285 else if (!_stricmp(name, "ignore_private_data"))
286 opt_ignore_private_data = !_stricmp(inifile_cleanstr(value), "true");
287 else if (!_stricmp(name, "sound"))
288 opt_sound = !_stricmp(inifile_cleanstr(value), "true");
289 else if (!_stricmp(name, "switch"))
290 M3gResolutionSwitch = !_stricmp(inifile_cleanstr(value), "true");
291 //else if (!_stricmp(name, "devmode"))
292 //turn_dev_mode_on = !_stricmp(inifile_cleanstr(value), "true");
293 else
294 DDrStartupMessage("unrecognised option \"%s\"", name);
295 break;
296 case s_patch:
297 if (!_stricmp(name, "fonttexturecache"))
298 patch_fonttexturecache = !_stricmp(inifile_cleanstr(value), "true");
299 else if (!_stricmp(name, "largetextures"))
300 patch_largetextures = !_stricmp(inifile_cleanstr(value), "true");
301 else if (!_stricmp(name, "levelplugins"))
302 patch_levelplugins = !_stricmp(inifile_cleanstr(value), "true");
303 else if (!_stricmp(name, "pathfinding"))
304 patch_pathfinding = !_stricmp(inifile_cleanstr(value), "true");
305 else if (!_stricmp(name, "projaware"))
306 patch_projaware = !_stricmp(inifile_cleanstr(value), "true");
307 else if (!_stricmp(name, "directinput"))
308 patch_directinput = !_stricmp(inifile_cleanstr(value), "true");
309 else if (!_stricmp(name, "wpfadetime"))
310 patch_wpfadetime = !_stricmp(inifile_cleanstr(value), "true");
311 else if (!_stricmp(name, "kickguns"))
312 patch_kickguns = !_stricmp(inifile_cleanstr(value), "true");
313 else if (!_stricmp(name, "cooldowntimer"))
314 patch_cooldowntimer = !_stricmp(inifile_cleanstr(value), "true");
315 else if (!_stricmp(name, "throwtest"))
316 patch_throwtest = !_stricmp(inifile_cleanstr(value), "true");
317 else if (!_stricmp(name, "alttab"))
318 patch_alttab = !_stricmp(inifile_cleanstr(value), "true");
319 else if (!_stricmp(name, "particledisablebit"))
320 patch_particledisablebit = !_stricmp(inifile_cleanstr(value), "true");
321 else if (!_stricmp(name, "multibyte"))
322 patch_multibyte = !_stricmp(inifile_cleanstr(value), "true");
323 else if (!_stricmp(name, "cheattable"))
324 patch_cheattable = !_stricmp(inifile_cleanstr(value), "true");
325 else if (!_stricmp(name, "argb8888"))
326 patch_argb8888 = !_stricmp(inifile_cleanstr(value), "true");
327 else if (!_stricmp(name, "killvtune"))
328 patch_killvtune = !_stricmp(inifile_cleanstr(value), "true");
329 else if (!_stricmp(name, "getcmdline"))
330 patch_getcmdline = !_stricmp(inifile_cleanstr(value), "true");
331 else if (!_stricmp(name, "disablecmdline"))
332 patch_disablecmdline = !_stricmp(inifile_cleanstr(value), "true");
333 else if (!_stricmp(name, "safeprintf"))
334 patch_safeprintf = !_stricmp(inifile_cleanstr(value), "true");
335 else if (!_stricmp(name, "daodandisplayenum"))
336 patch_daodandisplayenum = !_stricmp(inifile_cleanstr(value), "true");
337 else if (!_stricmp(name, "usegettickcount"))
338 patch_usegettickcount = !_stricmp(inifile_cleanstr(value), "true");
339 else if (!_stricmp(name, "cheatsenabled"))
340 patch_cheatsenabled = !_stricmp(inifile_cleanstr(value), "true");
341 else if (!_stricmp(name, "usedaodangl"))
342 patch_usedaodangl = !_stricmp(inifile_cleanstr(value), "true");
343 else if (!_stricmp(name, "windowhack"))
344 patch_windowhack = !_stricmp(inifile_cleanstr(value), "true");
345 else if (!_stricmp(name, "daodaninit"))
346 patch_daodaninit = !_stricmp(inifile_cleanstr(value), "true");
347 else if (!_stricmp(name, "bsl"))
348 patch_bsl = !_stricmp(inifile_cleanstr(value), "true");
349 else if (!_stricmp(name, "cheater"))
350 patch_cheater = !_stricmp(inifile_cleanstr(value), "true");
351 else if (!_stricmp(name, "newweap"))
352 patch_newweapon = !_stricmp(inifile_cleanstr(value), "true");
353 else
354 DDrStartupMessage("unrecognised patch \"%s\"", name);
355 break;
356 case s_language:
357 if (!_stricmp(name, "savepoint"))
358 {
359 char* str = _strdup(value);
360 DDrPatch_Int32(OniExe + 0x000fd730, (int)str);
361 DDrPatch_Int32(OniExe + 0x000fd738, (int)str);
362 }
363 else if (!_stricmp(name, "syndicatewarehouse"))
364 {
365 char* str = _strdup(value);
366 DDrPatch_Int32(OniExe + 0x000fd71a, (int)str);
367 DDrPatch_Int32(OniExe + 0x0010ef75, (int)str);
368 }
369 else if (!_stricmp(name, "damn"))
370 DDrPatch__strdup(OniExe + 0x0010fb6e, value);
371 else if (!_stricmp(name, "blam"))
372 DDrPatch__strdup(OniExe + 0x0010fb73, value);
373 else if (!_stricmp(name, "shapeshifter_on"))
374 DDr_CheatTable[0].message_on = _strdup(value);
375 else if (!_stricmp(name, "shapeshifter_off"))
376 DDr_CheatTable[0].message_off = _strdup(value);
377 else if (!_stricmp(name, "liveforever_on"))
378 DDr_CheatTable[1].message_on = _strdup(value);
379 else if (!_stricmp(name, "liveforever_off"))
380 DDr_CheatTable[1].message_off = _strdup(value);
381 else if (!_stricmp(name, "touchofdeath_on"))
382 DDr_CheatTable[2].message_on = _strdup(value);
383 else if (!_stricmp(name, "touchofdeath_off"))
384 DDr_CheatTable[2].message_off = _strdup(value);
385 else if (!_stricmp(name, "canttouchthis_on"))
386 DDr_CheatTable[3].message_on = _strdup(value);
387 else if (!_stricmp(name, "canttouchthis_off"))
388 DDr_CheatTable[3].message_off = _strdup(value);
389 else if (!_stricmp(name, "fatloot_on"))
390 DDr_CheatTable[4].message_on = _strdup(value);
391 else if (!_stricmp(name, "glassworld_on"))
392 DDr_CheatTable[5].message_on = _strdup(value);
393 else if (!_stricmp(name, "glassworld_off"))
394 DDr_CheatTable[5].message_off = _strdup(value);
395 else if (!_stricmp(name, "winlevel_on"))
396 DDr_CheatTable[6].message_on = _strdup(value);
397 else if (!_stricmp(name, "loselevel_on"))
398 DDr_CheatTable[7].message_on = _strdup(value);
399 else if (!_stricmp(name, "bighead_on"))
400 DDr_CheatTable[8].message_on = _strdup(value);
401 else if (!_stricmp(name, "bighead_off"))
402 DDr_CheatTable[8].message_off = _strdup(value);
403 else if (!_stricmp(name, "minime_on"))
404 DDr_CheatTable[9].message_on = _strdup(value);
405 else if (!_stricmp(name, "minime_off"))
406 DDr_CheatTable[9].message_off = _strdup(value);
407 else if (!_stricmp(name, "superammo_on"))
408 DDr_CheatTable[10].message_on = _strdup(value);
409 else if (!_stricmp(name, "superammo_off"))
410 DDr_CheatTable[10].message_off = _strdup(value);
411 else if (!_stricmp(name, "devmode_on"))
412 {
413 char* str = _strdup(value);
414 DDr_CheatTable[11].message_on = str;
415 DDr_CheatTable[cheat_x].message_on = str;
416 }
417 else if (!_stricmp(name, "devmode_off"))
418 {
419 char* str = _strdup(value);
420 DDr_CheatTable[11].message_off = str;
421 DDr_CheatTable[cheat_x].message_off = str;
422 }
423 else if (!_stricmp(name, "reservoirdogs_on"))
424 DDr_CheatTable[12].message_on = _strdup(value);
425 else if (!_stricmp(name, "reservoirdogs_off"))
426 DDr_CheatTable[12].message_off = _strdup(value);
427 else if (!_stricmp(name, "roughjustice_on"))
428 DDr_CheatTable[13].message_on = _strdup(value);
429 else if (!_stricmp(name, "roughjustice_off"))
430 DDr_CheatTable[13].message_off = _strdup(value);
431 else if (!_stricmp(name, "chenille_on"))
432 DDr_CheatTable[14].message_on = _strdup(value);
433 else if (!_stricmp(name, "chenille_off"))
434 DDr_CheatTable[14].message_off = _strdup(value);
435 else if (!_stricmp(name, "behemoth_on"))
436 DDr_CheatTable[15].message_on = _strdup(value);
437 else if (!_stricmp(name, "behemoth_off"))
438 DDr_CheatTable[15].message_off = _strdup(value);
439 else if (!_stricmp(name, "elderrune_on"))
440 DDr_CheatTable[16].message_on = _strdup(value);
441 else if (!_stricmp(name, "elderrune_off"))
442 DDr_CheatTable[16].message_off = _strdup(value);
443 else if (!_stricmp(name, "moonshadow_on"))
444 DDr_CheatTable[17].message_on = _strdup(value);
445 else if (!_stricmp(name, "moonshadow_off"))
446 DDr_CheatTable[17].message_off = _strdup(value);
447 else if (!_stricmp(name, "munitionfrenzy_on"))
448 DDr_CheatTable[18].message_on = _strdup(value);
449 else if (!_stricmp(name, "fistsoflegend_on"))
450 DDr_CheatTable[19].message_on = _strdup(value);
451 else if (!_stricmp(name, "fistsoflegend_off"))
452 DDr_CheatTable[19].message_off = _strdup(value);
453 else if (!_stricmp(name, "killmequick_on"))
454 DDr_CheatTable[20].message_on = _strdup(value);
455 else if (!_stricmp(name, "killmequick_off"))
456 DDr_CheatTable[20].message_off = _strdup(value);
457 else if (!_stricmp(name, "carousel_on"))
458 DDr_CheatTable[21].message_on = _strdup(value);
459 else if (!_stricmp(name, "carousel_off"))
460 DDr_CheatTable[21].message_off = _strdup(value);
461 else
462 DDrStartupMessage("unrecognised language item \"%s\"", name);
463 break;
464 case s_bsl:
465 default:
466 break;
467 }
468
469 return true;
470}
471
472void DDrConfig()
473{
474
475 if (GetFileAttributes("daodan.ini") == INVALID_FILE_ATTRIBUTES)
476 {
477 FILE* fp;
478 DDrStartupMessage("daodan.ini doesn't exist, creating");
479 fp = fopen("daodan.ini", "w");
480 if (fp)
481 {
482 fputs("[Options]\n", fp);
483 fclose(fp);
484 }
485 }
486
487 DDrStartupMessage("parsing daodan.ini...");
488 if (!inifile_read("daodan.ini", DDrIniCallback))
489 DDrStartupMessage("error reading daodan.ini, check your syntax!");
490 DDrStartupMessage("finished parsing");
491}
492
493void ONICALL DDrGame_Init()
494{
495 if (opt_usedaodanbsl)
496 SLrDaodan_Initalize();
497}
498
499void DDrException() {
500 int* i = 0;
501 *i = 1;
502}
503#include <stdio.h>
504
505//this was broken
506FILE** _UUgError_WarningFile = (FILE**)0x005711B4;
507FILE *__fastcall DDrPrintWarning(int filename, int linenumber, unsigned __int16 errornum, int message)
508{
509
510 FILE *v4; // eax@1
511 FILE *result; // eax@4
512 char v6[512]; // [sp+0h] [bp-100h]@1
513 FILE* UUgError_WarningFile = *_UUgError_WarningFile;
514 sprintf_s(
515 v6, 512,
516 "Error %x reported from File: %s, Line: %d (message follows) \r\n%s",
517 errornum,
518 filename,
519 linenumber,
520 message);
521
522 if ( UUgError_WarningFile
523 || (UUgError_WarningFile = oni_fopen("debugger.txt", "wb"), UUgError_WarningFile ) )
524 {
525 oni_fprintf(UUgError_WarningFile, "%s\r\n", v6);
526 oni_fflush(UUgError_WarningFile);
527 }
528 //oni_fprintf(stdout, v6);
529 //sprintf(&v6, "%s", message);
530 *_UUgError_WarningFile = UUgError_WarningFile;
531 result = UUgError_WarningFile;
532 return result;
533}
534
535void __cdecl DDrMain(int argc, char* argv[])
536{
537 int i;
538 char* section;
539 char* option;
540 bool falseoption;
541
542 DDrStartupMessage("daodan attached!");
543
544 opt_ignore_private_data = false;
545 opt_sound = true;
546
547 DDrConfig();
548 DDrStartupMessage("parsing command line...");
549 for (i = 1; i < argc; i ++)
550 {
551 if (argv[i][0] == '-')
552 {
553 section = argv[i] + 1;
554 if ((option = strchr(argv[i], '.')))
555 {
556 *option = '\0';
557 falseoption = (option[1] == 'n' || option[1] == 'N') && (option[2] = 'o' || option[2] == 'O');
558 if (i < (argc - 1) && argv[i + 1][0] != '-')
559 DDrIniCallback(section, true, option + 1, argv[++i]);
560 else
561 DDrIniCallback(section, true, option + (falseoption ? 3 : 1), (falseoption ? "false" : "true"));
562 *option = '.';
563 }
564 else
565 {
566 falseoption = (section[0] == 'n' || section[0] == 'N') && (section[1] = 'o' || section[1] == 'O');
567 ini_section = s_options;
568 if (i < (argc - 1) && argv[i + 1][0] != '-')
569 DDrIniCallback(NULL, false, section, argv[++i]);
570 else
571 DDrIniCallback(NULL, false, section + (falseoption ? 2 : 0), (falseoption ? "false" : "true"));
572 }
573 }
574 else
575 {
576 DDrStartupMessage("parse error \"%s\"", argv[i]);
577 break;
578 }
579 }
580 DDrStartupMessage("finished parsing");
581 DDrPatch_Init();
582
583 // Safe startup message printer
584 if (patch_safeprintf)
585 DDrPatch_MakeJump(UUrStartupMessage, DDrStartupMessage);
586
587 // Daodan device mode enumeration function
588 if (patch_daodandisplayenum)
589 DDrPatch_MakeJump(gl_enumerate_valid_display_modes, daodan_enumerate_valid_display_modes);
590
591 // Performance patch
592 if (patch_usegettickcount)
593 {
594 DDrPatch_MakeJump(UUrMachineTime_High, DDrMachineTime_High);
595 DDrPatch_MakeJump(UUrMachineTime_High_Frequency, DDrMachineTime_High_Frequency);
596 DDrPatch_MakeJump(UUrMachineTime_Sixtieths, DDrMachineTime_Sixtieths);
597 }
598
599 // Cheats always enabled
600 if (patch_cheatsenabled)
601 DDrPatch_MakeJump(ONrPersist_GetWonGame, DDrPersist_GetWonGame);
602
603 // Windowed mode
604 if (patch_usedaodangl)
605 {
606 DDrPatch_NOOP((char*)0x004032B7, 6);
607 DDrPatch_MakeCall((char*)0x004032B7, LIiP_SetCursorPosHook);
608
609 DDrPatch_NOOP((char*)0x00403349, 6);
610 DDrPatch_MakeCall((char*)0x00403349, LIiP_SetCursorPosHook);
611 DDrPatch_MakeJump(ONrPlatform_Initialize, DDrPlatform_Initialize);
612 DDrPatch_MakeJump(gl_platform_initialize, daodangl_platform_initialize);
613 }
614 // Hacked windowed mode (for when daodangl isn't working properly)
615 else if (patch_windowhack)
616 DDrWindowHack_Install();
617
618 if (patch_daodaninit)
619 DDrPatch_MakeCall(OniExe + 0x000d345a, DDrGame_Init);
620
621 // Patches for existing BSL functions
622 if (patch_bsl)
623 SLrDaodan_Patch();
624
625 if (patch_cheater)
626 {
627 DDrPatch_MakeCall(OniExe + 0x000f618f, DDrCheater);
628 DDrPatch_Int16(OniExe + 0x000deb45, 0x5590);
629#if 0
630 DDrPatch_MakeCall(OniExe + 0x000deb47, FallingFrames);
631#endif
632 DDrPatch_MakeJump(OniExe + 0x0010f021, DDrCheater_LevelLoad);
633 }
634
635 //DDrPatch_MakeJump(0x004378c0, DDrException);
636 DDrPatch_MakeJump(0x004245A0, DDrPrintWarning);
637 //init_daodan_gl();
638
639 ONiMain(argc, argv);
640}
641/*
642void DDrWrongExe()
643{
644 switch (MessageBox(NULL, "This version of the Daodan DLL is incompatible with your Oni.exe.\n"
645 "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))
646 {
647 case IDOK:
648 {
649 STARTUPINFO si;
650 PROCESS_INFORMATION pi;
651 FillMemory(&si, 0, sizeof(si));
652 FillMemory(&pi, 0, sizeof(pi));
653 si.cb = sizeof(si);
654 if (!CreateProcess(NULL, "cmd /c \"start http://wiki.oni2.net/Daodan_DLL\"", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
655 MessageBox(NULL, "", "", 0);
656 CloseHandle(pi.hProcess);
657 CloseHandle(pi.hThread);
658 }
659 default:
660 ExitProcess(0);
661 }
662}
663*/
664BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
665{
666 switch (fdwReason)
667 {
668 case DLL_PROCESS_ATTACH:
669 DDrDLLModule = hinstDLL;
670 DDrONiModule = GetModuleHandle(NULL);
671
672 if (*(uint32_t*)(OniExe + 0x0011acd0) == 0x09d36852)
673 DDrPatch_MakeCall(OniExe + 0x0010fb49, DDrMain);
674 else
675 ExitProcess(0);
676 break;
677 }
678 return TRUE;
679}
Note: See TracBrowser for help on using the repository browser.