I was talking with Tchos after I played his module about these real time cutscenes, or as he calls them Valve-style. The ones that whoever played SoZ knows.
They happen not in the original cutscene mode, nor as a NWN1 style dialogue. The NPCs are there barking their dialogue, and the player can see them from a really cool angle, as if he is just moving around and a scene unfolds in front of him.
I thought I'd give it a dig and see how it is done, and I found out really amazed that the method they use in SoZ is really simple. A script fires... perhaps from a trigger or another conversation end. Any method will do. This script defines cases, which are used from the nodes of the cutscene conversation. Example:
#include "ginc_misc"
void main()
{
object oSasani = GetObjectByTag("u02_sasani");
int nBarkState = GetLocalInt(oSasani, "nBarkState");
if ( (nBarkState > 12) )
return;
object oPC = GetFactionLeader(GetFirstPC());
object oCaptain = GetObjectByTag("u02_captain");
object oVolo = GetObjectByTag("u02_volo");
object oNas = GetObjectByTag("u02_nassirin");
object oOsi = GetObjectByTag("u02_osi");
object oSpeaker, oListener;
switch (nBarkState)
{
case 0:
oSpeaker = oCaptain;
oListener = oSasani;
break;
case 1:
oSpeaker = oSasani;
oListener = oCaptain;
break;
and so on. Each case is one node. What happens in the node itself, is just setting a local integer called nBarkState to the tag of Sa'sani, the create initiating he convo I guess, which increments on the next node and so on.
So for example if I needed an NPC to say on the first node "I've been expecting you.", and this NPC is tagged "creature", then case 1 on the above script would state him as the speaker (and listener whoever listens), and the node would have an action script ga_local_int(nBarkState, 1, "creature"), second node, ga_local_int(nBarkState, 2, "creature").
I find this to be a really cool way of making cutscenes where the PC has nothing to say, but witnesses it nonetheless.
One issue I thought about, is what happens if the PC moves during it if we don't want to freeze him for the duration, and enters another building. A solution would be to reset the nBarkState variable to 0 every time we enter the trigger, and destroy the trigger on the end of the convo.
I also don't know if animations and walking whatsoever works with barks, but perhaps this is the cool thing about the system, that it is actually not barks. It's a normal conversation behaving as barks, so why would an action script like ga_local_int work, but not a ga_play_custom_animation. Test will show.
One of course could do such a thing in one script too, using heartbeats and adding the string spoken directly in one script, not needing the dialogue at all. This was Tchos' system. Equally good, because as he said you can just write a script and the dialogue in it on a text editor without even opening the toolset.
Anyway though, I felt like sharing this "find". Perhaps too late in my campaign to implement the method, but I will certainly would like to use it on a next one, or see it more often used by others
.