Browse Source

Separate Say and Choose commands

master
chrisgregan 11 years ago
parent
commit
3a160295e7
  1. 4
      Assets/Fungus/Dialog/Commands/AddOption.cs
  2. 115
      Assets/Fungus/Dialog/Commands/Choose.cs
  3. 2
      Assets/Fungus/Dialog/Commands/Choose.cs.meta
  4. 87
      Assets/Fungus/Dialog/Commands/Say.cs
  5. 36
      Assets/Fungus/Dialog/Commands/SetDialog.cs
  6. 46
      Assets/Fungus/Dialog/Editor/ChooseEditor.cs
  7. 2
      Assets/Fungus/Dialog/Editor/ChooseEditor.cs.meta
  8. 48
      Assets/Fungus/Dialog/Editor/SayEditor.cs
  9. 31
      Assets/Fungus/Dialog/Editor/SetDialogEditor.cs
  10. 2
      Assets/Fungus/Dialog/Scripts/Dialog.cs
  11. BIN
      Assets/Shuttle/ShuttleGame.unity

4
Assets/Fungus/Dialog/Commands/AddOption.cs

@ -15,10 +15,10 @@ namespace Fungus.Script
public override void OnEnter()
{
Say.SayOption option = new Say.SayOption();
Choose.Option option = new Choose.Option();
option.optionText = optionText;
option.targetSequence = targetSequence;
Say.options.Add(option);
Choose.options.Add(option);
Continue();
}

115
Assets/Fungus/Dialog/Commands/Choose.cs

@ -0,0 +1,115 @@
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
namespace Fungus.Script
{
[CommandCategory("Dialog")]
[HelpText("Presents a list of options for the player to choose from, with an optional timeout. Add options using preceding AddOption commands.")]
public class Choose : FungusCommand
{
public Dialog dialog;
static public Dialog activeDialog;
public class Option
{
public string optionText;
public Sequence targetSequence;
}
static public List<Option> options = new List<Option>();
public string chooseText;
public Character character;
public float timeoutDuration;
public override void OnEnter()
{
// Remember active dialog between Choose calls
if (dialog == null)
{
if (Choose.activeDialog == null)
{
Continue();
return;
}
else
{
dialog = Choose.activeDialog;
}
}
else
{
activeDialog = dialog;
}
dialog.ShowDialog(true);
dialog.SetCharacter(character);
if (options.Count == 0)
{
Continue();
}
else
{
List<Dialog.Option> dialogOptions = new List<Dialog.Option>();
foreach (Option sayOption in options)
{
Dialog.Option dialogOption = new Dialog.Option();
dialogOption.text = sayOption.optionText;
Sequence onSelectSequence = sayOption.targetSequence;
dialogOption.onSelect = delegate {
dialog.ShowDialog(false);
if (onSelectSequence == null)
{
Continue ();
}
else
{
ExecuteSequence(onSelectSequence);
}
};
dialogOptions.Add(dialogOption);
}
options.Clear();
dialog.Choose(chooseText, dialogOptions, timeoutDuration, delegate {
dialog.ShowDialog(false);
Continue();
});
}
}
public override string GetSummary()
{
string summary = "";
if (character != null)
{
summary = character.characterName + ": ";
}
summary += "\"" + chooseText + "\"";
return summary;
}
public override void GetConnectedSequences (ref List<Sequence> connectedSequences)
{
foreach (Option option in options)
{
if (option.targetSequence != null)
{
connectedSequences.Add(option.targetSequence);
}
}
}
}
}

2
Assets/Fungus/Dialog/Commands/SetDialog.cs.meta → Assets/Fungus/Dialog/Commands/Choose.cs.meta

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 7c2d26a03c0c04cad97b8739546dd6ed
guid: d1dc785fd3508440db335f3b5654c96c
MonoImporter:
serializedVersion: 2
defaultReferences: []

87
Assets/Fungus/Dialog/Commands/Say.cs

