39-45 Stratégie > Jeux vidéo > Theatre of War > Theatre of War > Tutoriel de l'éditeur > Les scripts > Partie A 

tuto script partie A, les triggers victoire et defaite


Nous allons voir dans cette partie du tutorial comment réaliser une mission simple avec quelques scripts.

Tout d'abord, pour faciliter la mise en place de la mission, nous allons utiliser le générateur de mission aléatoire. Cela permet une mise en place rapide des unités, sans se préoccuper des fameux placeholder !!!

Imaginons une mission où la France a décidé de soutenir la Pologne. Les Russes attaquent une position commune.

Voici des images de la mise en place des troupes :



Pour le coté russe, on prévoir une attaque au centre avec l'infanterie et les T26.

Un groupe de BT et un groupe de T60 attaqueront, soit par la droite, soit par la gauche.



Ouvrons maintenant la carte ainsi créée avec l'éditeur de mission.

Allons dans l'onglet « triggers » et développons l'arbre des « triggers ».



Les triggers sont des petits programmes informatiques qui vont piloter les troupes ennemis, vérifier les conditions de victoire, attribuer des renforts...

Chaque tache particulière que l'on aura imaginé fera l'objet d'un trigger spécifique.

Nous allons tout d'abord supprimer tous les triggers qui ont été généré par le générateur de mission, sauf le trigger « init » qui est un trigger particulier. Nous y reviendrons ensuite dessus.

Une fois tous les triggers (ou scripts) effacés (sauf init), nous pouvons en créer avec un clic droit de la souris sur la zone ad hoc :



Nous allons commencer par un script simple, le script « defaite »

On marque son titre en bas à droite, et on peut recopier les lignes suivantes.



Le trigger est un petit programme qui va s'exécuter constamment au cours du jeu, pour tester constamment si il vous reste des soldats. S'il ne vous en reste plus, il affichera le panneau « défaite ». Il se présente ainsi sous la forme d'une boucle informatique, avec un test de sortie.

Normalement, l'ordinateur exécute ce programme, ligne après ligne. Arrivé en bas, il s'arrete. Il n'est donc plus éxécuté. Pour qu'il soit à nouveau exécuté, on lui demande de revenir en haut, grâce à l'instruction GOTO.

« GOTO xxx » signifie retourne au point xxx.

Le point xxx dans le programme est introduit par l'instruction LABEL xxx.


Dans notre exemple, xxx est _begin.


Pour que cette boucle fonctionne correctement, il faut ajouter une subtilité importante. Le programme est exécuté par l'ordinateur à très grande vitesse. Arrivé en bas, au bout de quelques millisecondes de calcul, il retourne en haut, au label _begin. Or il est inutile de vérifier toutes les millisecondes si vous avez perdu. Il suffit de le vérifier toutes les secondes (et encore). Sinon, un grand nombre de triggers risque de ralentir le jeu. Par défaut, n'oubliez pas l'instruction « delay » qui permet de ne pas surcharger le processeur de l'ordinateur.


Nous allons mettre les commentaires après le symbole //

++++++++++++++++++++++++++++++++++++++++++++

SetWorkArmy ( ARMY , 1 )

LABEL _BEGIN

SET @humans_joueur = GetNUnits ( ARMY , 1 , HUMAN , CREW )

SET @humans_joueur_in_panic = GetNUnits ( ARMY , 1 , HUMAN , CREW , PANIC )

IF ( @humans_joueur = 0 OR @humans_joueur_in_panic = @humans_joueur ) THEN

     MissionFail ( )

     HALT

ENDIF

Delay ( 1000 )

GOTO _BEGIN

Halt

++++++++++++++++++++++++++++++++++++++++

Instruction « halt »

Cela permet d'arreter ce petit programme ou triggers. Il est donc placer à la fin, ou dans une condition. Normallement, s'il n'y a pas l'instruction « halt » à la fin du trigger, celui recommence au début, même sans instruction GOTO. Il ne devrait donc pas être nécessaire de mettre un goto dans ce trigger de défaite. Néanmoins, cela est plus compréhensible. De la même facon, puisqu'il y a un goto, il ne devrait pas être nécessaire de mettre halt à la fin, puisqu'il ne sera jamais atteint. Mais par précaution, il vaut mieux le mettre systématiquement.


