Ladies and Gents:

These forums are now closed and registration disabled.

Please join us at our new forum on Proboards. Our hope is that these new forums are more stable, provide more and better features, and allow continuation of the project forums in a safer, more secure, long term environment.


--The ME3Explorer Team

[Finished] Dialogue Editor

Semi-technical area to discuss content modding research and discoveries. Technical information necessary for coding tools should be posted in Technical Research on the Coders board.

[Finished] Dialogue Editor

Postby giftfish » 19 Oct 2013, 15:31


This post has been revised to coincide with the first installment of the Dialogue Editing Tutorial (posting momentarily). A big thanks to JohnP for ironing out several details.

IMPORTANT: This post is still incomplete, as we're still unclear about the function of several parameters. If you have knowledge not in this research post, please share. And, please correct me if I've fecked anything up, lol :]

1. To open the editor go to Developer Tools > Dialog > Dialog Editor.

2. Open the PCC you want to examine/edit by going to File > Open PCC. Navigate to the location of the PCC file. We'll start with BioD_CitHub_HospitalP2_LOC_INT.pcc, as that's one of the main files we edit for ThaneMOD.

IMPORTANT: The editor by default will load the TLK file that's in the main game CookedPC. If you want to load a different TLK, then you need to go to File > Load Different TLK. Then navigate to the location of that TLK file.

3. Once the file is loaded, select the desired conversation from the drop down menu on the top left. Then click "Load." We'll be looking at 3 different ones:

    #260 : citprs_hosp_tha_inv_d_dlg -- The "investigate" portion of Thane's Huerta dialogue, when he and Shepard are seated.
    #261 : citprs_hosp_thane_d_dlg -- The "Intro" portion of Thane's conversation, when he and Shepard are standing.
    #263 : citprs_udina_AK_visit_v_dlg -- The "Intro" to the second visit with the VS when they are awake and Udina is exiting the room.

Go ahead and select 260 first.

4. I'll also be using an ambient dialogue between Liara and Aethyta as an example. This is located in BioD_CitHub_PresidiumP2_LOC_INT.pcc. The dialogue is: citprs_aethyta_liara_ambs_a_dlg. FYI, the number in front of the conversation file name corresponds to its Export entry in PCCEd2.

Now to review the contents of each tab, a bit out of order.


The Speaker List is an itemized list of the speakers in the conversation. It only contains characters who speak, are not Shepard, and who are not considered the "owner" of the conversation (more on "owners" in a bit). Since only Shepard and Thane are involved in this conversation, only Thane's name appears on the list.

The "0" in "0 : 524" is just for numbering (numbering starts at 0 instead of 1). You'll see this convention (# : #) used in multiple locations in the editor. The "524" to the right identifies "global_thane" in the Name list. Name lists are PCC-specific, so if/when global_thane is used in other PCCs, it won't be identified by the same number.


Stage Directions are exactly what you'd expect from the tab name. They list animations and events that occur in the dialogue scene. The string IDs referenced here (e.g., 641224) don't have lines of dialogue associated with them (hence the "No Data" that follows).


Male and Female Face Sets refer to the FaceFX Animation Sets that are loaded during the conversation. The numbers to the right of the colon correspond to the Export entries for the sets (similar to the dlg), however unlike the Name list the numbers are off by one. That means that the female animation sets for this dialogue should actually be: 1302, 1305, and 1307. Male ones should be 1303, 1306, 1308.

The gender refers to Shepard. In other words, "global_thane_F" refers to Thane's facial animations when conversing with FemShep. The "M" suffix is used with BroShep. There are also sets that end in "Player_F/M" (sets for FemShep/BroShep, I assume) and "Owner_M/F."

Note: There are no "NonSpkr" sets present, despite these being listed in PCCEd2. I'm not certain what these correspond to.

Tab 1 contains the "Starting List." This is a list of the different ways the conversation can begin. The numbers after the colon direct you toward the Entry List entry number that begins the conversation. The presence of only one entry here indicates the conversation will always begin in the same manner.


