Jump to content
Jezuro

New conversation system how-to

Recommended Posts

thanks for reuploadind the mission.

Share this post


Link to post
Share on other sites

Quick question-

I've got the basic conversation working now, where you can select a single answer which will then close the conversation.

Is there a simple way to have the conversation menu open again once you've received the reply, with the conversation options you had previously, but minus the ones you've selected already?

I haven't had much luck using "if" cases within the switch-case-do (i.e. "If I've already asked this, don't show it as an option.").

Thanks :)

Share this post


Link to post
Share on other sites

After messing about with it some more, I've gotten the "if not" statements working.

So my conversation tree looks like this now:

BIS_convMenu = [];

if (_from == villager1 && _sentenceId == "" && !(_this kbWasSaid [_from, _topic, "intel_translator_welcome", 999999])) then

{

BIS_convMenu = BIS_convMenu + [["Greet Villager", _topic, "intel_translator_welcome", []]];

};

//once you receive the Villager's return Welcome, give the Option for any of the three sentences below

switch (_sentenceId) do {

case "intel_villager1_welcome": {

BIS_convMenu = BIS_convMenu + [["Ask Question 1.", _topic, "intel_translator_Q1_0", []]];

BIS_convMenu = BIS_convMenu + [["Ask Question 2.", _topic, "intel_translator_Q2_0", []]];

BIS_convMenu = BIS_convMenu + [["Thank the Villager.", _topic, "intel_translator_thanks", []]];

};

//if you ahaven't asked Question 2 yet, give the Option to do so once receiving "Answer 1"

case "intel_villager1_A1_0": {

if not (_this kbWasSaid [_from, _topic, "intel_translator_Q2_0", 999999]) then {BIS_convMenu = BIS_convMenu + [["Ask Question 2.", _topic, "intel_translator_Q2_0", []]]; };

BIS_convMenu = BIS_convMenu + [["Thank the Villager.", _topic, "intel_translator_thanks", []]];

};

//if you haven't asked about Question 1 yet, give the Option to do so once receiving "Answer 2"

case "intel_villager1_A2_0": {

if not (_this kbWasSaid [_from, _topic, "intel_translator_Q1_0", 999999]) then {BIS_convMenu = BIS_convMenu + [["Ask Question 1.", _topic, "intel_translator_Q1_0", []]]; };

BIS_convMenu = BIS_convMenu + [["Thank the Villager.", _topic, "intel_translator_thanks", []]];

};

};

// return the sentence list pool

BIS_convMenu

Share this post


Link to post
Share on other sites

Hi all. Could I ask someone to explain me how exactly these conversations work. I don't need anything fancy like choosing your answers yet.I need to keep it simple so that the conversation goes on by itself. I tried creating talk.bikb but how do you actually make it work? Ive tried without success. Is there just a trigger where I need to type execute talk.bikb or something?

I really don't get it, maximum I got was made Arma2 crash like 5 times in a row because it didn't like how I wrote the bibk. file, would be really good if it didn't crash but just showed me the error without exiting the whole game it gets too frustrating now.

The example mission didn't help at all. It just got me confused even more.

Could someone post how to make it simple, like in an intro a camera fly's in a trigger and the text starts going (I plan adding voices later when I actually learn how to make even the simplest conversations) or if player enters the zone and starts talking with other people? Thanks for your patience.

Edited by ediko911
Grammar

Share this post


Link to post
Share on other sites

It seems the link for the demo missions is down again. It would be very nice if someone could re-upload it. thanks

Share this post


Link to post
Share on other sites

Thanks, i realy tried it with your instructions, but i did not get it. now i am able to continue my campagne! thanx

Share this post


Link to post
Share on other sites

How would you do if you'd want to add a topic to all civilian ? wheter they're generated by ALICE or not

Share this post


Link to post
Share on other sites
{if (side _x == Civilian) then {_x kbAddTopic [. . .]}} forEach allUnits

Share this post


Link to post
Share on other sites

I just dont get it with this fsm-files, pretty difficult. I read a lot, but it is still hard. but in the beginning you say there is a "Manual" conversation flow. How do i start this manual conversation? i tried it with a sqf file, but it does not work.

and another question: i want to avoid the player from moving. he should only be able to move his head. how and where do i implement this condition?

Share this post


Link to post
Share on other sites

Sorry but is there somewhere a reference for all the default voice classnames so i could like use the phrases from the game like you did in your example mission. Thanks in advance

Share this post


Link to post
Share on other sites

All dubbing soundfiles are packed in addon dubbing.pbo. Conversation sentences are defined in .bikb files located in every mission folder, subfolder \kb.

Share this post


Link to post
Share on other sites

This is working great for me.

But there are some words (That I really really need), that I can't make the unit say :/

This is not my real sentence, lol, but it works, except "sniper" is not spoken.

In fact, any vehicle is not spoken. I can use SniperRifle, etc., but not vehicles...

