(12.01.2021 21:39)Raistlin Wrote:  
Code: 
 char __thiscall AdvMng_4_Arena(void *AvdMng, int hero, int obj, char xyz) 
{ 
  _AdvMgr_ *AvdMan; // esi 
  char result; // al 
  signed int v6; // ebx 
  char v7; // al 
  signed int v8; // ecx 
  signed int v9; // eax 
 
  AvdMan = AvdMng; 
  if ( !sub_004E5630(hero, obj) ) 
  { 
    v6 = 0; 
    if ( xyz ) 
    { 
      AdvMgr_SetTimer(AvdMan, 0, -1); 
      AdvMgr_UpdateInfoPanel(AvdMan, 0, 1, 1); 
      b_MsgBox(*o_Advevent_TXT->GetString, 10, -1, -1, 31, 2, 32, 2, -1, 0, -1, 0); 
      if ( o_WndMgr->ResultItemId == 30729 ) 
      { 
        v6 = 0; 
      } 
      else if ( o_WndMgr->ResultItemId == 30730 ) 
      { 
LABEL_20: 
        v6 = 1; 
        goto LABEL_21; 
      } 
LABEL_21: 
      *(v6 + hero + 1142) += 2; 
      return sub_004E5650(hero, obj); 
    } 
    v7 = *(hero + 1142); 
    if ( v7 <= 99 ) 
    { 
      if ( v7 <= 0 ) 
        v8 = 0; 
      else 
        v8 = v7; 
    } 
    else 
    { 
      v8 = 99; 
    } 
    LOBYTE(v9) = *(hero + 1143); 
    if ( v9 <= 99 ) 
    { 
      if ( v9 <= 0 ) 
        v9 = 0; 
      else 
        v9 = v9; 
    } 
    else 
    { 
      v9 = 99; 
    } 
    if ( v8 <= v9 ) 
      goto LABEL_21; 
    goto LABEL_20; 
  } 
  result = xyz; 
  if ( xyz ) 
    result = b_MsgBox(*(o_Advevent_TXT->GetString + 4), 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0); 
  return result; 
}
  
 
Для сравнения это же самое, но уже из MoP 2.19:
 
Code: 
 CPU Disasm 
Address   Hex dump                    Command                                  Comments 
0049E3BC  /$  55                      PUSH EBP                                 ; MoP.0049E3BC(guessed Arg1,Arg2,Arg3) 
0049E3BD  |.  8BEC                    MOV EBP,ESP 
0049E3BF  |.  8B55 0C                 MOV EDX,DWORD PTR SS:[ARG.2] 
0049E3C2  |.  33C0                    XOR EAX,EAX 
0049E3C4  |.  40                      INC EAX 
0049E3C5  |.  57                      PUSH EDI 
0049E3C6  |.  8B0A                    MOV ECX,DWORD PTR DS:[EDX] 
0049E3C8  |.  8B7D 08                 MOV EDI,DWORD PTR SS:[ARG.1] 
0049E3CB  |.  D3E0                    SHL EAX,CL 
0049E3CD  |.  8547 73                 TEST DWORD PTR DS:[EDI+73],EAX 
0049E3D0  |.  8A4D 10                 MOV CL,BYTE PTR SS:[ARG.3] 
0049E3D3  |.  75 60                   JNZ SHORT 0049E435 
0049E3D5  |.  0947 73                 OR DWORD PTR DS:[EDI+73],EAX 
0049E3D8  |.  84C9                    TEST CL,CL 
0049E3DA  |.  74 4E                   JZ SHORT 0049E42A 
0049E3DC  |.  A1 686A6900             MOV EAX,DWORD PTR DS:[696A68] 
0049E3E1  |.  6A 02                   PUSH 2                                   ; /Arg6 = 2 
0049E3E3  |.  6A 20                   PUSH 20                                  ; |Arg5 = 20 
0049E3E5  |.  6A 02                   PUSH 2                                   ; |Arg4 = 2 
0049E3E7  |.  8B48 20                 MOV ECX,DWORD PTR DS:[EAX+20]            ; | 
0049E3EA  |.  6A 1F                   PUSH 1F                                  ; |Arg3 = 1F 
0049E3EC  |.  6A 07                   PUSH 7                                   ; |Arg2 = 7 
0049E3EE  |.  FF31                    PUSH DWORD PTR DS:[ECX]                  ; |Arg1 
0049E3F0  |.  E8 EBC62A00             CALL 0074AAE0                            ; \MoP.0074AAE0 
0049E3F5  |.  83C0 07                 ADD EAX,7 
0049E3F8  |>  50                      PUSH EAX 
0049E3F9  |.  A1 14399A02             MOV EAX,DWORD PTR DS:[29A3914] 
0049E3FE  |.  8BCF                    MOV ECX,EDI 
0049E400  |.  E8 4469F6FF             CALL 00404D49 
0049E405  |.  59                      POP ECX 
0049E406  |.  8988 A0030000           MOV DWORD PTR DS:[EAX+3A0],ECX 
0049E40C  |.  C780 A4030000 02000000  MOV DWORD PTR DS:[EAX+3A4],2 
0049E416  |>  81C1 6E040000           ADD ECX,46E 
0049E41C  |.  8A040F                  MOV AL,BYTE PTR DS:[ECX+EDI] 
0049E41F  |.  3C 7E                   CMP AL,7E 
0049E421  |.  7D 1B                   JGE SHORT 0049E43E 
0049E423  |.  04 02                   ADD AL,2 
0049E425  |.  88040F                  MOV BYTE PTR DS:[ECX+EDI],AL 
0049E428  |.  EB 14                   JMP SHORT 0049E43E 
0049E42A  |>  33C9                    XOR ECX,ECX 
0049E42C  |.  B1 08                   MOV CL,8 
0049E42E  |>  E8 326BF6FF             CALL 00404F65 
0049E433  |.^ EB E1                   JMP SHORT 0049E416 
0049E435  |>  84C9                    TEST CL,CL 
0049E437  |.  74 05                   JZ SHORT 0049E43E 
0049E439  |.  E8 4E69F6FF             CALL 00404D8C 
0049E43E  |>  5F                      POP EDI 
0049E43F  |.  5D                      POP EBP 
0049E440  |.  C2 0C00                 RETN 0C
  
 
Code: 
 CPU Disasm 
