Changeset 995 for Daodan/src/Patches/Patches.c
- Timestamp:
- Apr 9, 2014, 2:10:18 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Daodan/src/Patches/Patches.c
r994 r995 85 85 void ONICALL DDrGame_Init() 86 86 { 87 ConfigOption_t* co = DDrConfig_GetOptOfType("options.usedaodanbsl", C_BOOL); 88 if (co->value.intBoolVal) 87 if (DDrConfig_GetOptOfType("patches.usedaodanbsl", C_BOOL)->value.intBoolVal) 89 88 SLrDaodan_Initialize(); 90 89 } … … 193 192 194 193 195 int DD_Patch_DebugNameTextureInit(short width, short height, int type, int allocated, int flags, char* name, void** output) 196 { 197 //flags = (1 << 10); 198 type = 1; 199 //DDrPatch_Byte( 0x005EB83C + 3, 0xff ); 200 DDrPatch_Int32((int*)(OniExe + 0x001EB83C), 0xFF000000 ); 201 return M3rTextureMap_New(width, height, type, allocated, flags, name, output); 202 } 203 204 short DD_Patch_DebugNameShadeHack( Character* Char ) 205 { 206 return TSrContext_SetShade(*(void**)(OniExe + 0x001EB844), ONrCharacter_GetHealthShade( Char->Health, Char->MaxHealth )); 207 //return TSrContext_SetShade(*(void**)0x005EB844, 0xFFFFFFFF); 208 } 209 210 211 // Disable UUrPlatform_Initalize/Terminate, this enables the Alt-Tab and the 212 // Windows key but has the possible side effect of allowing the screensaver 213 // to enable itself in-game. 214 void DD_Patch_AltTab() 215 { 216 // 0xC3 = ret, so makes those functions just have a "ret" instruction at their start 217 DDrPatch_Byte ((char*)UUrPlatform_Initialize, 0xC3); 218 DDrPatch_Byte ((char*)UUrPlatform_Terminate, 0xC3); 219 } 220 221 // Textures using ARGB8888 can be used 222 void DD_Patch_ARGB8888() 223 { 224 DDrPatch_Byte ((char*)(OniExe + 0x00135af0), 0x07); 225 DDrPatch_Byte ((char*)(OniExe + 0x00135af4), 0x0B); 226 } 227 228 // Fix BinkBufferInit() call in BKrMovie_Play() to use GDI (DIB) blitting 229 // instead of DirectDraw; patch ONiRunGame to use the same method to play 230 // outro (ie., BKrMovie_Play() instead of ONrMovie_Play_Hardware() as the 231 // latter has problems on WINE). 232 void DD_Patch_BinkPlay() 233 { 234 // push BINKBUFFERAUTO -> push BINKBUFFERDIBSECTION. 235 DDrPatch_Byte((void*)(OniExe + 0x0008829b + 1), 0x02); 236 // call ONrMovie_Play_Hardware -> call ONrMovie_Play 237 DDrPatch_MakeCall((void*)(OniExe + 0x000d496f), ONrMovie_Play); 238 } 239 240 // Enables d_regen (unfinished) and prevents fly-in portraits from being 241 // stretched when playing in widescreen resolutions. 242 void DD_Patch_BSL() 243 { 244 //Calculating the value of the needed offset is much more reliable when the compiler does it for you. 245 246 //TODO: fix moonshadow. 194 // Enables d_regen script command. Instead of one global flag to only regenerate player each char has a flag to enable local regeneration 195 void DD_Patch_Regeneration() 196 { 197 // In: WPrInventory_Update 247 198 Character * Chr = 0; 248 199 int NoPath = (int)&(Chr[0].RegenHax) & 0x000000FF; 249 200 const unsigned char regen_patch[] = 250 201 {0x90, 0x90, 0x90, 0x90, 0x90, // mov al, _WPgRegenerationCheat -> NOOP 251 0x90, 0x90, // test al, al-> NOOP252 0x90, 0x90, 202 0x90, 0x90, // test al, al -> NOOP 203 0x90, 0x90, // jz short loc_51BB98 -> NOOP 253 204 0x8B, 0x86, (char)NoPath, 0x01, 0x00, 0x00, // mov eax, [esi+Character.field_1E8] 254 255 0x85, 0xC0, 256 0x74, 0x21 257 }; 205 // -> mov eax, [esi+Character.RegenHax] 206 0x85, 0xC0, // test eax, eax 207 0x74, 0x21 // jnz 0x21 -> jz 0x21 208 }; 258 209 DDrPatch_Const((char*)(OniExe + 0x0011BB64), regen_patch); 259 260 // Patches for existing BSL functions 261 SLrDaodan_Patch(); 262 } 263 264 // Adds new cheat codes if cheattable is also enabled 265 void DD_Patch_Cheater() 266 { 267 DDrPatch_MakeCall((void*)(OniExe + 0x000f618f), (void*)DDrCheater); 268 DDrPatch_Int16((short*)(OniExe + 0x000deb45), 0x5590); 269 #if 1 270 DDrPatch_MakeCall((void*)(OniExe + 0x000deb47), (void*)FallingFrames); 271 #endif 272 DDrPatch_MakeJump((void*)(OniExe + 0x0010f021), (void*)DDrCheater_LevelLoad); 273 } 274 275 // Cheats always enabled 276 void DD_Patch_CheatsEnabled() 277 { 278 DDrPatch_MakeJump((void*)ONrPersist_GetWonGame, (void*)DDrPersist_GetWonGame); 279 } 280 281 // Use Daodan's own cheattable 282 void DD_Patch_CheatTable() 283 { 284 DDrPatch_Int32 ((int*)(OniExe + 0x000f616b), (int)&DDr_CheatTable[0].name); 285 DDrPatch_Int32 ((int*)(OniExe + 0x000f617a), (int)&DDr_CheatTable[0].message_on); 286 } 210 } 211 287 212 288 213 // Load chinese font DLL if available … … 312 237 } 313 238 314 // Limit cursor to Oni's window 315 void DD_Patch_ClipCursor() 316 { 317 // LIrMode_Set: replace LIrPlatform_Mode_Set call with our hook. 318 DDrPatch_MakeCall((void*)(OniExe + 0x00003f9f), (void*) DD_LIrPlatform_Mode_Set); 319 320 // LIrMode_Set_Internal: replace LIrPlatform_Mode_Set call with our hook. 321 DDrPatch_MakeCall((void*)(OniExe + 0x00003fff), (void*) DD_LIrPlatform_Mode_Set); 322 323 // LIrTermiante: replace LIrPlatform_Terminate call with our hook. 324 DDrPatch_MakeCall((void*)(OniExe + 0x000004cb8), (void*) DD_LIrPlatform_Terminate); 325 } 326 327 // Disables weapon cooldown exploit 328 void DD_Patch_CooldownTimer() 329 { 330 const unsigned 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 }; 331 DDrPatch_Const ((char*)(OniExe + 0x0011a825), cooldown_patch); 332 } 333 334 // Daodan device mode enumeration function 335 void DD_Patch_DaodanDisplayEnum() 336 { 337 DDrPatch_MakeJump((void*)gl_enumerate_valid_display_modes, (void*)DD_GLrEnumerateDisplayModes); 338 } 339 340 // Adds new BSL functions 341 void DD_Patch_DaodanInit() 342 { 343 DDrPatch_MakeCall((void*)(OniExe + 0x000d345a), (void*)DDrGame_Init); 344 } 345 346 // Forced DirectInput (for Windows NT) 347 void DD_Patch_DirectInput() 348 { 349 DDrPatch_Byte((char*)(OniExe + 0x00002e6d), 0xeb); 350 } 351 352 // Disable Oni's command line parser so it doesn't interfere with ours 353 void DD_Patch_DisableCmdLine() 354 { 355 // Replace start of OniParseCommandLine with XOR ax,ax; RET 356 // DDrPatch_Int32 ((int*)(OniExe + 0x000d3570), 0xc3c03366); 357 // Replace start of OniParseCommandLine with XOR eax,eax; RET 358 DDrPatch_Int32 ((int*)(OniExe + 0x000d3570), 0x00c3c033); 359 } 360 361 // Font texture cache doubled 362 void DD_Patch_FontTextureCache() 363 { 364 DDrPatch_Byte((char*)(OniExe + 0x00020ea7), 0x20); 365 DDrPatch_Byte((char*)(OniExe + 0x00020f4a), 0x40); 366 } 367 368 // Disable Oni's internal CLrGetCommandLine function (to eventually replace it with our own) 369 void DD_Patch_GetCmdLine() 370 { 371 DDrPatch_NOOP ((char*)(OniExe + 0x000d3280), 51); 372 } 373 374 // Allow HD screens with resolution < 1024*768 375 void DD_Patch_HDScreens_LowRes() 376 { 377 DDrPatch_MakeJump((void*)M3rDraw_BigBitmap, (void*)DD_M3rDraw_BigBitmap); 378 } 379 380 void DD_Patch_HighresConsole() { 381 Oni_COrTextArea_Resize = DDrPatch_MakeDetour((void*)COrTextArea_Resize, (void*)DD_COrTextArea_Resize); 382 } 383 384 // Hackish fix for Konoko not kicking guns 385 // Don't use this, it breaks stairs. 386 void DD_Patch_KickGuns() 387 { 388 const unsigned 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 }; 389 DDrPatch_Const ((char*)(OniExe + 0x000dc420), kickgun_patch); 390 } 391 392 // Disable loading the vtuneapi.dll 393 void DD_Patch_KillVTune() 394 { 395 DDrPatch_Byte ((char*)(OniExe + 0x00026340), 0xC3); 396 } 397 398 // Now supports textures up to 512x512 399 void DD_Patch_LargeTextures() 400 { 401 DDrPatch_Byte ((char*)(OniExe + 0x00005251), 0x10); 402 } 403 404 // Non-"_Final" levels are now valid 405 void DD_Patch_LevelPlugins() 406 { 407 DDrPatch_Byte ((char*)(OniExe + 0x000206a8), 0x01); 408 } 409 410 // Weapon on ground shown with name and magazine contents 411 void DD_Patch_NewWeap() 412 { 413 //Makes it always say "Received weapon_name." 414 //Needs check for loc_4DFC66 415 //DDrPatch_NOOP((char*)(OniExe + 0x000E4DF8),2); 416 417 //Adds Weapon name and ammo meter to pickup autoprompt 418 DDrPatch_NOOP((char*)(OniExe + 0x000FAC73), 9); 419 DDrPatch_NOOP((char*)(OniExe + 0x000FAC80), 5); 420 DDrPatch_MakeCall((void*)(OniExe + 0xFAC85), (void*)DDrWeapon2Message); 421 422 //Moves location of colors 423 //DDrPatch_Int32((int*)(OniExe + 0x0002E3D5), (int)&DDrDSayColors ); 424 //DDrPatch_Int32((int*)(OniExe + 0x0002E3DA), (int)&DDrDSayColors ); 425 } 426 427 // Disable Multi-byte character awareness patch (multiple language support) 428 void DD_Patch_NoMultiByte() 429 { 430 DDrPatch_Byte ((char*)(OniExe + 0x0002d8f8), 0xeb); 431 DDrPatch_Byte ((char*)(OniExe + 0x0002d9ad), 0xeb); 432 DDrPatch_Byte ((char*)(OniExe + 0x0002dbe2), 0xeb); 433 DDrPatch_Byte ((char*)(OniExe + 0x0002dec3), 0xeb); 434 DDrPatch_Byte ((char*)(OniExe + 0x0002e2ab), 0xeb); 435 DDrPatch_Byte ((char*)(OniExe + 0x0002e2c4), 0xeb); 436 DDrPatch_Byte ((char*)(OniExe + 0x0002e379), 0xeb); 437 DDrPatch_Byte ((char*)(OniExe + 0x0002e48c), 0xeb); 438 DDrPatch_Byte ((char*)(OniExe + 0x0002e4d0), 0xeb); 439 DDrPatch_Byte ((char*)(OniExe + 0x0002e4f4), 0xeb); 440 DDrPatch_Byte ((char*)(OniExe + 0x0002e646), 0xeb); 441 DDrPatch_Byte ((char*)(OniExe + 0x0002e695), 0xeb); 442 DDrPatch_Byte ((char*)(OniExe + 0x0002e944), 0xeb); 443 DDrPatch_Byte ((char*)(OniExe + 0x0002e95d), 0xeb); 444 DDrPatch_Byte ((char*)(OniExe + 0x0002e98e), 0xeb); 445 DDrPatch_Byte ((char*)(OniExe + 0x0002e9dc), 0xeb); 446 } 447 448 // Fix options not visible in main menu when a game was started 449 void DD_Patch_OptionsVisible() 450 { 451 DDrPatch_MakeCall((void*)(OniExe + 0x000d2d2d), DDrShowOptionsButton); 452 DDrPatch_MakeCall((void*)(OniExe + 0x000d2d43), DDrShowResumeButton); 453 } 454 455 // Unlocks particle action disabling/enabling bits for all events. (Will be 456 // controlled by a command line switch when I figure out how to do that without 457 // Win32 hacks.) 458 void DD_Patch_ParticleDisableBit() 459 { 460 DDrPatch_Int16 ((short*)(OniExe + 0x001b184), 0x9090); 461 } 462 463 // Pathfinding grid cache size x8 464 void DD_Patch_PathFinding() 465 { 466 const unsigned char pathfinding[2] = {0x90 , 0xE9 }; 467 DDrPatch_Byte ((char*)(OniExe + 0x0010b03b), 0x20); 468 DDrPatch_Byte ((char*)(OniExe + 0x0010b04c), 0x20); 469 470 //other stuff 471 DDrPatch_Const((char*)(OniExe + 0x00040789), pathfinding); 472 } 473 474 // Projectile awareness fixed 475 void DD_Patch_ProjAware() 476 { 477 DDrPatch_Byte ((char*)(OniExe + 0x0009c07c), 0x6c); 478 DDrPatch_Byte ((char*)(OniExe + 0x0009c080), 0x70); 479 DDrPatch_Byte ((char*)(OniExe + 0x0009c084), 0x74); 480 DDrPatch_Byte ((char*)(OniExe + 0x0009c110), 0x6c); 481 } 482 483 // Safe startup message printer 484 void DD_Patch_SafePrintf() 485 { 486 DDrPatch_MakeJump((void*)UUrStartupMessage, (void*)DDrStartupMessage); 487 } 488 489 // Show all (also enemies') lasersights 490 void DD_Patch_ShowAllLasersights() 491 { 492 DDrPatch_NOOP((char*)(OniExe + 0x000E1957), 6 ); 493 } 494 495 void DD_Patch_ShowTriggerVolumes() 496 { 497 Oni_ONrMechanics_Register = DDrPatch_MakeDetour((void*)ONrMechanics_Register, (void*)DD_ONrMechanics_Register); 498 Oni_ONrGameState_HandleUtilityInput = DDrPatch_MakeDetour((void*)ONrGameState_HandleUtilityInput, (void*)DD_ONrGameState_HandleUtilityInput); 499 } 500 501 // Experiment with allowing enemies to be thrown over railings 502 void DD_Patch_Throwtest() 503 { 504 const unsigned char throwtest_patch[] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 }; 505 DDrPatch_Const((char*)(OniExe + 0x000dc190), throwtest_patch); 506 } 507 508 // DaodanGL with windowed mode support 509 void DD_Patch_UseDaodanGL() 510 { 511 // LIrPlatform_Mode_Set: GetWindowRect -> GetClientRect. 512 DDrPatch_NOOP((char*) OniExe + 0x00002dd6, 6); 513 DDrPatch_MakeCall((char*) OniExe + 0x00002dd6, (void*) GetClientRect); 514 515 // UUrWindow_GetSize: GetWindowRect -> GetClientRect. 516 DDrPatch_NOOP((char*) OniExe + 0x0002651c, 6); 517 DDrPatch_MakeCall((char*) OniExe + 0x0002651c, (void*) GetClientRect); 518 519 // LIrPlatform_PollInputForAction: fix GetCursorPos call to return client coordinates. 520 DDrPatch_NOOP((char*) OniExe + 0x000032cc, 6); 521 DDrPatch_MakeCall((char*) OniExe + 0x000032cc, (void*) DD_GetCursorPos); 522 523 // LIrPlatform_InputEvent_GetMouse: fix GetCursorPos call to return client coordinates. 524 DDrPatch_NOOP((char*) OniExe + 0x00002cc2, 6); 525 DDrPatch_MakeCall((char*) OniExe + 0x00002cc2, (void*) DD_GetCursorPos); 526 527 // LIrPlatform_PollInputForAction: translate SetCursorPos position to screen coordinates. 528 DDrPatch_NOOP((char*) OniExe + 0x000032b7, 6); 529 DDrPatch_MakeCall((char*) OniExe + 0x000032b7, (void*) DD_SetCursorPos); 530 531 // LIrPlatform_PollInputForAction: translate SetCursorPos position to screen coordinates. 532 DDrPatch_NOOP((char*) OniExe + 0x00003349, 6); 533 DDrPatch_MakeCall((char*) OniExe + 0x00003349, (void*) DD_SetCursorPos); 534 535 // Replace ONrPlatformInitialize. 536 DDrPatch_MakeJump((void*) ONrPlatform_Initialize, (void*) DD_ONrPlatform_Initialize); 537 538 // Replace gl_platform_initialize. 539 DDrPatch_MakeJump((void*) gl_platform_initialize, (void*) DD_GLrPlatform_Initialize); 540 541 // Replace gl_platform_dispose. 542 DDrPatch_MakeJump((void *) gl_platform_dispose, (void*) DD_GLrPlatform_Dispose); 543 } 544 545 // Performance patch 546 void DD_Patch_UseGetTickCount() 547 { 548 DDrPatch_MakeJump((void*)UUrMachineTime_High, (void*)DDrMachineTime_High); 549 DDrPatch_MakeJump((void*)UUrMachineTime_High_Frequency, (void*)DDrMachineTime_High_Frequency); 550 DDrPatch_MakeJump((void*)UUrMachineTime_Sixtieths, (void*)DDrMachineTime_Sixtieths); 551 } 552 553 // Adds working function for existing BSL command wp_fadetime, sets fade time to 4800 554 void DD_Patch_WpFadetime() 555 { 556 // Makes wp_fadetime actually have a function 557 const unsigned char fadetime_patch[] = { 0x66, 0x8B, 0x1D, 0xC4, 0x7D, 0x62, 0x00, 0x66, 0x89, 0x5E, 0x46, 0x5B, 0x5E, 0x83, 0xC4, 0x14, 0xC3 }; 558 DDrPatch_Const ((char*)(OniExe + 0x0011a889), fadetime_patch); 559 DDrPatch_Byte ((char*)(OniExe + 0x0011a560), 0x31); 560 561 // Sets the fadetime to 4800 by default 562 DDrPatch_Int16 ((short*)(OniExe + 0x0011ab0e), 0x12c0); 563 } 564 565 // Disable gamma slider in options in windowed mode 566 void DD_Patch_GammaSlider() 567 { 568 DDrPatch_MakeCall((void*)(OniExe + 0x000d262c), (void*)DD_ONiOGU_GammaSlider_SetRange); 569 } 570 571 // Fix the warning print method 572 void DD_Patch_PrintWarning() 573 { 574 DDrPatch_MakeJump((void*)(OniExe + 0x000245A0), (void*)DDrPrintWarning); 239 240 241 int DD_Patch_DebugNameTextureInit(short width, short height, int type, int allocated, int flags, char* name, void** output) 242 { 243 //flags = (1 << 10); 244 type = 1; 245 //DDrPatch_Byte( 0x005EB83C + 3, 0xff ); 246 DDrPatch_Int32((int*)(OniExe + 0x001EB83C), 0xFF000000 ); 247 return M3rTextureMap_New(width, height, type, allocated, flags, name, output); 248 } 249 250 short DD_Patch_DebugNameShadeHack( Character* Char ) 251 { 252 return TSrContext_SetShade(*(void**)(OniExe + 0x001EB844), ONrCharacter_GetHealthShade( Char->Health, Char->MaxHealth )); 575 253 } 576 254 … … 599 277 } 600 278 601 /* 602 void DD_Patch_ShowTriggerVolumes() 603 { 604 DDrPatch_Int32((int*)(OniExe + 0x000cc9bb+4), (uint32_t)DD_OBJiTriggerVolume_Draw); 605 } 606 607 void DD_Patch_ShowFlags() 608 { 609 DDrPatch_Int32((int*)(OniExe + 0x000c4ed4+4), (uint32_t)DD_OBJiFlag_Draw); 610 } 611 */ 279 280 281 282 283 284 285 612 286 613 287 bool DD_Patch_Init() … … 615 289 STARTUPMESSAGE("Patching engine", 0); 616 290 291 // Disable UUrPlatform_Initalize/Terminate, this enables the Alt-Tab and the 292 // Windows key but has the possible side effect of allowing the screensaver 293 // to enable itself in-game. 617 294 if (DDrConfig_GetOptOfType("patches.alttab", C_BOOL)->value.intBoolVal) 618 DD_Patch_AltTab(); 619 295 { 296 // 0xC3 = ret, so makes those functions just have a "ret" instruction at their start 297 DDrPatch_Byte((char*)UUrPlatform_Initialize, 0xC3); 298 DDrPatch_Byte((char*)UUrPlatform_Terminate, 0xC3); 299 } 300 301 // Textures using ARGB8888 can be used 620 302 if (DDrConfig_GetOptOfType("patches.argb8888", C_BOOL)->value.intBoolVal) 621 DD_Patch_ARGB8888(); 622 303 { 304 // Update conversion lookups in IMgConvertPixelType_List 305 DDrPatch_Byte((char*)(OniExe + 0x00135af0), 0x07); 306 DDrPatch_Byte((char*)(OniExe + 0x00135af4), 0x0B); 307 } 308 309 // Fix BinkBufferInit() call in BKrMovie_Play() to use GDI (DIB) blitting 310 // instead of DirectDraw; patch ONiRunGame to use the same method to play 311 // outro (ie., BKrMovie_Play() instead of ONrMovie_Play_Hardware() as the 312 // latter has problems on WINE). 623 313 if (DDrConfig_GetOptOfType("patches.binkplay", C_BOOL)->value.intBoolVal) 624 DD_Patch_BinkPlay(); 625 626 if (DDrConfig_GetOptOfType("patches.bsl", C_BOOL)->value.intBoolVal) 627 DD_Patch_BSL(); 628 629 if (DDrConfig_GetOptOfType("patches.cheater", C_BOOL)->value.intBoolVal) 630 DD_Patch_Cheater(); 631 314 { 315 // push BINKBUFFERAUTO -> push BINKBUFFERDIBSECTION. 316 DDrPatch_Byte((void*)(OniExe + 0x0008829b + 1), 0x02); 317 // call ONrMovie_Play_Hardware -> call ONrMovie_Play 318 DDrPatch_MakeCall((void*)(OniExe + 0x000d496f), ONrMovie_Play); 319 } 320 321 if (DDrConfig_GetOptOfType("patches.d_regen", C_BOOL)->value.intBoolVal) 322 DD_Patch_Regeneration(); 323 324 // Cheats always enabled 632 325 if (DDrConfig_GetOptOfType("patches.cheatsenabled", C_BOOL)->value.intBoolVal) 633 DD_Patch_CheatsEnabled(); 634 326 { 327 DDrPatch_MakeJump((void*)ONrPersist_GetWonGame, (void*)DDrPersist_GetWonGame); 328 } 329 330 // Use Daodan's own cheattable 635 331 if (DDrConfig_GetOptOfType("patches.cheattable", C_BOOL)->value.intBoolVal) 636 DD_Patch_CheatTable(); 332 { 333 // In ONrGameState_HandleCheats: Replace pointers to orig cheattable 334 DDrPatch_Int32 ((int*)(OniExe + 0x000f616b), (int)&DDr_CheatTable[0].name); 335 DDrPatch_Int32 ((int*)(OniExe + 0x000f617a), (int)&DDr_CheatTable[0].message_on); 336 337 // ONrGameState_HandleCheats: Replace call to ONrCheater 338 DDrPatch_MakeCall((void*)(OniExe + 0x000f618f), (void*)DDrCheater); 339 340 // In: ONrGameState_DoCharacterFrame 341 // -> NOP; PUSH ebp; CALL FallingFrames 342 // Replace fall height frame counter (actually in-air frame counter) increase by a 343 // conditional one (only counted when inc_fallingframes) 344 DDrPatch_Int16((short*)(OniExe + 0x000deb45), 0x5590); 345 DDrPatch_MakeCall((void*)(OniExe + 0x000deb47), (void*)FallingFrames); 346 347 // At end of ONrUnlockLevel to init values on level loading 348 DDrPatch_MakeJump((void*)(OniExe + 0x0010f021), (void*)DDrCheater_LevelLoad); 349 } 637 350 638 351 if (DDrConfig_GetOptOfType("patches.chinese", C_BOOL)->value.intBoolVal) 639 352 DD_Patch_Chinese(); 640 353 354 // Limit cursor to Oni's window 641 355 if (DDrConfig_GetOptOfType("patches.clipcursor", C_BOOL)->value.intBoolVal) 642 DD_Patch_ClipCursor(); 643 356 { 357 // LIrMode_Set: replace LIrPlatform_Mode_Set call with our hook. 358 DDrPatch_MakeCall((void*)(OniExe + 0x00003f9f), (void*) DD_LIrPlatform_Mode_Set); 359 360 // LIrMode_Set_Internal: replace LIrPlatform_Mode_Set call with our hook. 361 DDrPatch_MakeCall((void*)(OniExe + 0x00003fff), (void*) DD_LIrPlatform_Mode_Set); 362 363 // LIrTerminate: replace LIrPlatform_Terminate call with our hook. 364 DDrPatch_MakeCall((void*)(OniExe + 0x000004cb8), (void*) DD_LIrPlatform_Terminate); 365 } 366 367 // Disables weapon cooldown exploit 644 368 if (DDrConfig_GetOptOfType("patches.cooldowntimer", C_BOOL)->value.intBoolVal) 645 DD_Patch_CooldownTimer(); 646 369 { 370 // In WPrRelease: NoOp 4 MOVs 371 DDrPatch_NOOP((char*)(OniExe + 0x0011a825), 22); 372 } 373 374 // Daodan device mode enumeration function 647 375 if (DDrConfig_GetOptOfType("patches.daodandisplayenum", C_BOOL)->value.intBoolVal) 648 DD_Patch_DaodanDisplayEnum(); 649 376 { 377 DDrPatch_MakeJump((void*)gl_enumerate_valid_display_modes, (void*)DD_GLrEnumerateDisplayModes); 378 } 379 380 // Forced DirectInput (for Windows NT) 650 381 if (DDrConfig_GetOptOfType("patches.directinput", C_BOOL)->value.intBoolVal) 651 DD_Patch_DirectInput(); 652 382 { 383 // LIrPlatform_Initialize: replace conditional jump by unconditional 384 DDrPatch_Byte((char*)(OniExe + 0x00002e6d), 0xeb); 385 } 386 387 // Disable Oni's command line parser so it doesn't interfere with ours 653 388 if (DDrConfig_GetOptOfType("patches.disablecmdline", C_BOOL)->value.intBoolVal) 654 DD_Patch_DisableCmdLine(); 655 389 { 390 // Replace start of OniParseCommandLine with XOR eax,eax; RET 391 DDrPatch_Int32 ((int*)(OniExe + 0x000d3570), 0x00c3c033); 392 // NoOp first 51 byte in ONiMain, including tests and conditional exec of CLrGetCommandLine 393 DDrPatch_NOOP((char*)(OniExe + 0x000d3280), 51); 394 } 395 396 // Font texture cache doubled 656 397 if (DDrConfig_GetOptOfType("patches.fonttexturecache", C_BOOL)->value.intBoolVal) 657 DD_Patch_FontTextureCache(); 658 659 if (DDrConfig_GetOptOfType("patches.getcmdline", C_BOOL)->value.intBoolVal) 660 DD_Patch_GetCmdLine(); 661 398 { 399 // Double two values in TMrGame_Initialize 400 DDrPatch_Byte((char*)(OniExe + 0x00020ea7), 0x20); 401 DDrPatch_Byte((char*)(OniExe + 0x00020f4a), 0x40); 402 } 403 404 // Allow HD screens on resolutions < 1024*768 662 405 if (DDrConfig_GetOptOfType("patches.hdscreens_lowres", C_BOOL)->value.intBoolVal) 663 DD_Patch_HDScreens_LowRes(); 664 406 { 407 DDrPatch_MakeJump((void*)M3rDraw_BigBitmap, (void*)DD_M3rDraw_BigBitmap); 408 } 409 410 // Allow for console to show on higher resolutions 665 411 if (DDrConfig_GetOptOfType("patches.highres_console", C_BOOL)->value.intBoolVal) 666 DD_Patch_HighresConsole(); 667 412 { 413 Oni_COrTextArea_Resize = DDrPatch_MakeDetour((void*)COrTextArea_Resize, (void*)DD_COrTextArea_Resize); 414 } 415 416 // Hackish fix for Konoko not kicking guns 417 // Don't use this, it breaks stairs. 668 418 if (DDrConfig_GetOptOfType("patches.kickguns", C_BOOL)->value.intBoolVal) 669 DD_Patch_KickGuns(); 670 671 //if (patch_killvtune) 672 // DD_Patch_KillVTune(); 673 419 { 420 // In ONrCharacter_EnablePhysics: Load different values to same addresses as before 421 const unsigned 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 }; 422 DDrPatch_Const ((char*)(OniExe + 0x000dc420), kickgun_patch); 423 } 424 425 // Disable loading the vtuneapi.dll 426 if (DDrConfig_GetOptOfType("patches.killvtune", C_BOOL)->value.intBoolVal) 427 { 428 // Instantly return from UUrLoadVtuneAPI 429 DDrPatch_Byte((char*)(OniExe + 0x00026340), 0xC3); 430 } 431 432 // Now supports textures up to 512x512 674 433 if (DDrConfig_GetOptOfType("patches.largetextures", C_BOOL)->value.intBoolVal) 675 DD_Patch_LargeTextures(); 676 434 { 435 DDrPatch_Byte((char*)(OniExe + 0x00005251), 0x10); 436 } 437 438 // Non-"_Final" levels are now valid 677 439 if (DDrConfig_GetOptOfType("patches.levelplugins", C_BOOL)->value.intBoolVal) 678 DD_Patch_LevelPlugins(); 679 440 { 441 // Patch in TMrUtility_LevelInfo_Get: 442 DDrPatch_Byte((char*)(OniExe + 0x000206a8), 0x01); 443 } 444 445 // Weapon on ground shown with name and magazine contents 680 446 if (DDrConfig_GetOptOfType("patches.newweap", C_BOOL)->value.intBoolVal) 681 DD_Patch_NewWeap(); 682 447 { 448 //Makes it always say "Received weapon_name." 449 //Needs check for loc_4DFC66 450 //DDrPatch_NOOP((char*)(OniExe + 0x000E4DF8),2); 451 452 //Adds Weapon name and ammo meter to pickup autoprompt (patches to ONrGameState_ProcessHeartbeat) 453 // Do not call WPrHasAmmo and ignore conditional jump: 454 DDrPatch_NOOP((char*)(OniExe + 0x000FAC73), 9); 455 // Do not load ecx with some magic value? 456 DDrPatch_NOOP((char*)(OniExe + 0x000FAC80), 5); 457 // Replace call to ONiGameState_FindAutoPromptMessage 458 DDrPatch_MakeCall((void*)(OniExe + 0xFAC85), (void*)DDrWeapon2Message); 459 460 //Moves location of colors 461 //DDrPatch_Int32((int*)(OniExe + 0x0002E3D5), (int)&DDrDSayColors ); 462 //DDrPatch_Int32((int*)(OniExe + 0x0002E3DA), (int)&DDrDSayColors ); 463 } 464 465 // Disable Multi-byte character awareness patch (multiple language support) 683 466 if (DDrConfig_GetOptOfType("patches.nomultibyte", C_BOOL)->value.intBoolVal) 684 DD_Patch_NoMultiByte(); 685 467 { 468 // TSiContext_DrawLine: Replace conditional jumps by unconditional ones 469 DDrPatch_Byte ((char*)(OniExe + 0x0002d8f8), 0xeb); 470 DDrPatch_Byte ((char*)(OniExe + 0x0002d9ad), 0xeb); 471 // TSiContext_DrawTextLine: same 472 DDrPatch_Byte ((char*)(OniExe + 0x0002dbe2), 0xeb); 473 DDrPatch_Byte ((char*)(OniExe + 0x0002dec3), 0xeb); 474 // TSrContext_FormatString: same 475 DDrPatch_Byte ((char*)(OniExe + 0x0002e2ab), 0xeb); 476 DDrPatch_Byte ((char*)(OniExe + 0x0002e2c4), 0xeb); 477 DDrPatch_Byte ((char*)(OniExe + 0x0002e379), 0xeb); 478 DDrPatch_Byte ((char*)(OniExe + 0x0002e48c), 0xeb); 479 DDrPatch_Byte ((char*)(OniExe + 0x0002e4d0), 0xeb); 480 DDrPatch_Byte ((char*)(OniExe + 0x0002e4f4), 0xeb); 481 DDrPatch_Byte ((char*)(OniExe + 0x0002e646), 0xeb); 482 DDrPatch_Byte ((char*)(OniExe + 0x0002e695), 0xeb); 483 // TSrContext_GetStringRect: same 484 DDrPatch_Byte ((char*)(OniExe + 0x0002e944), 0xeb); 485 DDrPatch_Byte ((char*)(OniExe + 0x0002e95d), 0xeb); 486 DDrPatch_Byte ((char*)(OniExe + 0x0002e98e), 0xeb); 487 DDrPatch_Byte ((char*)(OniExe + 0x0002e9dc), 0xeb); 488 } 489 490 // Fix options not visible in main menu when a game was started 686 491 if (DDrConfig_GetOptOfType("patches.optionsvisible", C_BOOL)->value.intBoolVal) 687 DD_Patch_OptionsVisible(); 688 689 if (DDrConfig_GetOptOfType("patches.particledisablebit", C_BOOL)->value.intBoolVal) 690 DD_Patch_ParticleDisableBit(); 691 492 { 493 // replace WMrWindow_SetVisible calls 494 DDrPatch_MakeCall((void*)(OniExe + 0x000d2d2d), DDrShowOptionsButton); 495 DDrPatch_MakeCall((void*)(OniExe + 0x000d2d43), DDrShowResumeButton); 496 } 497 498 // Pathfinding grid cache size x8 692 499 if (DDrConfig_GetOptOfType("patches.pathfinding", C_BOOL)->value.intBoolVal) 693 DD_Patch_PathFinding(); 694 500 { 501 // Replaces conditional jump (je) with unconditional jump 502 const unsigned char pathfinding[2] = {0x90 , 0xE9 }; 503 DDrPatch_Byte ((char*)(OniExe + 0x0010b03b), 0x20); 504 DDrPatch_Byte ((char*)(OniExe + 0x0010b04c), 0x20); 505 506 //other stuff 507 DDrPatch_Const((char*)(OniExe + 0x00040789), pathfinding); 508 } 509 510 // Projectile awareness fixed 695 511 if (DDrConfig_GetOptOfType("patches.projaware", C_BOOL)->value.intBoolVal) 696 DD_Patch_ProjAware(); 697 512 { 513 DDrPatch_Byte ((char*)(OniExe + 0x0009c07c), 0x6c); 514 DDrPatch_Byte ((char*)(OniExe + 0x0009c080), 0x70); 515 DDrPatch_Byte ((char*)(OniExe + 0x0009c084), 0x74); 516 DDrPatch_Byte ((char*)(OniExe + 0x0009c110), 0x6c); 517 } 518 519 // Safe startup message printer 698 520 if (DDrConfig_GetOptOfType("patches.safeprintf", C_BOOL)->value.intBoolVal) 699 DD_Patch_SafePrintf(); 700 521 { 522 DDrPatch_MakeJump((void*)UUrStartupMessage, (void*)DDrStartupMessage); 523 } 524 525 // Show all (also enemies') lasersights 701 526 if (DDrConfig_GetOptOfType("patches.showalllasersights", C_BOOL)->value.intBoolVal) 702 DD_Patch_ShowAllLasersights(); 703 527 { 528 DDrPatch_NOOP((char*)(OniExe + 0x000E1957), 6 ); 529 } 530 531 // Allow bsl-var show_triggervolumes or ctrl+shift+x (devmode) to work 704 532 if (DDrConfig_GetOptOfType("patches.showtriggervolumes", C_BOOL)->value.intBoolVal) 705 DD_Patch_ShowTriggerVolumes(); 706 533 { 534 Oni_ONrMechanics_Register = DDrPatch_MakeDetour((void*)ONrMechanics_Register, (void*)DD_ONrMechanics_Register); 535 Oni_ONrGameState_HandleUtilityInput = DDrPatch_MakeDetour((void*)ONrGameState_HandleUtilityInput, (void*)DD_ONrGameState_HandleUtilityInput); 536 } 537 538 // Experiment with allowing enemies to be thrown over railings 707 539 if (DDrConfig_GetOptOfType("patches.throwtest", C_BOOL)->value.intBoolVal) 708 DD_Patch_Throwtest(); 709 540 { 541 DDrPatch_NOOP((char*)(OniExe + 0x000dc190), 10); 542 } 543 544 // DaodanGL with windowed mode support 710 545 if (DDrConfig_GetOptOfType("patches.usedaodangl", C_BOOL)->value.intBoolVal) 711 DD_Patch_UseDaodanGL(); 712 546 { 547 // LIrPlatform_Mode_Set: GetWindowRect -> GetClientRect. 548 DDrPatch_NOOP((char*) OniExe + 0x00002dd6, 6); 549 DDrPatch_MakeCall((char*) OniExe + 0x00002dd6, (void*) GetClientRect); 550 551 // UUrWindow_GetSize: GetWindowRect -> GetClientRect. 552 DDrPatch_NOOP((char*) OniExe + 0x0002651c, 6); 553 DDrPatch_MakeCall((char*) OniExe + 0x0002651c, (void*) GetClientRect); 554 555 // LIrPlatform_PollInputForAction: fix GetCursorPos call to return client coordinates. 556 DDrPatch_NOOP((char*) OniExe + 0x000032cc, 6); 557 DDrPatch_MakeCall((char*) OniExe + 0x000032cc, (void*) DD_GetCursorPos); 558 559 // LIrPlatform_InputEvent_GetMouse: fix GetCursorPos call to return client coordinates. 560 DDrPatch_NOOP((char*) OniExe + 0x00002cc2, 6); 561 DDrPatch_MakeCall((char*) OniExe + 0x00002cc2, (void*) DD_GetCursorPos); 562 563 // LIrPlatform_PollInputForAction: translate SetCursorPos position to screen coordinates. 564 DDrPatch_NOOP((char*) OniExe + 0x000032b7, 6); 565 DDrPatch_MakeCall((char*) OniExe + 0x000032b7, (void*) DD_SetCursorPos); 566 567 // LIrPlatform_PollInputForAction: translate SetCursorPos position to screen coordinates. 568 DDrPatch_NOOP((char*) OniExe + 0x00003349, 6); 569 DDrPatch_MakeCall((char*) OniExe + 0x00003349, (void*) DD_SetCursorPos); 570 571 // Replace ONrPlatformInitialize. 572 DDrPatch_MakeJump((void*) ONrPlatform_Initialize, (void*) DD_ONrPlatform_Initialize); 573 574 // Replace gl_platform_initialize. 575 DDrPatch_MakeJump((void*) gl_platform_initialize, (void*) DD_GLrPlatform_Initialize); 576 577 // Replace gl_platform_dispose. 578 DDrPatch_MakeJump((void *) gl_platform_dispose, (void*) DD_GLrPlatform_Dispose); 579 } 580 581 // Performance patch 713 582 if (DDrConfig_GetOptOfType("patches.usegettickcount", C_BOOL)->value.intBoolVal) 714 DD_Patch_UseGetTickCount(); 715 583 { 584 DDrPatch_MakeJump((void*)UUrMachineTime_High, (void*)DDrMachineTime_High); 585 DDrPatch_MakeJump((void*)UUrMachineTime_High_Frequency, (void*)DDrMachineTime_High_Frequency); 586 DDrPatch_MakeJump((void*)UUrMachineTime_Sixtieths, (void*)DDrMachineTime_Sixtieths); 587 } 588 589 // Fix displaying the talking portraits in widescreen modes 590 if (DDrConfig_GetOptOfType("patches.widescreenportraits", C_BOOL)->value.intBoolVal) 591 { 592 SLrDaodan_Patch(); 593 } 594 595 // Adds working function for existing BSL command wp_fadetime, sets fade time to 4800 716 596 if (DDrConfig_GetOptOfType("patches.wpfadetime", C_BOOL)->value.intBoolVal) 717 DD_Patch_WpFadetime(); 718 719 720 DD_Patch_DaodanInit(); 721 722 DD_Patch_GammaSlider(); 723 724 DD_Patch_PrintWarning(); 597 { 598 // Makes wp_fadetime actually have a function (changes within WPrRelease) 599 // Patches end of function to instead of use a constant value for fadetime (12c0 = 4800) actually use value of wp_fadetime: 600 // orig: MOV [esi+0x46], 0x12c0 ; POP ebx ; POP esi ; ADD esp, 0x14 ; RET 601 // new: MOV bx, [0x627dc4] ; MOV [esi+0x46], bx ; POP ebx ; POP esi ; ADD esp, 0x14 ; RET 602 const unsigned char fadetime_patch[] = { 0x66, 0x8B, 0x1D, 0xC4, 0x7D, 0x62, 0x00, 0x66, 0x89, 0x5E, 0x46, 0x5B, 0x5E, 0x83, 0xC4, 0x14, 0xC3 }; 603 DDrPatch_Const ((char*)(OniExe + 0x0011a889), fadetime_patch); 604 // Fixes jump because of new length of code in patch 605 DDrPatch_Byte ((char*)(OniExe + 0x0011a560), 0x31); 606 607 // Sets the fadetime to 4800 by default (in WPrInitialize) 608 DDrPatch_Int16 ((short*)(OniExe + 0x0011ab0e), 4800); 609 } 610 611 // Adds new BSL functions 612 // Replaces an early unused call (OBJrLevel_Unload_Unknown_2) in ONiMain 613 DDrPatch_MakeCall((void*)(OniExe + 0x000d345a), (void*)DDrGame_Init); 614 615 // Disable gamma slider in options in windowed mode 616 // In ONiOGU_Options_Callback: Replace WMrSlider_SetRange 617 DDrPatch_MakeCall((void*)(OniExe + 0x000d262c), (void*)DD_ONiOGU_GammaSlider_SetRange); 618 619 // Fix the warning print method 620 // Replace UUrError_Report_Internal 621 DDrPatch_MakeJump((void*)(OniExe + 0x000245A0), (void*)DDrPrintWarning); 725 622 726 623 DD_Patch_ShowNames();
Note:
See TracChangeset
for help on using the changeset viewer.