Jump to content
IndeedPete

Spin-Off Release: Simple Conversation System

Recommended Posts

Yes, if run client side.

 

Yes, the system can be called and set up as needed. If you are referring to the _isCutscene parameter of some functions in particular, that just creates cinema borders and adds skipping functionality, rendering the player immobilised for the duration.

 

kbTell does work in MP, it's the Arma 3 standard for voiced conversations in both SP and MP. My functions only bypass the kbTell's own text display in the side chat and, when correctly set up, show the subtitles using my custom dialogs instead.

 

You need to clarify your problem a bit more. Do you want longer multiple choice conversations requiring the player to push a button from time to time or just single sentences being shown in a pre-defined order?

Share this post


Link to post
Share on other sites

Thanks for the quick response, IndeedPete!

 

Well, for my current mission it will be enough to show single sentences of a dialogue between a German Officer and an Afghan village elder.  This conversation is supposed to have a pre-defined order of the sentences.  

 

If the cutscene parameter allows skipping the dialogue, I'd be interested in learning about that, too, since the mission itself is build to have some replayability through random enemy placement within a set number of markers - but these ideally appear only once the conversation is finished regularly or skipped.  It is intended that always the same set of markers appears.  Just the exact location of the enemy units is randomized within these (currently four) locations.  

 

Should it be too much of a hassle coding-wise to make markers appear as result of a conversation, I'd be satisfied with just having a conversation of sentences in a pre-defined order.

 

Thanks in advance for further help,

 

tourist

Share this post


Link to post
Share on other sites

If nothing else is happening, I would advise the simple conversation (right) over the simple sentences (left). Players can read it at their own pace, you can add questioning elements later, and the system is capable of running pre-defined code pieces.

 

2014-03-29_00003pik6y.jpg 2014-03-29_000044rkku.jpg

 

I think you probably want to download the example mission from the first post and just try the system.

Share this post


Link to post
Share on other sites

Fantastic work, i have one question,

 

How i can run a script from missionconversations.hpp? i am trying this:

	class Exit2
	{
		exit = 1;
		expression = "nul = [] execVM 'scripts\IntelTasks2.sqf';";
		sentences[] = {
			"Bye."
		};
	};
};

Greets and thanks.

Share this post


Link to post
Share on other sites

Yes, that is how it should work. What's happening if you do it that way?

Share this post


Link to post
Share on other sites

Yes, that is how it should work. What's happening if you do it that way?

The script not work,

 

I will explain better, what I do is spawn an AI just like that:

_civilian = ["LOP_Tak_Civ_Man_01","LOP_Tak_Civ_Man_02","LOP_Tak_Civ_Man_04"] call BIS_fnc_selectRandom;

_infogrp = createGroup CIVILIAN;
_informant = _infogrp createUnit [_civilian, [(getMarkerpos _markerinformant select 0) + 1, getMarkerpos _markerinformant select 1, +1.5], [], 0, "NONE"];
_informant allowDamage false;
_informant disableAI "MOVE";

[_informant, "opener2"] call IP_fnc_addConversation;

this is the piece of conversations concerning this AI:

	class exit2
	{
		exit = 1;
	};
	class opener2
	{
		arguments[] = {"(name player)"};
		responses[] = {"intel"};
		sentences[] = {
			"Hey, you have some information?",
			"Yes, %1. What would you like to know?"
		};
		sound = "radioclick";
	};
	class intel
	{
		responses[] = {"exit2"};
		expression = "nul = [] execVM 'scripts\IntelTasks1.sqf';";
		sentences[] = {
			"Give me your info"
		};
	};
};

And the script I want to run, and that's what I think does not work. Thanks.

hint "You have new info";

sleep 5;

_missions = ["info1","info2","info3"]; //mission array

_choose = _missions call BIS_fnc_selectRandom; // random mission 
[_choose] execVM "rtasks\makeIntelTasks.sqf";  //call mission

sleep 60;

if(true) exitWith{};

Share this post


Link to post
Share on other sites

What's your RPT saying? Do you run your game with -showScriptErrors?

Share this post


Link to post
Share on other sites

Yes run my game with -showScriptErrors, this is what it says my RPT,

21:02:33 Error in expression <[sealone, C Alpha 1-1:1, 'intel']>
21:02:33   Error position: <Alpha 1-1:1, 'intel']>
21:02:33   Error Missing ]
21:02:33 Error in expression <[sealone, C Alpha 1-1:1, 'intel']>
21:02:33   Error position: <Alpha 1-1:1, 'intel']>
21:02:33   Error Missing ]

sealone is the name of the unit player.

 

Many Thanks for your help.

Share this post


Link to post
Share on other sites

Might it be your "rtasks\makeIntelTasks.sqf"?

Share this post


Link to post
Share on other sites