Nous allons maintenant détailler le coeur de ce petit programme.

Nous allons calculer le nombre de soldats restant pour le joueur et vérifier si ce nombre est bien non nul, auquel cas le joueur à perdu.

Nous allons aussi calculer le nombre de soldats paniqués. Si tous les soldats du joueur sont paniqués, c'est à dire, en déroute, on considère aussi que le joueur a perdu.

Nous avons donc deux nombres à calculer, et deux tests à faire.

Pour calculer un nombre d'unité, l'instruction est la suivante :

GetNUnits ( )

Il faut ensuite préciser dans les parenthèses un certain nombre de paramètre.

Tout d'abord, on précise à quel groupe doit on limiter le calcul. Plusieurs possibilités :

+GetNUnits ( ARMY , 1 , xxxx ) signifie que l'on ne s'intéresse qu'à l'armée n°1, c'est à dire celle du joueur.

+GROUP , "Group27" signifie que l'on se limite au group 27 (dans l'armée précisée par setworkarmy). Pour voir le groupe d'une unité, on peut développer l'arbre de la mission comme suit :



On peut aussi s'adresser à une unité élémentaire, définit par son ID (identification number)



+GetNUnits ( unit , 171 , xxxx ) signifie de le chef de char de ce canon


Il faut maintenant remplir la deuxième partie, c'est à dire, à l'intérieur de l'armée 1, quel type de troupe nous intéresse.

GetNUnits ( ARMY , 1 , HUMAN , CREW )

On spécifie ici les humains (soldats) plus les équipages de char.

On peut spécifié parmi les différents choix ci dessous :

----------------------------------------------------------------------

ALL                                 - tous les objets de jeu

ARMOREDCAR           - automitrailleuse

ARTILLERY                 - canon d’artillerie

CAR                                - véhicule non blindé, habituellement à roue

FLAK                              - canon antiaérien

FORTIFICATION        - bunker en bois ou en béton

HMG                               - mitrailleuse lourde

HUMAN                          - personne

SPG                                 - canon autotracté

TANKS                           - chars

----------------------------------------------------------------------

On peut affiner la catégorie avec les filtres suivants. ATTENTION, le filtre suivant ne s'applique pas seul, mais il s'applique à la catégorie ci dessus.

BROKEN_WEAPON La liste des objets ne retient que les éléments avec un armement endommagé. Ce filtre ne s’applique qu’à des véhicules, pas à des personnes.

OK_WEAPON La liste des objets ne retient que ceux avec une arme en état de marche. Ce filtre ne s’applique qu’à des véhicules, pas à des personnes.

BROKEN_ENGINE La liste des objets ne retient que ceux avec un moteur ou les chenilles/roues endommagées. Ce filtre ne s’applique qu’à des véhicules, pas à des personnes.

OK_ENGINE La liste des objets ne retient que ceux avec un moteur ou des chenilles/roues en état de marche. Ce filtre ne s’applique qu’à des véhicules, pas à des personnes.

EMPTY La liste des objets ne retient que ceux sans équipage. Ce filtre ne s’applique qu’à des véhicules, pas à des personnes.

NOT_EMPTY La liste des objets ne retient que ceux avec un équipage. Ce filtre ne s’applique qu’à des véhicules, pas à des personnes.

CREW La liste en cours prend en compte les équipages à l’intérieur des véhicules ou qui servent un canon. Ce filtre s’applique aux véhicules comme à l’infanterie.

PANIC La liste en cours retient uniquement les personnes paniquées. Ce filtre ne s’applique qu’à des personnes, pas à des véhicules.

NO_PANIC La liste en cours retient uniquement les personnes qui ne sont pas paniquées. Ce filtre ne s’applique qu’à des personnes, pas à des véhicules.

VISIBLE La liste en cours retient uniquement les objets qui sont visibles dans l’armée désignée avec la procédure SetWorkArmy. Ce filtre s’applique aux véhicules comme à l’infanterie.

NOT_VISIBLE La liste en cours retient uniquement les objets qui ne sont pas visibles dans l’armée désignée avec la procédure SetWorkArmy. Ce filtre s’applique aux véhicules comme à l’infanterie.

OLD_CREW La liste en cours retient uniquement les unités ayant servi comme équipage. Ce filtre s’applique aux véhicules comme à l’infanterie.

