Associer deux objectifs dans une map.
(utilisation de variables "level".)
Tutorial créé par Tropheus.

retour au sommaire

Au cours de ce tutorial, vous apprendrez à définir 2 objectifs (ici identiques, mais ils peuvent être différents) dans une map. Ceci vous le verrez de 2 façons différentes au niveau du scripting. Dont une technique en utilisant les variables "level". Pour plus de détails allez voir ici.

1/ Partie mapping.

Cette partie est commune aux deux types de procédures. Nous allons voler 2 documents importants à l'ennemi.

Pour commencer, vous allez construire une pièce close avec ses lumières et tout et tout comme vous savez le faire maintenant. (sinon allez voir ici). Dans cette pièce vous allez disposer 2 tables (static/furniture/bunkertable) une à gauche et l'autre à droite de la pièce. Jusqu'ici rien de bien compliqué. Sur chacune des tables, vous allez créer un scritp.origin qui prendront l'allure des documents et en plus comme se sont des origin ils attireront le compas du joueur.

Je vous mets ici les key / value pour le premier script.origin
$targetname / document1
model / models/items/documents1a.tik

Pour le second
$targetname / document2
model / models/items/documents1b.tik //avec "b" on a les documents rouges avec "a" comme au 1 on a les documents bleus.

Vous allez maintenant englober chacun de ces documents par un brush que vous transformerez en trigger_use.

Pour le premier trigger vous mettrez les key / value suivantes :

$targetname / document1_trigger
setthread / objective_1

Pour le second voici ce qu'il faut mettre.

$targetname / document2_trigger
setthread / objective_2

Et c'est tout. Vous voyez c'était pas difficile. Normalement vous obtenez ceci : en vue 2D et en vue 3D.

 

2/ Partie scripting.

Là c'est un peu plus hard, mais avec de bonnes explications vous verrez qu'on comprend tout.

a/ Script 1

Dans cette partie, nous allons considérer que les objectifs sont "distincts". En effet, ici on volera les documents 1 avant les documents 2. Notre compas sera attiré d'abord par le 1 puis par le 2. C'est comme si on avait séquencé les étapes.
ATTENTION !!! Si vous inverser les étapes, vous ne volerez qu'un seul document.

Voici le script :

//mon script "voler de 2 documents"
//Architecture : Tropheus
//Script : Tropheus

exec global/ai.scr
exec global/loadout.scr maps/test_2obj.scr
main:
     level waittill prespawn
        $player stufftext "tmstart sound/music/mus_15a_mystery.mp3"
     level waittill spawn
        $player item weapons/colt45.tik
        $player ammo pistol 1000
        waitthread global/objectives.scr::add_objectives 1 2 "Voler les documents 1." $document1.origin
        set_objective_pos $document1
        waitthread global/objectives.scr::current_objectives 1
        waitthread global/objectives.scr::add_objectives 2 2 "Voler les documents 2." $document2.origin
        waitthread global/objectives.scr::current_objectives 2
     level.script = "level.test_2obj.scr"
end
///////////////////////////////
objective_1:
        $document1 remove
        $document1_trigger nottriggerable
        waitthread global/objectives.scr::add_objectives 1 3 "Voler les documents 1." $document1.origin
        set_objective_pos $document2
end
//////////////////////////////
objective_2:
        $document2 remove
        $document2_trigger nottriggerable
        waitthread global/objectives.scr::add_objectives 2 3 "Voler les documents 2." $document2.origin
        goto levelend
end
/////////////////////////////
levelend:
        waitthread global/objectives.scr::add_objectives 1 3 "Voler les documents 1." $document1.origin
        waitthread global/objectives.scr::add_objectives 2 3 "Voler les documents 2." $document2.origin
        waitthread global/objectives.scr::current_objectives 0
        iprintln "Mission terminée."
        exec global/missioncomplete.scr test_2obj
end

Bon allez, je vous explique.

//mon script "voler de 2 documents"
//Architecture : Tropheus
//Script : Tropheus

