Dans cette section je me propose de vous initier à la programmation
de missions pour Opération Flashpoint.
Si certaines de mes affirmations vous semblent incorrectes, n'hésitez
pas à me le faire savoir.
Sections
Dernière mise à jour, le 25/ 07/03, section caméras.
A chaque section correspond, si cela est nécessaire, un fichier exemple à télécharger, reprenant les explications données.
Le fichier init.sqs
Le fichier description.ext
Musiques,
Sons et Messages radios
Réalisation de scripts
Cameras
Le script Camera.sqs
INIT.sqs
Le fichier init.sqs est le fichier dans lequel vous pourrez spécifier les conditions initiales de l'ensemble des variables globales que vous utiliserez dans votre mission.
Il doit être sauvegardé dans le répertoire de votre
mission.
Cela concerne aussi bien les variables booléennes ( Type : Vrai / Faux
), les variables numériques et alphanumériques classiques, que les objets
( Personnages, véhicules etc.. )
Ce fichier sera exécuté au tout début de la mission, avant même son lancement,
vous pouvez ainsi spécifier l'équipement de vos personnages, la valeur
initiale de vos variables globales, et même exécuter certains scripts
nécessaires à la mise en place de vos unités.
Voici par exemple, le fichier init.sqs de ma dernière mission, Tempus
Fugit.
;Identité des différents personnages moi setidentity "moi" moi2 setidentity "moi2" moi3 setidentity "moi3" piotr setidentity "piotr" marek setidentity"marek" bilou setidentity "gus" ;Equipement des différents personnages moi addweapon "nvgoggles" moi addweapon "binocular" moi2 addweapon "nvgoggles" moi3 addweapon"nvgoggles" civ2 addmagazine "kozliceball" civ2 addmagazine "kozliceball" civ2 addmagazine "kozliceball" civ2 addmagazine "kozliceball" civ2 addweapon "kozlice" ;Valeur de départ des différentes variables globales radon=false contact=false camp=false save=0 nothd=false unfix=false ;Etat des différents messages radio 3 setradiomsg "null" 4 setradiomsg "null" 5 setradiomsg "null" ;Etat des differends objectifs ( cachés ) "1" objstatus "hidden" "2" objstatus "hidden" "3" objstatus "hidden" ;Equipement des differents personnages removeallweapons b removeallweapons b_1 removeallweapons b_2 removeallweapons b_3 b removemagazines "grenade" ;Exécution de scripts [moi,pl] exec "quickmonte.sqs" [] exec "random.sqs" [moi,oh58] exec "radar.sqs" |
Télécharger le fichier Exemple
description.ext
Le fichier description.ext est un fichier essentiel lors de la réalisation
de vos missions.
Il doit être sauvegardé dans le répertoire de votre
mission.
Grâce à lui vous pouvez définir les nombreux paramétres personnalisant
vos missions : l'identité de vos personnages, les scores ( Mini Maxi Moyen
), le texte qui apparait à l'intro et durant le chargement de votre mission,
l'utilisation ou non de certains matériels ( Montre, boussole, Gps, carte
etc... ), mais surtout vous pouvez aussi définir les nouveaux sons,
musiques, et messages radios que vous aurez créés pour rendre votre mission
encore plus particulière !!!
I. Définitions des paramétres standards.
; Definition des scores minis et
maxis décernant les étoiles lors du débriefing final minScore=1000 avgScore=6000 maxScore=15000 ; Texte qui apparait lors de l'intro Onloadintro="Malden." ; Texte qui apparait lors du chargement de la mission onloadmission="Near the crash zone." ; Dans les exemples qui suivent : 1="oui" 0="Non" ; y'a t'il un débriefing à la fin de la mission ? ici oui debriefing = 1 ; Peut-on utiliser la montre ? Non showwatch = 0 ; Peut on utiliser la boussole ? Oui showcompass = 1 ; Peut on utiliser le bloc-note ? Oui shownotepad = 1 ; Peut on utiliser le GPS ? Non showgps = 0 ; Peut on utiliser la carte ? Oui showmap = 1 ; Fait apparaître la date et l'heure lors du chargement de l'intro. onLoadIntroTime = true |
II. Personnalisation de l'apparence des personnages
Vous pouvez aussi définir l'apparence physique de vos personnages, voici un exemple :
class cfgidentities { class gus -> Chaque personnage correspond à une classe { name = "Gus"; -> Nom du personnage, utilisé avec l'instruction "setidentity" face = "face22"; -> Visage du personnage, il y en a 51, Voir le guide de références glasses= "none"; -> Porte t'il des lunettes ? "None"=non -> "sunglasses"=lunettes de soleil -> "spectacle"=lunettes normale speaker = "dan"; -> Voix utilisée lors des comptes-rendus automatiques pitch = 1.0; -> Ton de lavoix : 1.0=normal, >1.0 plus aigu, <1.0 plus grave }; class marek { name = "Marek Groviak"; face = "face14"; glasses= "sunglasses"; speaker = "Adam"; pitch = .96; }; class moi2 { name = "Stephen Goldman"; face = "face49"; glasses= "spectacle"; speaker = "Adam"; pitch = .9; }; }; |
III. Sons, Musiques et Messages Radios.
C'est certainement la partie la plus rébarbative de la création des missions pour Opération Flashpoint, mais c'est aussi grâce à une ambiance sonore particulière que vous pouvez donner un caractère 'professionnel' à vos missions.
A. Les conditions nécessaires
Pour pouvoir
utiliser des sons persos, il y a un minimum de conditions à respecter si l'on
veux que cela fonctionne.
Les fichiers sons doivent
être en Ogg vorbis, monophonique, constant Bit Rate.
Ogg Vorbis
est un format récent qui permet d'avoir un son de qualité avec des fichiers relativement
moins gros que le format MP3. L'échantillonage n'a pas d'importance, il influe
surtout sur la taille du fichier final, ce qui peut être un handicap lorsque l'on
veux télécharger vos missions.
Dans la rubrique Outils
vous trouverez les programmes nécessaires pour créer vos fichiers en Ogg vorbis.
Tous les fichiers sons ( Musique,
Radio, Sons ), doivent être placé dans le répertoire "sound" de votre mission.
Si il n'existe pas il faut le créer.
Ces conditions respectées, il n'y
a plus qu'à ajouter les données dans le fichier Description.ext.
B. Mise en page et paramètres
La mise en page, dans le fichier Description.ext, est trés importante.
Le fonctionnement global de la définition des sons
est quasiment toujours le même, il faut définir la classe ( Son, Musique, Radio
), indiquer tous les fichiers à utiliser, puis pour chaques fichiers, indiquer
les paramètres à utiliser lorsqu'ils sont joués.
Le language ressemble
beaucoup au HTML, il faut veiller à bien respecter les ";", "}" et autres "{",
qui délimitent les différentes parties du fichier.
Un éditeur est disponible dans la rubrique outils de mon site, il vous permettra de créer rapidement les paragraphes nécessaires à la réalisation de votre fichier description.ext.
C. Sons
Les sons servent à beaucoup de choses dans les missions, ils définissent
aussi bien les sons d'environnement que les paroles de vos personnages. Utilisé
en association avec WavToLiP pour synchroniser le
son avec le mouvement des lèvres de votre personnage l'effet est impressionant.
Voici la syntaxe à utiliser pour définir vos sons :
-> Définitions des sons
joués lors de la mission. class CfgSounds { sounds[] = { MM,YMCA }; -> Nom des fichiers sons, SANS l'extensions .ogg class mm -> Chaque nouveau son commence par Class, suividu nom du fichier SANS .ogg { name = "MM"; ->Nom qui apparaitra dans la listedes sons des déclencheurs sound[] = {"mm.ogg", db-50,1}; -> Entre les "",le nom du fichier AVEC l'extension .ogg -> db-50, atténuation par rapport au sons environnants (+/-) -> "Ton" du son joué, 1 = normal, <1 + grave, >1 plus aigu titles[] = { }; -> A laisser tel quel }; class ymca { name = ""; sound[] = {"ymca.ogg",db-50,1}; titles[] = { }; }; }; |
Pour ensuite jouer vos sons dans la mission, il suffit d'utiliser la commande PLAYSOUND "Nomduson", avec le nom du son SANS l'extension .Ogg, tel qu'il est défini dans le DESCRIPTION.EXT.
Un éditeur est disponible dans la rubrique outils de mon site, il vous permettra de créer rapidement les paragraphes nécessaires à la réalisation de votre fichier description.ext.
D. Musiques
La syntaxe à respecter est assez similaire à celle des sons, elle respecte quasiment le même schéma.
class cfgmusic { tracks[]= { boa,mm }; -> Nom des différentes pistes musicales, format Ogg Vorbis, Mono. class boa -> A chaque morceaux correspond une classe {name= "boa"; -> Nom du fichier, SANS l'extension .ogg Sound[]={\sound\boa.ogg,db+0,1.0}; -> Répertoire ou se trouve le morceau, ATTENTION tous les sons doivent être dans le répertoire \sound de votre mission -> Db et ton comme pour les sons. }; class mm {name= "mm"; Sound[]={\sound\mm.ogg,db+0,1.0}; }; }; |
Pour ensuite jouer vos morceaux dans la mission, il suffit d'utiliser la commande PLAYMUSIC "Nomdumorceau", avec le nom du morceau SANS l'extension .Ogg, tel qu'il est défini dans le DESCRIPTION.EXT.
Un éditeur est disponible dans la rubrique outils de mon site, il vous permettra de créer rapidement les paragraphes nécessaires à la réalisation de votre fichier description.ext.
D. Radio
La qualité de l'échantillonage peut être un peu abaissée, de manière à donner une impression supplémentaire de réalisme. Les effets d'électricité statique sont ajouté automatiquement par le jeu.
class Cfgradio { sounds[] = {catdest,da33,df33,eb33};
-> Nom des différents fichiers, SANS .Ogg class catdest -> A chaque message correspond une classe { name =""; -> A laisser tel-quel sound[] = {"catdest.ogg", db+0,0.93}; -> Nom du fichier Avec .ogg, db et pitch title = Armored counter attack destroyed. -> Texte apparaissant lorsque le message est -> joué }; class da33 { name = ""; sound[] = {"da33.ogg", db+0,0.93}; title = HQ to all units. Ennemy strike detected at grid DA33. }; class df33 { name = ""; sound[] = {"df33.ogg", db+0,0.93} ; title = HQ to all units. Ennemy strike detected at grid DF33. }; class EB33 { name = ""; sound[] = {"EB33.ogg", db+0,0.93}; title = HQ to all units. Ennemy strike detected at grid EB33. }; }; |
Pour ensuite jouer vos messsages radios dans la mission, il suffit d'utiliser la commande SIDERADIO "Nomduson" ou GLOBALRADIO "Nomduson", avec le nom du son SANS l'extension .Ogg, tel qu'il est défini dans le DESCRIPTION.EXT.
Un éditeur est disponible dans la rubrique outils de mon site, il vous permettra de créer rapidement les paragraphes nécessaires à la réalisation de votre fichier description.ext.
Télécharger le fichier Exemple
Scripts
Les scripts sont de petits programmes, relativement
simples à écrire, qui permettent de réaliser des opérations complexes, ou répétitives.
Définition
Les variables
:
Il y en a de plusieurs types : Elles peuvent être
Booléenes ( Vrai / Faux ), numériques, comme alphanumériques.
Les variables
globales sont utilisées pour l'ensemble de la mission programmée, que ce soit
pour les scripts comme pour les variables utilisées dans le jeu. Exemples : a,
Roger, V1.
Les variables locales, ne sont utilisées que dans les scripts,
elles se différencient des variables globales car elles ont précédées par "_"
( Ex : _a, _Roger,_V1 ).
Dans les 2 cas, les variables peuvent être booléenes,
numériques, comme alphanumériques.
Composition des scripts :
Le
script est un fichier texte éditable par l'intermédiaire de Notepad ou de Wordpad,
son extension est .sqs,
par exemple Demonstration.sqs.
Ils
doivent être installés dans le répertoire de votre mission.
Ils
ne nécessitent pas nécessairement de variables d'entrées.
Une variable
d'entrée est une valeur nécessaire pour pouvoir exécuter le script, ou qui sera
modifiée par celui-ci.
Par exemple :
Hint "Hello" |
Appel des scripts
Dans le jeu, les scripts sont appelés par l'intermédiaire des lignes "Sur activation" et/ou "Sur désactivation" des déclencheurs ou des points de passages.
Dans cette image on voit que la condition "alarme"
active le script "trckill.sqs", "[pat21,moi,"stealth",20]"
correspondant aux variables d'entrée du script, "exec"
est la commande qui fait s'éxécuter le script.
Ainsi, tous les scripts
s'appellent comme cela : [....] exec "nomduscript.sqs",
entre les [] il faut placer les variables d'entrées, dans l'ordre ou elles sont
attendues par les script, et entre les " " le nom du script et son extension .sqs
.
Si le script n'a pas de variable d'entrée, il faut simplement ouvrir et
fermer les crochets : [] exec "bidon.sqs".
Ecriture des scripts
Comme dit précèdemment, ils sont éditables via Notepad, ou Wordpad.
Si le script nécessite des variables d'entrée, il faut les récupérer, cela
se fait au début du fichier par l'intermédiaire de variables locales et de la
commande "_this select".
Exemple, le script
coords.sqs, disponible dans la page scripts de mon site :
_v0=_this select 0 Hint format ["Coordonnées :%1",getpos _v0] exit |
Dans
ce script, la variable locale _V0 prendra la valeur
de la variable d'entrée 0. Cette variable d'entrée,
étant la première de la liste des variables d'entrée ( Eh oui, un ordinateur compte
à partir de 0 !! ).
Ce script récupére les coordonnées d'un objet ( Véhicule,
Objet, Personnage... ), et les affiche dans le coin supérieur gauche de l'écran
d'OPF.
Il est appelé comme suit : [Roger] exec
"coords.sqs". Roger étant par exemple le nom
d'un personnage.
Un exemple avec plusieurs variables d'entrée :
Le
script "eject.sqs"
_v0 = _this select 0 _v1 = _this select 1 _i = 0 _j = 0 _v1 stop true #Here _j = count units _v0 _grou = units _v0 ? not alive (_grou select _i):_i=_i+1 (_grou select _i) action ["EJECT",_v1] unassignvehicle (_grou select _i) _i=_i+1 _j = count units _v0 ~0.5 ?_j>_i:goto "Here" #fin _v1 stop false exit |
Ce
script, un peu plus évolué, fait s'éjecter un groupe d'un véhicule.
La
ligne d'appel est :[groupe,helico] exec "eject.sqs"
les variables d'entrées sont groupe et
helico, elles sont récupérées par les variables locales _v0
et _v1, par les commandes _this
select 0 et _this select 1.
A vous de jouer !!
Je n'ai pas l'intention ( ni le temps d'ailleurs ) de vous
apprendre les arcanes de la programmation des scripts. Je vous conseille, si vous
voulez vous lancer, de télécharger le guide de référence ainsi que les scripts
que j'ai écrit, la plupart contiennent les informations nécessaires à leur compréhension,
le reste étant affaire de pratique.
Pour écrire vos scripts et les tester
tout de suite, lancez OPF, et lorsque vous devez écrire un script utiliser ALT-TAB
pour basculer en mode windows, écrivez votre script, sans oublier de
l'enregistrer dans le répertoire de votre mission avec l'extension ".sqs".
Faites ALT-TAB et basculez sur OPF pour le tester...
Rassurez-vous,
cela vient assez vite car c'est réellement facile !!!
Télécharger le fichier Exemple
Cameras
Les scénes cinématiques sont certainement les éléments
qui donnent un véritable 'aspect professionnel' aux missions personnalisés. Elles
permettent de mettre dans l'ambiance de la partie, de créer des rebondissements,
voire de montrer certains faits importants pour comprendre les tenants et les
aboutissants de votre mission.
La création d'une scéne cinématique est
loin d'être compliquée, mais elle nécessite l'emploi de scripts. Bien qu'il soit
possible de la programmer directement via l'interface de l'éditeur d'OPF, le résultat
est souvent aléatoire, car parfois, une modification infime d'un élément entraîne
un changement complet du comportement des unités et nécessite des corrections
assez fastidieuses.
Je vous propose donc de vous expliquer, à l'aide d'une scéne exemple, comment créer vos propres scénes cinématiques.
Les bases
Je considére que vous savez comment créer et appeler un script.
Les scénes cinématiques utilisent des caméras, les caméras doivent être considérées
comme des objets immatériels, qui doivent être définis dans l'espace. Pour cela
vous devez commencer par placer votre caméra dans l'espace, par rapport à un objet
de référence, définir les caractéristiques de votre caméra, lui indiquer l'objet
filmé, puis déterminer ses mouvements dans la durée et l'espace.
Une
fois votre caméra définie, vous devez lui indiquer quel objet viser, pour cela
vous utiliserez la commande "_cam CAMSETTARGET obj", ou _cam
est le nom de la caméra, et ou obj est le nom de
l'objet visé.
Vous pouvez positionner votre
caméra de 2 maniéres :
Soit de façon
absolue dans l'espace à l'aide de la commande "_cam
CAMSETPOS [x,y,z]", qui définit une position spatiale précise par
rapport aux coordonnées de la carte.
Soit de façon relative
à un objet existant, à l'aide de la commande "_cam CAMSETRELPOS
[x,y,z]" où x, y et z définissent des coordonnées relative à l'objet visé.
Le plus dur est fait, il suffit ensuite d'indiquer à votre caméra les changements
de cible, à l'aide de "Camsettarget", puis le temps quelle doit mettre pour effectuer
les changements, à l'aide de la commande "camCommit",
ainsi, par exemple "_cam camCommit 10" signifie que
la caméra "_cam" à 10 secondes pour effectuer son changement de cible.
Une fois la durée de changement définie, il suffit d'attendre que la caméra ait
fini son mouvement pour passer à la scéne suivante, cela est réalisé grâce à la
commande "@camCommitted
_cam", qui indique au script d'attendre que la caméra "_cam"
ait fini son mouvement pour continuer à dérouler le script.
Exemple
La
scéne créée pour la démonstration est une scéne de parachutage de troupes russes
sur un village.
Voici son script avec les commentaires nécessaires à
sa compréhension. Vous pouvez télécharger le dossier éditable et le tester sur
votre machine.
Les différentes variables sont "mi" l'hélico russe, "moi"
le soldat américain au funeste sort, "hinv" un "H invisible", "_camg" la caméra.
;
Définition de la position absolue de la caméra par rapport à l'hélico "mi" ; _camgx, camgy et _camgz étant les coordonnées spatiales de la caméra _camgx = getpos mi select 0 _camgy = getpos mi select 1 _camgz = getpos mi select 2 ;Création de l'objet caméra, nommé _camg, aux coordonnées définies auparavant _camg="camera" CamCreate [_camgx,_camgy,_camgz] ; Indication de la cible de la caméra, ici "mi", l'hélico _camg CamSetTarget mi ; Indication du temps que devra mettre la caméra pour se mettre en place, ici 0 seconde _camg camCommit 0 ; Indication du type de caméra, ici une caméra externe, qui se place devant l'objet visé ; d'autres modes existent, voir le guide de référence _camg CameraEffect ["external","front"] ; Mise en place de la caméra, de façon RELATIVE à l'objet visé ( mi ) définit précedemment ; Ici la caméra se place 10 ;métres devant mi, 16 métres à droite de mi et 5 métres plus haut _camg camsetrelpos [10,16,5] ; La caméra à 2 secondes pour se mettre en place _camg camCommit 2 ;Le script attend que la caméra soit en place @camCommitted _camg ; La caméra filme mi sans bouger pendant 10 secondes ~10 ; Indication d'une nouvelle cible à la caméra, ici "moi" _camg CamSetTarget moi ; positionnement RELATIF de la caméra par rapport à "moi" _camg camsetrelpos [0.5,.2,1.7] ; 8 secondes pour se déplacer _camg camCommit 8 ; attente de la fin du mouvement @camCommitted _camg ; 5 secondes d'attente en filmant "moi" ~5 ; Nouvelle cible pour la caméra, "mi" _camg CamSetTarget mi ; 3 secondes pour effectuer le mouvement : Comme il n'y a pas d'indication de position ; la caméra ne se déplace, mais effectue ;simplement une rotation pour viser sa cible _camg camCommit 3 ; attente de la fin du mouvement @camCommitted _camg ; Attente que la variable "vu" passe à "true" ; voir le déclencheur sur la carte de l'éditeur @vu ; Rien de particulier, voir précedemment _camg CamSetTarget mi _camg camsetrelpos [100,6,0] _camg camCommit 3 @camCommitted _camg ~8 ; Récupération des coordonnées du H invisible nommé "hinv" _camgx = getpos hinv select 0 _camgy = getpos hinv select 1 _camgz = getpos hinv select 2 ; Positionnement ABSOLU de la caméra, 100 métres au dessus de "hinv" _camg camsetpos [_camgx,_camgy,_camgz+100] _camg CamSetTarget moi _camg camCommit 10 @camCommitted _camg ~10 _camg CamSetTarget moi _camg camsetrelpos [15,6,20] _camg camCommit 3 @camCommitted _camg ; attente de la mort de "moi" @ (not alive moi) ; ralentissement du temps au 1/10° de sa vitesse normale setacctime 0.1 ; déplacement de la caméra vers "moi" _camg camsetrelpos [.1,1,1.7] ; Temps de déplacement, en tenant compte du ralentissement du temps _camg camCommit 0.1 ; attente d'une seconde à 1/10° de la vitesse normale, soit 10 secondes. ~1 ; destruction de la caméra _camg CameraEffect ["Terminate","back"] CamDestroy _camg ;retour à la vitesse normale setacctime 1 |
Téléchargez le fichier exemple,installez le dans votre répertoire de création de missions, et modifiez certains paramétres, vous verrez c'est trés facile à assimiler !!!
Télécharger le fichier Exemple
Pour vous simplifier la vie, et créer vos cinématiques rapidement, il y a aussi le script magique !!
C'est : obj exec "camera.sqs".
Ce script, intégré à l'éditeur, vous permet de créer
une caméra dans le jeu. On manie la caméra, on sélectionne
une cible puis on appuie sur la touche CTRL Gauche pour créer, dans un fichier
nommée clipboard.txt du répertoire racine
d'ofp, les infos utilisables directement dans le script de votre cinématique.
Après cela, il suffit de récupérer les positions de la caméra
dans ce fichier et il n'y a plus qu'à rajouter les commandes pour créer la caméra,
la détruire, donné les temps d'attente et de déplacement entre chaque mouvements
de caméra !!
Touche | Mouvement
de caméra ou action correspondante |
A | Monter |
W | Descendre |
Z | Avancer
Lent |
E | Avancer
Rapide |
S | Reculer
Lent |
D | Straffe
Droit |
Q | Straffe
Gauche |
X | Straffe
Gauche Rapide |
C | Straffe
Droit Rapide |
V | Retour
au joueur ( Vision du personnage ) |
Espace | Fixer
la cible : Carré Jaune : Pas de cible sélectionnée ( Dans le fichier Clipboard.sqs, vous aurez les coordonnées visées par la caméra ) Carré Rouge : Cible vérrouillée ( Dans le fichier Clipboard.sqs, vous aurez le nom de l'unité visée par la caméra ) |
8 ( PN ) | Lever
|
2 ( PN ) | Baisser |
4
( PN ) | Rotation Gauche |
6
( PN ) | Rotation Droite |
+ | Zoom
Avant |
- | Zoom
Arrière |
CTRL Gauche | Inscription
des lignes dans le fichier Clipboard.txt |
L | Activation
/ Désactivation du réticule |
Poua activer
le script : Vous placez l'appel du script dans la case activation d'un déclencheur
radio ( activation plusieurs fois ), avec obj le
nom de l'objet ou de l'unité où doit se créer la caméra.
ATTENTION il ne doit pas y avoir de [] ni de ""
autour d'obj.
Exemple de ce qui se trouve dans le Clipboard.txt :
;===
15:46:45 _camera camSetTarget mike _camera camSetPos [6260.84,6462.46,0.94] _camera camSetFOV 0.123 _camera camCommit 0 @camCommitted _camera ;=== 15:47:00 _camera camSetTarget vul _camera camSetPos [6260.84,6462.46,0.94] _camera camSetFOV 0.280 _camera camCommit 0 @camCommitted _camera |
Il suffit d'enlever les paramètres horaires ( ;=== 15:46:45 ), de faire des copier-coller dans votre script de cinématique et de rajouter les autres paramètres pour obtenir quelque chose de trés correct.
Un lien est mort ? Contactez-moi !!
Ce site n'est en aucun cas affilié à Bohemia Interactive Studio ou Codemasters.
Les programmes fournis dans ce site sont livrés "tels quels" et n'engage en aucun cas la responsabilité du webmaster.
Graphismes et Design [SON]Golden-Trigger et Tyrell 2002.