Does vehicle words have postfixes or prefixes? Like vehiclesniper or unitsniper, or something?

class Sentences

{

class RequestReinforcements

{

text = "This is sniper";

speech[] = {thisis,sniper};

class Arguments {};

};

};

Share this post


Link to post
Share on other sites

Is it actually possible to define custom words? I see in the config, words are defined like this (see dubbingradio_e.pbo):

class RadioProtocol_EP1_EN: RadioProtocolBase {

class Words {
	micOut = {"\ca\DubbingRadio_E\Data\Mic_Out1.ogg"};
	micOut1 = {"\ca\DubbingRadio_E\Data\over01.ogg"};
	micOut2 = {"\ca\DubbingRadio_E\Data\over02.ogg"};
	micOut3 = {"\ca\DubbingRadio_E\Data\over03.ogg"};
	loop = {"\ca\DubbingRadio_E\Data\radionoise1.ogg"};
	beepBeep = {"\ca\DubbingRadio_E\Data\beep.ogg"};
	pause = {"\ca\DubbingRadio_E\Data\empty01sec.ogg"};
	xmit = {"\ca\DubbingRadio_E\Data\beep.ogg"};
	sabot = {};
	mgun = {};
	NO_SPEECH = {};
	empty = {};
	Advance = {"DEFAULT\Advance.ogg"};
	And = {"DEFAULT\And.ogg"};
	Are = {"DEFAULT\Are.ogg"};
               ...

The natural place do define custom words would be in the description.ext. But I don't see anything mentioned about CfgWords anywhere. So is this currently possible at all (without resorting to addons)? Is it legal to define CfgWords like CfgRadio in the description.ext file? Or shall we use CfgRadio or CfgSounds to define words, would that work?

The biki states that the argument speech is an array of Strings, where each string is an already defined word in configs. So I guess the easiest solution - without the need to actually define custom words - is not legal, i.e. something like this:

class 
{
	text = "$STR_fullSentence";
	speech[] = {"\Sound\part1.ogg", %Number, "\Sound\part2.ogg"};
	class Arguments {
        class Number {type = "simple";};
	};
};	

in a bikb file would not work, wouldn't it?

And as for the variable part or the placeholder, %Number in this case, which are later passed along with kbTell.. Shall these sounds be defined as CfgRadio?

Share this post


Link to post
Share on other sites

Further I wonder if it's possible to declare alternative stealth/wisper sounds, which could be used to great effect?

Well, but first we need to know how to define and use custom words. I really hope that this is possible at all, for glueing sentence dynamically together would help a lot with dubbing. The benefits are obvious.

Share this post


Link to post
Share on other sites

Is there any way to let the text disappear faster ?

Because it stays pretty long...

Share this post


Link to post
Share on other sites

Using OA 1.54 and playing from the editor I'm unable to to play the sound files.

I have this (in class Sentences ofc):

class Hello_1
{
   text = "Hello, how are you?";
   speech[] = {"Hello_1.ogg"};
   class Arguments {};
};

And with speech[] = {}; it works fine, the text is written 2s later the response comes etc. etc.. However if I put a sound file: "Hello_1.ogg" in my mission root folder and put that in as above, no sound is played, however the 2s delay between the hello and the response is gone. The sound file is about 2s long so it is not muted or something like that. I tried using one of the sound files from the example by Jezuro and renamed that to Hello_1.ogg however that gives the same result. What must I do to have the sample played.

In case it matters the sound is being "played by" the player.

Share this post


Link to post
Share on other sites

I've been messing about this now for a while, using the Domination kbTell system as a basis to learn from. What I think may scare off the new guy is the complexity of the kbTell array once you start putting in arguments, where some arguments have text only, others speech only, and some both text and speech.

So here is a pretty complex example I've done myself in order to get textual and verbal communications with FDC during an artillery request which is a bit more complex than the vanilla game really supports. I won't show the generated variables that is put into it, other than to say that _vocalarray and _vocaltype are precalculated arrays of strings, where the strings match the actual words (filenames found in "ArmA 2\Expansion\Addons\dubbingradio_e\RADIO\Male01EN\DEFAULT\*", but without the extension. "Pause" is also a word if you need to break it up a little for verbal clarity).

So, for an advanced parameter example, I have this setup in .bikb file:

class ArtilleryRequest {
	text = "%Team, requesting %Type strike %Mode %Location. %Rounds salvoes!";
	speech[] = {%Team,%Type,%Location};
	class Arguments {
		class Team {type = "simple";};
		class Type {type = "simple";};
		class Mode {type = "simple";};
		class Rounds {type = "simple";};
		class Location {type = "simple";};
	};
};

And what you may be presented in a worst case scenario:

player kbTell [_speaker,d_kb_topic_side_arti,"ArtilleryRequest",["Team","",_firstsecondstr,[_firstsecondstr]],["Type","",d_ari_type,_vocaltype],["Mode","",if (_mode == "grid") then {" at grid"} else {", observer position"},[]],["Location","",if (_mode == "grid") then {if (count _input == 8) then {_position call Xf_ToGrid8} else {mapGridPosition getMarkerPos D_ARTI_MARKER_HELPER};} else {format ["%1. Angle %2 mils at %3 meters", _grid,_mils,_dist]},_vocalarray],["Rounds","",str(d_ari_salvos),[]],true];

That's just nasty and completely unreadable, and trying to edit it will be anything but easy. So let's break it up. What's the biki information about the syntax?

person kbTell [receiver, topic, sentence id, [argument name, argument value, argument text, argument speech], ...{,forceRadio}]

Those ... indicates that there can be more arrays of parameters. So if we separate the parameters from the rest, and make them separate lines, we get a nicer looking syntax, like:

person kbTell [receiver, topic, sentence id,
[argument name, argument value, argument text, [b][color="#ff0000"][[/color][/b]argument speech[b][color="Red"]][/color][/b]],
...
{,forceRadio}
]

I highlighted the speech argument, as it's easy to overlook the fact that this is an array of strings. See below where I have a string stored in firstsecondstr, that I put that into [].

If you apply that to my example, you end up with (for my 5 parameters):

player kbTell [_speaker,d_kb_topic_side_arti,"ArtilleryRequest",
["Team","",_firstsecondstr,[_firstsecondstr]],
["Type","",d_ari_type,_vocaltype],
["Mode","",if (_mode == "grid") then {" at grid"} else {", observer position"},[]],
["Location","",if (_mode == "grid") then {if (count _input == 8) then {_position call Xf_ToGrid8} else {mapGridPosition getMarkerPos D_ARTI_MARKER_HELPER};} else {format ["%1. Angle %2 mils at %3 meters", _grid,_mils,_dist]},_vocalarray],
["Rounds","",str(d_ari_salvos),[]],
true
];

It's looking better, but with nested if statements in the code, it can be further refined for readability. Something like this:

player kbTell [_speaker,d_kb_topic_side_arti,"ArtilleryRequest",
["Team","",_firstsecondstr,[_firstsecondstr]],
["Type","",d_ari_type,_vocaltype],
["Mode","",
	if (_mode == "grid") then {
		" at grid"
	} else {
		", observer position"
	},[]
],
["Location","",
	if (_mode == "grid") then {
		if (count _input == 8) then {
			_position call Xf_ToGrid8
		} else {
			mapGridPosition getMarkerPos D_ARTI_MARKER_HELPER
		};
	} else {
		format ["%1. Angle %2 mils at %3 meters", _grid,_mils,_dist]
	},_vocalarray],
["Rounds","",str(d_ari_salvos),[]],
true
];

And there it is. This made that noncomprehensible messy looking kbTell line from hell you just downloaded, into something that may be easier to follow and change into what you need.

Share this post


Link to post
Share on other sites

Fyi, example mission is down :(

Oops! Google Chrome could not connect to arma.jezurosworkshop.net

Share this post


Link to post
Share on other sites

Now have the kb system working very well, it just takes a little practice to get your head fully wrapped around it. And using it with the MP support modules ( rKBTELL via the RE call ) works fine for simple phrases.

But remote version does not appear to support complex phrases, ones with variable substitution. Looking at the 1.56 version of the MP module seems to support that finding. :confused:

All is not lost, you just need to use a wrapper script and rEXECVM that instead.

Share this post


Link to post
Share on other sites

The sample mission link is broken so I really have no chance of understanding this. :(

I hate how simple things (in theory) are so difficult to accomplish when making missions worth a damn.

Share this post


Link to post
Share on other sites

Okay, after even my private server went down, I hope I just reuploaded the mission for the last time.

Share this post


Link to post
Share on other sites

Hey Jezuro im having a problem using the interrupted event, It does not work for my conversation (infact i cannot use sentenceid check for anything)

I have an NPC, and a trigger around him that will add the topics to the npc and the player that walks into the trigger. I can engage in conversation with him, but as soon as I hit backspace, the check sentenceid == "Interrupted" does not go through in the fsm, and doesnt display the hint.

I did add an Interrupted sentence class into the bikb file, and i added it into the fsm. Does this check only work when in the start state of an fsm?

Currently It is setup that:

the player must talk to him first, this works

then the NPC engages with the first sentence, also works

then the player response, works

npc engages with second sentence, works

the entire conversation and flow works, but the interrupted check does not, hanging the entire conversation and all the scripts, until the player has given a response (which he cant since he has cancelled the conversation)

here is a picture of my FSM so that maybe someone here might explain to me why this doesnt work:

http://img695.imageshack.us/i/npcborisfsm.jpg/

I had to use kbWasSaid to check if a response was given, sentenceId does not work apparently after the first state, and kbWasSaid does not work to check for "Interrupted"

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×