Browse Source

Added dialog text tags

master
chrisgregan 11 years ago
parent
commit
5d0b97452f
  1. 3
      Assets/Fungus/Dialog/Editor/SayEditor.cs
  2. 8
      Assets/Fungus/Dialog/Scripts/ChooseDialog.cs
  3. 286
      Assets/Fungus/Dialog/Scripts/Dialog.cs
  4. 39
      Assets/Fungus/Dialog/Scripts/SayDialog.cs
  5. BIN
      Assets/Shuttle/ShuttleGame.unity

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

@ -24,7 +24,8 @@ namespace Fungus.Script
EditorGUILayout.BeginHorizontal();
string text = EditorGUILayout.TextArea(t.storyText, sayStyle, GUILayout.MinHeight(40));
float minHeight = sayStyle.CalcHeight(new GUIContent(t.storyText), EditorGUIUtility.currentViewWidth);
string text = EditorGUILayout.TextArea(t.storyText, sayStyle, GUILayout.MinHeight(minHeight + 10), GUILayout.ExpandHeight(true));
if (t.character != null &&
t.character.characterImage != null &&

8
Assets/Fungus/Dialog/Scripts/ChooseDialog.cs

@ -23,8 +23,8 @@ namespace Fungus.Script
public void Choose(string text, List<Option> options, float timeoutDuration, Action onTimeout)
{
Clear();
StartCoroutine(WriteText(text, delegate {
Action onWritingComplete = delegate {
foreach (Option option in options)
{
AddOption(option.text, option.onSelect);
@ -34,7 +34,9 @@ namespace Fungus.Script
{
StartCoroutine(WaitForTimeout(timeoutDuration, onTimeout));
}
}));
};
StartCoroutine(WriteText(text, onWritingComplete, onTimeout));
}
IEnumerator WaitForTimeout(float timeoutDuration, Action onTimeout)

286
Assets/Fungus/Dialog/Scripts/Dialog.cs

@ -4,6 +4,7 @@ using UnityEngine.Events;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace Fungus.Script
{
@ -25,7 +26,25 @@ namespace Fungus.Script
public Text storyText;
public Image leftImage;
public Image rightImage;
protected enum GlyphType
{
Character, // Text character
Wait, // w, w=0.5
WaitForInput, // i
WaitForInputAndClear, // ic
Clear, // c
Speed, // s, s=60
Exit, // x
Punctuation // p, p=0.5
}
protected class Glyph
{
public GlyphType type = GlyphType.Character;
public string param = "";
}
public void ShowDialog(bool visible)
{
if (dialogCanvas != null)
@ -92,21 +111,37 @@ namespace Fungus.Script
}
}
protected IEnumerator WriteText(string text, Action onWritingComplete)
protected IEnumerator WriteText(string text, Action onWritingComplete, Action onExitTag)
{
// Zero CPS means write instantly
// Also write instantly if text contains markup tags
storyText.text = "";
List<Glyph> glyphs = MakeGlyphList(text);
if (glyphs.Count == 0)
{
yield break;
}
// Zero writingSpeed means write instantly
// Also write instantly if text contains rich text markup tags
if (writingSpeed == 0 ||
text.Contains("<"))
{
storyText.text = text;
foreach (Glyph glyph in glyphs)
{
if (glyph.type == GlyphType.Character)
{
storyText.text += glyph.param;
}
}
if (onWritingComplete != null)
{
onWritingComplete();
}
yield break;
}
GameObject typingAudio = null;
if (writingSound != null)
@ -118,34 +153,102 @@ namespace Fungus.Script
typingAudio.audio.Play();
}
storyText.text = "";
// Make one character visible at a time
float writeDelay = (1f / (float)writingSpeed);
float writeDelay = 0f;
if (writingSpeed > 0)
{
writeDelay = (1f / (float)writingSpeed);
}
float timeAccumulator = 0f;
int i = 0;
while (true)
while (i < glyphs.Count)
{
timeAccumulator += Time.deltaTime;
while (timeAccumulator > writeDelay)
{
i++;
timeAccumulator -= writeDelay;
Glyph glyph = glyphs[i];
switch (glyph.type)
{
case GlyphType.Character:
if (storyText.text.Length == 0 && glyph.param == "\n")
{
// Ignore leading newlines
}
else
{
storyText.text += glyph.param;
}
break;
case GlyphType.Wait:
float duration = 1f;
if (!Single.TryParse(glyph.param, out duration))
{
duration = 1f;
}
yield return new WaitForSeconds(duration);
timeAccumulator = 0f;
break;
case GlyphType.WaitForInput:
OnWaitForInputTag(true);
yield return StartCoroutine(WaitForInput(null));
OnWaitForInputTag(false);
break;
case GlyphType.WaitForInputAndClear:
OnWaitForInputTag(true);
yield return StartCoroutine(WaitForInput(null));
OnWaitForInputTag(false);
storyText.text = "";
break;
case GlyphType.Clear:
storyText.text = "";
break;
case GlyphType.Speed:
if (!Single.TryParse(glyph.param, out writingSpeed))
{
writingSpeed = 0f;
}
writeDelay = 0;
if (writingSpeed > 0)
{
writeDelay = (1f / (float)writingSpeed);
}
break;
case GlyphType.Exit:
if (typingAudio != null)
{
Destroy(typingAudio);
}
if (onExitTag != null)
{
onExitTag();
}
yield break;
case GlyphType.Punctuation:
break;
}
if (++i >= glyphs.Count)
{
break;
}
}
if (i >= text.Length)
{
storyText.text = text;
break;
}
else
{
string left = text.Substring(0, i + 1);
storyText.text = left;
}
yield return null;
}
@ -174,7 +277,138 @@ namespace Fungus.Script
storyText.text = "";
}
}
List<Glyph> MakeGlyphList(string storyText)
{
List<Glyph> glyphList = new List<Glyph>();
string pattern = @"\{.*?\}";
Regex myRegex = new Regex(pattern);
Match m = myRegex.Match(storyText); // m is the first match
int position = 0;
while (m.Success)
{
// Get bit leading up to tag
string preText = storyText.Substring(position, m.Index - position);
string tagText = m.Value;
foreach (char c in preText)
{
glyphList.Add(MakeCharacterGlyph(c.ToString()));
}
Glyph tagGlyph = MakeTagGlyph(tagText);
if (tagGlyph != null)
{
glyphList.Add (tagGlyph);
}
position = m.Index + tagText.Length;
m = m.NextMatch();
}
if (position < storyText.Length - 1)
{
string postText = storyText.Substring(position, storyText.Length - position);
foreach (char c in postText)
{
glyphList.Add(MakeCharacterGlyph(c.ToString()));
}
}
return glyphList;
}
Glyph MakeCharacterGlyph(string character)
{
Glyph glyph = new Glyph();
glyph.type = GlyphType.Character;
glyph.param = character;
return glyph;
}
Glyph MakeTagGlyph(string tagText)
{
if (tagText.Length < 3 ||
tagText.Substring(0,1) != "{" ||
tagText.Substring(tagText.Length - 1,1) != "}")
{
return null;
}
string tag = tagText.Substring(1, tagText.Length - 2);
GlyphType type = GlyphType.Character;
string paramText = "";
if (tag == "i")
{
type = GlyphType.WaitForInput;
}
if (tag == "ic")
{
type = GlyphType.WaitForInputAndClear;
}
else if (tag.StartsWith("w="))
{
type = GlyphType.Wait;
paramText = tag.Substring(2, tag.Length - 2);
}
else if (tag == "w")
{
type = GlyphType.Wait;
}
else if (tag == "c")
{
type = GlyphType.Clear;
}
else if (tag.StartsWith("s="))
{
type = GlyphType.Speed;
paramText = tag.Substring(2, tag.Length - 2);
}
else if (tag == "s")
{
type = GlyphType.Speed;
}
else if (tag == "x")
{
type = GlyphType.Exit;
}
else if (tag.StartsWith("p="))
{
type = GlyphType.Punctuation;
paramText = tag.Substring(2, tag.Length - 2);
}
else if (tag == "p")
{
type = GlyphType.Punctuation;
}
Glyph glyph = new Glyph();
glyph.type = type;
glyph.param = paramText;
return glyph;
}
protected IEnumerator WaitForInput(Action onInput)
{
while (!Input.GetMouseButtonDown(0))
{
yield return null;
}
if (onInput != null)
{
onInput();
}
}
protected virtual void OnWaitForInputTag(bool waiting)
{}
}
}

