Créer un compteur pour un objectif. (COD et CODUO).
Tutorial réalisé par
Tropheus.
Merci à Lucyfer pour son aide.
Le but de ce tutorial est de vous montrer comment construire un compteur au niveau d'un objectif.

1/ MAPPING.
Il vous faut une map avec un certain nombres d'axes ayant tous le même targetname (Ici fin). (Attention il est aussi possible de les sélectionner par d'autres critères que le targetname, c'est à vous de voir ce qui correspond le mieux à votre map).
Voila ce que cela donne.

2/ SCRIPTING
a/ Le fichier .gsc.
main()
{
maps\_load::main();
//GIVE
PLAYER WEAPONS
level.player takeallweapons();
level.player giveWeapon("panzerfaust");
level.player giveWeapon("thompson");
level.player giveWeapon("colt");
level.player giveWeapon("fraggrenade");
level.player switchToWeapon("thompson");
thread objectif1();
thread compt_init();
thread compteur();
}
////////Mise en tableau de AI et initialisation le l'objectif
objectif1()
{
level.tab=getentarray("fin","targetname");
level.count=level.tab.size;
objective_add(1,"active",&"TEST_COMPTEUR_OBJ1");
objective_string(1, &"TEST_COMPTEUR_OBJ1", level.count);
objective_current(1);
}
////////// Définition des AI à compter.
compt_init()
{
i=0;
while(i<level.tab.size)
{
level.tab[i] thread bot();
i++;
}
}
///////////Décrémentation du compteur en fct de la mort des AI
bot()
{
self waittill("death");
level.count--;
level notify("update_objective_1");
}
////////////Compteur // Affichage // Statut de l'objectif
compteur()
{
while(level.count>0)
{
level waittill("update_objective_1");
objective_string(1, &"TEST_COMPTEUR_OBJ1", level.count);
}
objective_state(1,"done");
objective_string(1,&"TEST_COMPTEUR_OBJ1_FINI");
}
Explications
Tout d'abord il faut préciser que la variable level.count est la valeur qui sera décrémentée à chaque mort.
main()
{
maps\_load::main();
//GIVE
PLAYER WEAPONS
level.player takeallweapons();
level.player giveWeapon("panzerfaust");
level.player giveWeapon("thompson");
level.player giveWeapon("colt");
level.player giveWeapon("fraggrenade");
level.player switchToWeapon("thompson");
thread objectif1(); //envoi
sur le thread définissant l'objectif.
thread compt_init();//envoi vers le thread qui initialise le compteur.
thread compteur();//envoi vers le compteur.
}
////////Mise en tableau de AI et initialisation le l'objectif
objectif1()
{
level.tab=getentarray("fin","targetname");//mise
en tableau des entité ayant pour targetname "fin".
level.count=level.tab.size;
//on attribue à la variable level.count la taille
du tableau (C'est à dire le nombre de cases) Chaque case correspondant à une
entité. (ici level.count = 3)
objective_add(1,"active",&"TEST_COMPTEUR_OBJ1");//on
définit et active l'objectif
objective_string(1, &"TEST_COMPTEUR_OBJ1", level.count);
//on
définit le texte à afficher. "level.count" sera la valeur affichée.
c'est à dire 3 puis 2 puis 1 en fonction de morts axes.
objective_current(1);
}
////////// Définition des AI à compter.
compt_init()
{
i=0;//on donne la valeur 0 à i
while(i<level.tab.size)//tant que
i est inférieur à la
taille du tableau on efectue la boucle.
{
level.tab[i] thread bot();//chaque
entité du tableau est envoyée sur le thread bot().
i++;//on incrémente
i de 1.
}
}
///////////Décrémentation du compteur (level.count)
en fonction de la mort des AI.
bot()
{
self waittill("death"); //on attend la mort d'un
axe pour continuer.
level.count--;//on diminue le valeur du compteur
level notify("update_objective_1"); //on
met à jour
l'objectif 1.
}
////////////Compteur // Affichage // Statut de l'objectif
compteur()
{
while(level.count>0)//tant que level.count
est supérieur
à 0
{
level waittill("update_objective_1");//le
jeu attend la mise à jour de l'objectif pour continuer.
objective_string(1, &"TEST_COMPTEUR_OBJ1",
level.count);//on redéfinit le texte à écrire.
}
// Les lignes suivantes sont lues si
et seulement si level.count
n'est pas supérieur à 0
objective_state(1,"done");//objectif1 rempli
objective_string(1,&"TEST_COMPTEUR_OBJ1_FINI");//on
change le texte de l'objectif.
}
b/ le fichier .str.
À placer dans le dossier localizedstrings/french dans votre pk3 comme vous devez en avoir l'habitude maintenant. Avec comme nom test_compteur.str.
Ici %s permet de récupérer la valeur définie dans votre script. (Ici level.count)
REFERENCE OBJ1
LANG_FRENCH "Il reste encore %s Allemands à tuer."
REFERENCE OBJ1_FINI
LANG_FRENCH "Vous avez tué tous
les Allemands."
ENDMARKER
Télécharger l'exemple (pour CODUO seulement)
c/ observations.
Je tenais à vous faire part d'une particularité.
Vous avez tous remarqué la boucle suivante.
compt_ini()
{
i=0;
while(i<level.tab.size)
{
level.tab[i] thread bot();
i++;
}
}
Je definis la valeur de i au début du thread avant la boucle while. Ensuite tant
que i est plus petit que la taille du tableau on execute les commandes.
On envoie
chaque élément du tableau vers le thread bot().
Puis j'incrémente la valeur de i de 1 avant que la boucle ne recommence.
De cette façon j'envoie vers le thread bot level.tab[0], level.tab[1], level.tab[2].
Cette boucle est tout à fait identique à une boucle FOR.
for(i=0;i<level.tab.size;i++)
Alors pour soulager votre script vous pouvez utiliser le thread suivant.
compt_ini()
{
for(i=0; i<level.tab.size; i++)
{
level.tab[i] thread bot();
}
}
Voila pour cette précision,
bon
Mapping et Scripting
Tropheus
Pour CaskAmiProd
et MohaaScriptLib
Tropheus©
Septembre 2005