Browse Source

Changes to support Fungus Script execution

master
chrisgregan 9 years ago
parent
commit
c33bb139b1
  1. 17
      Assets/Fungus/Flowchart/Scripts/Block.cs
  2. 4
      Assets/Fungus/Flowchart/Scripts/Commands/Call.cs
  3. 107
      Assets/Fungus/Flowchart/Scripts/Flowchart.cs
  4. 2
      Assets/Fungus/Narrative/Scripts/Commands/Say.cs
  5. 10
      Assets/Fungus/Narrative/Scripts/MenuDialog.cs
  6. 10
      Assets/Fungus/Narrative/Scripts/SayDialog.cs
  7. 8
      Assets/Fungus/UI/Scripts/Writer.cs

17
Assets/Fungus/Flowchart/Scripts/Block.cs

@ -142,11 +142,16 @@ namespace Fungus
return executionCount; return executionCount;
} }
public virtual bool Execute(Action onComplete = null) /// <summary>
/// Execute the Block in a coroutine. Only one running instance of each Block is permitted.
/// </summary>
/// <param name="commandIndex">Index of command to start execution at</param>
/// <param name="onComplete">Delegate function to call when execution completes</param>
public virtual IEnumerator Execute(int commandIndex = 0, Action onComplete = null)
{ {
if (executionState != ExecutionState.Idle) if (executionState != ExecutionState.Idle)
{ {
return false; yield break;
} }
if (!executionInfoSet) if (!executionInfoSet)
@ -155,13 +160,7 @@ namespace Fungus
} }
executionCount++; executionCount++;
StartCoroutine(ExecuteBlock(onComplete));
return true;
}
protected virtual IEnumerator ExecuteBlock(Action onComplete = null)
{
Flowchart flowchart = GetFlowchart(); Flowchart flowchart = GetFlowchart();
executionState = ExecutionState.Executing; executionState = ExecutionState.Executing;
@ -175,6 +174,8 @@ namespace Fungus
} }
#endif #endif
jumpToCommandIndex = commandIndex;
int i = 0; int i = 0;
while (true) while (true)
{ {

4
Assets/Fungus/Flowchart/Scripts/Commands/Call.cs

@ -64,12 +64,12 @@ namespace Fungus
flowchart.selectedBlock = targetBlock; flowchart.selectedBlock = targetBlock;
} }
targetBlock.Execute(onComplete); StartCoroutine(targetBlock.Execute(0, onComplete));
} }
else else
{ {
// Execute block in another Flowchart // Execute block in another Flowchart
targetFlowchart.ExecuteBlock(targetBlock, onComplete); targetFlowchart.ExecuteBlock(targetBlock, 0, onComplete);
} }
} }

107
Assets/Fungus/Flowchart/Scripts/Flowchart.cs

