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"

est un script sans variable d'entrée, qui se contente d'afficher "Hello", dans le coin supérieur gauche de l'écran lorsque vous jouez à OPF.

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

camera.sqs

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.


Cette page a été crée grace à 1st Page 2000.