Dialogue Modding – pt 3 – Dialogue Wheel

Dialogue Wheel and Line Types

The Dialogue Wheel

The major change between DAO and DA2 conversations is the addition of the dialogue wheel and voiced player lines. Despite this big surface-level change, the underlying conversation structure changed very little. The whole thing is still just alternating owner/speaker lines and player/listener lines connected by child lines. Note that while the player character is indeed now also speaking, user-selected lines are still player/listener lines – though there will be a few weird exceptions detailed later in the post.

Everything Hawke or the Warden can say in response to a line is linked as a child of the speaker line they’re responding to. Unfortunately, this means that copies of the same dialogue wheel can be scattered all over a conversation branch if the NPC you’re talking to has a few variations in dialogue, or if there are investigate options that loop through several branches of conversation before returning to the wheel again. A single edit to a single dialogue wheel could require more hunting around the GFF than any other change.

If a player line has a condition that is not met, that line will not appear among the other options, as in DAO.

- 30204        CONVERSATION_LINE_CHILDREN_LIST    [LINK]       (3 items)
  - 0                                             LINK  
      30100    CONVERSATION_CHILD_LINE            UINT16       11
      30101    CONVERSATION_WHEEL_PARAPHRASE      TlkString    6195813, 0
      30301    CONVERSATION_WHEEL_CATEGORY        UINT8        6
      30300    CONVERSATION_WHEEL_ICON            UINT8        255
      30303    CONVERSATION_WHEEL_FOLLOWER        UINT32       4294967295
  - 1                                             LINK               
      30100    CONVERSATION_CHILD_LINE            UINT16       22
      30101    CONVERSATION_WHEEL_PARAPHRASE      TlkStr       6195830, 0
      30300    CONVERSATION_WHEEL_CATEGORY        UINT8        8
      30301    CONVERSATION_WHEEL_ICON            UINT8        255
      30303    CONVERSATION_WHEEL_FOLLOWER        UINT32       4294967295
  - 2                                             LINK               
      30100    CONVERSATION_CHILD_LINE            UINT16       27
      30101    CONVERSATION_WHEEL_PARAPHRASE      TlkStr       6195838, 0
      30300    CONVERSATION_WHEEL_CATEGORY        UINT8        7
      30301    CONVERSATION_WHEEL_ICON            UINT8        255
      30303    CONVERSATION_WHEEL_FOLLOWER        UINT32       4294967295

You may recall from the GFF orientation that while child links in DAO dialogue files are a single integer, child links in DA2 conversation files are far more complex. The dialogue wheel is the reason for this.
30100 – this part, ID of the line being linked, we’ve already covered.

30101 – on links to speaker lines this doesn’t matter (and is usually 4294967295, or 32 bits of “nope”), but on links to player lines, this is the string reference for the paraphrase that appears on the dialogue wheel. If you wish to simply rewrite a paraphrase without making any other changes, you can do so by adding a local string, as shown earlier.

In my experience, the paraphrase always immediately follows Hawke’s spoken line in the talktable (because new lines are added to the talktable at the time the conversation file is saved, and the paraphrase and spoken line were always added at the same time).

30300 – this dictates both the position and icon of the dialogue wheel, and corresponds to entries in conversation_categories.gda. The “position” column in conversation_categories itself corresponds to entries in conversation_wheel_pos.gda.

30301 – normally 255, if you wish to override the icon in the center of the conversation wheel for that option, you can change it to a number corresponding to an entry in conversation_icons.gda.

30303 – Normally 4294967295, this otherwise seems to correspond with a number in conversation_followers.gda, the dialogue option will only show if the associated follower is in the active party (this emulates the same behavior as putting the gen00pt_party plot flag for that active follower on the player line the dialogue option links to).

GDAs can be extracted from packages\data\core\2da.rim

Hawke’s Personality

Hawke’s blue/purple/red personality is tracked by the genpt_personality plot (GUID D1C4E624FFF54413AD7DADD63B1CC2F3), which shows up in dialogue a lot. (A lot).

The following flags are frequently set as actions:

0 – adds a point to red personality
1 – adds a point to blue personality
2 – adds a point to purple personality

Sometimes Hawke has different lines that can play as the same response, based on their dominant personality. The following flags are used as conditions in that case:

