SANCTUAIRE - OpenMMO/openMMO GitHub Wiki
##Calcul du sanctuaire en fonction des coordonnées et vis-versa
Cette page vous expose l'algorithme de calcul du sanctuaire en fonction des coordonnées et de la récupération des coordonnées en fonction du sanctuaire.
##Reverse
Pour la recherche assembleur j'ai effectué une simple recherche sur la valeur 20020 (4E34h) qui est l'identifiant du flag sanctuaire d'un personnage.
.text:0041C5BC loc_41C5BC: ; CODE XREF: Character::Death(_ATTACK_STRUCTURE *,Unit *)+1279 j
.text:0041C5BC ; Character::Death(_ATTACK_STRUCTURE *,Unit *)+1366 j
.text:0041C5BC mov edx, [esi]
.text:0041C5BE push ebx
.text:0041C5BF push 4E34h ; Id du flag sanctuaire (20020 en décimale)
.text:0041C5C4 mov ecx, esi
.text:0041C5C6 mov [ebp+var_30], ebx
.text:0041C5C9 call dword ptr [edx+0Ch] ; Lecture de la valeur contenue dans le flag 20020
.text:0041C5CC cmp eax, ebx
.text:0041C5CE jz short loc_41C617
.text:0041C5D0 mov edi, eax
.text:0041C5D2 mov ebx, eax
.text:0041C5D4 and eax, 0FFh ; 255 en décimal
.text:0041C5D9 shr edi, 14h ; Decalage des bits vers la droite de 20
.text:0041C5DC shr ebx, 8 ; Décalage des bits vers la droite de 8
.text:0041C5DF push eax
.text:0041C5E0 and edi, 0FFFh ; 4095 en décimal
.text:0041C5E6 and ebx, 0FFFh ; 4095 en décimal
.text:0041C5EC mov [ebp+var_80], eax
.text:0041C5EF call ?GetWorld@TFCMAIN@@SAPAVWorldMap@@G@Z ; TFCMAIN::GetWorld(ushort)
.text:0041C5F4 add esp, 4
.text:0041C5F7 test eax, eax
.text:0041C5F9 jz short loc_41C617
.text:0041C5FB xor ecx, ecx
.text:0041C5FD mov cx, [eax+2Ch]
.text:0041C601 cmp edi, ecx
.text:0041C603 jge short loc_41C617
.text:0041C605 xor edx, edx
.text:0041C607 mov dx, [eax+2Eh]
.text:0041C60B cmp ebx, edx
.text:0041C60D jge short loc_41C617
.text:0041C60F test edi, edi
.text:0041C611 jl short loc_41C617
.text:0041C613 test ebx, ebx
.text:0041C615 jge short loc_41C62B
.text:0041C617
Dans notre cas, vu que le calcul du sanctuaire est relativement simple, nous ne chercherons pas dans le désassembleur la fonction inverse de celui-ci, une simple réécriture inverse de notre algorithmes suffira pour en avoir l'envers.
##Algorithme du calcul du sanctuaire
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int x = 1400, y = 400, w = 0;
__int64 sanctuary = 0;
cout << "Start coordinates : " << x << "," << y << "," << w << "\n";
sanctuary = ((short)x << 20) + ((short)y << 8) + (short)w; // (x * 1048576) + (y * 256) + w;
cout << "Sanctuary : " << sanctuary << "\n";
x = ((short)(sanctuary >> 20) & 0x0FFF);
y = ((short)(sanctuary >> 8) & 0x0FFF);
w = sanctuary & 0x0FF;
cout << "Calculates the coordinates : " << x << "," << y << "," << w << "\n";
system("PAUSE");
return EXIT_SUCCESS;
}