[English]

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

  LES MODS: FAIRE UN PREDATOR QUI SAUTE PLUS HAUT

Dans ce tutorial, je vais vous montrer comment faire un mod très simple dans ce jeu: nous allons faire sauter le Predator plus haut qu'auparavant, comme dans les films. Concernant le mod en lui-même, vous n'aurez ni besoin de connaissance du noyau, ni de comprendre le fichier source exposé.

1) Préparer le terrain

Quelques fois, quand vous voulez faire un mod, vous pouvez trouver 2 situations:
  • Vous savez exactement quel type de mod vous voulez faire, donc vous passez votre temps en cherchant la portion de code qui gère ce que vous voulez manipuler. Une fois que vous l'avez, vous pouvez commencer à expérimenter.
  • L'autre situation est lorsque vous êtes assez fou pour passer votre temps à LIRE des codes sources et ensuite *BINGO*, vous apercevez la portion de code magique qui vous donne une idée. Après cela, vous expérimentez avec le code lui-même, ou ajoutez / le modifiez pour correspondre à vos idées.
La seconde situation est celle qui m'a donné l'idée de faire un tel mod: je ne voulais rien faire en particulier, mais quand je suis arrivé à la ligne 715 du fichier Pmove.c, voici comment j'ai réagis: "Bordel! J'ai jamais fais gaffe que l'Alien faisait un saut en avant !".

2) Comment commencer ?

En fait, j'étais tellement intéressé par le gameplay, que je n'ai jamais remarqué une telle chose !!! Donc j'ai lancé le jeu, sélectionné l'Alien et joué avec. "Yes! C'est bien ça !". Je suis ainsi retourné dans le code et l'ai un peu étudié. J'ai regardé au-dessus:
if(playerStatusPtr->Mvt_InputRequests.Flags.Rqst_Jump)
Donc dans ce cas, le joueur "fait une requête pour sauter", c-à-d l'Alien. Ensuite, j'ai regardé à:
if ((playerStatusPtr->ShapeState == PMph_Crouching) && (DotProduct(&viewDir,&dynPtr->GravityDirection)<-32768))
{
dynPtr->LinImpulse.vx += MUL_FIXED(viewDir.vx,jumpSpeed*3);
dynPtr->LinImpulse.vy += MUL_FIXED(viewDir.vy,jumpSpeed*3);
dynPtr->LinImpulse.vz += MUL_FIXED(viewDir.vz,jumpSpeed*3);
}
Ici, nous parlons de se mettre accroupi ("crouching" en anglais), de la direction de la vue ("view direction") et de la vitesse de saut ("jump speed"). Résumons: quand nous sommes l'Alien, si nous nous accroupissons, donc en regardant vers une certaine direction et en faisant un saut, et bien le saut lui-même est multiplié par 3 ? J'ai relancé le jeu, et réalisé que si vous regardez au-dessus de vous en tant qu'Alien, puis vous accroupissez et sautez, vous faites simplement un extra saut dans cette direction !

L'idée était née: je sais comment tester l'espèce du joueur, comment savoir s'il est accroupi et je peux modifier la vitesse du saut: je vais essayer de faire un Predator qui saute plus haut, comme dans AvP2 !!!

Note: ceci est intégré directement dans AvP 2, donc désormais également dans AvP GE ;).

3) Comment procéder ?

Voici la partie intéressante du code:
/* l'alien peu sauter dans la direction qu'il fixe voit */
if (AvP.PlayerType == I_Alien)
// Ceci concerne l'Alien
{
VECTORCH viewDir;

viewDir.vx = Global_VDB_Ptr->VDB_Mat.mat13;
viewDir.vy = Global_VDB_Ptr->VDB_Mat.mat23;
viewDir.vz = Global_VDB_Ptr->VDB_Mat.mat33;
if ((playerStatusPtr->ShapeState == PMph_Crouching) && (DotProduct(&viewDir,&dynPtr->GravityDirection)<-32768))
{
dynPtr->LinImpulse.vx += MUL_FIXED(viewDir.vx,jumpSpeed*3);
dynPtr->LinImpulse.vy += MUL_FIXED(viewDir.vy,jumpSpeed*3);
dynPtr->LinImpulse.vz += MUL_FIXED(viewDir.vz,jumpSpeed*3);
}
else
{
dynPtr->LinImpulse.vx -= MUL_FIXED(dynPtr->GravityDirection.vx,jumpSpeed);
dynPtr->LinImpulse.vy -= MUL_FIXED(dynPtr->GravityDirection.vy,jumpSpeed);
dynPtr->LinImpulse.vz -= MUL_FIXED(dynPtr->GravityDirection.vz,jumpSpeed);
dynPtr->LinVelocity.vz += jumpSpeed;
} dynPtr->TimeNotInContactWithFloor = -1;
}
// NOUVEAU CODE POUR LE PREDATOR ICI
else
// Ca concernait le Predator & le Marine, maintenant, seulement le Marine
{
dynPtr->LinImpulse.vx -= MUL_FIXED(dynPtr->GravityDirection.vx,jumpSpeed);
dynPtr->LinImpulse.vy -= MUL_FIXED(dynPtr->GravityDirection.vy,jumpSpeed);
dynPtr->LinImpulse.vz -= MUL_FIXED(dynPtr->GravityDirection.vz,jumpSpeed);
dynPtr->TimeNotInContactWithFloor = 0;
}
Maintenant pour le code du Predator, vous devez ajouter:
// Si le Predator s'accroupit (pas besoin de regarder au-dessus comme l'Alien)
else if((AvP.PlayerType == I_Predator)&&(playerStatusPtr->ShapeState == PMph_Crouching))
{
// Nous allons multiplier le saut par 2, ce qui semble suffisant:
dynPtr->LinImpulse.vx -= MUL_FIXED(dynPtr->GravityDirection.vx,jumpSpeed*2);
dynPtr->LinImpulse.vy -= MUL_FIXED(dynPtr->GravityDirection.vy,jumpSpeed*2);
dynPtr->LinImpulse.vz -= MUL_FIXED(dynPtr->GravityDirection.vz,jumpSpeed*2);
dynPtr->TimeNotInContactWithFloor = 0;
}
Voici l'exemple typique d'un simple mod: seulement 7 lignes pour ajouter une nouvelle fonctionnalité au Predator !!! Sûr, cela peut être amélioré (ex.: en ajoutant un nouveau son pour le saut, ...), mais c'est assez facile pour vous laisser vous amuser avec le moteur 3D ... Maintenant, répétez après moi: "AvP GE est cool !!!"