NOT_OLD_CREW Les unités ayant servi comme équipage sont exclues de la liste. Ce filtre s’applique aux véhicules comme à l’infanterie.

SOLDIER La liste en cours retient uniquement les soldats (les officiers, mitrailleurs, servant de canon et fusils AC ou de lance-grenades et snipers ne font pas partie de cette catégorie). Ce filtre s’applique aux véhicules comme à l’infanterie.

NOT_SOLDIER Les soldats (les officiers, mitrailleurs, servant de canon et fusils AC ou de lance-grenades et snipers ne font pas partie de cette catégorie) sont exclus de la liste. Ce filtre s’applique aux véhicules comme à l’infanterie.

DEFEND La liste en cours retient uniquement les objets qui exécutent un ordre DEFEND. Ce filtre s’applique aux véhicules comme à l’infanterie.

NOT_DEFEND La liste en cours retient uniquement les objets qui n’exécutent pas un ordre DEFEND command. Ce filtre s’applique aux véhicules comme à l’infanterie.

 

Dans notre exemple, nous avons choisi les personnes (HUMAN), et préciser CREW, ce qui précise que HUMAN est calculé avec les équipages, y compris ceux dans les chars !


Nous savons calculer le nombre de soldats du joueur encore sur la carte. Il faut maintenant mettre ce nombre dans une variable. Une variable est un espace dans la mémoire de l'ordinateur où l'on peut stocker des informations (résultat d'un calcul, nom d'une unité...).

Pour retrouver une variable, on lui donne un nom, et pour savoir que c'est un nom de variable, on précède ce non du symbole @. Dans ce cas, la variable est dite locale, c'est à dire, il n'existe que dans la "boite" du trigger (ici le trigger "defaite"). Vous ne pouvez pas l'utiliser dans le trigger victoire, sans la recalculer.

Pour obtenir une variable globale, c'est à dire, connue de tous les triggers, il faut mettre deux fois le symbole@

Enfin, pour dire que l'on veut stocker le résultat du calcul dans la variable, on utilise l'instruction SET.


SET @humans_joueur = GetNUnits ( ARMY , 1 , HUMAN , CREW )

On peut maintenant faire un test sur cette variable. Par exemple :

IF ( @humans_joueur = 0 ) THEN

      MissionFail ( )

      HALT

ENDIF

MissionFail est l'instruction qui affiche l'écran de defaite !

Ensuite, le trigger est arretée (HALT)

Pour toute instruction « IF », il faut finir par une instruction « ENDIF ».


On peut cumuler plusieurs conditions dans un même test, c'est à dire plusieurs conditions simultanées (avec AND qui signifie « et ») ou alternative (avec OR, qui signifie « ou bien »), mais on ne peut pas mélanger les AND et les OR (ce qui est bien dommage).


On cumule ici deux conditions alternatives :

IF ( @humans_joueur = 0 OR @humans_joueur_in_panic = @humans_joueur ) THEN

      MissionFail ( )

      HALT

ENDIF


Pour la condition de défaite, nous avons vérifié qu'il restait des soldats joueur, et que tous n'étaient pas en déroute. Or nous devons défendre ce village. Il nous faut donc tester s'il y a des soldats joueur dans le village, et pas d'ennemi dedans.

L'instruction utilisée est « GetNUnitsInArea »


Pour spécifier la zone, il nous faut voir la carte pour connaître le nom de la zone à défendre :


Il s'agit de la zone A1. Ce n'est pas un nombre, mais un nom, il faut donc l'entourer de guillemet.