The screenshot above shows Thane's investigate dialogue can begin in two ways. The first way (the top entry), points to entry 0 in the Entry List. The second way (the bottom entry), points to entry 3 in the in the Entry List. The game engine always starts the dialogue with position "0" in the Starting List, but what the player experiences in game varies with how the conditional/bool checks return. This may be more obvious when looking at the gibbed dump:


Now let's take a look at a different type of dialogue: Liara's ambient dialogue with Aethyta on the Presidium. Note that the "ambs" in the file name indicates this is an ambient dialogue, not an investigate:


In this case, the ambient can begin 11 different ways; the game starts at the top of the list and works its way down depending on how the conditional checks return. With ambients, usually it's a case of triggering sequentially--the game simply keeps track and triggers one right after the other. This is why you can walk up to Liara/Aethyta repeatedly and retrigger a new ambient each time. Sometimes, though, the ambient that triggers is dependent upon other plot events (common with Steve/James).

Similar to Thane's dialogue, the numbers to the right of the colons indicate the Entry List number that the dialogue will start with. So, 0 triggers first, then 6, then 12, and so on. With that, let's look at the Entry List tab.

The Entry List contains all lines/events for the speakers listed in the Speaker List. That means everyone BUT Shepard. For Thane's "Investigate" dialogue, that means all of Thane's lines. For the VS Intro convo, it actually means lines from Ashley, Kaidan and Udina, as seen here:


The text in the entries are the spoken lines of dialogue. Instances of "No Data" correspond to other "events" in the conversation. More on this later.

For the rest of this section we're going to use Thane's Investigate convo to discuss the contents of the Entry List.


