[English]

NEWS
INTRODUCTION
TERMINOLOGIE
LE CODE SOURCE
LES BUGS
TUTORIAUX
DOWNLOADS
L'AUTEUR

  LES BUGS: COMPILATION EN "RELEASE FOR FOX"

Chaque utilisateur commun de Visual C++ ayant essayé de faire marcher le jeu dans ce mode de compilation endura le même problème. Cette page va vous expliquer ce que sont les modes de compilation, quel problème est associé à ceux-ci, pour finalement vous donner ma solution à ce problème.

1) Modes de compilation

Dans Microsoft Visual C++, vous pouvez compiler votre code source dans 2 différents & communs modes:
  • Le mode Win32 Debug
  • le mode Win32 Release
Dans le premier cas, le développeur peut placer des parties de code uniquement utilisées pour des raisons de débogage. Ces parties seront automatiquement inclues dans l'application (durant l'étape de pré-processing). Par exemple, AvP utilise ce mode pour ajouter de nouvelles commandes console qui ne seront pas présentes dans la version publique...

Dans le second cas, pas de contenu relatif au débogage n'apparaîtra car cela concernera la version publique de l'application. Donc dans notre exemple, les commandes consoles ajoutées seront présentesdans le code, mais pas dans le jeu.

L'autre utilisation de ces modes de compilation est de personnaliser les projets. Par exemple, vous pouvez décider de générer des informations de débogage dans le mode "Win32 Debug" et pas dans le mode "Win32 Release". Tout est question d'organisation de projets.

Notez que vous pouvez créer d'autres modes de compilationsi vous le désirez...

Maintenant, dans le cas d'AvP, les gars de chez Rebellion nous ont donné 3 modes de compilation qui sont:
  • Win32 Debug
  • Win32 Release
  • Win32 Release For Fox
Nous ne discuterons pas du rôle de chaque mode de compilation ici (cela sera fait dans les sections "Le Code Source"). Disons juste que le mode "Win32 Release" peut être considéré come un autre mode "Win32 Debug". Ce qui nous mène à dire que si vous voulez que votre jeu soit en version finale, vous devez le compiler avec le mode "Win32 Release For Fox".

2) Le bug de "Win32 release For Fox"

Le bug apparaît si vous essayez d'exécuter l'application dans le mode "Win32 Release For Fox", seulement sous Windows 98. L'indice significatif sur ce bug est que si vous compilez l'application dans les autres modes, aucun bug n'apparaît: ce qui signifie qu'il y a des portions de code qui ne sont pas présentes voire différentes dans les 2 modes Debug.

Après une session d'étude personnelle du code et un débogage en langage assembleur, j'ai découvert que la "sale bête" (voici le terme que j'emploierai par la suite) venait de l'appel à la fonction "ToAscii" dans le fichier win_proj.cpp (dans la procédure "MakeToAsciiTable"). Ce que j'ai appris dans mes modifications de code source pour trouver le bug fût que quand j'ajoutais des instructions autour de la "sale bête", quelques fois, cela fonctionnait ! Bug étrange hein ?!

3) Ma solution

Ce que j'ai finalement compris de tout cela est que l'application plante à cause des optimisations du compilateur sur le code "MakeToAsciiTable" (gardez à l'esprit que ça marche dans les modes Debug: ceux-ci ne sont pas aussi optimisés que le mode Release).

Donc voici le code à ajouter (en bleu) pour corriger la chose:
#pragma optimize("", off)

void MakeToAsciiTable(void)
{
WORD output;
for (int k=0; k<=255; k++)
{
ksarray[k]=0;
}

for (int i=0; i<=255; i++)
{
for (int s=0; s<=255; s++)
{
if(ToAscii(i,s,&ksarray[0],&output,0)!=0)
{
ToAsciiTable[i][s] = (unsigned char)output;
}
else
{
ToAsciiTable[i][s] = 0;
}
}
}
}

#pragma optimize("", on)

Cela ordonnera simplement au compilateur de désactiver les optimisations sur la procédure.

Veuillez s'il vous plaît noter que je suis vraiment fier de ma découverte, car j'ai travaillé dessus depuis 2001 et malgré le fait que cela dura beaucoup de temps, j'ai aidé le premier mod d'AvP - c-à-d Cancer Black fait par Eldritch & l'équipe AMP - (et peut-être de futurs mods) à être compatible avec Windows 98.

Note: le truc marrant à remarquer ici est qu'aussi bien le compilateur que la fonction "ToAscii" sont fait par Microsoft ! Donc il y a une incompatibilité entre des choses qui devraient être compatibles ! Peut importe, je n'ai rien contre Microsoft: "l'erreur est humaine".