A noter que contrairement à un grand nombre d'instruction, la zone rectangle « A1 » n'a pas besoin d'être précédée de l'instruction « rect » (GetNUnitsInArea ( ARMY , 1 , ALL , rect , "A1" ) ne fonctionne pas


SET @humain_joueur_village = GetNUnitsInArea ( ARMY , 1 , ALL , "A1" )

SetWorkArmy ( ARMY , 2 )

SET @humain_IA_village = GetNUnitsInArea ( ARMY , 2 , ALL , "A1" )


IF ( @humain_joueur_village = 0 AND @humain_IA_village > 0 ) THEN

      MissionFail ( )

      HALT

ENDIF


Vous avez donc taper votre premier script.

Il faut maintenant le relier avec le script init.

En effet, le script ou trigger init est le premier et le seul lut automatiquement par l'ordinateur. Les autres triggers doivent être lancés à partir du script init.

Cela se fait simplement en tapant de le script init les instructions suivantes :


RunTrigger ( "defaite" )

Halt



Enfin, il faut maintenant compiler vos triggers. Cela signifie que l'ordinateur va transformer ces instructions écrites en « anglais » en un langage informatique. Ce qui est important, c'est que le programme va vérifier un certain nombre de choses (la syntaxe, les variables...) et vous renseignera sur les erreurs courantes.

Pour compiler, le bouton est celui ci :



Si la compilation est réussie, le message suivant s'affiche :




Enfin, une dernière recommandation pour l'écriture des scripts :

IL FAUT DES ESPACES !!!

Avant les parenthèses, après, avant les nombres, après, bref PARTOUT


Sinon, vous voyez apparaître du rouge, ce qui n'est jamais bon signe...


Exemple, repérez toutes les erreurs !!!

----------------------------------------------trigger defaite --------------------

LABEL _BEGIN

SET @humans_joueur= GetNUnits ( ARMY ,1 , HUMAN , CREW )

SET @humans_joueur_in_panic = GetNUnits (ARMY , 1 , HUMAN , CREW , PANIC )

IF ( @humans_joueur = 0 OR @humans_joueur_in_panic = @humans_joueur ) THEN

      MissionFail( )

      HALT

ENDIF

SET @humain_joueur_village = GetNUnitsInArea ( ARMY ,1 , ALL , "A1" )

SetWorkArmy ( ARMY, 2 )

SET @humain_IA_village = GetNUnitsInArea ( ARMY , 2 , ALL, "A1" )

IF ( @humain_joueur_village = 0 AND @humain_IA_village > 0) THEN

      MissionFail ()

      HALT

ENDIF

Delay ( 1000 )

GOTO _BEGIN

Halt

--------------------------------------------------------------------------------


trigger victoire

Nous allons maintenant voir plus rapidement le trigger de victoire.

Pour la condition de victoire, nous considérerons simplement qu'elle est acquise s'il n'y a plus de soldats ennemis opérationnels. C'est un trigger très similaire au trigger « défaite ».


Un clic droit sur l'arborescence « triggers » permet d'ajouter un nouveau trigger.

On rempli son nom dans le champ « name » en bas à droite.

On recopie ensuite les instructions du trigger « défaite » dans le trigger « victoire ».

Ensuite, on effectue les modifications pour obtenir le résultat suivant :


------------------------------trigger victoire-------------------------------------------------

LABEL _BEGIN

SetWorkArmy ( ARMY , 2 )

SET @humans_IA = GetNUnits ( ARMY , 2 , HUMAN , CREW )

SET @humans_IA_in_panic = GetNUnits ( ARMY , 2 , HUMAN , CREW , PANIC )

SET @humain_IA_village = GetNUnitsInArea ( ARMY , 2 , ALL , "A1" )

SetWorkArmy ( ARMY , 1 )

SET @humain_joueur_village = GetNUnitsInArea ( ARMY , 1 , ALL , "A1" )


IF ( @humans_IA = 0 AND @humain_IA_village = 0 AND @humain_joueur_village > 0 ) THEN

     MissionWin ( )

     HALT

ENDIF


IF ( @humans_IA_in_panic = @humans_IA AND @humain_IA_village = 0 AND @humain_joueur_village > 0 ) THEN

     MissionWin ( )

     HALT

ENDIF

Delay ( 2000 )

GOTO _BEGIN

Halt

------------------------------------------------------------------------------------------

On modifie le script init pour lancer ce nouveau trigger.

On peut ajouter un delai de 10 minutes avant le test des conditions de victoire, car il est peu probable d'obtenir défaite ou victoire avant ce laps de temps.


---------------------------trigger init--------------------------------------------------------------

delay ( 600000 )

RunTrigger ( "defaite" )

RunTrigger ( "victoire" )

Halt

-----------------------------------------------------------------------------------------


On compile à nouveau pour vérifier

Vous savez maintenant faire un trigger. Nous allons voir la suite, mais de manière moins détaillée...

La suite

retour au sommaire