The top two entries have been expanded and an excerpt from the gibbed dialogue testdump placed alongside them. Corresponding variables are shaded in like colors. Here's what each parameter means:

    1. Entry # and String Text
    Each entry is an "event," which may or may not correspond to a spoken line. For example, entry 0 lacks a spoken line, but entry 1 does not (Thane: "Coming by again, Shepard? I'm flattered.").

    2. Reply List -- updated August 15, 2014
    Indicates the reply triggered by the entry. This field will have either one entry (which points to a single reply), no entries, or a list of 2+ entries (a dialogue wheel or multiple replies dependent upon conditional/bool checks). If it is empty, the conversation stops there. The field always follows the same format, as can be seen in the ThaneMOD edit below:


    • 641255 = TLK string ID
    • "Back on Earth..." = the dialogue wheel text as defined by the above string's data
    • 2 = Reply List entry triggered from choosing this option on the dialogue wheel (i.e., what Shepard will actually say in game)
    • EReplyCategory = a "label" that refers to the text that follows it; the "category" reference can also be found in the Gibbed dump
    • REPLY_CATEGORY_INVESTIGATE = the type of reply; there are a variety of others including REPLY_CATEGORY_DEFAULT, REPLY_CATEGORY_AGREE, REPLY CATEGORY_PARAGON_INTERRUPT and more. More details about this in the Dialogue Tutorial.

    3. Speaker List
    Contains the speakers in the conversation as defined by the Speaker List tab. It is defined for each entry that can occur first in a conversation, as specified in the Starting List.

    4. Speaker Index
    Identifies the speaker for the line as defined by the Speaker List tab. If there is no spoken line, then this field will say "-1." This value will also be used when the line is spoken by the conversation "owner." The "owner" of a conversation is defined by a link to a StartConversation object in the sequence map.

    5. Listener Index
    Unknown. Shepard may be the "Listener" (since it's the opposite of "Speaker"), but I have yet to verify this. Values tend to range from 0 to -3 but I can't locate any links to specific characters in the dialogue, different beginning entries, ambients versus investigates, or anything. There is no "Listener list."

    6. ConditionalFunc
    Identifies the plot bools or conditionals checked by the entry. If ConditionalFunc checks a conditional, the game is hard-coded to only proceed to the reply if it returns "true." A value of -1 ("null") indicates no conditional/bool is checked. FYI, entry 0 for Thane's Investigate dialogue checks plot bool 18819. Entry 1 checks conditional 1265.

    7. ConditionalParam
    Since the game is hard-coded to only proceed to the defined reply if a conditional returns true, the ConditionalParam field is "null" (-1) much of the time. The exception is if there are multiple ways the dialogue can begin (see the Starting List), as with Aethyta and Liara's ambient dialogue. In this case conditional 898 is listed in ConditionalFunc and the number in ConditionalParam corresponds to the entry's position in the Starting List.


    If ConditionalFunc checks a plot bool, then the game needs to know what to do depending on how it returns. In that case, ConditionalParam indicates how the bool needs to return (true=1/false=0) to trigger the defined Reply. Looking at Thane's Investigate dialogue, bool 18819 has to return true (1) for entry 0 to trigger reply 0. This is how the game checks to see if the player has already completed this dialogue previously.

    8 & 9. StateTransition/Param -- updated November 5, 2014
    State Transitions are what the game uses to change the state of plot bools and integers. In fact, a single state transition can specify changes to multiple plot and integer points. The ID of the State Transition does not correspond to the values for the ints or bools themselves. Depending on the structure of the conversation (if there are multiple branches) the same transition values can appear in different entries.

    The StateParam field sort of works like the CondFunc field, in that it defines the value to set for integers. This is used frequently in ambient dialogues, as with the Liara-Aethyta Presidium convo. Bools are binary, so a value likely doesn't need to be specified, which is why the parameter field contains "-1" in these instances.



    Note: State Transitions can be now be added, edited, and deleted from the game using TankMaster's Natives Editor. More on this in to come the Dialogue Tutorial.

    10. ExportID
    Refers to camera positioning. Replacing the value in this field with one used by another entry will change the camera angle to the one used by that entry.

    11. Script Index
    Unknown. All values I've encountered are identical (-1).

    12. Camera Intimacy -- Updated November 5, 2014
    Defines how zoomed in the camera is. Values seem to range from 1 to 4.

    13. Skippable
    Setting this to "false" will make the line unskippable via the spacebar.

    13. Fire Conditional
    Controls whether the game checks the defined conditional for the entry. It will always be set to "True" when there is a conditional defined by ConditionalFunc OR when the field is empty (-1). Changing FireConditional to "false" will allow you to disable the conditional check for entry while keeping the conditional defined by ConditionalFunc in place. If there is a plot bool in ConditionalFunc, then FireConditional is always set to "False." Comparing entries 0 and 2 in Thane's Investigate dialogue provides a good example.

    14. Ambient -- Updated November 5, 2014
    Defines whether the dialogue is ambient or cutscene. Thane's conversations are cutscenes so Ambient is set to "False." Liara and Aethyta's dialogue have this set as "True" for all fields. Turning this "on" is one step involved in turning ambient conversations into full cutscenes. Doingso requires that all the other necessary camera objects are in place, which often is not the case.

    15. NonTextLine
    Refers to CineDesign sounds that don't have strings associated with them in the TLK, such as entry 25 of Thane's dialogue. This entry lacks text and this field is set to "True." All other entries have this set to "False." Thanks to Emeraldfern for figuring this out.

    16. IgnoreBodyGestures
    Unknown. Frequently set to "False."

    17. AlwaysHideSubtitle
    Setting this to "True" hides the subtitle for the line, regardless of the subtitle setting for the game. It's used in situations where there might be kisses/gasps/grunts/etc BW doesn't want to display, when there IS string data present for the line. Refer to Thane's Intro dialogue, entry 28 of the Reply List for an example.

    18. Text
    Unknown. Always empty in my experience.

    19. Reftext
    Contains the string ID and data (text) for the spoken line associated with the entry. If the string ID is absent from the TLK, the text will say "No Data."

    20. GUIStyle
    Unknown. So far all instances I've located have: "(EConvGUIStyles) GUI_STYLE_NONE." Both phrases are identified by their position in the Name list. The phrase in the parentheses is likely a label, similar to the "EReplyCategory" parameter referenced earlier.

The Reply List contains all of "Shepard's" lines regardless of whether s/he speaks in the conversation. The VS Huerta dialogue is short but illustrates this well:


This also means that many ambient dialogues in the game have "No Data" for their Reply List entries, as Shepard doesn't speak in many of them.

For the most part, Reply List fields are identical to those in the Entry List, but there are a few differences:

    1. Entry List

    "Entry List" is a subcategory rather than "Reply List". It points to one or more entries in the Entry List. In the example below, entry 0 in the Reply List can trigger two different entries in the Entry List: 1 and 2. It will try to trigger them in order. The one the player experiences is the first one that returns correctly based upon the conditionals built into the Entry List entries. In other words, if conditional 1265 returns true, the game will play entry 1 of the Entry List. If 1265 returns false it will play entry 2 of the Entry List.

    2. Unskippable
    Similar to the "Skippable" field in the Entry List.

    3. IsDefaultAction
    This parameter defines which decisions the game defaults to when not in Full Decision/RPG mode. For example, in Thane's Intro conversation we see this set to "True" for entry 16. This is when FemShep has the option to tell Thane the relationship with Kaidan is in the past. Typically, if this field is set to "True," the next field is as well.

    4. IsMajorDecision
    "Major Decisions" are replies Shepard can make that have an impact on future plot points. It seems that in most cases (but not all) bools are set at these moments; the game will use them in conditional checks later on.

    5. EReplyType -- Updated August 15, 2014
    The phrase within parentheses is a label as defined in the Name list. I've seen two three different types: REPLY_STANDARD, REPLY_AUTOCONTINUE, and REPLY_DIALOGEND. REPLY_STANDARD is most frequently used, and is what's used with a spoken line. REPLY_AUTOCONTINUE is used in the case of no spoken line and simply "sends" the conversation back to the Entry List. REPLY_DIALOGEND is sometimes used at the end of a dialogue; I've been unable to discern the inconsistency.



  • 8/15/2014 -- update
  • 11/5/24014 -- Added new info on ambient, State Transitions and a couple other things
  • 11/6/2014 -- Removed Wrap Up section; relocated to new TLK Post in Dialogue Editing Tutorial

User avatar
Toolset Developer
Posts: 1247
Joined: 08 Jan 2016, 02:35
Has thanked: 129 time
Have thanks: 75 time

Re: Research -- Dialogue/ Dialogue Editor

Postby WarrantyVoider » 19 Oct 2013, 15:38


thanks alot, that was detailed! some thoughts:

-I think sound is linked over the tlk IDs, so its replaceable too, like the text and by who (speaker/listener index)
-all those type / value variables, like GUIStyle are based on the namelist, so these numbers you get to edit are namelist entries

greetz WV

PS:moved and stickied^^
always backup your files!
mess with the best or die like the rest!
"I tried everything!" - "mkay, please list that..." ; please dont pm me for help, we have a help section
User avatar
Posts: 2270
Joined: 22 Aug 2012, 11:33
Has thanked: 480 time
Have thanks: 626 time

Re: Research -- Dialogue Editor

Postby giftfish » 19 Oct 2013, 16:02

WarrantyVoider wrote:-I think sound is linked over the tlk IDs, so its replaceable too, like the text and by who (speaker/listener index)
-all those type / value variables, like GUIStyle are based on the namelist, so these numbers you get to edit are namelist entries

Ok, I know Em knows about the namelist stuff. I'll have to ask her where I find them if I need the values for different categories.

The sound files I'm still unsure about. To be clear, I've already replaced a bunch of those files in the .pcc. But, what I need to do is add completely new sound files, I think; or be able to change the pointers to existing ones. I tried to follow a procedure Inquiring posted on this before and it didn't work. FemShep has very limited amounts of dialogue in this conversation, so I need to be able to add new lines for her that don't exist. Am I supposed to be able to clone a sound file in ME3Exp? I mean the option is there, but like I said, I got an error.

Anyway, it's either that or repurpose some of Thane's unloyal lines into hers, maybe (also involves changing pointers). I'm not completely sure how it's going to work yet. Trying to make it as simple as possible, so I don't completely feck everything up...LOL.

Re: Research -- Dialogue Editor

Postby mnn » 20 Oct 2013, 20:06

Just popping here to drop links to my previous posts regarding dialogs/conversations:


mnn has been thanked by:
Posts: 42
Joined: 22 Aug 2012, 17:10
Has thanked: 1 time
Have thanks: 15 time

Re: Research -- Dialogue Editor

Postby giftfish » 27 Oct 2013, 20:05

Update on our progress with the editor her :]


