--- Daodan/src/Daodan.c 2009/08/10 09:09:53 452 +++ Daodan/src/Daodan.c 2009/11/03 10:38:47 476 @@ -7,6 +7,7 @@ #include "Daodan_Cheater.h" #include "Daodan_Persistence.h" #include "Daodan_BSL.h" +#include "Daodan_Console.h" #include "Daodan_WindowHack.h" @@ -38,18 +39,26 @@ bool patch_particledisablebit = false; bool patch_multibyte = false; bool patch_cheattable = true; bool patch_argb8888 = true; +bool patch_killvtune = true; +bool patch_getcmdline = true; +bool patch_disablecmdline = true; bool patch_safeprintf = true; bool patch_daodandisplayenum = true; bool patch_usegettickcount = true; bool patch_cheatsenabled = true; -bool patch_usedaodangl = false; -bool patch_windowhack = true; +bool patch_usedaodangl = true; +bool patch_windowhack = false; bool patch_daodaninit = true; bool patch_bsl = true; bool patch_cheater = true; +// bool patch_newweapon = true; + bool opt_usedaodanbsl = true; +bool opt_border = true; +bool opt_shadow = false; +bool opt_topmost = false; bool DDrPatch_Init() { @@ -161,11 +170,41 @@ bool DDrPatch_Init() DDrPatch_Int32 (OniExe + 0x000f617a, (int)&DDr_CheatTable[0].message_on); } + // ARGB8888 textures if (patch_argb8888) { DDrPatch_Byte (OniExe + 0x00135af0, 0x07); DDrPatch_Byte (OniExe + 0x00135af4, 0x0B); } + + //Test newweap patch +// if (patch_newweapon) { + + //Makes it always say "Recieved weapon_name." + //Needs check for loc_4DFC66 + DDrPatch_NOOP( OniExe + 0x000E4DF8,2); + + //Adds Weapon name and ammo meter to pickup autoprompt + DDrPatch_NOOP( OniExe + 0x000FAC73, 9); + DDrPatch_NOOP( OniExe + 0x000FAC80, 5); + DDrPatch_MakeCall( OniExe + 0xFAC85, DDrWeapon2Message); + + //Moves location of colors + DDrPatch_Int32( OniExe + 0x0002E3D5, (int)&DDrDSayColors[0].Char ); + DDrPatch_Int32( OniExe + 0x0002E3DA, (int)&DDrDSayColors[0].Char ); +// } + + // Disable loading the vtuneapi.dll + if (patch_killvtune) + DDrPatch_Byte (OniExe + 0x00026340, 0xC3); + + // Disable Oni's internal CLrGetCommandLine function (to eventually replace it with our own) + if (patch_getcmdline) + DDrPatch_NOOP (OniExe + 0x000d3280, 51); + + // Disable Oni's command line parser so it doesn't interfere with ours + if (patch_disablecmdline) + DDrPatch_Int32 (OniExe + 0x000d3570, 0xc3c03366); return true; } @@ -187,7 +226,7 @@ bool DDrIniCallback(char* section, bool else { ini_section = s_unknown; - DDrStartupMessage("unrecognised ini section \"%s\"", section); + DDrStartupMessage("unrecognised section \"%s\"", section); } } @@ -196,6 +235,28 @@ bool DDrIniCallback(char* section, bool case s_options: if (!stricmp(name, "usedaodanbsl")) opt_usedaodanbsl = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "border")) + opt_border = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "shadow")) + opt_shadow = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "topmost")) + opt_topmost = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "multibyte")) + patch_multibyte = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "debug")) + AKgDebug_DebugMaps = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "debugfiles")) + BFgDebugFileEnable = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "findsounds")) + SSgSearchOnDisk = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "ignore_private_data")) + opt_ignore_private_data = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "sound")) + opt_sound = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "switch")) + M3gResolutionSwitch = !stricmp(inifile_cleanstr(value), "true"); + else + DDrStartupMessage("unrecognised option \"%s\"", name); break; case s_patch: if (!stricmp(name, "fonttexturecache")) @@ -228,6 +289,12 @@ bool DDrIniCallback(char* section, bool patch_cheattable = !stricmp(inifile_cleanstr(value), "true"); else if (!stricmp(name, "argb8888")) patch_argb8888 = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "killvtune")) + patch_killvtune = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "getcmdline")) + patch_getcmdline = !stricmp(inifile_cleanstr(value), "true"); + else if (!stricmp(name, "disablecmdline")) + patch_disablecmdline = !stricmp(inifile_cleanstr(value), "true"); else if (!stricmp(name, "safeprintf")) patch_safeprintf = !stricmp(inifile_cleanstr(value), "true"); else if (!stricmp(name, "daodandisplayenum")) @@ -393,7 +460,48 @@ void ONICALL DDrGame_Init() void __cdecl DDrMain(int argc, char* argv[]) { DDrStartupMessage("daodan attached!"); + + opt_ignore_private_data = false; + opt_sound = true; + DDrConfig(); + DDrStartupMessage("parsing command line..."); + int i; + char* section; + char* option; + bool falseoption; + for (i = 1; i < argc; i ++) + { + if (argv[i][0] == '-') + { + section = argv[i] + 1; + if ((option = strchr(argv[i], '.'))) + { + *option = '\0'; + falseoption = (option[1] == 'n' || option[1] == 'N') && (option[2] = 'o' || option[2] == 'O'); + if (i < (argc - 1) && argv[i + 1][0] != '-') + DDrIniCallback(section, true, option + 1, argv[++i]); + else + DDrIniCallback(section, true, option + (falseoption ? 3 : 1), (falseoption ? "false" : "true")); + *option = '.'; + } + else + { + falseoption = (section[0] == 'n' || section[0] == 'N') && (section[1] = 'o' || section[1] == 'O'); + ini_section = s_options; + if (i < (argc - 1) && argv[i + 1][0] != '-') + DDrIniCallback(NULL, false, section, argv[++i]); + else + DDrIniCallback(NULL, false, section + (falseoption ? 2 : 0), (falseoption ? "false" : "true")); + } + } + else + { + DDrStartupMessage("parse error \"%s\"", argv[i]); + break; + } + } + DDrStartupMessage("finished parsing"); DDrPatch_Init(); // Safe startup message printer @@ -435,13 +543,40 @@ void __cdecl DDrMain(int argc, char* arg SLrDaodan_Patch(); if (patch_cheater) + { DDrPatch_MakeCall(OniExe + 0x000f618f, DDrCheater); + DDrPatch_Int16(OniExe + 0x000deb45, 0x5590); + DDrPatch_MakeCall(OniExe + 0x000deb47, FallingFrames); + DDrPatch_MakeJump(OniExe + 0x0010f021, DDrCheater_LevelLoad); + } init_daodan_gl(); ONiMain(argc, argv); } - +/* +void DDrWrongExe() +{ + switch (MessageBox(NULL, "This version of the Daodan DLL is incompatible with your Oni.exe.\n" + "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)) + { + case IDOK: + { + STARTUPINFO si; + PROCESS_INFORMATION pi; + FillMemory(&si, 0, sizeof(si)); + FillMemory(&pi, 0, sizeof(pi)); + si.cb = sizeof(si); + if (!CreateProcess(NULL, "cmd /c \"start http://wiki.oni2.net/Daodan_DLL\"", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + MessageBox(NULL, "", "", 0); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + default: + ExitProcess(0); + } +} +*/ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { switch (fdwReason) @@ -450,8 +585,10 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DDrDLLModule = hinstDLL; DDrONiModule = GetModuleHandle(NULL); - DDrPatch_MakeCall(OniExe + 0x0010fb49, DDrMain); - + if (*(uint32_t*)((void*)OniExe + 0x0011acd0) == 0x09d36852) + DDrPatch_MakeCall(OniExe + 0x0010fb49, DDrMain); + else + ExitProcess(0); break; } return TRUE;