You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
4.9 KiB
224 lines
4.9 KiB
10 years ago
|
using UnityEngine;
|
||
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Text.RegularExpressions;
|
||
|
|
||
|
namespace Fungus
|
||
|
{
|
||
|
public enum TokenType
|
||
|
{
|
||
|
Words, // A string of words
|
||
|
BoldStart, // b
|
||
|
BoldEnd, // /b
|
||
|
ItalicStart, // i
|
||
|
ItalicEnd, // /i
|
||
|
ColorStart, // color=red
|
||
|
ColorEnd, // /color
|
||
|
Wait, // w, w=0.5
|
||
|
WaitForInputNoClear, // wi
|
||
|
WaitForInputAndClear, // wc
|
||
10 years ago
|
WaitOnPunctuationStart, // wp, wp=0.5
|
||
|
WaitOnPunctuationEnd, // /wp
|
||
10 years ago
|
Clear, // c
|
||
10 years ago
|
SpeedStart, // s, s=60
|
||
|
SpeedEnd, // /s
|
||
10 years ago
|
Exit, // x
|
||
10 years ago
|
Message, // m=MessageName
|
||
|
VerticalPunch, // {vpunch=0.5}
|
||
|
HorizontalPunch, // {hpunch=0.5}
|
||
|
Shake, // {shake=0.5}
|
||
|
Shiver, // {shiver=0.5}
|
||
|
Flash, // {flash=0.5}
|
||
|
Audio, // {audio=Sound}
|
||
|
AudioLoop, // {audioloop=Sound}
|
||
|
AudioPause, // {audiopause=Sound}
|
||
|
AudioStop // {audiostop=Sound}
|
||
10 years ago
|
}
|
||
|
|
||
|
public class Token
|
||
|
{
|
||
|
public TokenType type = TokenType.Words;
|
||
|
public string param = "";
|
||
|
}
|
||
|
|
||
|
public class DialogParser
|
||
|
{
|
||
|
public List<Token> tokens = new List<Token>();
|
||
|
|
||
|
public virtual void Tokenize(string storyText)
|
||
|
{
|
||
|
tokens.Clear();
|
||
|
|
||
|
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;
|
||
|
|
||
|
AddWordsToken(tokens, preText);
|
||
|
AddTagToken(tokens, tagText);
|
||
|
|
||
|
position = m.Index + tagText.Length;
|
||
|
m = m.NextMatch();
|
||
|
}
|
||
|
|
||
|
if (position < storyText.Length - 1)
|
||
|
{
|
||
|
string postText = storyText.Substring(position, storyText.Length - position);
|
||
|
AddWordsToken(tokens, postText);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected static void AddWordsToken(List<Token> tokenList, string words)
|
||
|
{
|
||
|
Token token = new Token();
|
||
|
token.type = TokenType.Words;
|
||
|
token.param = words;
|
||
|
tokenList.Add(token);
|
||
|
}
|
||
|
|
||
|
protected virtual void AddTagToken(List<Token> tokenList, string tagText)
|
||
|
{
|
||
|
if (tagText.Length < 3 ||
|
||
|
tagText.Substring(0,1) != "{" ||
|
||
|
tagText.Substring(tagText.Length - 1,1) != "}")
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
string tag = tagText.Substring(1, tagText.Length - 2);
|
||
|
|
||
|
TokenType type = TokenType.Words;
|
||
|
string paramText = "";
|
||
|
|
||
|
if (tag == "b")
|
||
|
{
|
||
|
type = TokenType.BoldStart;
|
||
|
}
|
||
|
else if (tag == "/b")
|
||
|
{
|
||
|
type = TokenType.BoldEnd;
|
||
|
}
|
||
|
else if (tag == "i")
|
||
|
{
|
||
|
type = TokenType.ItalicStart;
|
||
|
}
|
||
|
else if (tag == "/i")
|
||
|
{
|
||
|
type = TokenType.ItalicEnd;
|
||
|
}
|
||
|
else if (tag.StartsWith("color="))
|
||
|
{
|
||
|
type = TokenType.ColorStart;
|
||
|
paramText = tag.Substring(6, tag.Length - 6);
|
||
|
}
|
||
|
else if (tag == "/color")
|
||
|
{
|
||
|
type = TokenType.ColorEnd;
|
||
|
}
|
||
|
else if (tag == "wi")
|
||
|
{
|
||
|
type = TokenType.WaitForInputNoClear;
|
||
|
}
|
||
|
if (tag == "wc")
|
||
|
{
|
||
|
type = TokenType.WaitForInputAndClear;
|
||
|
}
|
||
|
else if (tag.StartsWith("wp="))
|
||
|
{
|
||
10 years ago
|
type = TokenType.WaitOnPunctuationStart;
|
||
10 years ago
|
paramText = tag.Substring(3, tag.Length - 3);
|
||
|
}
|
||
|
else if (tag == "wp")
|
||
|
{
|
||
10 years ago
|
type = TokenType.WaitOnPunctuationStart;
|
||
|
}
|
||
|
else if (tag == "/wp")
|
||
|
{
|
||
|
type = TokenType.WaitOnPunctuationEnd;
|
||
10 years ago
|
}
|
||
|
else if (tag.StartsWith("w="))
|
||
|
{
|
||
|
type = TokenType.Wait;
|
||
|
paramText = tag.Substring(2, tag.Length - 2);
|
||
|
}
|
||
|
else if (tag == "w")
|
||
|
{
|
||
|
type = TokenType.Wait;
|
||
|
}
|
||
|
else if (tag == "c")
|
||
|
{
|
||
|
type = TokenType.Clear;
|
||
|
}
|
||
|
else if (tag.StartsWith("s="))
|
||
|
{
|
||
10 years ago
|
type = TokenType.SpeedStart;
|
||
10 years ago
|
paramText = tag.Substring(2, tag.Length - 2);
|
||
|
}
|
||
|
else if (tag == "s")
|
||
|
{
|
||
10 years ago
|
type = TokenType.SpeedStart;
|
||
|
}
|
||
|
else if (tag == "/s")
|
||
|
{
|
||
|
type = TokenType.SpeedEnd;
|
||
10 years ago
|
}
|
||
|
else if (tag == "x")
|
||
|
{
|
||
|
type = TokenType.Exit;
|
||
|
}
|
||
10 years ago
|
else if (tag.StartsWith("m="))
|
||
|
{
|
||
|
type = TokenType.Message;
|
||
|
paramText = tag.Substring(2, tag.Length - 2);
|
||
|
}
|
||
10 years ago
|
else if (tag.StartsWith("vpunch="))
|
||
|
{
|
||
|
type = TokenType.VerticalPunch;
|
||
|
paramText = tag.Substring(7, tag.Length - 7);
|
||
|
}
|
||
|
else if (tag.StartsWith("hpunch="))
|
||
|
{
|
||
|
type = TokenType.HorizontalPunch;
|
||
|
paramText = tag.Substring(7, tag.Length - 7);
|
||
|
}
|
||
|
else if (tag.StartsWith("shake="))
|
||
|
{
|
||
|
type = TokenType.Shake;
|
||
|
paramText = tag.Substring(6, tag.Length - 6);
|
||
|
}
|
||
|
else if (tag.StartsWith("shiver="))
|
||
|
{
|
||
|
type = TokenType.Shiver;
|
||
|
paramText = tag.Substring(7, tag.Length - 7);
|
||
|
}
|
||
|
else if (tag.StartsWith("flash="))
|
||
|
{
|
||
|
type = TokenType.Flash;
|
||
|
paramText = tag.Substring(6, tag.Length - 6);
|
||
|
}
|
||
|
else if (tag.StartsWith("audio="))
|
||
|
{
|
||
|
type = TokenType.Audio;
|
||
|
paramText = tag.Substring(6, tag.Length - 6);
|
||
|
}
|
||
|
else if (tag.StartsWith("audioloop="))
|
||
|
{
|
||
|
type = TokenType.AudioLoop;
|
||
|
paramText = tag.Substring(10, tag.Length - 10);
|
||
|
}
|
||
10 years ago
|
Token token = new Token();
|
||
|
token.type = type;
|
||
|
token.param = paramText.Trim();
|
||
|
|
||
|
tokenList.Add(token);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|