3 – if red personality
4 – if blue personality
5 – if purple personality

These lines can autoplay, like when Hawke interjects in ambient party banter. Or the lines can all be attached to the same response on the dialogue wheel. If this is the case, that dialogue wheel option links to an “empty” player continue line, which itself has links to the personality-dependent responses. Remember when I said there are edge cases where Hawke’s dialogue will be a speaker rather than player line? This is what I meant.

Remember that even in cases like this the last line linked should not have a condition set so it will never be possible to fall out of the conversation early if something goes wrong.

Fun fact: Hawke’s personality variables are stored in the save game with the other module variables (corresponding to lines in var_module.gda), which can be found under SAVEGAME_CAMPAIGN > SCRIPTVARTABLE.

1034 – PER_AGGRESSIVE_TOTAL (red personality)
1035 – PER_HELPFUL_TOTAL (blue personality)
1036 – PER_HUMOROUS_TOTAL (purple personality)

- 16000          SAVEGAME_CAMPAIGN
  - 17000        SCRIPTVARTABLE            (68 items)
    - 0                                    *SVI1
        17001    SCRIPTVARTABLE_NAME       ECString      1034
        17003    SCRIPTVARTABLE_VALUE      INT32         11
    - 1                                    *SVI1
        17001    SCRIPTVARTABLE_NAME       ECString      1035
        17003    SCRIPTVARTABLE_VALUE      INT32         58
    - 2                                    *SVI1
        17001    SCRIPTVARTABLE_NAME       ECString      1036
        17003    SCRIPTVARTABLE_VALUE      INT32         37

Line Types

This section is incomplete, but it will only very rarely be relevant. If you discover more information about these flags than what is covered here please contact me!

You may recall from GFF orientation that there were a lot of options located in each line of a DAO dialogue file that are not present in DA2 conversation files. While a lot of those were either removed or externalized to a .cl file which handles cinematics, some of them were collapsed into a single bitwise flag at the start of each line. I will be calling this the line type.

Bitwise flags are binary, where each bit position represents a different flag. If multiple flags are true, the values are combined and appear as a single number. In binary and decimal, the flags look like this:

   binary = decimal
000000001 = 1
000000010 = 2
000000100 = 4
000001000 = 8
000010000 = 16
000100000 = 32
001000000 = 64
010000000 = 128
100000000 = 256

If flags 64, 8, 4, and 2 are set, then the flag will be this:

001001110 = 78

Line type flags that I have been able to identify are as follows:

1 – owner/speaker line
2 – player/listener line
8 – skip line
32 – once line (once per game)
64 – ambient line

Flags 1 and 2 are the only flags that will ever appear on their own, as every single line will be flagged at the very least as either a speaker or player line.

Continues, or empty player lines between multiple speaker lines, are flagged as 10 (2 + 8 or player line + skip).

Traditional “skip lines” in the DAO sense – lines which are included in the dialogue structure but are actually played in a cutscene, and thus are “skipped” within the dialogue so they don’t play twice – are flagged as 9 (1 + 8 or speaker line + skip). Skip lines in DA2 will lack their own .cl, and their cinematics are instead included in the .cl for a preceding line in the conversation. (Which will be covered in the next part.)

Ambient lines – dialogue that doesn’t play in a conversation and lacks cinematics, but rather appears in forms like party banter, party barks, or other NPCs talking to each other without involving the player in their conversation – are flagged as 69 (1 + 4 + 64 or speaker line + ? + ambient).

Continues between ambient lines are flagged as 78 (2 + 4 + 8 + 64 or player line + ? + skip + ambient)

Once lines” correspond with the DAO option for line visibility – lines that will only play once per conversation or once per game. If these are player responses, they will be removed from the list after you have selected them.

The empty line at the start of an ambient that is only supposed to play once per game may have a flag of 105 (1 + 8 + 32 + 64 or speaker line + skip + once + ambient)

I’m not entirely sure what flag 256 could be but 257 (256+1) and 258 (256+2) show up constantly. I thought it might have something to do with whether or not the speaker of the line is a default owner of the conversation, or something similar, but this doesn’t seem to be consistent across conversations. I’d say it probably doesn’t matter, but I’ve been wrong about that sort of thing before and will be again.