exec global/ai.scr
exec global/loadout.scr maps/test_2obj.scr
main:
level waittill prespawn
$player stufftext "tmstart sound/music/mus_15a_mystery.mp3"
level waittill spawn
$player item weapons/colt45.tik
$player ammo pistol 1000
waitthread global/objectives.scr::add_objectives 1 2 "Voler les documents 1." $document1.origin
// permet d'afficher l'objectif " Voler les documents 1." quand vous appuyer sur la touche "Tab" avec la case non cochée.
set_objective_pos $document1 // pointe le compas sur les documents 1
waitthread global/objectives.scr::current_objectives 1 // active le script objective.scr
waitthread global/objectives.scr::add_objectives 2 2 "Voler les documents 2." $document2.origin
waitthread global/objectives.scr::current_objectives 2
level.script = "level.test_2obj.scr"
end
///////////////////////////////
objective_1:
// activé par le trigger.
$document1 remove // enlève le document volé
$document1_trigger nottriggerable // inactive le trigger après son utilisation on peut éliminer cette ligne si on met un trigger_useonce dans la partie mapping.
waitthread global/objectives.scr::add_objectives 1 3 "Voler les documents 1." $document1.origin // "coche la case dans le menu "Tab". Comme ceci :

set_objective_pos $document2 // pointe le compas vers les documents 2
end
//////////////////////////////
objective_2:
$document2 remove
$document2_trigger nottriggerable
waitthread global/objectives.scr::add_objectives 2 3 "Voler les documents 2." $document2.origin
// Coche la case de l'objectif.
goto levelend // envoie vers le levelend
end
/////////////////////////////
levelend:
waitthread global/objectives.scr::add_objectives 1 3 "Voler les documents 1." $document1.origin
// Coche la case de l'objectif.
waitthread global/objectives.scr::add_objectives 2 3 "Voler les documents 2." $document2.origin// Coche la case de l'objectif.
waitthread global/objectives.scr::current_objectives 0 // remet le nombre d'ojectif à 0.
iprintln "Mission terminée." // Affiche ceci dans le coin de votre écran.
exec global/missioncomplete.scr test_2obj // relance la map après la fin.
end

Bon vous voyez que ce n'était si difficile que ça !!!

b/ Script 2

Dans cette partie, vous aurez les mêmes objectifs que précédemment. Seulement, vous aurez une décrémentation des objectifs dans la fenêtre "Tab". Comme ceci.



De plus, l'ordre de prise des documents n'a plus d'importance, ce ne sera que le nombre d'objectifs réalisés qui déterminera la fin de la mission.

Bon allez j'arrête de vous faire languir, voici le script.

//mon script "vol de documents"
//Architecture : Tropheus
//Script : Tropheus

exec global/ai.scr
exec global/loadout.scr maps/test_2obj.scr
main:
     level waittill prespawn
        $player stufftext "tmstart sound/music/mus_15a_mystery.mp3"
     level waittill spawn
        $player item weapons/colt45.tik
        $player ammo pistol 1000
        level.indice=2
        waitthread global/objectives.scr::add_objectives 1 2 "voler les 2 documents." $document1.origin 2
        set_objective_pos $document1
        waitthread global/objectives.scr::current_objectives 1
        thread indice
     level.script = "level.test_2obj.scr"
end
///////////////////////////////
indice:
        waitthread global/objectives.scr::add_objectives 1 2 ("Il reste " + (level.indice) + " document(s) à voler.")
        if (level.indice == 0)
        goto levelend
end
///////////////////////////////
objective_1:
        $document1 remove
        $document1_trigger nottriggerable
        level.indice--
        set_objective_pos $document2
        goto indice
end
//////////////////////////////
objective_2:
        $document2 remove
        $document2_trigger nottriggerable
        level.indice=(level.indice - 1)
        goto indice
end
/////////////////////////////
levelend:
        waitthread global/objectives.scr::add_objectives 1 3 "Voler les documents."
        waitthread global/objectives.scr::current_objectives 0
        iprintln "Mission terminée."
        exec global/missioncomplete.scr test_2obj
end

