| 1 | + | #include <string.h> | 
 
 
 
 
 
 
 
 | 2 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 3 |  | #include "Daodan.h" | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 4 |  | #include "Daodan_Patch.h" | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 5 |  | #include "Daodan_Utility.h" | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 15 |  | #include "oni_gl.h" | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 16 |  | #include "daodan_gl.h" | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 17 |  |  | 
 
 
 
 
 
 
 
 | 18 | + | #include "inifile.h" | 
 
 
 
 
 
 
 
 | 19 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 20 |  | HMODULE DDrDLLModule; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 21 |  | HMODULE DDrONiModule; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 22 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 23 |  | bool DDrPatch_Init() | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 24 |  | { | 
 
 
 
 
 
 
 
 
 
 
 | 25 | < | DDrStartupMessage("daodan attached, patching engine"); | 
 
 
 
 
 
 
 
 
 | 25 | > | DDrStartupMessage("patching engine"); | 
 
 
 
 
 
 
 
 
 
 
 | 26 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 27 |  | // Font texture cache doubled | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 28 |  | DDrPatch_Byte  (OniExe + 0x00020ea7, 0x20); | 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 | 99 |  | return true; | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 100 |  | } | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 101 |  |  | 
 
 
 
 
 
 
 
 | 102 | + | enum {s_unknown, s_language} ini_section; | 
 
 
 
 
 
 
 
 | 103 | + |  | 
 
 
 
 
 
 
 
 | 104 | + | bool DDrIniCallback(char* section, bool newsection, char* name, char* value) | 
 
 
 
 
 
 
 
 | 105 | + | { | 
 
 
 
 
 
 
 
 | 106 | + | if (newsection) | 
 
 
 
 
 
 
 
 | 107 | + | { | 
 
 
 
 
 
 
 
 | 108 | + | if (!stricmp(section, "language")) | 
 
 
 
 
 
 
 
 | 109 | + | ini_section = s_language; | 
 
 
 
 
 
 
 
 | 110 | + | else | 
 
 
 
 
 
 
 
 | 111 | + | { | 
 
 
 
 
 
 
 
 | 112 | + | ini_section = s_unknown; | 
 
 
 
 
 
 
 
 | 113 | + | DDrStartupMessage("unrecognised ini section \"%s\"", section); | 
 
 
 
 
 
 
 
 | 114 | + | } | 
 
 
 
 
 
 
 
 | 115 | + | } | 
 
 
 
 
 
 
 
 | 116 | + |  | 
 
 
 
 
 
 
 
 | 117 | + | switch (ini_section) | 
 
 
 
 
 
 
 
 | 118 | + | { | 
 
 
 
 
 
 
 
 | 119 | + | case s_language: | 
 
 
 
 
 
 
 
 | 120 | + | if (!stricmp(name, "savepoint")) | 
 
 
 
 
 
 
 
 | 121 | + | { | 
 
 
 
 
 
 
 
 | 122 | + | DDrPatch_StrDup(OniExe + 0x000fd730, value); | 
 
 
 
 
 
 
 
 | 123 | + | DDrPatch_StrDup(OniExe + 0x000fd738, value); | 
 
 
 
 
 
 
 
 | 124 | + | } | 
 
 
 
 
 
 
 
 | 125 | + | else if (!stricmp(name, "syndicatewarehouse")) | 
 
 
 
 
 
 
 
 | 126 | + | { | 
 
 
 
 
 
 
 
 | 127 | + | DDrPatch_StrDup(OniExe + 0x000fd71a, value); | 
 
 
 
 
 
 
 
 | 128 | + | DDrPatch_StrDup(OniExe + 0x0010ef75, value); | 
 
 
 
 
 
 
 
 | 129 | + | } | 
 
 
 
 
 
 
 
 | 130 | + | else if (!stricmp(name, "blam")) | 
 
 
 
 
 
 
 
 | 131 | + | DDrPatch_StrDup(OniExe + 0x0010fb73, value); | 
 
 
 
 
 
 
 
 | 132 | + | else | 
 
 
 
 
 
 
 
 | 133 | + | DDrStartupMessage("unrecognised language item \"%s\"", name); | 
 
 
 
 
 
 
 
 | 134 | + | break; | 
 
 
 
 
 
 
 
 | 135 | + | default: | 
 
 
 
 
 
 
 
 | 136 | + | break; | 
 
 
 
 
 
 
 
 | 137 | + | } | 
 
 
 
 
 
 
 
 | 138 | + |  | 
 
 
 
 
 
 
 
 | 139 | + | return true; | 
 
 
 
 
 
 
 
 | 140 | + | } | 
 
 
 
 
 
 
 
 | 141 | + |  | 
 
 
 
 
 
 
 
 | 142 | + | void DDrConfig() | 
 
 
 
 
 
 
 
 | 143 | + | { | 
 
 
 
 
 
 
 
 | 144 | + | if (GetFileAttributes("daodan.ini") == INVALID_FILE_ATTRIBUTES) | 
 
 
 
 
 
 
 
 | 145 | + | { | 
 
 
 
 
 
 
 
 | 146 | + | DDrStartupMessage("daodan.ini doesn't exist, creating"); | 
 
 
 
 
 
 
 
 | 147 | + | FILE* fp = fopen("daodan.ini", "w"); | 
 
 
 
 
 
 
 
 | 148 | + | if (fp) | 
 
 
 
 
 
 
 
 | 149 | + | { | 
 
 
 
 
 
 
 
 | 150 | + | fputs("[Options]\n", fp); | 
 
 
 
 
 
 
 
 | 151 | + | fclose(fp); | 
 
 
 
 
 
 
 
 | 152 | + | } | 
 
 
 
 
 
 
 
 | 153 | + | } | 
 
 
 
 
 
 
 
 | 154 | + |  | 
 
 
 
 
 
 
 
 | 155 | + | DDrStartupMessage("parsing daodan.ini..."); | 
 
 
 
 
 
 
 
 | 156 | + | if (!inifile_read("daodan.ini", DDrIniCallback)) | 
 
 
 
 
 
 
 
 | 157 | + | DDrStartupMessage("error reading daodan.ini, check your syntax!"); | 
 
 
 
 
 
 
 
 | 158 | + | DDrStartupMessage("finished parsing"); | 
 
 
 
 
 
 
 
 | 159 | + | } | 
 
 
 
 
 
 
 
 | 160 | + |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 161 |  | void __cdecl DDrMain(int argc, char* argv[]) | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 162 |  | { | 
 
 
 
 
 
 
 
 | 163 | + | DDrStartupMessage("daodan attached!"); | 
 
 
 
 
 
 
 
 | 164 | + | DDrConfig(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 165 |  | DDrPatch_Init(); | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 166 |  |  | 
 
 
 
 
 
 
 
 
 
 
 
 
 | 167 |  | // Safe startup message printer |