Reverse-engineering du fichier T4C.exe (version NMS 1.66)

De T4C Tech
Aller à la navigation Aller à la recherche

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)