Briefing by =[TTK]= Freshmeat

Pour les Masochistes Éditeurs de missions
Répondre
Avatar du membre
=[TTK]= Freshmeat
Retraité
Retraité
Messages : 474
Enregistré le : lun. 1 mars 2010, 13:49

Briefing by =[TTK]= Freshmeat

Message 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.
Les gens n'accordent guère d'importance à la vie, la preuve : quand ils la perdent, ils ne la réclament jamais.
[Jean Deluca]
Image

Avatar du membre
=[TTK]= Yourry
Grand Scriptou
Grand Scriptou
Âge : 36
Messages : 1634
Enregistré le : mer. 17 mars 2010, 16:39
Localisation : Dans le reblochon !

Re: Briefing by =[TTK]= Freshmeat

Message 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:
"Les Boches faisaient "Kamarad". Il aurait fallu commencer par ça des deux côtés, pour éviter les massacres organisés par ceux d'en haut, mais le fusil qu'ils nous avaient collé entre les mains, forcément, il a bien fallu qu'il serve et tout le reste à suivit." dixit Tardi et Verney
Image
L'autre jour, en tirant le rouleau de papier cul, toute la cloison est venue avec. dixit Camille Caz

Avatar du membre
Camille Caz
Grand Gourou
Grand Gourou
Âge : 83
Messages : 1814
Enregistré le : lun. 25 janv. 2010, 22:45
Humeur : paléolithique mais presque
Localisation : près de La Rochelle

Re: Briefing by =[TTK]= Freshmeat

Message 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.
On n'a pas toujours ce qu'on mérite mais on ne mérite pas forcément ce qu'on a.

Avatar du membre
=[TTK]= Freshmeat
Retraité
Retraité
Messages : 474
Enregistré le : lun. 1 mars 2010, 13:49

Re: Briefing by =[TTK]= Freshmeat

Message 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.
Les gens n'accordent guère d'importance à la vie, la preuve : quand ils la perdent, ils ne la réclament jamais.
[Jean Deluca]
Image

Avatar du membre
=[TTK]= Memphis007
Grand TranKilou
Grand TranKilou
Âge : 43
Messages : 3351
Enregistré le : mer. 13 janv. 2010, 15:29
Humeur : Binaire
Localisation : 127.0.0.1
Contact :

Re: Briefing by =[TTK]= Freshmeat

Message 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.
Si ya pas de shell, ya pas de plaisir...
Image

Fingers in the noise. Maxime verdâtre.

Répondre