Re: Research -- Dialogue Editor

Postby WarrantyVoider » 30 Oct 2013, 23:50

here you can see how a dialog sequence is referenced from kismet, havent found exactly the link to facefxanimset (which holds facefx data too, needs more research!), but it links down to the sound...


now on svn together with layout file (yEd editor) for edits under /stuff/treeviews

greetz WV
always backup your files!
mess with the best or die like the rest!
"I tried everything!" - "mkay, please list that..." ; please dont pm me for help, we have a help section

WarrantyVoider has been thanked by:
User avatar
Posts: 2270
Joined: 22 Aug 2012, 11:33
Has thanked: 480 time
Have thanks: 626 time

Re: Research -- Dialogue Editor

Postby giftfish » 30 Oct 2013, 23:55

Really awesome, WV! Thanks so much :)

Also, more updates on our dialogue WIP in the thread I linked above.

Re: Research -- Dialogue Editor

Postby giftfish » 18 Jun 2014, 21:39

I noticed something about the ConditionalParameter field the other day that I haven't seen stated anywhere. First, remember that the ConditionalFunction field can list one of 3 things: a plot bool, a conditional, or a -1 if no check is present.

When it comes to the ConditionalParam field, there is usually a 0 or a -1/1. If ConditionalFunct is a plot bool, then "1" is used. If ConditionalFunct is a conditional, then '-1" is used. Both indicate the conditional/bool should return true. Technically, though, I think the -1 used in the case of a conditional really means "none." I think it's hard-coded somewhere in the game that if it's checking a conditional by default the conversation proceeds down that branch if it is true. Only if ConditionalFunct is set to 0, does it means the conditional/bool should return false.

