Reverse-engineering du fichier T4C.exe (version NMS 1.66)
Reverse-engineering du fichier T4C.exe (version NMS 1.66)
Activation de ma météo dans n'importe qu'elle zone
Par défaut dans le client 1.66NMS, il y a des restrictions météo qui empêchent tout simplement le développement correct d'un plugin météo sur votre serveur.
Les restrictions
- La neige est fonctionnelle uniquement sur les deux petites île de neige ce trouvant sur le monde 4 (Leoworld) et sur le monde 0 (WorldMap). - La pluie ne fonctionne que sur le monde 0 (WorldMap) et sur le monde 3(UnderWorld) dans les coordonnée Y inférieur à 1536 (0x600). - La météo est totalement désactivée sur le monde 1 (DungeonMap) et 2 (CavernMap).
Les souhaits
- Nous souhaitons rendre toute météo disponibles sur n'importe qu'elle zone du jeu afin de pouvoir développez en accoté un système de gestion météo.
Le code vu dans IDA Pro avec une annotation personnelle (Lecture du paquet)
Réception d'un paquet météo de type 104 (0x68)
.text:004E2FAB loc_4E2FAB: ; CODE XREF: sub_4DE2A9+38D�j .text:004E2FAB ; DATA XREF: .text:off_4E9D78�o .text:004E2FAB push offset aPak104 ; Paket Wheater 104 .text:004E2FB0 mov ecx, offset DebugLoggerInstance .text:004E2FB5 call DebugLog
Lecture de l'identifiant de l'effet météo
Il y a une lecture d'un long dans le paquet récupérant l'identifiant de l'id météo.
.text:004E2FBA lea ecx, [ebp+WeatherID] .text:004E2FC0 push ecx .text:004E2FC1 mov ecx, [ebp+Paket] .text:004E2FC4 call PaketReadLong
Lecture de la valeur du flag météo
Il y a également une lecture d'un word récupérant la valeur du flag de l'effet météo, cette valeur indique au client si il doit afficher ou non l'effet X. (Par x nous noterons l'effet météo : 1 Pluie; 2 Neige; 3 Brouillard).
.text:004E2FC9 lea edx, [ebp+WeatherFlagValue1] .text:004E2FCF push edx .text:004E2FD0 mov ecx, [ebp+Paket] .text:004E2FD3 call PaketReadWord
En fonction de l'identifiant météo on Set quelques variable interne pour mémoriser l'effet et sont statut
.text:004E2FD8 movsx eax, word ptr [ebp+WeatherFlagValue1] .text:004E2FDF mov [ebp+WheaterFlagValue2], eax .text:004E2FE5 cmp [ebp+WheaterFlagValue2], WeatherFlag_Off .text:004E2FEC jz short DesactivateWeather ; Désactivation de la météo .text:004E2FEE cmp [ebp+WheaterFlagValue2], WeatherFlag_On .text:004E2FF5 jz short ActivateWeather ; Activation de la météo .text:004E2FF7 jmp short DesactivateWeather1 ; Désactivation de la météo .text:004E2FF9 ; --------------------------------------------------------------------------- .text:004E2FF9 .text:004E2FF9 DesactivateWeather: ; CODE XREF: sub_4DE2A9+4D43�j .text:004E2FF9 mov [ebp+WeatherFlagValue3], WeatherFlag_Off ; Désactivation de la météo .text:004E3000 jmp short CheckWeatherEffectRain ; Si c'est l'effet Pluie (Id 1) .text:004E3002 ; --------------------------------------------------------------------------- .text:004E3002 .text:004E3002 ActivateWeather: ; CODE XREF: sub_4DE2A9+4D4C�j .text:004E3002 mov [ebp+WeatherFlagValue3], WeatherFlag_On ; Activation de la météo .text:004E3009 jmp short CheckWeatherEffectRain ; Si c'est l'effet Pluie (Id 1) .text:004E300B ; --------------------------------------------------------------------------- .text:004E300B .text:004E300B DesactivateWeather1: ; CODE XREF: sub_4DE2A9+4D4E�j .text:004E300B mov [ebp+WeatherFlagValue3], WeatherFlag_Off ; Désactivation de la météo .text:004E3012 .text:004E3012 CheckWeatherEffectRain: ; CODE XREF: sub_4DE2A9+4D57�j .text:004E3012 ; sub_4DE2A9+4D60�j .text:004E3012 cmp [ebp+WeatherID], WheaterFlagId_Rain ; Si c'est l'effet Pluie (Id 1) .text:004E3019 jnz short CheckWeatherEffectSnow ; Sinon on jump sur la vérification de l'effet Neige .text:004E301B mov cl, [ebp+WeatherFlagValue3] .text:004E3021 mov EffectRain, cl ; On copie la valeur du flag météo dans la variable de la pluie .text:004E3027 jmp short JumpToDebugLoggerInstance .text:004E3029 ; --------------------------------------------------------------------------- .text:004E3029 .text:004E3029 CheckWeatherEffectSnow: ; CODE XREF: sub_4DE2A9+4D70�j .text:004E3029 cmp [ebp+WeatherID], WheaterFlagId_Snow ; Si c'est l'effet Neige (Id 2) .text:004E3030 jnz short CheckWeatherEffectFog ; Sinon on jump sur la vérification de l'effet Brouillard .text:004E3032 mov dl, [ebp+WeatherFlagValue3] .text:004E3038 mov EffectSnow, dl ; On copie la valeur du flag météo dans la variable de la neige .text:004E303E jmp short JumpToDebugLoggerInstance .text:004E3040 ; --------------------------------------------------------------------------- .text:004E3040 .text:004E3040 CheckWeatherEffectFog: ; CODE XREF: sub_4DE2A9+4D87�j .text:004E3040 cmp [ebp+WeatherID], WheaterFlagId_Fog ; Si c'est l'effet Brouillard (Id 3) .text:004E3047 jnz short JumpToDebugLoggerInstance ; Sinon on jump sur la l'instance des logs .text:004E3049 mov al, [ebp+WeatherFlagValue3] .text:004E304F mov EffectFog, al ; On copie la valeur du flag météo dans la variable du brouillard .text:004E3054 .text:004E3054 JumpToDebugLoggerInstance: ; CODE XREF: sub_4DE2A9+4D7E�j .text:004E3054 ; sub_4DE2A9+4D95�j ... .text:004E3054 push offset asc_6B5C3C ; "\r\n" .text:004E3059 mov ecx, offset DebugLoggerInstance .text:004E305E call DebugLog .text:004E3063 jmp loc_4E9B3B
Le code vu dans IDA Pro avec une annotation personnelle (Gestion du thread météo)
Nous voici maintenant dans le thread de la gestion d'affichage de la météo, c'est précisément ici que nous trouverons nos contraintes d'affichage.
Dans un premier temps vous aurez le code assembleur complet de la gestion météo jusqu'à l'arrête de mes recherches après que celle-ci fonctionne comme voulu.
Je marquerais quelques points d'arrêt sur les zones importantes et sur les modifications à effectuer.
.text:006026F0 loc_6026F0: ; CODE XREF: sub_602309+38E j .text:006026F0 push 0 .text:006026F2 mov ecx, offset unk_8E6C60 .text:006026F7 call sub_64F460 .text:006026FC xor ecx, ecx .text:006026FE mov cl, EffectRain .text:00602704 test ecx, ecx
Première détection du système (Est-ce la pluie ?)
Dans cette première partie, nous vérifions si il s’agit de la pluie, sinon nous passons à l'effet suivant. Quelques ligne plus bas un second test qui redirige ou non dans la section de la pluie.
.text:00602706 jz short loc_60273E ; On vérifie si c'est bien l'éffet de la pluie .text:00602708 mov edx, [ebp-2B0h] .text:0060270E xor eax, eax .text:00602710 mov ax, [edx+113C0h] .text:00602717 test eax, eax .text:00602719 jnz short loc_60273E .text:0060271B mov ecx, [ebp-2B0h] .text:00602721 mov word ptr [ecx+113C0h], 1 .text:0060272A mov edx, [ebp-2B0h] .text:00602730 mov word ptr [edx+113C2h], 0 .text:00602739 jmp loc_602889 ; On indique dans la variable locale que la météo est OFF .text:00602739 ; Vu la suite du code, il me faut simplement mettre cette .text:00602739 ; pour que la neige fonctionne en dehors de ces deux îles .text:0060273E ; --------------------------------------------------------------------------- .text:0060273E .text:0060273E loc_60273E: ; CODE XREF: sub_602309+3FD j .text:0060273E ; sub_602309+410 j .text:0060273E xor eax, eax .text:00602740 mov al, EffectRain .text:00602745 test eax, eax .text:00602747 jz loc_6027DD .text:0060274D mov ecx, [ebp-2B0h] .text:00602753 xor edx, edx .text:00602755 mov dx, [ecx+113C0h] .text:0060275C cmp edx, 1 .text:0060275F jnz short loc_6027DD .text:00602761 mov eax, [ebp-2B0h] .text:00602767 xor ecx, ecx .text:00602769 mov cx, [eax+113C2h] .text:00602770 cmp ecx, 4Ch .text:00602773 jge short loc_6027C9 .text:00602775 mov edx, [ebp-2B0h] .text:0060277B mov eax, [edx+113C4h] .text:00602781 xor edx, edx .text:00602783 mov ecx, 2 .text:00602788 div ecx .text:0060278A mov eax, [ebp-2B0h] .text:00602790 mov ecx, [eax+113C4h] .text:00602796 add ecx, 1 .text:00602799 mov eax, [ebp-2B0h] .text:0060279F mov [eax+113C4h], ecx .text:006027A5 test edx, edx .text:006027A7 jz short loc_6027C7 .text:006027A9 mov ecx, [ebp-2B0h] .text:006027AF mov dx, [ecx+113C2h] .text:006027B6 add dx, 4 .text:006027BA mov eax, [ebp-2B0h] .text:006027C0 mov [eax+113C2h], dx .text:006027C7 .text:006027C7 loc_6027C7: ; CODE XREF: sub_602309+49E j .text:006027C7 jmp short loc_6027D8 .text:006027C9 ; --------------------------------------------------------------------------- .text:006027C9 .text:006027C9 loc_6027C9: ; CODE XREF: sub_602309+46A j .text:006027C9 mov ecx, [ebp-2B0h] .text:006027CF mov word ptr [ecx+113C0h], 2 .text:006027D8 .text:006027D8 loc_6027D8: ; CODE XREF: sub_602309:loc_6027C7 j .text:006027D8 jmp loc_602889 ; On indique dans la variable locale que la météo est OFF .text:006027D8 ; Vu la suite du code, il me faut simplement mettre cette .text:006027D8 ; pour que la neige fonctionne en dehors de ces deux îles .text:006027DD ; --------------------------------------------------------------------------- .text:006027DD .text:006027DD loc_6027DD: ; CODE XREF: sub_602309+43E j .text:006027DD ; sub_602309+456 j .text:006027DD xor edx, edx .text:006027DF mov dl, EffectRain .text:006027E5 test edx, edx .text:006027E7 jnz loc_602889 ; On indique dans la variable locale que la météo est OFF .text:006027E7 ; Vu la suite du code, il me faut simplement mettre cette .text:006027E7 ; pour que la neige fonctionne en dehors de ces deux îles .text:006027ED mov eax, [ebp-2B0h] .text:006027F3 xor ecx, ecx .text:006027F5 mov cx, [eax+113C0h] .text:006027FC test ecx, ecx .text:006027FE jz loc_602889 ; On indique dans la variable locale que la météo est OFF .text:006027FE ; Vu la suite du code, il me faut simplement mettre cette .text:006027FE ; pour que la neige fonctionne en dehors de ces deux îles .text:00602804 mov edx, [ebp-2B0h] .text:0060280A xor eax, eax .text:0060280C mov ax, [edx+113C2h] .text:00602813 test eax, eax .text:00602815 jle short loc_60286B .text:00602817 mov ecx, [ebp-2B0h] .text:0060281D mov eax, [ecx+113C4h] .text:00602823 xor edx, edx .text:00602825 mov ecx, 2 .text:0060282A div ecx .text:0060282C mov eax, [ebp-2B0h] .text:00602832 mov ecx, [eax+113C4h] .text:00602838 add ecx, 1 .text:0060283B mov eax, [ebp-2B0h] .text:00602841 mov [eax+113C4h], ecx .text:00602847 test edx, edx .text:00602849 jz short loc_602869 .text:0060284B mov ecx, [ebp-2B0h] .text:00602851 mov dx, [ecx+113C2h] .text:00602858 sub dx, 4 .text:0060285C mov eax, [ebp-2B0h] .text:00602862 mov [eax+113C2h], dx .text:00602869 .text:00602869 loc_602869: ; CODE XREF: sub_602309+540 j .text:00602869 jmp short loc_602889 ; On indique dans la variable locale que la météo est OFF .text:00602869 ; Vu la suite du code, il me faut simplement mettre cette .text:00602869 ; pour que la neige fonctionne en dehors de ces deux îles .text:0060286B ; --------------------------------------------------------------------------- .text:0060286B loc_60286B: ; CODE XREF: sub_602309+50C j .text:0060286B mov ecx, [ebp-2B0h] .text:00602871 mov word ptr [ecx+113C0h], 0 .text:0060287A mov edx, [ebp-2B0h] .text:00602880 mov word ptr [edx+113C2h], 0 .text:00602889
Première contrainte (Interdiction de la pluie sur les île de neige)
Comme nous pouvons le voir ci-dessous, nous avons 2 contraintes imbriquées qui vérifient des coordonnées.
Mais dans un premier temps regardons bien nous voyons :
.text:00602889 loc_602889: ; CODE XREF: sub_602309+430 j .text:00602889 ; sub_602309:loc_6027D8 j ... .text:00602889 mov byte ptr [ebp-4], WeatherFlag_Off ; On indique dans la variable locale que la météo est OFF .text:00602889 ; Vu la suite du code, il me faut simplement mettre cette .text:00602889 ; pour que la neige fonctionne en dehors de ces deux îles
Nous avons pu remarquer une variable locale qui et mise à 0 et dans les quelques lignes qui suivent nous remarquerons que cette variable locale et remise à 1 si les test sont réussit.
Cela nous indique clairement que cette variable joue une rôle d'interrupteur dans c'est premières contraintes. Nous nommerons la variable WeatherCheck1 pour que vous puissiez l'identifier dans la suite des nos recherches.
Première contrainte (Interdiction de la pluie sur les île de neige du monde 0 (WorldMap))
Comme nous pouvons le voir ici, nous vérifions clairement une zone sur le monde 0 (WorldMap), la zone est codée en dur dans le client ce qui n'offre aucune souplesse et possibilité pour clients Dialsoft possédant une licence d'exploitation du jeu T4C...
.text:0060288D mov byte ptr [ebp-8], 0 .text:00602891 movsx eax, PlayerPosW ; Copie la position W du joueur dans eax .text:00602898 test eax, eax ; World 0 .text:0060289A jnz short loc_6028DB ; Si eax = 0; zf vaut 1; si zf vaut un on jump .text:0060289A ; Si le monde est différent de 0 on saute .text:0060289C movsx ecx, PlayerPosX ; Copie la position X du joueur dans ecx .text:006028A3 cmp ecx, 97Ah ; PosX1 = 2426 .text:006028A9 jle short loc_6028DB ; Si la position X du joueur et plus petite ou égale à 2426 on saute .text:006028AB movsx edx, PlayerPosX ; Copie la position X du joueur dans edx .text:006028B2 cmp edx, 0A61h ; PosX2 = 2657 .text:006028B8 jge short loc_6028DB ; Si la position X du joueur et plus grande ou égale à 2657 on saute .text:006028BA movsx eax, word ptr PlayerPosY ; Copie la position Y du joueur dans eax .text:006028C1 cmp eax, 864h ; PosY1 = 2148 .text:006028C6 jle short loc_6028DB ; Si la position Y du joueur et plus petite ou égale à 2148 on saute .text:006028C8 movsx ecx, word ptr PlayerPosY ; Copie la position Y du joueur dans ecx .text:006028CF cmp ecx, 996h ; PosY2 = 2454 .text:006028D5 jge short loc_6028DB ; Si la position Y du joueur et plus petite ou égale à 2454 on saute .text:006028D7 mov byte ptr [ebp-4], WeatherFlag_On ; On indique dans la variable locale que la météo est ON .text:006028DB
Les coordonnées ci-dessus réprenste une zone rectangulaire qui correspond exactement à l'image ci-dessous :
Si les tests de coordonnées sont négatifs nous allons directement dans le second test de coordonnées.
Première contrainte (Interdiction de la pluie sur les île de neige du monde 4 (LeoWorld))
Idem que le premier test, nous vérifions cette fois-ci une zone sur le monde 4 (LeoWorld). Cette zone définit également très précisément l'île de neige sur ce monde.
.text:006028DB loc_6028DB: ; CODE XREF: sub_602309+591 j .text:006028DB ; sub_602309+5A0 j ... .text:006028DB movsx edx, PlayerPosW ; Copie la position W du joueur dans edx .text:006028E2 cmp edx, 4 ; World 4 .text:006028E5 jnz short loc_602922 ; Si edx = 0; zf vaut 1; si zf vaut un on jump .text:006028E5 ; Si le monde est différent de 4 on saute .text:006028E7 movsx eax, PlayerPosX ; Copie la position X du joueur dans eax .text:006028EE cmp eax, 48Bh ; PosX1 = 1163 .text:006028F3 jle short loc_602922 ; Si la position X du joueur et plus petite ou égale à 1163 on saute .text:006028F5 movsx ecx, PlayerPosX ; Copie la position X du joueur dans ecx .text:006028FC cmp ecx, 7D0h ; PosX2 = 2000 .text:00602902 jge short loc_602922 ; Si la position X du joueur et plus grande ou égale à 2000 on saute .text:00602904 movsx edx, word ptr PlayerPosY ; Copie la position X du joueur dans edx .text:0060290B cmp edx, 53h ; PosY1 = 83 .text:0060290E jle short loc_602922 ; Si la position Y du joueur et plus petite ou égale à 83 on saute .text:00602910 movsx eax, word ptr PlayerPosY ; Copie la position X du joueur dans eax .text:00602917 cmp eax, 366h ; PosY2 = 870 .text:0060291C jge short loc_602922 ; Si la position Y du joueur et plus petite ou égale à 870 on saute .text:0060291E mov byte ptr [ebp-4], WeatherFlag_On ; On indique dans la variable locale que la météo est ON .text:00602922
Les coordonnées ci-dessus réprenste une zone rectangulaire qui correspond exactement à l'image ci-dessous :
Si les tests de coordonnées sont négatifs nous allons directement dans la seconde contrainte !
Seconde contrainte (Autirsation de la pluie uniquement sur certaines zones)
Dans le code assembleur ci-dessous nous avons affaire à notre seconde contrainte, celle-ci autorise uniquement la pluie sur le monde 0 (WorldMap) sauf dans la zone de neige (voir ci-dessus).
Et également une autorisation unique de la pluie dans les partie supérieur du monde 3 (UderWorld), c'est à dire que toutes les coordonnées Y supérieurs à 1536 (0x600) ne peuvent recevoir l'effet de la pluie.
.text:00602922 loc_602922: ; CODE XREF: sub_602309+5DC j .text:00602922 ; sub_602309+5EA j ... .text:00602922 movsx ecx, PlayerPosW ; Copie la position W du joueur dans ecx .text:00602929 test ecx, ecx ; World 0 .text:0060292B jz short loc_60294F ; Si edx = 0; zf vaut 1; si zf vaut un on jump .text:0060292B ; Si le monde est égal à 0 on saute .text:0060292D movsx edx, PlayerPosW ; Copie la position W du joueur dans edx .text:00602934 cmp edx, 3 ; World 3 .text:00602937 jnz loc_602A05 ; Si edx = 0; zf vaut 1; si zf vaut un on jump .text:00602937 ; Si le monde est différent de 3 on saute .text:0060293D movsx eax, word ptr PlayerPosY .text:00602944 cmp eax, 600h ; PosY <= 1536 .text:00602949 jge loc_602A05 ; Si la position Y du joueur et plus petite ou égale à 1356 on saute .text:0060294F
La gestion de la météo concernant la pluie ce poursuit (celle-ci ne nous intéresse pas) :
.text:0060294F loc_60294F: ; CODE XREF: sub_602309+622 j .text:0060294F mov ecx, [ebp-2B0h] .text:00602955 xor edx, edx .text:00602957 mov dx, [ecx+113C0h] .text:0060295E test edx, edx .text:00602960 jz loc_602A05 .text:00602966 mov ecx, offset unk_7EC5E0 .text:0060296B call sub_421420 .text:00602970 cmp dword ptr [eax+20h], 0 .text:00602974 jz loc_602A05 .text:0060297A mov eax, [ebp-4] .text:0060297D and eax, 0FFh .text:00602982 test eax, eax .text:00602984 jnz short loc_602A05 .text:00602986 push 18h .text:00602988 push 0 .text:0060298A lea ecx, [ebp-38h] .text:0060298D push ecx .text:0060298E call sub_65F330 .text:00602993 add esp, 0Ch .text:00602996 mov dword ptr [ebp-20h], 0 .text:0060299D mov dword ptr [ebp-1Ch], 0 .text:006029A4 mov ecx, offset unk_7196E0 .text:006029A9 call sub_417E70 .text:006029AE mov [ebp-18h], eax .text:006029B1 mov ecx, offset unk_7196E0 .text:006029B6 call sub_417E90 .text:006029BB mov [ebp-14h], eax .text:006029BE lea edx, [ebp-20h] .text:006029C1 mov [ebp-38h], edx .text:006029C4 mov eax, [ebp-2Ch] .text:006029C7 or al, 2 .text:006029C9 mov [ebp-2Ch], eax .text:006029CC mov ecx, [ebp-2B0h] .text:006029D2 mov edx, [ecx+113D0h] .text:006029D8 mov [ebp-30h], edx .text:006029DB lea eax, [ebp-38h] .text:006029DE push eax .text:006029DF mov ecx, [ebp-2B0h] .text:006029E5 add ecx, 965ACh .text:006029EB push ecx .text:006029EC mov edx, [ebp-2B0h] .text:006029F2 add edx, 9658Ch .text:006029F8 push edx .text:006029F9 call sub_6545B4 .text:006029FE mov ecx, eax .text:00602A00 call sub_654601 .text:00602A05
Première détection du système (Est-ce la neige ?)
Comme pour la pluie, dans cette première partie, nous vérifions si il s’agit de la neige, sinon nous passons à l'effet suivant qui sera le brouillard. Quelques ligne plus bas un second test qui redirige ou non dans la section de la de la neige.
Nous sauterons cette partie jusqu'au vif de notre modification !
.text:00602A05 loc_602A05: ; CODE XREF: sub_602309+62E j .text:00602A05 ; sub_602309+640 j ... .text:00602A05 xor eax, eax .text:00602A07 mov al, EffectSnow .text:00602A0C test eax, eax .text:00602A0E jz short loc_602A46 .text:00602A10 mov ecx, [ebp-2B0h] .text:00602A16 xor edx, edx .text:00602A18 mov dx, [ecx+113C8h] .text:00602A1F test edx, edx .text:00602A21 jnz short loc_602A46 .text:00602A23 mov eax, [ebp-2B0h] .text:00602A29 mov word ptr [eax+113C8h], 1 .text:00602A32 mov ecx, [ebp-2B0h] .text:00602A38 mov word ptr [ecx+113CAh], 0 .text:00602A41 jmp loc_602B92 .text:00602A46 ; --------------------------------------------------------------------------- .text:00602A46 .text:00602A46 loc_602A46: ; CODE XREF: sub_602309+705 j .text:00602A46 ; sub_602309+718 j .text:00602A46 xor edx, edx .text:00602A48 mov dl, EffectSnow .text:00602A4E test edx, edx .text:00602A50 jz loc_602AE6 .text:00602A56 mov eax, [ebp-2B0h] .text:00602A5C xor ecx, ecx .text:00602A5E mov cx, [eax+113C8h] .text:00602A65 cmp ecx, 1 .text:00602A68 jnz short loc_602AE6 .text:00602A6A mov edx, [ebp-2B0h] .text:00602A70 xor eax, eax .text:00602A72 mov ax, [edx+113CAh] .text:00602A79 cmp eax, 4Ch .text:00602A7C jge short loc_602AD2 .text:00602A7E mov ecx, [ebp-2B0h] .text:00602A84 mov eax, [ecx+113CCh] .text:00602A8A xor edx, edx .text:00602A8C mov ecx, 2 .text:00602A91 div ecx .text:00602A93 mov eax, [ebp-2B0h] .text:00602A99 mov ecx, [eax+113CCh] .text:00602A9F add ecx, 1 .text:00602AA2 mov eax, [ebp-2B0h] .text:00602AA8 mov [eax+113CCh], ecx .text:00602AAE test edx, edx .text:00602AB0 jz short loc_602AD0 .text:00602AB2 mov ecx, [ebp-2B0h] .text:00602AB8 mov dx, [ecx+113CAh] .text:00602ABF add dx, 4 .text:00602AC3 mov eax, [ebp-2B0h] .text:00602AC9 mov [eax+113CAh], dx .text:00602AD0 .text:00602AD0 loc_602AD0: ; CODE XREF: sub_602309+7A7 j .text:00602AD0 jmp short loc_602AE1 .text:00602AD2 ; --------------------------------------------------------------------------- .text:00602AD2 .text:00602AD2 loc_602AD2: ; CODE XREF: sub_602309+773 j .text:00602AD2 mov ecx, [ebp-2B0h] .text:00602AD8 mov word ptr [ecx+113C8h], 2 .text:00602AE1 .text:00602AE1 loc_602AE1: ; CODE XREF: sub_602309:loc_602AD0 j .text:00602AE1 jmp loc_602B92 .text:00602AE6 ; --------------------------------------------------------------------------- .text:00602AE6 .text:00602AE6 loc_602AE6: ; CODE XREF: sub_602309+747 j .text:00602AE6 ; sub_602309+75F j .text:00602AE6 xor edx, edx .text:00602AE8 mov dl, EffectSnow .text:00602AEE test edx, edx .text:00602AF0 jnz loc_602B92 .text:00602AF6 mov eax, [ebp-2B0h] .text:00602AFC xor ecx, ecx .text:00602AFE mov cx, [eax+113C8h] .text:00602B05 test ecx, ecx .text:00602B07 jz loc_602B92 .text:00602B0D mov edx, [ebp-2B0h] .text:00602B13 xor eax, eax .text:00602B15 mov ax, [edx+113CAh] .text:00602B1C test eax, eax .text:00602B1E jle short loc_602B74 .text:00602B20 mov ecx, [ebp-2B0h] .text:00602B26 mov eax, [ecx+113CCh] .text:00602B2C xor edx, edx .text:00602B2E mov ecx, 2 .text:00602B33 div ecx .text:00602B35 mov eax, [ebp-2B0h] .text:00602B3B mov ecx, [eax+113CCh] .text:00602B41 add ecx, 1 .text:00602B44 mov eax, [ebp-2B0h] .text:00602B4A mov [eax+113CCh], ecx .text:00602B50 test edx, edx .text:00602B52 jz short loc_602B72 .text:00602B54 mov ecx, [ebp-2B0h] .text:00602B5A mov dx, [ecx+113CAh] .text:00602B61 sub dx, 4 .text:00602B65 mov eax, [ebp-2B0h] .text:00602B6B mov [eax+113CAh], dx .text:00602B72 .text:00602B72 loc_602B72: ; CODE XREF: sub_602309+849 j .text:00602B72 jmp short loc_602B92 .text:00602B74 ; --------------------------------------------------------------------------- .text:00602B74 .text:00602B74 loc_602B74: ; CODE XREF: sub_602309+815 j .text:00602B74 mov ecx, [ebp-2B0h] .text:00602B7A mov word ptr [ecx+113C8h], 0 .text:00602B83 mov edx, [ebp-2B0h] .text:00602B89 mov word ptr [edx+113CAh], 0 .text:00602B92
En fonction des opérations ci-dessus le client exécute la neige ou saute directement à l'effet du brouillard.
.text:00602B92 loc_602B92: ; CODE XREF: sub_602309+738 j .text:00602B92 ; sub_602309:loc_602AE1 j ... .text:00602B92 mov eax, [ebp-4] .text:00602B95 and eax, 0FFh .text:00602B9A test eax, eax ; En fonction des opération ci-dessus, on interdit tout simplement la neige dans les autres zones .text:00602B9C jz loc_602C5A .text:00602BA2 mov ecx, [ebp-2B0h] .text:00602BA8 xor edx, edx .text:00602BAA mov dx, [ecx+113C8h] .text:00602BB1 test edx, edx .text:00602BB3 jz loc_602C5A .text:00602BB9 mov ecx, offset unk_7EC5E0 .text:00602BBE call sub_421420 .text:00602BC3 cmp dword ptr [eax+20h], 0 .text:00602BC7 jz loc_602C5A .text:00602BCD push 18h .text:00602BCF push 0 .text:00602BD1 lea eax, [ebp-60h] .text:00602BD4 push eax .text:00602BD5 call sub_65F330 .text:00602BDA add esp, 0Ch .text:00602BDD mov dword ptr [ebp-48h], 0 .text:00602BE4 mov dword ptr [ebp-44h], 0 .text:00602BEB mov ecx, offset unk_7196E0 .text:00602BF0 call sub_417E70 .text:00602BF5 mov [ebp-40h], eax .text:00602BF8 mov ecx, offset unk_7196E0 .text:00602BFD call sub_417E90 .text:00602C02 mov [ebp-3Ch], eax .text:00602C05 lea ecx, [ebp-48h] .text:00602C08 mov [ebp-60h], ecx .text:00602C0B mov edx, [ebp-54h] .text:00602C0E or edx, 2 .text:00602C11 mov [ebp-54h], edx .text:00602C14 mov eax, [ebp-2B0h] .text:00602C1A mov ecx, [eax+113D0h] .text:00602C20 mov [ebp-58h], ecx .text:00602C23 mov edx, [ebp-2B0h] .text:00602C29 mov ax, [edx+113CAh] .text:00602C30 push eax .text:00602C31 lea ecx, [ebp-60h] .text:00602C34 push ecx .text:00602C35 mov edx, [ebp-2B0h] .text:00602C3B add edx, 9664Ch .text:00602C41 push edx .text:00602C42 mov eax, [ebp-2B0h] .text:00602C48 add eax, 9662Ch .text:00602C4D push eax .text:00602C4E call sub_6545B4 .text:00602C53 mov ecx, eax .text:00602C55 call sub_654984 .text:00602C5A
Première détection du système (Est-ce la brouillard ?)
Comme pour la pluie et le brouillard, dans cette première partie, nous vérifions si il s’agit du brouillard, sinon nous sortons de la gestion météo.
Nous sauterons cette partie jusqu'au vif de notre modification !
.text:00602C5A loc_602C5A: ; CODE XREF: sub_602309+893 j .text:00602C5A ; sub_602309+8AA j ... .text:00602C5A xor ecx, ecx .text:00602C5C mov cl, EffectFog .text:00602C62 test ecx, ecx .text:00602C64 jz short loc_602C9C .text:00602C66 mov edx, [ebp-2B0h] .text:00602C6C xor eax, eax .text:00602C6E mov ax, [edx+113B8h] .text:00602C75 test eax, eax .text:00602C77 jnz short loc_602C9C .text:00602C79 mov ecx, [ebp-2B0h] .text:00602C7F mov word ptr [ecx+113B8h], 1 .text:00602C88 mov edx, [ebp-2B0h] .text:00602C8E mov word ptr [edx+113BAh], 0 .text:00602C97 jmp loc_602DEA ; Copie la position W du joueur dans eax .text:00602C9C ; --------------------------------------------------------------------------- .text:00602C9C .text:00602C9C loc_602C9C: ; CODE XREF: sub_602309+95B j .text:00602C9C ; sub_602309+96E j .text:00602C9C xor eax, eax .text:00602C9E mov al, EffectFog .text:00602CA3 test eax, eax .text:00602CA5 jz loc_602D3E .text:00602CAB mov ecx, [ebp-2B0h] .text:00602CB1 xor edx, edx .text:00602CB3 mov dx, [ecx+113B8h] .text:00602CBA cmp edx, 1 .text:00602CBD jnz short loc_602D3E .text:00602CBF mov eax, [ebp-2B0h] .text:00602CC5 xor ecx, ecx .text:00602CC7 mov cx, [eax+113BAh] .text:00602CCE cmp ecx, 8Ch .text:00602CD4 jge short loc_602D2A .text:00602CD6 mov edx, [ebp-2B0h] .text:00602CDC mov eax, [edx+113BCh] .text:00602CE2 xor edx, edx .text:00602CE4 mov ecx, 2 .text:00602CE9 div ecx .text:00602CEB mov eax, [ebp-2B0h] .text:00602CF1 mov ecx, [eax+113BCh] .text:00602CF7 add ecx, 1 .text:00602CFA mov eax, [ebp-2B0h] .text:00602D00 mov [eax+113BCh], ecx .text:00602D06 test edx, edx .text:00602D08 jz short loc_602D28 .text:00602D0A mov ecx, [ebp-2B0h] .text:00602D10 mov dx, [ecx+113BAh] .text:00602D17 add dx, 4 .text:00602D1B mov eax, [ebp-2B0h] .text:00602D21 mov [eax+113BAh], dx .text:00602D28 .text:00602D28 loc_602D28: ; CODE XREF: sub_602309+9FF j .text:00602D28 jmp short loc_602D39 .text:00602D2A ; --------------------------------------------------------------------------- .text:00602D2A .text:00602D2A loc_602D2A: ; CODE XREF: sub_602309+9CB j .text:00602D2A mov ecx, [ebp-2B0h] .text:00602D30 mov word ptr [ecx+113B8h], 2 .text:00602D39 .text:00602D39 loc_602D39: ; CODE XREF: sub_602309:loc_602D28 j .text:00602D39 jmp loc_602DEA ; Copie la position W du joueur dans eax .text:00602D3E ; --------------------------------------------------------------------------- .text:00602D3E .text:00602D3E loc_602D3E: ; CODE XREF: sub_602309+99C j .text:00602D3E ; sub_602309+9B4 j .text:00602D3E xor edx, edx .text:00602D40 mov dl, EffectFog .text:00602D46 test edx, edx .text:00602D48 jnz loc_602DEA ; Copie la position W du joueur dans eax .text:00602D4E mov eax, [ebp-2B0h] .text:00602D54 xor ecx, ecx .text:00602D56 mov cx, [eax+113B8h] .text:00602D5D test ecx, ecx .text:00602D5F jz loc_602DEA ; Copie la position W du joueur dans eax .text:00602D65 mov edx, [ebp-2B0h] .text:00602D6B xor eax, eax .text:00602D6D mov ax, [edx+113BAh] .text:00602D74 test eax, eax .text:00602D76 jle short loc_602DCC .text:00602D78 mov ecx, [ebp-2B0h] .text:00602D7E mov eax, [ecx+113BCh] .text:00602D84 xor edx, edx .text:00602D86 mov ecx, 2 .text:00602D8B div ecx .text:00602D8D mov eax, [ebp-2B0h] .text:00602D93 mov ecx, [eax+113BCh] .text:00602D99 add ecx, 1 .text:00602D9C mov eax, [ebp-2B0h] .text:00602DA2 mov [eax+113BCh], ecx .text:00602DA8 test edx, edx .text:00602DAA jz short loc_602DCA .text:00602DAC mov ecx, [ebp-2B0h] .text:00602DB2 mov dx, [ecx+113BAh] .text:00602DB9 sub dx, 4 .text:00602DBD mov eax, [ebp-2B0h] .text:00602DC3 mov [eax+113BAh], dx .text:00602DCA .text:00602DCA loc_602DCA: ; CODE XREF: sub_602309+AA1 j .text:00602DCA jmp short loc_602DEA ; Copie la position W du joueur dans eax .text:00602DCC ; --------------------------------------------------------------------------- .text:00602DCC .text:00602DCC loc_602DCC: ; CODE XREF: sub_602309+A6D j .text:00602DCC mov ecx, [ebp-2B0h] .text:00602DD2 mov word ptr [ecx+113B8h], 0 .text:00602DDB mov edx, [ebp-2B0h] .text:00602DE1 mov word ptr [edx+113BAh], 0 .text:00602DEA
Troisième contrainte (Autorisation de la météo uniquement sur certaines zones)
Ci dessous après nos quelques détections Pluie, Neige et Brouillard un dernier test est effectué afin de voir si la météo peut-être appliquée dans la zone ou le joueur ce situe.
.text:00602DEA loc_602DEA: ; CODE XREF: sub_602309+98E j .text:00602DEA ; sub_602309:loc_602D39 j ... .text:00602DEA movsx eax, PlayerPosW ; Copie la position W du joueur dans eax .text:00602DF1 test eax, eax .text:00602DF3 jz short loc_602E23 ; Si edx = 0; zf vaut 1; si zf vaut un on jump .text:00602DF3 ; Si le monde est égal à 0 on saute .text:00602DF5 movsx ecx, PlayerPosW ; Copie la position W du joueur dans ecx .text:00602DFC cmp ecx, 4 .text:00602DFF jz short loc_602E23 ; Si edx = 0; zf vaut 1; si zf vaut un on jump .text:00602DFF ; Si le monde est égal à 4 on saute .text:00602E01 movsx edx, PlayerPosW ; Copie la position W du joueur dans edx .text:00602E08 cmp edx, 3 .text:00602E0B jnz loc_603070 ; Si edx = 0; zf vaut 1; si zf vaut un on jump .text:00602E0B ; Si le monde est différent de 3 on saute .text:00602E0B ; .text:00602E11 movsx eax, word ptr PlayerPosY .text:00602E18 cmp eax, 600h ; PosY <= 1536 .text:00602E1D jge loc_603070 ; Si la position Y du joueur et plus petite ou égale à 1536 on saute .text:00602E1D ; .text:00602E1D ; Après cela nous n'avons plus aucune contraintes donc nous stoperons l'analyse ici !
Les solutions
0x90 est ton ami !
--Mestoph 22 décembre 2008 à 17:21 (MSK)

