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