There's also another catch. There are cases in which a dialogue can have multiple starting points. As stated in the OP, they are itemized in "Starting List." In certain cases the conditional in the ConditionalFunc is always the same. So far I've only run across this with the ambients. For example, Liara and Aethyta's ambient dialogue contains 11 entries numbered from 0 to 10. The ConditionalParam field will specify which entry in the starting list it is associated with. For example...

-Position 0 in the Starting List corresponds to Entry 0 in the Entry List. When you look at the Entry List and expand Entry 0 you will see the ConditionalFunc set to 898 and the ConditionalParam set to 0.
-Position 1 in the Starting List corresponds to Entry 6 in the Entry List. When you look at the Entry List and expand Entry 6 you will see the ConditionalFunc set to 898 and the ConditionalParam set to 1.
-Position 3 in the Starting List corresponds to Entry 19 in the Entry List. When you look at the Entry List and expand Entry 19 you will see the ConditionalFunc set to 898 and the ConditionalParam set to 3.

And so forth. Using the above method the game controls the order in which the player will trigger the available ambient dialogues when in game :]


Re: Research -- Dialogue Editor

Postby giftfish » 14 Aug 2014, 18:41

Original post updated to coincide with release of Part 1 of the Dialogue Editing Tutorial :]

Re: Research -- Dialogue Editor

Postby giftfish » 05 Nov 2014, 15:19

A couple small updates with new/revised info. I'll likely relocate the "Wrap Up" section to a new part of the Dialogue Editing Tutorial that should be up by the end of the day.

Return to Modders' Research

Who is online

Users browsing this forum: No registered users and 1 guest