Vous voyez, pas beaucoup de changements si ce n'est la variable "level" dont la valeur déterminera la fin du niveau ou non.
Pour un raffraichissement de mémoire au sujet des variables "level", c'est par ici. langage mohaa

Bon quelques explications. (Sauf pour les parties déjà expliquées au-dessus.)

//mon script "vol de documents"
//Architecture : Tropheus
//Script : Tropheus

exec global/ai.scr
exec global/loadout.scr maps/test_2obj.scr
main:
level waittill prespawn
$player stufftext "tmstart sound/music/mus_15a_mystery.mp3"
level waittill spawn
$player item weapons/colt45.tik
$player ammo pistol 1000
level.indice=2
// définition de la valeur "level.indice"de départ (ici 2 car il y 2 objectifs)
set_objective_pos $document1 // pointe le compas vers le premier objectif ce qui n'est pas obligatoire
waitthread global/objectives.scr::current_objectives 1 // ligne non nécessaire car sans elle ça marche quand même.
thread indice // envoie vers la partie du script qui définira le message à afficher mais aussi la fin du jeu.
level.script = "level.test_2obj.scr"
end
///////////////////////////////
indice:
// activé par la commande "thread indice"
waitthread global/objectives.scr::add_objectives 1 2 ("Il reste " + (level.indice) + " document(s) à voler.") // ce qui est affiché dans la fenêtre "Tab" avec la valeur de la variable "level.indice" qui s'affichera entre les deux lignes de textes. ATTENTION, n'oubliez pas de laisser un espace après "reste" et avant "documents".
if (level.indice == 0) // condition qui permet de passer au "levelend" si level.indice est égale à 0 alors on va au levelend sinon on attend une nouvelle valeur de l'indice pour tester la condition.
goto levelend // envoie au levelend si la condition ci-dessus est vraie.
end
///////////////////////////////
objective_1:
// activé par le trigger_use.
$document1 remove
$document1_trigger nottriggerable // on désactive le trigger.
level.indice--
// ici on décrémente la valeur de "level.indice" de 1 unité.
set_objective_pos $document2 // pointe le compas sur les documents 2
goto indice // on retourne à l'indice pour faire vérifier la condition et aussi pour changer le message.
end
//////////////////////////////
objective_2:
// activé par le trigger_use.
$document2 remove
$document2_trigger nottriggerable
level.indice=(level.indice - 1)
// voici une autre façon d'enlever 1 unité à la valeur de la variable "level.indice".
goto indice
end
/////////////////////////////
levelend:
waitthread global/objectives.scr::add_objectives 1 3 "Voler les documents."
// dernier message à être affiché.
waitthread global/objectives.scr::current_objectives 0
iprintln "Mission terminée."
exec global/missioncomplete.scr test_2obj
end

Pas de grandes différences ?, Hein ?

3/ Voici quelques précisions générales.

La commande "thread" active la partie du script auquel elle se rapporte.
La commande "waitthread" active la partie du script auquel elle se rapporte, mais on est obligé d'attendre la fin du thread pour pouvoir passer à autre chose.
waitthread global/objectives.scr::add_objectives 1 3 "Voler les documents." // dans cette ligne on a le "1" qui correspond au numéro de l'ojectif, et le "3" qui mets la croix dans la case.

On a donc :
objectif1:
1 2 = activation de l'objectif 1
1 3 = Coche la case
/////////////////////
objectif2:
2 2 = activation de l'objectif 2
2 3 = Coche la case
/////////////////////
objectif3:
3 2 = activation de l'objectif 3
3 3 = Coche la case
///////////////////
objectif4:
4 2 = activation de l'objectif 4
4 3 = Coche la case

Donc le premier nombre = numéro de l'objectif.
Le second nombre est un nombre prédéfini avec comme valeur 2 pour l'activation et 3 pour la fin d'un objectif.
C'est visible sur l'image de fin de mission. Ici.

Bon je vous laisse et vous souhaite un bon mapping.

Téléchargez le pk3 (sans script) et les scripts séparés.


Tropheus

retour haut de page