9 changed files with 465 additions and 45 deletions
@ -0,0 +1,219 @@ |
|||||||
|
using System; |
||||||
|
using System.Collections; |
||||||
|
using System.Collections.Generic; |
||||||
|
using System.Text.RegularExpressions; |
||||||
|
using UnityEngine; |
||||||
|
|
||||||
|
namespace Fungus |
||||||
|
{ |
||||||
|
public class ConversationManager |
||||||
|
{ |
||||||
|
protected Character[] characters; |
||||||
|
|
||||||
|
protected Character currentCharacter; |
||||||
|
protected Sprite currentPortrait; |
||||||
|
protected RectTransform currentPosition; |
||||||
|
|
||||||
|
protected Character previousCharacter; |
||||||
|
protected Sprite previousPortrait; |
||||||
|
protected RectTransform previousPosition; |
||||||
|
|
||||||
|
protected bool exitSayWait; |
||||||
|
|
||||||
|
public ConversationManager () |
||||||
|
{ |
||||||
|
// cache characters for faster lookup |
||||||
|
characters = GameObject.FindObjectsOfType<Fungus.Character>(); |
||||||
|
} |
||||||
|
|
||||||
|
protected Stage GetActiveStage() |
||||||
|
{ |
||||||
|
if (Stage.activeStages == null || |
||||||
|
Stage.activeStages.Count == 0) |
||||||
|
{ |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
return Stage.activeStages[0]; |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// Parse and execute a conversation string |
||||||
|
/// </summary> |
||||||
|
/// <param name="conv"></param> |
||||||
|
public IEnumerator Conversation(string conv) |
||||||
|
{ |
||||||
|
if (string.IsNullOrEmpty(conv)) |
||||||
|
{ |
||||||
|
yield break; |
||||||
|
} |
||||||
|
|
||||||
|
SayDialog sayDialog = SayDialog.GetSayDialog(); |
||||||
|
|
||||||
|
if (sayDialog == null) |
||||||
|
{ |
||||||
|
yield break; |
||||||
|
} |
||||||
|
|
||||||
|
//find SimpleScript say strings with portrait options |
||||||
|
//You can test regex matches here: http://regexstorm.net/tester |
||||||
|
Regex sayRegex = new Regex(@"((?<sayParams>[\w ,]*):)?(?<text>.*\r*\n)"); |
||||||
|
MatchCollection sayMatches = sayRegex.Matches(conv); |
||||||
|
|
||||||
|
for (int i = 0; i < sayMatches.Count; i++) |
||||||
|
{ |
||||||
|
previousCharacter = currentCharacter; |
||||||
|
previousPortrait = currentPortrait; |
||||||
|
previousPosition = currentPosition; |
||||||
|
|
||||||
|
string sayParams = sayMatches[i].Groups["sayParams"].Value; |
||||||
|
if (!string.IsNullOrEmpty(sayParams)) |
||||||
|
{ |
||||||
|
string[] separateParams; |
||||||
|
if (sayParams.Contains(",")) |
||||||
|
{ |
||||||
|
separateParams = sayParams.Split(','); |
||||||
|
for (int j = 0; j < separateParams.Length; j++) |
||||||
|
{ |
||||||
|
separateParams[j] = separateParams[j].Trim(); |
||||||
|
} |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
separateParams = sayParams.Split(' '); |
||||||
|
} |
||||||
|
|
||||||
|
SetParams(separateParams); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
//no params! Use previous settings? |
||||||
|
} |
||||||
|
|
||||||
|
string text = sayMatches[i].Groups["text"].Value; |
||||||
|
|
||||||
|
sayDialog.gameObject.SetActive(true); |
||||||
|
|
||||||
|
if (currentCharacter != null && currentCharacter != previousCharacter) |
||||||
|
{ |
||||||
|
sayDialog.SetCharacter(currentCharacter); |
||||||
|
} |
||||||
|
|
||||||
|
Stage stage = GetActiveStage(); |
||||||
|
|
||||||
|
if (stage != null && currentCharacter != null && (currentPortrait != previousPortrait || currentPosition != previousPosition)) |
||||||
|
{ |
||||||
|
PortraitOptions portraitOptions = new PortraitOptions(true); |
||||||
|
portraitOptions.character = currentCharacter; |
||||||
|
portraitOptions.fromPosition = currentCharacter.state.position ?? previousPosition; |
||||||
|
portraitOptions.toPosition = currentPosition; |
||||||
|
portraitOptions.portrait = currentPortrait; |
||||||
|
|
||||||
|
stage.Show(portraitOptions); |
||||||
|
} |
||||||
|
|
||||||
|
// Ignore Lua style comments and blank lines |
||||||
|
if (text.StartsWith("--") || text.Trim() == "") |
||||||
|
{ |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
exitSayWait = false; |
||||||
|
sayDialog.Say(text, true, true, true, false, null, () => { |
||||||
|
exitSayWait = true; |
||||||
|
}); |
||||||
|
|
||||||
|
while (!exitSayWait) |
||||||
|
{ |
||||||
|
yield return null; |
||||||
|
} |
||||||
|
exitSayWait = false; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/// <summary> |
||||||
|
/// Using the string of say parameters before the ':', |
||||||
|
/// set the current character, position and portrait if provided. |
||||||
|
/// </summary> |
||||||
|
/// <param name="sayParams">The list of say parameters</param> |
||||||
|
private void SetParams(string[] sayParams) |
||||||
|
{ |
||||||
|
Character character = null; |
||||||
|
Sprite portrait = null; |
||||||
|
RectTransform position = null; |
||||||
|
|
||||||
|
// try to find the character first, since we need to get its portrait |
||||||
|
int characterIndex = -1; |
||||||
|
for (int i = 0; character == null && i < sayParams.Length; i++) |
||||||
|
{ |
||||||
|
for (int j = 0; j < characters.Length; j++) |
||||||
|
{ |
||||||
|
if (characters[j].NameStartsWith(sayParams[i])) |
||||||
|
{ |
||||||
|
characterIndex = i; |
||||||
|
character = characters[j]; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Assume last used character if none is specified now |
||||||
|
if (character == null) |
||||||
|
{ |
||||||
|
character = currentCharacter; |
||||||
|
} |
||||||
|
|
||||||
|
// Next see if we can find a portrait for this character |
||||||
|
int portraitIndex = -1; |
||||||
|
if (character != null) |
||||||
|
{ |
||||||
|
for (int i = 0; i < sayParams.Length; i++) |
||||||
|
{ |
||||||
|
if (portrait == null && |
||||||
|
character != null && |
||||||
|
i != characterIndex) |
||||||
|
{ |
||||||
|
Sprite s = character.GetPortrait(sayParams[i]); |
||||||
|
if (s != null) |
||||||
|
{ |
||||||
|
portraitIndex = i; |
||||||
|
portrait = s; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Next check if there's a position parameter |
||||||
|
Stage stage = GetActiveStage(); |
||||||
|
if (stage != null) |
||||||
|
{ |
||||||
|
for (int i = 0; i < sayParams.Length; i++) |
||||||
|
{ |
||||||
|
if (i != characterIndex && |
||||||
|
i != portraitIndex) |
||||||
|
{ |
||||||
|
position = stage.GetPosition(sayParams[i]); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (character != null) |
||||||
|
{ |
||||||
|
currentCharacter = character; |
||||||
|
} |
||||||
|
|
||||||
|
if (portrait != null) |
||||||
|
{ |
||||||
|
currentPortrait = portrait; |
||||||
|
} |
||||||
|
|
||||||
|
if (position != null) |
||||||
|
{ |
||||||
|
currentPosition = position; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
fileFormatVersion: 2 |
||||||
|
guid: 6ee240b2e8b559946a44b33a90cca00f |
||||||
|
timeCreated: 1467644516 |
||||||
|
licenseType: Free |
||||||
|
MonoImporter: |
||||||
|
serializedVersion: 2 |
||||||
|
defaultReferences: [] |
||||||
|
executionOrder: 0 |
||||||
|
icon: {instanceID: 0} |
||||||
|
userData: |
||||||
|
assetBundleName: |
||||||
|
assetBundleVariant: |
Loading…
Reference in new issue