a modding question I field fairly often is how one determines what any given plot flag in DA2 is meant to do, and it's unfortunately a very tricky question to answer! unlike in Origins where you can just pop open the plot and see exactly what name the developers gave to each and every one of their plot flags, this information wasn't exported in DA2's plot files, so they're frustratingly opaque.
so the topic of demystifying plot flags is one I've been meaning to tackle in a supplementary entry in my DA2 Dialogue Modding tutorials for years, but it's unfortunately, well, it's complex! and there are a lot of edge cases to address and sometimes it still just comes down to guesswork. and to be honest my own process was excessively crapshoot up until fairly recently
so I've received another question about how to determine why one specific line of dialogue was playing instead of another, as the answer wasn't obvious, and there were a couple of reasons this intrigued me and I'm writing up a whole post about it now. one is that, well, my process is better now than it ever has been and I've been trying to share the tools I use so that everyone else can use them as well. another is that I kind of need to take a break and switch gears from what I've been working on.
and the biggest reason this intigued me is that this has to do with a conversation in the climax I've worked with on multiple occasions (mcr310_argument) and I know VERY well from experience that the climax is, to put it briefly, MESSY. the designers were under severe time crunch and a lot of things didn't get finished, or didn't get fixed, and sometimes when they came back to try to patch things over later the fixes they applied were unintuitive and obscure. so I want to know what's going on here and I suspect that it might be... let's say, enlightening! or it might raise more questions than it answers, who knows.
so this is a low effort post where i'm just going to walk you through my process of figuring out this one specific plot flag so we can know once and for all exactly why Meredith sometimes says to Hawke "And I call on you to keep order! After what just occurred, you cannot deny what must be done." and other times she says "And I demand you stand with us! Even you must see that this outrage cannot be tolerated." if it's not based on whether Hawke has been treated as being on Meredith's or Orsino's "side" throughout act 3, as it doesn't appear to be.
hopefully it will be a good case study for how I tackle this sort of thing & will give people a jumping off point for their own investigations. apologies in advance for the lack of brevity and the shitty low effort screencaps.
recommended reading for this post is Dialogue Modding Tutorial pt. 6 Plots and recommended downloads are the CNV strings, ASM dump, and XML dump (conversations & plots) from the DA2 XML Dumps I've uploaded. personally I use Notepad++ but if you have another preferred method of bulk searching in files then follow your heart.
so to get started we're going to pull up the CNV strings for mcr310_argument and find the lines of dialogue we're interested in. these files give a flat overview of every conversation with all dialogue strings included. I made these for me, personally, because this is how I prefer to take notes while working my way through a conversation. 😊
as you can see these are lines 186 and 188, and they're probably linked from 185. so now we open mcr310_argument.cnv and/or its xml from the dump to explore further. thanks to both the cnv strings and the xml dump we know that this file has been patched so we'll need to extract the cnv from patch.rimp rather than designerconversations.erf to get the current version.
so now we know that the line in question is checking the plot GUID 49BEAD07708649F0AC61A9AF4FF03127, the plot flag 260, and will play line 186 if it's true and 188 if it's false.
the first question to answer here is: okay, well, which plot is this? well I can tell you immediately upon looking at it that this is the GUID for act00pt_main because it is used seriously everywhere. but if you don't know this off the dome then shift+ctrl+f in Notepad++ opens the "Find in Files" dialogue and you can search for the GUID in the campaign base designerplots xml dump
this search will pull up all the various plot files in the game which reference this plot as well, which can be useful information, but the plot we're looking for specifically is the one that includes alias="PlotFlags" in its search results
the next piece of information to take note of here is: is this a standard flag (0-128) is it or a defined flag (256+)? that plot tutorial I linked at the start of the post explains the differences, but basically if it were a standard flag then it would need to have been set true at some point prior to this and we would need to search for when that could happen.
if it were a standard flag, we would probably want to very shortly be searching for it the CNV dump, to see which conversations, if any, it's set or checked in, but seeing as it's a defined flag, we should see if we can figure out what its definition is before we do anything else
so we know it's act00pt_main flag 260, but we don't know whether it's defined in the plot file itself or in the plot's attached script. we'll start with the plot because that's the best case scenario (note that these flags in the file can and often will be out of order)
but unfortunately, it would appear to be DISASSEMBLY TIME BABEY!!!! explaining how to parse disassembled bytecode is WELL above my paygrade, which is a big part of why there is not presently a part 7 to my dialogue modding tutorial. but this is a low effort, unedited bullshit post so let's dive in and see what we can figure out.
with act00pt_main.ncs.PATCH.RIMP.asm open, search CONSTI 260 and look for a bit that looks like this
if you're familiar with plot event scripting, this is the switch statement for the defined flags. if you're not familiar with plot event scripting...... well it doesn't change the fact but, ok here, a plot event script template will look something like this:
the disassembler I used is from xoreos which they have a blog post explaining a bit about which is interesting but you'll probably also need to search for some other basics if you're starting from zero
CONSTI 260 is an Integer CONSTant, then EQII compares two Integers to see if the flag (which the event received prior to this) is EQual to 260, and if it is (that is, if the result of the comparison is Not Zero) we JNZ or Jump if Not Zero to location 00043B3. got all that?
we also want to take note of where the break statement for this switch is located, it's the very last JuMP down at the bottom, JMP loc_00043E9. it will be relevant.
okiiiiiiiiie dokie. so this is more complex than it could have been and I'm sighing because of course it is but let's see what meaning we can divine from only kind of understanding what we're doing here
so what's happening here is the first location (loc_00043B3) is the start of the case statement for flag 260, as we already determined. the next two locations are flags 261 and 259. so if you're unfamiliar the way switch/case works is it's kind of like a series of if/else if checks, except if you don't break out of the switch at the end of every case, you can kind overflow from one case to another and run the same code for multiple cases. this can be desirable sometimes. you can see this is the case here because we jump from case to case and don't break until the very bottom. here I'll add comments:
so let's ignore all of that for now and instead try to divine some sort of purpose to all of this to guide us in our quest for understanding. we have a constant integer (CONSTI 100001 or, later, 100000) and then we're getting a local integer from the module so, okie dokie, we're going to take brief disassembly break to look at module variables. extract var_module.gda from the core 2da.erf
aha! so knowing that module variable 100001 is DAE_MEREDITH_APPROVAL, some light has been shed upon what this is intending to do. so with purpose to guide us let us return to only kind of understanding disassembly, at best.
so the plot event script receives an event for flag 260. at this point, we GetModule, and then we GetLocalInt 100001 from the module we just got, and then whatever that value we just retrieved from the save game happens to be, we compare it to CONSTI 1 to see if it's Greater Than or Equal to it. if the result of DAE_MEREDITH_APPROVAL >= 1 comparison is zero (that is, our variable is NOT greater than or equal to 1) then we do nothing and jump to the case statement for flag 261.
if DAE_MEREDITH_APPROVAL IS, in fact, >= 1, then we do NOT Jump if Zero, which means we arrive instead at another CONSTI 1. now, this stuff with the constants and the CPDOWNSP and the MOVSP and yada yada look this is the part that is really fucking obscure to me and I gloss over whenever possible. and so can you! you can ignore it with me, knowing that it is all just some degree of shuffling variables around, because now that we 90% of what's probably going on we can make some assumptions about the rest and move on with our lives.
so we'll assume, knowing broadly how things work, that this CONSTI 1 that we skip if DAE_MEREDITH_APPROVAL < 1 is the plot script returning TRUE if DAE_MEREDITH_APPROVAL >= 1, because this NWScript is bastardized C++ so TRUE is 1 and FALSE is 0.
so act00pt_main flag 260 is checking if meredith's approval of hawke is at least 1, and then if we scroll down to see what 261 is doing, it will return true if meredith's approval of hawke is at least 3. and then if we scroll down to see what flag 259 is doing, that's going to return true if the arishok's approval of hawke is at least 3.
so, okay. ONE last thing to address, the cherry on top of this shitty post. remember that the reason we're looking at all three of these flags at once is because we don't break out of the switch until the code has run through all three of them.
so if we're in the plot script because we're checking plot flag 259, then we jump straight to the third case statement and only check the arishok's approval, ez pz no problems here whatsoever.
if we're in the plot script because we're checking plot flag 260, on the other hand (which, for the record, we are), then there's a problem here. because regardless of whether or not "Meredith Likes Us At Least One" is true or false, we're also continuing on after that and checking whether or not "Meredith Likes Us At Least Three," while still validating plot flag 260. this is not a problem. if Meredith doesn't like us a 1 amount she won't like us a 3 amount either, so it's not going to return a false positive, and we've already locked in the return TRUE so we won't get a false negative if her approval is between 1 and 3 either.
but then we keep on keeping on to the case statement for plot flag 259 and now, while theoretically checking if "Meredith Likes Us At Least One" we are now also checking if "Arishok Likes Us At Least Three" and THAT'S a big problem because it's ENTIRELY possible that Meredith Likes Us 0 and yet we pop a false positive because the Arishok Likes Us 3.
this is such a perfect note on which to end the post, because what was I saying at the start of the post, about the bugs in the fucking climax. this has, actually, made me a little bit giddy, if I'm being honest. SOMEONE FORGOT THEIR FUCKING BREAK STATEMENTS. (honestly? RELATABLE.) congratulations your plot script is BUGGED lmaooooo. I love this game
Fan of BG3 and its approval system? Want more dynamic relationships than Vanilla Skyrim gives you? Really want to mess around with what your custom follower can pay attention to?
This handy guide teaches you how to do everything from Approval/Disapproval to remembering specific insults to letting your NPCs comment on each others' relationships with you!
PixelArtPeach’s Approval System Script (PASS) Tutorial Do you like the approval system in Baldur's Gate 3? Do you wish you could do somethi
Step by step guide to darken the skin color of a character (but it's applicable to other kinds of recolors too)
I wrote this tutorial since I know many people will be interested and jump into modding given the paleness of Natlan characters, so if Mihoyo doesn't fix it, we can fix it ourselves. Modes even show up in most cutscenes, since only very few are pre-rendered.
You can find more resources and people to help you learn about modding, besides talking to modders, in my SFW modding discord server ^^ Invite here
And you can find most of my works free for download here (other works are collabs posted by other people). I am also almost finished with my long Old Mondstadt fic! People are enjoying it a lot but that part of the fandom is niche so it hasn't gotten a lot of support...
And even if you don't join my discord, you can still learn more about modding in this tumblr post.
In summary, mods are PC only, they are not cheats and don't change game files, and consequently never got a single person banned in millions and millions of people using mods in the main game. No reason to fear mods
Posting here since they don't have it on their tumblr but PLEASE go give them a look.
This is who I commissioned to dye my Sorrow Petit Gem after seeing theirs turn out so amazingly well! I loathe the idea of painting or blushing the colors as it would be absolute suffering with joint friction.
Hey everyone! 💛
I’m thrilled to see how much you love my Presets—and I’d love to share why I’ve chosen to offer them as paid creations while keeping them accessible and fair for you all.
✨ What You’re Getting:
Unique Presets, crafted to stand out from generic filters, with meticulous attention to detail.
Constant Updates, ensuring full compatibility with ReShade and GShade as they evolve.
No Subscriptions Needed: Pay once on my Patreon (for individual presets or a full bundle) and keep them forever—no hidden fees!
🔒 Why Paid?
Each preset represents hours of work, testing, and fine-tuning—they’re not just “filters” but a tailored experience for your game. Sadly, renaming a file is all it takes to steal creative work… so this helps protect my effort while letting me keep improving them for you.
💡 Ready to Elevate Your Game?
No forced memberships! Find all my presets in my Patreon shop, with the freedom to pick only what you love. It’s a way to support my work without waste—and for me to keep delivering quality content for you.
Huge thanks to everyone who supports and values creativity! 🚀
Thought I'd make a little post to plop all my existing (and future) modding tutorials. A lot of these have been around a while mostly in Discord servers and not everyone joins these.
Some tutorials might be outdated, have better methods, or even be somewhat obsolete. I don't update them often and most of the time I just write them down to help people with specific inquiries.
A lot of these things were taught to me first before I sat down and wrote a how to. Thank you to everyone who was/is part of my modding journey and for sharing your knowledge with me!
My tools are mostly Wolvenkit, Blender and Noesis. These tutorials focus on the use of these tools and aim to aid beginners.
How to replace a vanilla tattoo
Adding decal meshes (for pictures) to clothes (Outdated)
Shirt decal replacing framework
How to make custom microblends
Changing NPCs clothes
Importing custom poses into the same container
Adding pride makeup to NPCs
How to change an entities' locomotion
How I refit clothes in Blender
Fixing sticky/falling feet in custom poses
Adding submeshes to garments without needing a new source
Complete Decal Workflow
NPC+/NPV to Nibbles Replacer
Poses Retargeting
Please don't hesitate to reach out with questions. Happy modding!