What do you mean by supported? It's still working, I use it regularly.

Share this post


Link to post
Share on other sites

Wow thanks for this, this is what I always wanted to have but never had the skills to create  :D  :D

 

I asked about something similar back some time ago as I didn't quite like the BIS dialogue system, yours really feels like one found in games such as Baldurs Gate etc. 

 

I guess this is making me sound spoiled but is there any chance the system can be expanded to include NWN2 / Kotor style dialogue boxes?

 

I mean like this (so the dialogue options are directly under the characters and the camera centers on them):

 

ArmA2 Concept

3-s.jpg

 

Original Example from KOTOR

KbZoupl.jpg

 

 

I looked into the demo and it seems the direct camera is limited to ambient dialogue (which is alreay great anyway). 

Share this post


Link to post
Share on other sites

In theory, you'd "just" have to create your own dialog with a structured text field on top of the screen and the listbox on the bottom. Then changing the openConversation function a bit and you'd be good to go. A camera pointing at your conversation partner could be done as well with some scripting. (Note that this live feed thing would also work in the multiple choice dialog, someone actually did it somewhere, I just kept the static images for design reasons.) However, I will not do any of this as I'm happy with the system's current state. Oh, and you might want to take apart "Hunter Six" by Lato. I haven't played it but I saw some screenshots with a similar dialog as this one in the image you posted.

Share this post


Link to post
Share on other sites
Im getting an error. "config: some input after end of file" whenever i load my mission and the conversation system will fail to load.

Ive narrowed it down to the additions ive made to missionConversations.hpp . Whenever i remove those additions, it works. Can you take a look and see where i made a mistake. ive scanned it again and again and i cant see where i went wrong.

http://pastebin.com/Py4z2M14
 
The additions i made start at "//bro"
  •  

Share this post


Link to post
Share on other sites

Found the problem. I made another class exit (named exit2 which conflicted with the original one).

 

EDIT: Is there a way to give objects identities? i created a conversation with a radio object, and i already set its IP_ConvSpecial to "radio", but it will only display "Error: no unit Radio". I  want to give it a proper name or at least remove the error: no unit.

Share this post


Link to post
Share on other sites

Hi IndeePete, and thanks a lot for your awesome script!

my problem is similar to zafjr's one's. And I think it has something to do with the civilian spawning script. I use Engima's Civilians script and run it like that:

 

// the unit is:
_unit = this select 0;

// in the unit's callback (similar to init field in editor):

 	_unit setVariable ["IP_Avatar", "conv\img\defaultAvatar.jpg"];
	_unit setVariable ["IP_ConvSpecial", "Civilian"];
   [_unit, "opener"] call IP_fnc_addConversation;

Now here is the missionConversation.hpp:

 

class Conversations
{
	class exit
	{
		exit = 1;
		//expression = "nul = [Civilian, 'Bye!', 'DIRECT', 3] spawn IP_fnc_simpleSentence;";
		expression = "call IP_fnc_closeConversation;";
		sentences[] = {"Good bye!"};
	};
	class opener
	{
		arguments[] = {"(name player)"};
		responses[] = {"reputation", "intel", "exit"};
		sentences[] = {
			"Hey there, Civilian! May I ask you something?",
			"What do you want to know?"
		};
		sound = "radioclick";
	};
	class back
	{
		responses[] = {"reputation", "intel","exit"};
		sentences[] = {
			"I'd like to know something else.",
			"Yes?"
		};
	};
	class reputation
	{
		responses[] = {"back", "exit"};
		sentences[] = {
			"What do you think about our presence in this region?",
			"I am happy you guys are here! Please help us to fring freedom to our country!"
		};
	};
	class intel
	{
		responses[] = {"back", "exit"};
		sentences[] = {
			"Can you tell me anything about enemy movements in this area?",
			"Actually..not. Because my developer didn't allow me to tell you yet! Maybe in an upcoming BETA version!"
		};
	};
};

If I run the game - even with show_scripterrors enabled, it doesn't show me any error, but later in the RPT I found tis:

 

20:34:02 Error in expression <[player1, <NULL-object>, 'back']>
20:34:02   Error position: <<NULL-object>, 'back']>
20:34:02   Error Invalid number in expression
20:34:02 Error in expression <[player1, <NULL-object>, 'back']>
20:34:02   Error position: <<NULL-object>, 'back']>
20:34:02   Error Invalid number in expression

It seems something in " class 'back' " isn't right, but I cannot figure it out exactly. But there is another problem, and I think this is the reason for that - but if so, I just don't know how to get it solved. When I walk towards a civilian and start the conversation via action menu, it seems all to be fine. The conversation windows appears, it shows the player's name on the left and the civilian's name on the right - just as expected. But as soon as I click on the question which is related to "class 'back", it shows "Error: No Vehicle" instead of the civilian's name, and then after selecting any question (from the "class 'back' related conversation window) it just closes the conversation, without showing me any scripting error.

 

