I have a lot of tools to create situations, and am still figuring out how I am going to use those tools to create scenarios, puzzles, obstacles, and story.
Worked on organizing some of the hard coded npc actions (specifically the dragging) into their behavior trees. I used to basically have one behavior in the tree that will do whatever action I set on the npc from elsewhere. A generic action; but it allowed me to program new actions easily. Just call npc.do_action(blah). On the downside, with only the ability to give one action at a time to an npc, this made some of the other code a bit more unwieldy than it should be. I could solve this with an action queue (npc.add_next_action(blah)), but that still wouldn't be as flexible as hardcoding the actions into the behavior tree itself.
For instance, even if an authority is in conversation with someone, they should abandon the conversation to go try and stop you if you offend. This is easy to pull off by putting the drag behavior at a slightly higher priority than the conversation. Later tweaks should allow me to adjust priorities - some police unit types may be less inclined to stop what they are doing to do their job than others; and someone running from a bear should pretty much ignore you.
I will table for now what happens after they stop you - do they resume immediately on the next line of conversation, restart the conversation, what?