Address   Hex dump                    Command                                  Comments 
0049E4E8  /$  55                      PUSH EBP                                 ; MoP.0049E4E8(guessed Arg1,Arg2,Arg3) 
0049E4E9  |.  8BEC                    MOV EBP,ESP 
0049E4EB  |.  8B55 0C                 MOV EDX,DWORD PTR SS:[ARG.2] 
0049E4EE  |.  33C0                    XOR EAX,EAX 
0049E4F0  |.  40                      INC EAX 
0049E4F1  |.  57                      PUSH EDI 
0049E4F2  |.  8B0A                    MOV ECX,DWORD PTR DS:[EDX] 
0049E4F4  |.  8B7D 08                 MOV EDI,DWORD PTR SS:[ARG.1] 
0049E4F7  |.  D3E0                    SHL EAX,CL 
0049E4F9  |.  8547 7F                 TEST DWORD PTR DS:[EDI+7F],EAX 
0049E4FC  |.  8A4D 10                 MOV CL,BYTE PTR SS:[ARG.3] 
0049E4FF  |.^ 0F85 30FFFFFF           JNZ 0049E435 
0049E505  |.  0947 7F                 OR DWORD PTR DS:[EDI+7F],EAX 
0049E508  |.  84C9                    TEST CL,CL 
0049E50A  |.  74 22                   JZ SHORT 0049E52E 
0049E50C  |.  A1 686A6900             MOV EAX,DWORD PTR DS:[696A68] 
0049E511  |.  6A 02                   PUSH 2                                   ; /Arg6 = 2 
0049E513  |.  6A 22                   PUSH 22                                  ; |Arg5 = 22 
0049E515  |.  6A 02                   PUSH 2                                   ; |Arg4 = 2 
0049E517  |.  8B48 20                 MOV ECX,DWORD PTR DS:[EAX+20]            ; | 
0049E51A  |.  6A 21                   PUSH 21                                  ; |Arg3 = 21 
0049E51C  |.  6A 07                   PUSH 7                                   ; |Arg2 = 7 
0049E51E  |.  FF71 50                 PUSH DWORD PTR DS:[ECX+50]               ; |Arg1 
0049E521  |.  E8 BAC52A00             CALL 0074AAE0                            ; \MoP.0074AAE0 
0049E526  |.  83C0 09                 ADD EAX,9 
0049E529  |.^ E9 CAFEFFFF             JMP 0049E3F8 
0049E52E  |>  33C9                    XOR ECX,ECX 
0049E530  |.  B1 0A                   MOV CL,0A 
0049E532  \.^ E9 F7FEFFFF             JMP 0049E42E
  
Такой вот коддинг на Ассемблере   
 (12.01.2021 21:39)Raistlin Wrote:  Если честно, мне не кажется что тут стоит что-то хукать, а удобнее просто изменить 6 значений. 
Из моей практики - такие вот "обезьяньи патчи" при накоплении их в коде программы приводят к путанице и последующим бесконтрольным ошибкам. Недавно вроде б в закрытом чате эту тему затрагивали, вот даже на вики кто-то ссылку кидал:  https://ru.wikipedia.org/wiki/Monkey_patch . Вроде б все сошлись на том, что на Си это зло (да и на Ассемблере тоже), требующее полного искоренения (хотя и Тифон немного грешит этим, потому что мне просто было лень затаскивать огромные содовские функции в dll).
			  
			
			
			
				
(This post was last modified: 13.01.2021 01:23 by XEPOMAHT.)
 
			 
		 |