39
Assets/Fungus/Dialog/Scripts/SayDialog.cs

@ -18,20 +18,27 @@ namespace Fungus.Script
{
storyText.text = text;
}
StartCoroutine(WriteText(text, delegate {
Action onWritingComplete = delegate {
ShowContinueImage(true);
StartCoroutine(WaitForInput(delegate {
Clear();
Clear();
if (onComplete != null)
{
onComplete();
}
}));
}));
};
Action onExitTag = delegate {
Clear();
if (onComplete != null)
{
onComplete();
}
};
StartCoroutine(WriteText(text, onWritingComplete, onExitTag));
}
protected override void Clear()
@ -40,24 +47,16 @@ namespace Fungus.Script
ShowContinueImage(false);
}
void ShowContinueImage(bool visible)
protected override void OnWaitForInputTag(bool waiting)
{
if (continueImage != null)
{
continueImage.enabled = visible;
}
ShowContinueImage(waiting);
}
IEnumerator WaitForInput(Action onInput)
void ShowContinueImage(bool visible)
{
while (!Input.GetMouseButtonDown(0))
{
yield return null;
}
if (onInput != null)
if (continueImage != null)
{
onInput();
continueImage.enabled = visible;
}
}
}

BIN
Assets/Shuttle/ShuttleGame.unity

Binary file not shown.
Loading…
Cancel
Save