Changeset 1008


Ignore:
Timestamp:
Aug 26, 2014, 1:21:09 AM (10 years ago)
Author:
alloc
Message:

Daodan 3.9: Added AI awareness patch (fixes #36)

Location:
Daodan/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • Daodan/src/Daodan_Config.c

    r1007 r1008  
    4848        } },
    4949        { "gameplay", "Gameplay", {
     50                { "characterawareness",
     51                        "Makes AI remember the player.",
     52                        C_BOOL,
     53                        {.intBoolVal = true},
     54                        {.intBoolVal = true} },
    5055                { "cheatsenabled",
    5156                        "Enables cheats without having to beat the game first.",
  • Daodan/src/Daodan_Patch.c

    r995 r1008  
    242242}
    243243
     244void* DDrPatch_ExecutableASM(char* from, char* nextInst, const unsigned char* code, int length)
     245{
     246        char* newCode = malloc(length+5);
     247        if (!DDrPatch_NOOP(newCode, length+5))
     248                return (void*)-1;
     249
     250        memcpy(newCode, code, length);
     251        if (!DDrPatch_MakeJump(&newCode[length], nextInst))
     252                return (void*)-1;
     253
     254        DWORD oldp;
     255        if (!VirtualProtect(newCode, length+5, PAGE_EXECUTE_READWRITE, &oldp)) {
     256                STARTUPMESSAGE("ExecASM: Could not mark page for new code as executable: from address 0x%08x", from);
     257                return (void*)-1;
     258        }
     259       
     260        if (!DDrPatch_MakeJump(from, newCode))
     261                return (void*)-1;
     262
     263        return newCode;
     264}
    244265
    245266void DDrPatch_PrintDisasm(void* addr, int instLimit, int sizeLimit)
  • Daodan/src/Daodan_Patch.h

    r994 r1008  
    1616bool DDrPatch_Int16(short* dest, unsigned short value);
    1717bool DDrPatch_NOOP(char* dest, unsigned int length);
     18void* DDrPatch_ExecutableASM(char* from, char* nextInst, const unsigned char* code, int length);
    1819
    1920void DDrPatch_PrintDisasm(void* addr, int instLimit, int sizeLimit);
  • Daodan/src/Patches/Patches.c

    r1000 r1008  
    278278
    279279
    280 
     280void DD_Patch_CharacterAwareness()
     281{
     282        const unsigned char patch[] =
     283        {
     284                0x52,                           //  0: push   edx
     285                0xBA, 0xA0, 0x16, 0x00, 0x00,   //  1: mov    edx,0x16a0
     286                0x89, 0xF8,                     //  6: mov    eax,edi
     287                0xF7, 0xE2,                     //  8: mul    edx
     288                0x89, 0xC2,                     //  a: mov    edx,eax
     289                0xE8, 0x00, 0x00, 0x00, 0x00,   //  c: call   ONrGameState_LivingCharacterList_Get (-> OniExe + 0x000fca90)
     290                0x8B, 0x00,                     // 11: mov    eax,[eax]
     291                0x01, 0xD0,                     // 13: add    eax,edx
     292                0x89, 0xC6,                     // 15: mov    esi,eax
     293                0x5A,                           // 17: pop    edx
     294                0x8B, 0x46, 0x04,               // 18: (ORIG) mov        eax, dword [ds:esi+0x4]
     295                0xF6, 0xC4, 0x80                // 1b: (ORIG) test       ah, 0x80
     296        };
     297        void* newCode = DDrPatch_ExecutableASM((char*)(OniExe + 0x0009A609), (char*)(OniExe + 0x0009A60F), patch, sizeof(patch));
     298        if ((int)newCode > 0) {
     299                DDrPatch_MakeCall((char*)(newCode+0xC), (char*)(OniExe + 0x000FCA90));
     300                DDrPatch_NOOP((char*)(OniExe + 0x0009A60E), 1);
     301        }
     302}
    281303
    282304
     
    321343        if (DDrConfig_GetOptOfType("modding.d_regen", C_BOOL)->value.intBoolVal)
    322344                DD_Patch_Regeneration();
     345
     346        if (DDrConfig_GetOptOfType("gameplay.characterawareness", C_BOOL)->value.intBoolVal)
     347                DD_Patch_CharacterAwareness();
    323348
    324349        // Cheats always enabled
  • Daodan/src/_Version.h

    r1007 r1008  
    66
    77#define DAODAN_VERSION_MAJOR 3
    8 #define DAODAN_VERSION_MINOR 8
     8#define DAODAN_VERSION_MINOR 9
    99#define DAODAN_VERSION_STRING STRINGIZE(DAODAN_VERSION_MAJOR) "." STRINGIZE(DAODAN_VERSION_MINOR)
    1010
Note: See TracChangeset for help on using the changeset viewer.