Langage scripté de MOHAA annexe C

Architecture d'un script

retour sommaire
Retour au texte principal

Texte original par Bjarne Grönnevik (vous trouverez en rose les explications données par Bjarne)
Titre original : Script architecture
Traduit par Tropheus (Vous trouverez en vert des précisions données par votre traducteur)


Toutes les commandes utilisées dans le scripting sont écrites dans un fichier script. Ce document vous explique comment est construit un fichier script.


Sommaire

* Le fichier *.scr
* Commentaires
* Les "methods"
* Une method spéciale la "main method".
* Le contenu de la "main" method.
* Un exemple complet de fichier *.scr


Le fichier *.scr

Toutes les commmandes utilisées dans le scripting sont mises dans un fichier *.scr. C'est un ficher texte standard qui peut être créé avec n'importe quel éditeur de textes (comme Notepad sous windows ou VI &Emac sous UNIX) (ndt :Je déconseille fortement l'utilisation de "wordpad" qui insère bon nombres de caractères supplémentaires ce qui modifie le script. Mais je conseille par ailleurs "Textpad" qui est très intéressant comme soft pour lire et créer les fichiers *.scr). Ces fichiers ont comme extension .scr au lieu de .txt comme l'ont souvent les fichiers textes. (ndt : extension à rajouter à la main directement à l'enregistrement de votre fichier script.exemple vous taperez : ma_map.scr)

L'extension .scr pose quelque fois des problèmes car windows la reconnait comme un économiseur d'écran. Aussi, si vous double-cliquez dessous, vous verrez appraître le message d'erreur suivant "C:\some_catalog\filename.scr is not a valid Wim32 application". Aussi pour ouvrir un tel fichier vous devez le faire à partir de votre éditeur de texte au lieu de double-cliquez dessus.


commentaires

Les commentaires sont une partie importante du fichier *.scr.

Basiquement tout ce qui est placé après 2 '/' sera igonré par MOH et peut être utilisé par le scripteur pour placer des aides ou des explications sur ce qu'il est en train de se passer au niveau du fichier script. Le tout sans que le jeu n'interprète mal ces indications.

Exemple :

// Faire sauter le casque du premier joueur s'il en a un...
$player[0] pophelmet //ça m'amuse
// ...C'est inutile... mais je suis un scripteur,
// Je peux faire tout ce que je veux !

revient au même dans le jeu que s'il était écrit :

$player[0] pophelmet

 


Method

Dans le fichier *.scr les commandes sont placées dans des "methods". Les" method"s sont des collections de commandes placées dans une zone du fichier avec un nom (nom de la "method") et se terminant par le mot clé end. Ceci ressemble à ceci :

a_good_method_label:
         // Il n'y a pas de commandes dans cette method, mais il pourrait y en avoir....
         // ...Car c'est juste un exemple

end

 


Une method spéciale "la main method".

La" main" method est une "method" appelée 'main'. Ceci est un peu spécial car c'est une method par defaut. Ce qui signifit que si une commande est donnée pour executer le script appelé mon_script.scr comme ceci :

exec mon_dossier/mon_script.scr

... il se passe en fait ceci :

exec mon_dossier/mon_script.scr::main

Et alors? Bien... c'est ce qui se passe avec votre script "connecté" à votre map. Si votre map s'apelle ma_map, et que c'est une map DM, alors MOH tentera automatiquement de faire ceci en chargeant votre map :

exec maps/dm/ma_map.scr

...et il est absolument nécessaire d'avoir une method 'main' dans votre script si vous voulez qu'il soit executé.

(ndt : la method "main" est la première partie de votre script lue par le jeu. Comme le dit Bjarne elle est lue par defaut ce n'est donc pas la peine de la préciser en mettant "::main")


Le contenu de la method "main".

Il est maintenant temps de construire une method "main". Très simplifée elle ressemble à ceci :

main:
         // Taches à effectuer avant le chargement de la partie prespawn
         level waittill presapwn
         // Taches à effectuer avant le chargement de la partie spawn
         level waittill spawn
         // Taches à effectuer avant le chargement de la partie roundstart
         level waittill roundstart
         // Taches à effectuer après le chargement de la partie roundstart
end


Pour que ceci ait un sens vous devez comprendre à quels moments les évenements prespawn, spawn et roundstart ont lieu:

prespawn

Le prespawn a lieu pendant le chargement de la map, il prépare en quelque sorte la map à accueillir les joueurs.

spawn

Le spawn a lieu lorsque le premier joueur entre sur la map.

roundstart

Le roundstart ne se rencontre seulement que sur les maps multijoueurs à objectifs. Après qu'au moins un joueur soit apparu dans chacun des camps (un en allié un en axe).


Un exemple complet de fichier *.scr

Ceci est un exemple complet de fichier *.scr avec beaucoup de commentaires expliquant ce qui se passe.

// Cette partie est juste de l'information sur les auteurs de la map et du script
// et plus si nécessaire.
//
// obj_vemork_1.2
// ARCHITECTURE : Bjarne Grönnevik
// SCRIPTING : Bjarne Grönnevik
// LIEN : http://www.planetmedalofhonor.com/rjukanproject/
// version 1.2


main:

         // Ecrivez ici le texte que les joueurs verront
         // lorsqu'ils sélectionneront leur équipe
         // ou qu'ils presseront la touche pour voir le tableau des scores au cours du jeu.

         setcvar "g_obj_alliedtext1" "Détruisez les distilateurs"
         setcvar "g_obj_alliedtext2" "ou nettoyez l'usine"
         setcvar "g_obj_alliedtext3" "de toutes les forces de l'Axe."
         setcvar "g_obj_axistext1" "Défendez la production"
         setcvar "g_obj_axistext2" "d'eau lourde de"
         setcvar "g_obj_axistext3" "l'assaut allié."

         // Mettez ici l'image que verront les joueurs quand ils
         // utiliseront la touche pour voir le tableau des scores pendant le jeu.

         setcvar "g_scoreboardpic" "obj_vemork_12"

         // Construisez ici un effet de brouillard
         $world farplane_color "0.3 0.3 0.3"
         $world farplane 5500

         level waittill prespawn

         // Charge ici de nombreuses données utilisables dans les jeux multiplayers
         // de ce fait, il n'y aura pas de message du type "Please wait, loading..."
         // pendant le jeu

         exec global/DMprecache.scr
         // Certains scripts l'utilisent, vous en aurez l'habitude... Je ne le mets ici
         // que pour être sur.

         level.script = maps/obj/vemork_factory_small.scr
         // Indique à MOH quelle musique de fond utiliser.
         exec global/ambient.scr m6l1a
         // Initialise le système d'explosion (utiliser pour les bombes
         // et les procédures)

         thread global/exploder.scr::main

         level waittill spawn

         // Les Axis empêchent que les bombes soient mises
         level.defusing_team = "axis"
         // Les Allies tentent de poser les bombes
         level.planting_team = "allies"
         // Nombre d'objectifs à remplir avant que l'équipe gagne.
         level.targets_to_destroy = 3
         // Dommages (par defaut) occasionnés par les bombes
         level.bomb_damage = 200
         // Rayon (par defaut) des dégats des explosions
         level.bomb_explosion_radius = 2048
         // Un joueur renaitra après sa mort? 1 ou 0 (0= pas de respawn)
         level.dmrespawning = 0
         // Le temps du round
         level.dmroundlimit = 5
         // Si le temps est atteint, qui gagne le match ?
         // Applicable aux axis, allies, kills (morts), or draw (cibles tuées)
         level.clockside = axis

         level waittill roundstart

         // Par la non "installation" des bombes (par le jeu) et le non chargement des procédures de victoires
         // jusqu'au roundstart, on evite ainsi qu'un seul joueur allié
         // entre sur la carte et gagne sans aucune résistance.

         $distiller_bomb thread global/obj_dm.scr::bomb_thinker
         // Commence le thread de victoire des alliés.
         thread allies_win_check
         // Commence le thread de victoire des Axis.
         $distiller_bomb thread axis_win_timer
end

//**************************************************************************************
* Test de la victoire allliée ( Victoire par réalisations des 3 objectifs
* ou éradication des forces opposées.
*//

allies_win_check:
         while(level.targets_destroyed < level.targets_to_destroy)
         {
                  waitframe
         }
         teamwin allies
end

//**************************************************************************************
* Test de la victoire axis ( Victoire par écoulement du temps
* ou eradication des forces opposées.
*//

axis_win_timer:
         level waittill axiswin // A la fin les Axis gagnent.
end




Retour sommaire
Retour texte principal