Briefing by =[TTK]= Freshmeat
Posté : lun. 6 juin 2011, 13:06
Je pense que mon modèle de briefing tient la route désormais, docn je vous le rpésente.
Le principe :
J'utilise un script 'briefing_client.sqf', qui contôle toutes les 2 secondes si des variables publiques régissant les objectifs sont mises à jour.
Ces variables sont à modifier par le mission maker himself dans sa mission.
Ce que ça fait :
- briefing présent dès le début de la mission
- gère le JIP
- gère les objectifs PvP par faction
- affiche les changements de stauts des objectifs avec taskhint
- gére les fins de missions avec un taskhint
Ce qui n'est pas géré :
- le changement de faction par le joueur en cours de partie : la faction utilisée est toujours la faction d'origine du joueur.
Comment ça marche ?
Dans init.sqf
Après avoir lancé le briefing.sqf, on pause le jeu le temps que ARMA ait fait au moins une fois le tour dans briefing_client.sqf pour que toutes les variables soit bien déclarées pour la suite de la mission.
Dans briefing.sqf
Les variables relatives aux objectifs sont construites comme suit :
x puis side puis _obj_ puis type
x : c'est un 'x' tout bête
side : c'est la faction pour laquelle l'objectif est à créer
_obj_ : c'est comme le 'x', on n'y touche pas
type : sert à distinguer les variables pour un même objectif
Il faut prendre soin de preciser ici aussi le type de respawn dans la variable bf_respawn.
Dans briefing_client.sqf
Il n'y a rien à changer
TOUTES LES VARIABLES PUBLIQUES UTILISEES DANS BRIEFING_CLIENT.SQF COMMENCENT PAR BF_, donc pour éviter tout problème de compatibilité avec d'autres scripts, soit on évite de créer de nouvelles variables commençant par bf_, soit il faut les renommer dans le script briefing_client.sqf.
Dans la mission :
pour mettre à jour un objectif, privilégier la forme suivante qui permet de gérer correctement les JIP :
A noter :
- dans la mission, il ne faut pas mettre le 'x' devant le nom de la variable '_obj_stat'.
- les variables "_end_obj_stat" servent à gérer la fin de mission, lui donner une des valeurs autorisées (END1-6,LOSER), entraîne la fin de la mission pour la faction concernée.
Le principe :
J'utilise un script 'briefing_client.sqf', qui contôle toutes les 2 secondes si des variables publiques régissant les objectifs sont mises à jour.
Ces variables sont à modifier par le mission maker himself dans sa mission.
Ce que ça fait :
- briefing présent dès le début de la mission
- gère le JIP
- gère les objectifs PvP par faction
- affiche les changements de stauts des objectifs avec taskhint
- gére les fins de missions avec un taskhint
Ce qui n'est pas géré :
- le changement de faction par le joueur en cours de partie : la faction utilisée est toujours la faction d'origine du joueur.
Comment ça marche ?
Dans init.sqf
Après avoir lancé le briefing.sqf, on pause le jeu le temps que ARMA ait fait au moins une fois le tour dans briefing_client.sqf pour que toutes les variables soit bien déclarées pour la suite de la mission.
Code : Tout sélectionner
_handle001 = execVM "briefing.sqf";
waitUntil {!isNil("bf_initdone")};
waitUntil {bf_initdone};
Les variables relatives aux objectifs sont construites comme suit :
x puis side puis _obj_ puis type
x : c'est un 'x' tout bête
side : c'est la faction pour laquelle l'objectif est à créer
_obj_ : c'est comme le 'x', on n'y touche pas
type : sert à distinguer les variables pour un même objectif
Il faut prendre soin de preciser ici aussi le type de respawn dans la variable bf_respawn.
Code : Tout sélectionner
// A NE PAS MODIFIER : INITIALISATION PAR DEFAUT DES STAT
xwest_1_obj_stat = "";
xeast_1_obj_stat = "";
xciv_1_obj_stat = "";
xguer_1_obj_stat = "";
xlogic_1_obj_stat = "";
xenemy_1_obj_stat = "";
west_end_obj_stat = "";
east_end_obj_stat = "";
civ_end_obj_stat = "";
guer_end_obj_stat = "";
logic_end_obj_stat = "";
enemy_end_obj_stat = "";
// INFORMATIONS COMMUNES A TOUS LES JOUEURS
xall_info = "Mettre ici le texte commun à tous les joueurs, il apparaitra dans la rubrique 'Information'.";
// BRIEFING PAR faction
xwest_ennemies = "Mettre ici le texte apparaissant dans la rubrique 'Ennemis' du briefing.";
xwest_allied = "Mettre ici le texte apparaissant dans la rubrique 'Alliés' du briefing.";
xwest_situation = "Mettre ici le texte apparaissant dans la rubrique 'Situation' du briefing";
xwest_1_obj_lib = "Libellé complet de 1er objectif, avec liens vers les marqueurs et tout le reste.";
xwest_1_obj_titre = "Titre de l'objectif, utilisé dans la liste des objectifs et sur les messages.";
xwest_1_obj_level = "Préfixe du titre : Primaire, Secondaire, .... ";
xwest_1_obj_stat = "Statut de l'objectif : NONE, CREATED, SUCCEEDED, FAILED, CANCELED. A 'NONE', l'objectif n'apparait pas en début de mission";
xwest_1_obj_mkr = "Nom du marqueur correspondant à l'objectif.";
xwest_1_obj_failed = "Texte dans le cas ou l'objectif passe à FAILED, mettre un simple point pour le texte par défaut, laisser vide pour ne pas avoir de message.";
xwest_1_obj_succeeded = "Texte dans le cas ou l'objectif passe à SUCCEEDED, mettre un simple point pour le texte par défaut, laisser vide pour ne pas avoir de message.";
xwest_1_obj_canceled = "Texte dans le cas ou l'objectif passe à CANCELED, mettre un simple point pour le texte par défaut, laisser vide pour ne pas avoir de message.";
xwest_1_obj_created = "Texte dans le cas ou l'objectif passe à CREATED, mettre un simple point pour le texte par défaut, laisser vide pour ne pas avoir de message.";
xwest_1_obj_assigned = "Texte dans le cas ou l'objectif passe à ASSIGNED, mettre un simple point pour le texte par défaut, laisser vide pour ne pas avoir de message.";
// Toujours mettre un objectif supplémentaire avec un statut vide
xwest_2_obj_stat = "";
// Messages de fin de mission
west_end_obj_loser = "Echec de la mission";
west_end_obj_end1 = "Fin de la mission";
// PRECISER LE type DE RESPAWN
bf_respawn = "group";
// APPEL DE LA GESTION DES OBJECTIFS
_briefingclient = execVM "briefing_client.sqf";
waitUntil { !isNull player };
waitUntil { player == player };
Il n'y a rien à changer
TOUTES LES VARIABLES PUBLIQUES UTILISEES DANS BRIEFING_CLIENT.SQF COMMENCENT PAR BF_, donc pour éviter tout problème de compatibilité avec d'autres scripts, soit on évite de créer de nouvelles variables commençant par bf_, soit il faut les renommer dans le script briefing_client.sqf.
Code : Tout sélectionner
if (!isdedicated) then {
waitUntil { !isNull player };
waitUntil { player == player };
bf_initdone = false;
bf_llmess = false;
bf_loend = "";
bf_lnend = 0;
bf_unitplayer = player;
bf_loobjlib = "";
bf_loobjtitre = "";
bf_loobjlevel = "";
bf_loosucceeded = "";
bf_loofailed = "";
bf_loocanceled = "";
bf_loocreated = "";
bf_looassigned = "";
bf_loomkr = "";
_lcside = side player;
//JIP : on n'écrase pas les objectifs
bf_lni = 1;
call compile format["bf_lostat = x%1_%2_obj_stat",_lcside,bf_lni];
while {bf_lostat != ""} do {
call compile format["bf_lonil = isnil('%1_%2_obj_stat')",_lcside,bf_lni];
if (bf_lonil) then {call compile format["%1_%2_obj_stat = x%3_%4_obj_stat",_lcside,bf_lni,_lcside,bf_lni];};
bf_lni = bf_lni + 1;
call compile format["bf_lostat = x%1_%2_obj_stat",_lcside,bf_lni];
};
call compile format["%1_%2_obj_stat = x%3_%4_obj_stat",_lcside,bf_lni,_lcside,bf_lni];
call compile format ["bf_loennemies = x%1_ennemies",_lcside];
call compile format ["bf_loallied = x%1_allied",_lcside];
call compile format ["bf_losituation = x%1_situation",_lcside];
if (xall_info != "") then {player createDiaryRecord["Diary", ["Info", xall_info]];};
if (bf_loennemies != "") then {player createDiaryRecord["Diary", ["Forces ennemies", bf_loennemies]];};
if (bf_loallied != "") then {player createDiaryRecord["Diary", ["Forces alliees", bf_loallied]];};
if (bf_losituation != "") then {player createDiaryRecord["Diary", ["Situation", bf_losituation]];};
bf_lni = 1;
call compile format["bf_lostat = %1_%2_obj_stat",_lcside,bf_lni];
while {bf_lostat != ""} do {
call compile format["bf_lonil = isnil('%1_%2_objectif')",_lcside,bf_lni];
if (!bf_lonil) then {call compile format ["%1_%2_objectif = nil",_lcside,bf_lni];};
bf_lni = bf_lni + 1;
call compile format["bf_lostat = %1_%2_obj_stat",_lcside,bf_lni];
};
bf_initdone = true;
bf_loend = "";
call compile format ["bf_loend = %1_end_obj_stat",_lcside];
while {bf_loend == "" OR bf_lnend <= 6} do {
if (bf_unitplayer != player && bf_respawn == "GROUP") then {
call compile format ["bf_loennemies = x%1_ennemies",_lcside];
call compile format ["bf_loallied = x%1_allied",_lcside];
call compile format ["bf_losituation = x%1_situation",_lcside];
if (xall_info != "") then {player createDiaryRecord["Diary", ["Info", xall_info]];};
if (bf_loennemies != "") then {player createDiaryRecord["Diary", ["Forces ennemies", bf_loennemies]];};
if (bf_loallied != "") then {player createDiaryRecord["Diary", ["Forces alliees", bf_loallied]];};
if (bf_losituation != "") then {player createDiaryRecord["Diary", ["Situation", bf_losituation]];};
bf_lni = 1;
call compile format["bf_lostat = %1_%2_obj_stat",_lcside,bf_lni];
while {bf_lostat != ""} do {
call compile format["bf_lonil = isnil('%1_%2_objectif')",_lcside,bf_lni];
if (!bf_lonil) then {call compile format ["%1_%2_objectif = nil",_lcside,bf_lni];};
bf_lni = bf_lni + 1;
call compile format["bf_lostat = %1_%2_obj_stat",_lcside,bf_lni];
};
bf_unitplayer = player;
};
bf_lni = 1;
bf_lnassigned = 0;
call compile format ["bf_loobjstat = %1_%2_obj_stat",_lcside,bf_lni];
while {bf_loobjstat != ""} do {
if (bf_loobjstat != "NONE") then {
call compile format ["bf_loobjlib = x%1_%2_obj_lib", _lcside,bf_lni];
call compile format ["bf_loobjtitre = x%1_%2_obj_titre", _lcside,bf_lni];
call compile format ["bf_loobjlevel = x%1_%2_obj_level", _lcside,bf_lni];
call compile format ["bf_loosucceeded = x%1_%2_obj_succeeded", _lcside,bf_lni];
call compile format ["bf_loofailed = x%1_%2_obj_failed", _lcside,bf_lni];
call compile format ["bf_loocanceled = x%1_%2_obj_canceled", _lcside,bf_lni];
call compile format ["bf_loocreated = x%1_%2_obj_created", _lcside,bf_lni];
call compile format ["bf_looassigned = x%1_%2_obj_assigned", _lcside,bf_lni];
call compile format ["bf_loomkr = x%1_%2_obj_mkr", _lcside,bf_lni];
call compile format ["bf_loonil = isnil('%1_%2_objectif')",_lcside,bf_lni];
if (bf_loonil) then {
call compile format ["%1_%2_objectif = player createSimpleTask [bf_loobjtitre]",_lcside,bf_lni];
call compile format ["%1_%2_objectif setSimpleTaskDescription [bf_loobjlib,bf_loobjlevel + ' : ' + bf_loobjtitre, bf_loobjtitre]",_lcside,bf_lni];
if (bf_loomkr != "") then {call compile format ["%1_%2_objectif setSimpleTaskDestination (getmarkerpos '%3')",_lcside,bf_lni,bf_loomkr];};
bf_loostat = "NONE";
} else {
call compile format ["bf_loostat = taskstate %1_%2_objectif",_lcside,bf_lni];
};
switch (bf_loobjstat) do {
case "CREATED" : {
if (bf_loostat == "NONE") then {
call compile format ["%1_%2_objectif settaskstate 'CREATED'",_lcside,bf_lni];
if (bf_llmess && bf_loocreated != "") then {
if (bf_loocreated == ".") then {bf_loocreated = "NOUVEL OBJECTIF :\n"+bf_loobjtitre;};
taskhint [bf_loocreated,[1,1,1,1],'tasknew'];
};
};
};
case "SUCCEEDED" : {
if (bf_loostat != "SUCCEEDED") then {
call compile format ["%1_%2_objectif settaskstate 'SUCCEEDED'",_lcside,bf_lni];
if (bf_llmess && bf_loosucceeded != "") then {
if (bf_loosucceeded == ".") then {bf_loosucceeded = "OBJECTIF ATTEINT :\n"+bf_loobjtitre;};
taskhint [bf_loosucceeded,[0.6,0.8,0.4,1],'taskdone'];
};
};
};
case "FAILED" : {
if (bf_loostat != "FAILED") then {
call compile format ["%1_%2_objectif settaskstate 'FAILED'",_lcside,bf_lni];
if (bf_llmess && bf_loofailed != "") then {
if (bf_loofailed == ".") then {bf_loofailed = "ECHEC :\n"+bf_loobjtitre;};
taskhint [bf_loofailed,[1,0.1,0,1],'taskfailed'];
};
};
};
case "CANCELED" : {
if (bf_loostat != "CANCELED") then {
call compile format ["%1_%2_objectif settaskstate 'CANCELED'",_lcside,bf_lni];
if (bf_llmess && bf_loocanceled != "") then {
if (bf_loocanceled == ".") then {bf_loocanceled = "OBJECTIF ANNULE :\n"+bf_loobjtitre;};
taskhint [bf_loocanceled,[0.75,0.75,0.75,1],'taskdone'];
};
};
};
};
};
bf_lni = bf_lni + 1;
call compile format ["bf_loobjstat = %1_%2_obj_stat",_lcside,bf_lni];
};
bf_llmess = true;
sleep 1;
bf_loend = "";
call compile format ["bf_loend = %1_end_obj_stat",_lcside];
if (bf_loend != "") then {bf_lnend = bf_lnend + 1;};
};
bf_loend = "";
call compile format["bf_loend = %1_end_obj_stat",_lcside];
call compile format["bf_looendlib = %1_end_obj_%2",_lcside,bf_loend];
if (bf_looendlib != "" && bf_loend != "LOSER") then {taskhint [bf_looendlib,[1,1,1,1],'taskdone'];};
if (bf_looendlib != "" && bf_loend == "LOSER") then {taskhint [bf_looendlib,[1,0.1,0,1],'taskfailed'];};
sleep 10;
call compile format["endmission '%1'",bf_loend];
} else {
bf_initdone = false;
laside = ["WEST","EAST","CIV","GUER","LOGIC","ENEMY"];
lnside = 0;
while {lnside <= 5} do {
_lcside = laside select lnside;
bf_lni = 1;
call compile format["bf_lostat = x%1_%2_obj_stat",_lcside,bf_lni];
while {bf_lostat != ""} do {
hint format["%1",bf_lni];
call compile format["bf_lonil = isnil('%1_%2_obj_stat')",_lcside,bf_lni];
if (bf_lonil) then {call compile format["%1_%2_obj_stat = x%3_%4_obj_stat",_lcside,bf_lni,_lcside,bf_lni];};
bf_lni = bf_lni + 1;
call compile format["bf_lostat = x%1_%2_obj_stat",_lcside,bf_lni];
};
call compile format["%1_%2_obj_stat = x%3_%4_obj_stat",_lcside,bf_lni,_lcside,bf_lni];
lnside = lnside + 1;
};
bf_initdone = true;
};
pour mettre à jour un objectif, privilégier la forme suivante qui permet de gérer correctement les JIP :
Code : Tout sélectionner
if (isServer) then {west_1_obj_stat = "SUCCEEDED";publicVariable "west_1_obj_stat";};
- dans la mission, il ne faut pas mettre le 'x' devant le nom de la variable '_obj_stat'.
- les variables "_end_obj_stat" servent à gérer la fin de mission, lui donner une des valeurs autorisées (END1-6,LOSER), entraîne la fin de la mission pour la faction concernée.