Page 1 sur 1

Briefing by =[TTK]= Freshmeat

Posté : lun. 6 juin 2011, 13:06
par =[TTK]= Freshmeat
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.

Code : Tout sélectionner

_handle001 = execVM "briefing.sqf";
waitUntil {!isNil("bf_initdone")};
waitUntil {bf_initdone}; 
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.

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 };
 
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.

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;

};
Dans la mission :
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";}; 
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.

Re: Briefing by =[TTK]= Freshmeat

Posté : mar. 7 juin 2011, 09:32
par =[TTK]= Yourry
Manque plus qu'a tester, en tout cas merci Freash.
Le véritable test, c'est de savoir si Camille va l’utiliser, s'il y arrive, Freash tu auras réussi quelque chose de grand...

:mrgreen:

Re: Briefing by =[TTK]= Freshmeat

Posté : mar. 7 juin 2011, 10:28
par Camille Caz
Ouèouè. Mais je me suis demandé ce qu'est le Briefing_client.sqf puis j'ai lu "Briefing_client.sqf ne passe pas, quel dommage ....."

Et ça, ça passe pas.

Re: Briefing by =[TTK]= Freshmeat

Posté : mar. 7 juin 2011, 12:31
par =[TTK]= Freshmeat
Mis à jour avec tout le code.

Je n'ai pas mis la balise code=sqf pour le briefing_client car cela ne fonctionne pas.

Je vous laisse tester.

Re: Briefing by =[TTK]= Freshmeat

Posté : mar. 7 juin 2011, 13:32
par =[TTK]= Memphis007
=[TTK]= Freshmeat a écrit :Je n'ai pas mis la balise code=sqf pour le briefing_client car cela ne fonctionne pas.
Trop de trucs à colorer, php n'aime pas :(, va falloir que j'optimise mes expressions régulières.