Au total, j'ai utilisé 3 outils :
1. de quoi décompresser la save
2. un debugger : Visual Studio
Un debugger sert à tracer l'exécution du programme instruction par instruction. Lorsqu'on ne dispose pas d'info de debuggage, on ne peut faire que instruction machine par instruction machine (cf assembleur)
3. un éditeur hexadécimal : Visual Studio (il fait beaucoup de choses
)
Dans la save, l'enregistrement des villes se fait via des structures commençant par la chaîne "CITY". Il y en 5 par ville, contigues, suivies d'une structure "POPD" (POPulation Data) qui introduit un tableau de structures CTZN (CiTiZeN), à raison d'une par citoyen, puis encore de 2 structures : BINF et BITM. Le nom de la ville se trouve dans la dernière structure CITY. La structure CTZN se termine par 3 infos sur la nationalité : la nationalité elle-même (cette valeur était corrompue : -1 au lieu de 3 pour les Grecs), puis 2 valeurs pour gérer l'assimilation (j'ai aussi corrigé ces valeurs qui aurait dû être à -1 lorsque les citoyens sont tous assimilées). A noter que la ville en question est une des premières villes de Stilgar.
-> Rechercher ce qu'il faut modifier est alors simple : Rechercher le nom de la ville à l'aide de l'outil de l'éditeur. En fait, le nom apparaît souvent 3 fois : la première dans les règles, si le nom de la ville est celui proposé par le jeu, la 2è est ce qu'on cherche, et la 3è pour le replay. Puis il faut localiser les structures CTZN qui se trouvent juste après.
-> 4 octets par valeur, puisque sur 32 bits, soit 3*4=12 octets modifiés par citoyen à corriger
Le bug n'a pas l'air d'apparaître systématiquement, mais il est certain que les valeurs ont été corrompues lors de l'opération en question.
La valeur nationalité indexe le tableau des civilisations (3 correspond bien à la 3è civilisation dans l'éditeur), 0 pour les barbares. Si le jeu prend -1, le pointeur qu'il calcule pour accéder aux données de la civ en question sera en dehors du tableau. Le jeu aura vite fait de lire n'importe quoi et de dérailler. En fait, ça plante dès qu'il utilise le pointeur, vu qu'il pointe dans une zone non définie (cf notion de mémoire virtuelle).