@ -371,59 +371,48 @@ namespace Fungus
} }
/** /**
* Start running another Flowchart by executing a specific child block. * Execute a child block in the Flowchart.
* The block must be in an idle state to be executed.
* You can use this method in a UI event. e.g. to handle a button click. * You can use this method in a UI event. e.g. to handle a button click.
* Returns true if the Block started execution.
*/ */
public virtual void ExecuteBlock(string blockName) public virtual bool ExecuteBlock(string blockName)
{ {
Block [] blocks = GetComponentsInChildren<Block>(); Block block = null;
foreach (Block block in blocks) foreach (Block b in GetComponentsInChildren<Block>())
{ {
if (block.blockName == blockName) if (b.blockName == blockName)
{ {
ExecuteBlock(block); block = b;
} break;
} }
} }
/** if (block == null)
* Sends a message to this Flowchart only.
* Any block with a matching MessageReceived event handler will start executing.
*/
public virtual void SendFungusMessage(string messageName)
{
MessageReceived[] eventHandlers = GetComponentsInChildren<MessageReceived>();
foreach (MessageReceived eventHandler in eventHandlers)
{ {
eventHandler.OnSendFungusMessage(messageName); Debug.LogError("Block " + blockName + "does not exist");
} return false;
} }
/** return ExecuteBlock(block);
* Sends a message to all Flowchart objects in the current scene.
* Any block with a matching MessageReceived event handler will start executing.
*/
public static void BroadcastFungusMessage(string messageName)
{
MessageReceived[] eventHandlers = GameObject.FindObjectsOfType<MessageReceived>();
foreach (MessageReceived eventHandler in eventHandlers)
{
eventHandler.OnSendFungusMessage(messageName);
}
} }
/** /**
* Start executing a specific child block in the flowchart. * Execute a child block in the flowchart.
* The block must be in an idle state to be executed. * The block must be in an idle state to be executed.
* This version provides extra options to control how the block is executed.
* Returns true if the Block started execution. * Returns true if the Block started execution.
*/ */
public virtual bool ExecuteBlock(Block block, Action onComplete = null) public virtual bool ExecuteBlock(Block block, int commandIndex = 0, Action onComplete = null)
{ {
// Block must be a component of the Flowchart game object if (block == null)
if (block == null ||
block.gameObject != gameObject)
{ {
Debug.LogError("Block must not be null");
return false;
}
if (block.gameObject != gameObject)
{
Debug.LogError("Block must belong to the same gameobject as this Flowchart");
return false; return false;
} }
@ -433,8 +422,8 @@ namespace Fungus
return false; return false;
} }
// Execute the first command in the command list // Start executing the Block as a new coroutine
block.Execute(onComplete); StartCoroutine(block.Execute(commandIndex, onComplete));
return true; return true;
} }
@ -454,6 +443,32 @@ namespace Fungus
} }
} }
/**
* Sends a message to this Flowchart only.
* Any block with a matching MessageReceived event handler will start executing.
*/
public virtual void SendFungusMessage(string messageName)
{
MessageReceived[] eventHandlers = GetComponentsInChildren<MessageReceived>();
foreach (MessageReceived eventHandler in eventHandlers)
{
eventHandler.OnSendFungusMessage(messageName);
}
}
/**
* Sends a message to all Flowchart objects in the current scene.
* Any block with a matching MessageReceived event handler will start executing.
*/
public static void BroadcastFungusMessage(string messageName)
{
MessageReceived[] eventHandlers = GameObject.FindObjectsOfType<MessageReceived>();
foreach (MessageReceived eventHandler in eventHandlers)
{
eventHandler.OnSendFungusMessage(messageName);
}
}
/** /**
* Returns a new variable key that is guaranteed not to clash with any existing variable in the list. * Returns a new variable key that is guaranteed not to clash with any existing variable in the list.
*/ */
@ -590,6 +605,26 @@ namespace Fungus
} }
} }
/**
* Returns the variable with the specified key, or null if the key is not found.
* You will need to cast the returned variable to the correct sub-type.
* You can then access the variable's value using the Value property. e.g.
* BooleanVariable boolVar = flowchart.GetVariable("MyBool") as BooleanVariable;
* boolVar.Value = false;
*/
public Variable GetVariable(string key)
{
foreach (Variable variable in variables)
{
if (variable != null && variable.key == key)
{
return variable;
}
}
return null;
}
/** /**
* Returns the variable with the specified key, or null if the key is not found. * Returns the variable with the specified key, or null if the key is not found.
* You can then access the variable's value using the Value property. e.g. * You can then access the variable's value using the Value property. e.g.

2
Assets/Fungus/Narrative/Scripts/Commands/Say.cs

@ -99,7 +99,7 @@ namespace Fungus
string subbedText = flowchart.SubstituteVariables(displayText); string subbedText = flowchart.SubstituteVariables(displayText);
sayDialog.Say(subbedText, !extendPrevious, waitForClick, fadeWhenDone, voiceOverClip, stopVoiceover, delegate { sayDialog.Say(subbedText, !extendPrevious, waitForClick, fadeWhenDone, stopVoiceover, voiceOverClip, delegate {
Continue(); Continue();
}); });
} }

10
Assets/Fungus/Narrative/Scripts/MenuDialog.cs

@ -13,8 +13,11 @@ namespace Fungus
// Currently active Menu Dialog used to display Menu options // Currently active Menu Dialog used to display Menu options
public static MenuDialog activeMenuDialog; public static MenuDialog activeMenuDialog;
protected Button[] cachedButtons; [NonSerialized]
protected Slider cachedSlider; public Button[] cachedButtons;
[NonSerialized]
public Slider cachedSlider;
public static MenuDialog GetMenuDialog() public static MenuDialog GetMenuDialog()
{ {
@ -139,7 +142,7 @@ namespace Fungus
return addedOption; return addedOption;
} }
protected virtual void HideSayDialog() public virtual void HideSayDialog()
{ {
SayDialog sayDialog = SayDialog.GetSayDialog(); SayDialog sayDialog = SayDialog.GetSayDialog();
if (sayDialog != null) if (sayDialog != null)
@ -150,7 +153,6 @@ namespace Fungus
public virtual void ShowTimer(float duration, Block targetBlock) public virtual void ShowTimer(float duration, Block targetBlock)
{ {
if (cachedSlider != null) if (cachedSlider != null)
{ {
cachedSlider.gameObject.SetActive(true); cachedSlider.gameObject.SetActive(true);

10
Assets/Fungus/Narrative/Scripts/SayDialog.cs

@ -126,12 +126,12 @@ namespace Fungus
} }
} }
public virtual void Say(string text, bool clearPrevious, bool waitForInput, bool fadeWhenDone, AudioClip voiceOverClip, bool stopVoiceover, Action onComplete) public virtual void Say(string text, bool clearPrevious, bool waitForInput, bool fadeWhenDone, bool stopVoiceover, AudioClip voiceOverClip, Action onComplete)
{ {
StartCoroutine(SayInternal(text, clearPrevious, waitForInput, fadeWhenDone, voiceOverClip, stopVoiceover, onComplete)); StartCoroutine(SayInternal(text, clearPrevious, waitForInput, fadeWhenDone, stopVoiceover, voiceOverClip, onComplete));
} }
protected virtual IEnumerator SayInternal(string text, bool clearPrevious, bool waitForInput, bool fadeWhenDone, AudioClip voiceOverClip, bool stopVoiceover, Action onComplete) public virtual IEnumerator SayInternal(string text, bool clearPrevious, bool waitForInput, bool fadeWhenDone, bool stopVoiceover, AudioClip voiceOverClip, Action onComplete)
{ {
Writer writer = GetWriter(); Writer writer = GetWriter();
@ -144,6 +144,8 @@ namespace Fungus
} }
} }
gameObject.SetActive(true);
this.fadeWhenDone = fadeWhenDone; this.fadeWhenDone = fadeWhenDone;
// Voice over clip takes precedence over a character sound effect if provided // Voice over clip takes precedence over a character sound effect if provided
@ -158,8 +160,8 @@ namespace Fungus
{ {
soundEffectClip = speakingCharacter.soundEffect; soundEffectClip = speakingCharacter.soundEffect;
} }
writer.Write(text, clearPrevious, waitForInput, stopVoiceover, soundEffectClip, onComplete);
yield return writer.Write(text, clearPrevious, waitForInput, stopVoiceover, soundEffectClip, onComplete);
} }
protected virtual void LateUpdate() protected virtual void LateUpdate()

8
Assets/Fungus/UI/Scripts/Writer.cs

@ -317,7 +317,7 @@ namespace Fungus
} }
} }
public virtual void Write(string content, bool clear, bool waitForInput, bool stopAudio, AudioClip audioClip, Action onComplete) public virtual IEnumerator Write(string content, bool clear, bool waitForInput, bool stopAudio, AudioClip audioClip, Action onComplete)
{ {
if (clear) if (clear)
{ {
@ -326,7 +326,7 @@ namespace Fungus
if (!HasTextObject()) if (!HasTextObject())
{ {
return; yield break;
} }
// If this clip is null then WriterAudio will play the default sound effect (if any) // If this clip is null then WriterAudio will play the default sound effect (if any)
@ -341,7 +341,9 @@ namespace Fungus
TextTagParser tagParser = new TextTagParser(); TextTagParser tagParser = new TextTagParser();
List<TextTagParser.Token> tokens = tagParser.Tokenize(tokenText); List<TextTagParser.Token> tokens = tagParser.Tokenize(tokenText);
StartCoroutine(ProcessTokens(tokens, stopAudio, onComplete)); gameObject.SetActive(true);
yield return StartCoroutine(ProcessTokens(tokens, stopAudio, onComplete));
} }
virtual protected bool CheckParamCount(List<string> paramList, int count) virtual protected bool CheckParamCount(List<string> paramList, int count)

Loading…
Cancel
Save