Browse Source

Merge pull request #410 from FungusGames/fungus-script-support

Fungus script support
master
Chris Gregan 9 years ago
parent
commit
9f02563a6b
  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. 0
      Assets/Fungus/Thirdparty/CSVParser/CsvParser.cs
  8. 8
      Assets/Fungus/UI/Scripts/Writer.cs
  9. 38
      Assets/Tests/Scripting/Scripting.unity

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

@ -142,11 +142,16 @@ namespace Fungus
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)
{
return false;
yield break;
}
if (!executionInfoSet)
@ -155,13 +160,7 @@ namespace Fungus
}
executionCount++;
StartCoroutine(ExecuteBlock(onComplete));
return true;
}
protected virtual IEnumerator ExecuteBlock(Action onComplete = null)
{
Flowchart flowchart = GetFlowchart();
executionState = ExecutionState.Executing;
@ -175,6 +174,8 @@ namespace Fungus
}
#endif
jumpToCommandIndex = commandIndex;
int i = 0;
while (true)
{

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

@ -64,12 +64,12 @@ namespace Fungus
flowchart.selectedBlock = targetBlock;
}
targetBlock.Execute(onComplete);
StartCoroutine(targetBlock.Execute(0, onComplete));
}
else
{
// 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.
* The block must be in an idle state to be executed.
* Execute a child block in the Flowchart.
* 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>();
foreach (Block block in blocks)
Block block = null;
foreach (Block b in GetComponentsInChildren<Block>())
{
if (block.blockName == blockName)
if (b.blockName == blockName)
{
ExecuteBlock(block);
}
block = b;
break;
}
}
/**
* 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)
if (block == null)
{
eventHandler.OnSendFungusMessage(messageName);
}
Debug.LogError("Block " + blockName + "does not exist");
return false;
}
/**
* 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);
}
return ExecuteBlock(block);
}
/**
* 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.
* This version provides extra options to control how the block is executed.
* 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 ||
block.gameObject != gameObject)
if (block == null)
{
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;
}
@ -433,8 +422,8 @@ namespace Fungus
return false;
}
// Execute the first command in the command list
block.Execute(onComplete);
// Start executing the Block as a new coroutine
StartCoroutine(block.Execute(commandIndex, onComplete));
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.
*/
@ -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.
* 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);
sayDialog.Say(subbedText, !extendPrevious, waitForClick, fadeWhenDone, voiceOverClip, stopVoiceover, delegate {
sayDialog.Say(subbedText, !extendPrevious, waitForClick, fadeWhenDone, stopVoiceover, voiceOverClip, delegate {
Continue();
});
}

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

@ -13,8 +13,11 @@ namespace Fungus
// Currently active Menu Dialog used to display Menu options
public static MenuDialog activeMenuDialog;
protected Button[] cachedButtons;
protected Slider cachedSlider;
[NonSerialized]
public Button[] cachedButtons;
[NonSerialized]
public Slider cachedSlider;
public static MenuDialog GetMenuDialog()
{
@ -139,7 +142,7 @@ namespace Fungus
return addedOption;
}
protected virtual void HideSayDialog()
public virtual void HideSayDialog()
{
SayDialog sayDialog = SayDialog.GetSayDialog();
if (sayDialog != null)
@ -150,7 +153,6 @@ namespace Fungus
public virtual void ShowTimer(float duration, Block targetBlock)
{
if (cachedSlider != null)
{
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();
@ -144,6 +144,8 @@ namespace Fungus
}
}
gameObject.SetActive(true);
this.fadeWhenDone = fadeWhenDone;
// Voice over clip takes precedence over a character sound effect if provided
@ -158,8 +160,8 @@ namespace Fungus
{
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()

0
Assets/Fungus/Thirdparty/CSVParser/CsvParser.cs vendored

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)
{
@ -326,7 +326,7 @@ namespace Fungus
if (!HasTextObject())
{
return;
yield break;
}
// 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();
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)

38
Assets/Tests/Scripting/Scripting.unity

@ -3005,7 +3005,7 @@ MonoBehaviour:
targetComponentFullname: UnityEngine.Component[]
targetComponentText: Flowchart
targetMethod: ExecuteBlock
targetMethodText: 'ExecuteBlock (String, Int32, Action): Void'
targetMethodText: 'ExecuteBlock (String): Boolean'
methodParameters:
- objValue:
typeAssemblyname: System.String, mscorlib, Version=2.0.0.0, Culture=neutral,
@ -3024,43 +3024,9 @@ MonoBehaviour:
vector2Value: {x: 0, y: 0}
vector3Value: {x: 0, y: 0, z: 0}
variableKey:
- objValue:
typeAssemblyname: System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
typeFullname: System.Int32
intValue: 0
boolValue: 0
floatValue: 0
stringValue:
colorValue: {r: 0, g: 0, b: 0, a: 0}
gameObjectValue: {fileID: 0}
materialValue: {fileID: 0}
objectValue: {fileID: 0}
spriteValue: {fileID: 0}
textureValue: {fileID: 0}
vector2Value: {x: 0, y: 0}
vector3Value: {x: 0, y: 0, z: 0}
variableKey:
- objValue:
typeAssemblyname: System.Action, System.Core, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
typeFullname: System.Action
intValue: 0
boolValue: 0
floatValue: 0
stringValue:
colorValue: {r: 0, g: 0, b: 0, a: 0}
gameObjectValue: {fileID: 0}
materialValue: {fileID: 0}
objectValue: {fileID: 0}
spriteValue: {fileID: 0}
textureValue: {fileID: 0}
vector2Value: {x: 0, y: 0}
vector3Value: {x: 0, y: 0, z: 0}
variableKey:
saveReturnValue: 0
returnValueVariableKey:
returnValueType: System.Void
returnValueType: System.Boolean
showInherited: 0
callMode: 0
--- !u!114 &1618689151

Loading…
Cancel
Save