The notion of queue while scripting for The Witcher is close to be the same as the one used in NeverWinter Nights. The queue works like a First In First Out (FIFO) stack, all actions queued are executed in the order they are queued).
Let's consider this short script :
// Geralt object SDPLAYER = GetFirstPC(); // Displays 'Hello World' above Geralt's head AssignCommand(SDPLAYER,SpeakString("Hello World")); // Make Geralt drink a beer AssignCommand(SDPLAYER,ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK)); // Displays 'Cheers !!!' above Geralt's head AssignCommand(SDPLAYER,SpeakString("Cheers !!!"));
Here the queue will contain the following three actions and the order they will be fired :
1. "Hello World" 2. Drink 3. "Cheers !!!"
This way Geralt will drink before saying "Cheers !!!" which is really a bad idea ^^ thus
object SDPLAYER = GetFirstPC(); AssignCommand(SDPLAYER,SpeakString("Hello World")); AssignCommand(SDPLAYER,SpeakString("Cheers !!!")); AssignCommand(SDPLAYER,ActionPlayAnimation(ANIMATION_FIREFORGET_DRINK));
is better !!
- All the functions that starts with Action* are subject to queuing their actions into the queue and see them executed at their turn.
- Most of the queuing functions have also a non queuing version that immediately executes the action whatever the elements in the queue and discards them.
PlayAnimation() vs ActionPlayAnimation()
- Most of the function are working this way except some special one.
Example of Classical Queuing functionsEdit
Special queuing functionsEdit
This set of function will be filled with time.
// The subject will jump to lLocation instantly (even between areas). // If lLocation is invalid, nothing will happen. void ActionJumpToLocation(location lLocation);
This action will be queued as first element on the stack to be fired ! All other actions still exists but will be fired after.
// Clear all the actions of the caller. // * No return value, but if an error occurs, the log file will contain // "ClearAllActions failed.". // - nClearCombatState: if true, this will immediately clear the combat state // on a creature, which will stop the combat music and allow them to rest, // engage in dialog, or other actions that they would normally have to wait for. void ClearAllActions(int nClearCombatState=FALSE, object oSubject=OBJECT_INVALID);
Clears the queue of a given character. Useful function to clear the queue and force the execution of a given action.
- It is to be noted that moving Geralt while doing an animation break the current animation, and for the move in most cases, discarding all elements from the queue.
Last but not least, action must be assigned to PC or NPCs to be correctly queued. Function AssignCommand do that job :
// Assign aActionToAssign to oActionSubject. // * No return value, but if an error occurs, the log file will contain // "AssignCommand failed." // (If the object doesn't exist, nothing happens.) void AssignCommand(object oActionSubject,action aActionToAssign);