@ -9,83 +9,51 @@ namespace Fungus.Script
[HelpText("Writes a line of story text to the dialog. A list of options can be specified for the player to choose from. Use a non-zero timeout to give the player a limited time to choose.")]
public class Say : FungusCommand
{
static public Dialog dialog;
public Dialog dialog;
public class SayOption
{
public string optionText;
public Sequence targetSequence;
}
static public List<SayOption> options = new List<SayOption>();
static public Dialog activeDialog;
public Character character;
public string storyText;
public bool displayOnce;
int executionCount;
public float continueTime;
public override void OnEnter()
{
if (dialog == null)
{
Continue();
return;
}
if (displayOnce && executionCount > 0)
{
Continue();
return;
}
executionCount++;
dialog.ShowDialog(true);
dialog.SetCharacter(character);
if (options.Count > 0)
// Remember active dialog between Say calls
if (dialog == null)
{
List<Dialog.Option> dialogOptions = new List<Dialog.Option>();
foreach (SayOption sayOption in options)
if (activeDialog == null)
{
Dialog.Option dialogOption = new Dialog.Option();
dialogOption.text = sayOption.optionText;
Sequence onSelectSequence = sayOption.targetSequence;
dialogOption.onSelect = delegate {
dialog.ShowDialog(false);
if (onSelectSequence == null)
{
Continue ();
}
else
{
ExecuteSequence(onSelectSequence);
}
};
dialogOptions.Add(dialogOption);
}
options.Clear();
dialog.Say(storyText, dialogOptions, 0, delegate {
dialog.ShowDialog(false);
Continue();
});
return;
}
else
{
dialog = activeDialog;
}
}
else
{
dialog.Say(storyText, delegate {
dialog.ShowDialog(false);
Continue();
});
activeDialog = dialog;
}
dialog.ShowDialog(true);
dialog.SetCharacter(character);
dialog.Say(storyText, delegate {
dialog.ShowDialog(false);
Continue();
});
}
public override string GetSummary()
@ -100,17 +68,6 @@ namespace Fungus.Script
return summary;
}
public override void GetConnectedSequences (ref List<Sequence> connectedSequences)
{
foreach (SayOption option in options)
{
if (option.targetSequence != null)
{
connectedSequences.Add(option.targetSequence);
}
}
}
}
}

36
Assets/Fungus/Dialog/Commands/SetDialog.cs

@ -1,36 +0,0 @@
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
namespace Fungus.Script
{
[CommandName("Set Dialog")]
[CommandCategory("Dialog")]
[HelpText("Sets the active dialog for displaying story text with the Say command.")]
public class SetDialog : FungusCommand
{
public Dialog dialogController;
public override void OnEnter()
{
if (dialogController != null)
{
Say.dialog = dialogController;
}
Continue();
}
public override string GetSummary()
{
if (dialogController == null)
{
return "Error: No dialog selected";
}
return dialogController.name;
}
}
}

46
Assets/Fungus/Dialog/Editor/ChooseEditor.cs

@ -0,0 +1,46 @@
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Rotorz.ReorderableList;
namespace Fungus.Script
{
[CustomEditor (typeof(Choose))]
public class ChooseEditor : FungusCommandEditor
{
public override void DrawCommandGUI()
{
Choose t = target as Choose;
EditorGUI.BeginChangeCheck();
EditorGUILayout.PrefixLabel(new GUIContent("Choose Text", "Text to display in dialog"));
GUIStyle sayStyle = new GUIStyle(EditorStyles.textArea);
sayStyle.wordWrap = true;
string chooseText = EditorGUILayout.TextArea(t.chooseText, sayStyle, GUILayout.MinHeight(30));
Character character = FungusCommandEditor.ObjectField<Character>(new GUIContent("Character", "Character to display in dialog"),
new GUIContent("<None>"),
t.character);
Dialog dialog = FungusCommandEditor.ObjectField<Dialog>(new GUIContent("Dialog", "Dialog to use when displaying choices"),
new GUIContent("<Default>"),
t.dialog);
float timeoutDuration = EditorGUILayout.FloatField(new GUIContent("Timeout Duration", "Time limit for player to make a choice. Set to 0 for no limit."), t.timeoutDuration);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(t, "Set Choose");
t.chooseText = chooseText;
t.character = character;
t.dialog = dialog;
t.timeoutDuration = timeoutDuration;
}
}
}
}