However, later I found the error message I've posted above in the RPT log. So what I'm doing wrong here? I already tried to figure the reason for that, tried to change some code, just everything I could imagine. But it doesn't help at all. Usually in the RPT it shows the related script file and points to a specific line from where the error comes from. But in this case, there's just this little error. The 'Null-object' points to the civilian unit - I guess. As it shows in conversation 'Error: No Vehicle' instead of the units name after I've selected one of the questions.

Do you have any idea? Thank you very much!

Share this post


Link to post
Share on other sites

I think it's that old problem that I basically serialise and later deserialise an array containing speaker one, speaker two, and the selected topic. Can't remember why I did that back then but this results in these problems when one of the speakers doesn't have a variable name assigned.

Share this post


Link to post
Share on other sites
On 2.3.2017 at 10:46 PM, IndeedPete said:

I think it's that old problem that I basically serialise and later deserialise an array containing speaker one, speaker two, and the selected topic. Can't remember why I did that back then but this results in these problems when one of the speakers doesn't have a variable name assigned.

 

You got any idea how I could fix it? I don't understand the code enough yet... The civs are being spawned dynamically, and they have names. As I said, the name will be taken over into the conversation dialoge, but as soon as player clicks an answer name is gone. How can I keep it?

Share this post


Link to post
Share on other sites

It's not the name of the character or anything; it's its variable name. I.e., what you coud set manually if you placed these units in the editor. Maybe you don't need to rework the script itself. How do you add topics to these units?

Share this post


Link to post
Share on other sites
3 hours ago, IndeedPete said:

It's not the name of the character or anything; it's its variable name. I.e., what you coud set manually if you placed these units in the editor. Maybe you don't need to rework the script itself. How do you add topics to these units?

PM you in German :)

Share this post


Link to post
Share on other sites

Hey IndeedPete,

This is godly, I tried to play around with the GUI editor and it was abit too advanced to accomplish what I had envisioned.

I have everything running with the basic functionality using your examples, the only thing I can't resolve is the Live feed element.

I am using the following in the init to test:


 

player setVariable ["IP_LiveFeed", true];

IP_Buddy setVariable ["IP_LiveFeed", true];

IP_Buddy setVariable ["IP_ConvSpecial", "God of VR"];

[IP_Buddy, "myfirstresponse"] call IP_fnc_addConversation;

What am I missing?
EDIT: Upon rereading and research, is the livefeed functionality not available for 'ConvSpecial' Variable?

EDIT: RESOLVED!!! (By reading all the forum posts haha!)

Additional Questions:

Is it possible to Execute and SQF from a given response?

I have hit a snag where, once the condition is met the response is then appearing in the list but the NPC response doesn't show:

       class MyFirstResponse // Name of the conversation.
{
    responses[] = {"exit","FoundTom"};
    sentences[] = {"I need to find Honest Tom!", "Ah yes, also known as Judas. Rumour has it he has impregnated many a fat chick, you should find him over there"};
};
       class exit
{
    exit = 1; // Closes conversation.
               expression = "nul = [iP_Buddy, 'Good luck getting out of here L01D', 'DIRECT', 3] spawn IP_fnc_simpleSentence;";
    sentences[] = {"Good bye!"};
};
     class FoundTom
{
    condition = "('Q1' call BIS_fnc_taskExists) && {('Q1' call BIS_fnc_taskState) == 'SUCCEEDED'};"
    responses[] = {"exit2"};
    sentences[] = {"I found him", "Was he trying to impregnate a fat chick again. Oh silly Tom, when will he ever learn."};
};


I also get the following error:

[IP_fnc_Openconversation] conversation ""Has no sentences!

Scrolling through the scripting I couldn't find an example of openconversation within your example mission.

Thanks

Share this post


Link to post
Share on other sites

You can run any code from the expression parameter in your missionConversations.hpp. There is some example on the first page.

 

Apparently, the conversation is not added correctly or does not exist. What's the exact code you use to add the convo to the character?

Share this post


Link to post
Share on other sites
On 2017-6-16 at 3:11 PM, IndeedPete said:

You can run any code from the expression parameter in your missionConversations.hpp. There is some example on the first page.

 

Apparently, the conversation is not added correctly or does not exist. What's the exact code you use to add the convo to the character?


This is resolved - just needed to clean up the code.

Is there a way to remove a line of text, so if it is used once it disappears (Without using conditions?)

Share this post


Link to post
Share on other sites

I am having an error with 

Quote

_hiddenData = call compile _this;

tells me line 11 in selectresponse.sqf has a generic error in expression with this line of code?  

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

×