2
Assets/Fungus/Dialog/Editor/SetDialogEditor.cs.meta → Assets/Fungus/Dialog/Editor/ChooseEditor.cs.meta

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: f77de3c7e9e264872bfb94713e4c4844
guid: 9596f36d69e664a97936a2f6409eb495
MonoImporter:
serializedVersion: 2
defaultReferences: []

48
Assets/Fungus/Dialog/Editor/SayEditor.cs

@ -17,59 +17,31 @@ namespace Fungus.Script
EditorGUI.BeginChangeCheck();
Character character = FungusCommandEditor.ObjectField<Character>(new GUIContent("Character", "Character to display in dialog"),
new GUIContent("<None>"),
t.character);
EditorGUILayout.PrefixLabel(new GUIContent("Say Text", "Text to display in dialog"));
GUIStyle sayStyle = new GUIStyle(EditorStyles.textArea);
sayStyle.wordWrap = true;
string text = EditorGUILayout.TextArea(t.storyText, sayStyle, GUILayout.MinHeight(30));
bool displayOnce = EditorGUILayout.Toggle(new GUIContent("Display Once", "Display this text once and never show it again."), t.displayOnce);
Character character = FungusCommandEditor.ObjectField<Character>(new GUIContent("Character", "Character to display in dialog"),
new GUIContent("<None>"),
t.character);
float continueTime = EditorGUILayout.FloatField(new GUIContent("Continue Time", "Time to wait before executing next command in the sequence. Useful for time limited player choices."), t.continueTime);
Dialog dialog = FungusCommandEditor.ObjectField<Dialog>(new GUIContent("Dialog", "Dialog to use when displaying Say command story text"),
new GUIContent("<Default>"),
t.dialog);
bool displayOnce = EditorGUILayout.Toggle(new GUIContent("Display Once", "Display this text once and never show it again."), t.displayOnce);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(t, "Set Say");
t.character = character;
t.storyText = text;
t.character = character;
t.dialog = dialog;
t.displayOnce = displayOnce;
t.continueTime = continueTime;
}
}
}
[CustomPropertyDrawer (typeof(Say.SayOption))]
public class SayOptionDrawer : PropertyDrawer
{
public override void OnGUI (Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginProperty(position, label, property);
SerializedProperty optionTextProp = property.FindPropertyRelative("optionText");
SerializedProperty targetSequenceProp = property.FindPropertyRelative("targetSequence");
Rect optionTextRect = position;
optionTextRect.width *= 0.5f;
Rect targetSequenceRect = position;
targetSequenceRect.width *= 0.5f;
targetSequenceRect.x += optionTextRect.width;
FungusScript fungusScript = FungusScriptWindow.GetFungusScript();
optionTextProp.stringValue = EditorGUI.TextField(optionTextRect, optionTextProp.stringValue);
if (fungusScript != null)
{
targetSequenceProp.objectReferenceValue = SequenceEditor.SequenceField(targetSequenceRect,
new GUIContent("<Continue>"),
fungusScript,
targetSequenceProp.objectReferenceValue as Sequence);
}
EditorGUI.EndProperty();
}
}
}

31
Assets/Fungus/Dialog/Editor/SetDialogEditor.cs

@ -1,31 +0,0 @@
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Rotorz.ReorderableList;
namespace Fungus.Script
{
[CustomEditor (typeof(SetDialog))]
public class SetDialogEditor : FungusCommandEditor
{
public override void DrawCommandGUI()
{
SetDialog t = target as SetDialog;
EditorGUI.BeginChangeCheck();
Dialog dialogController = FungusCommandEditor.ObjectField<Dialog>(new GUIContent("Active Dialog", "Dialog to use when displaying Say command story text"),
new GUIContent("<None>"),
t.dialogController);
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(t, "Set Dialog");
t.dialogController = dialogController;
}
}
}
}

2
Assets/Fungus/Dialog/Scripts/Dialog.cs

@ -126,7 +126,7 @@ namespace Fungus.Script
}));
}
public void Say(string text, List<Option> options, float timeoutDuration, Action onTimeout)
public void Choose(string text, List<Option> options, float timeoutDuration, Action onTimeout)
{
Clear();

BIN
Assets/Shuttle/ShuttleGame.unity

Binary file not shown.
Loading…
Cancel
Save