CapersProject/Assets/Plugins/Pixel Crushers/Dialogue System/Scripts/Importers/Articy/ArticyLuaFunctions.cs

128 lines
6.0 KiB
C#

#if USE_ARTICY
// Copyright (c) Pixel Crushers. All rights reserved.
using UnityEngine;
namespace PixelCrushers.DialogueSystem.Articy
{
/// <summary>
/// Implements articy:expresso functions.
/// </summary>
[AddComponentMenu("")] // Use wrapper.
public class ArticyLuaFunctions : MonoBehaviour
{
private static bool s_registered = false;
#if UNITY_2019_3_OR_NEWER && UNITY_EDITOR
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
static void InitStaticVariables()
{
s_registered = false;
}
#endif
private void OnEnable()
{
if (s_registered) return;
s_registered = true;
Lua.RegisterFunction("getObj", this, SymbolExtensions.GetMethodInfo(() => getObj(string.Empty)));
Lua.RegisterFunction("getObject", this, SymbolExtensions.GetMethodInfo(() => getObj(string.Empty)));
Lua.RegisterFunction("getProp", this, SymbolExtensions.GetMethodInfo(() => getProp(string.Empty, string.Empty)));
Lua.RegisterFunction("setProp", this, SymbolExtensions.GetMethodInfo(() => setProp(string.Empty, string.Empty, default(object))));
}
private void OnConversationLine(Subtitle subtitle)
{
var speaker = "\"Actor[\\\"" + DialogueLua.StringToTableIndex(subtitle.speakerInfo.nameInDatabase) + "\\\"]\"";
var self = "\"Dialog[" + subtitle.dialogueEntry.id + "]\""; // Note that Dialog[#] only has SimStatus to conserve memory. getProp() uses special case to get entry fields.
Lua.Run("speaker = " + speaker + "; self = " + self, DialogueDebug.logInfo);
}
public static string getObj(string objectName)
{
var db = DialogueManager.MasterDatabase;
var actor = db.actors.Find(x => string.Equals(objectName, x.Name) || string.Equals(objectName, x.LookupValue("Technical Name")) || string.Equals(objectName, x.LookupValue("Articy Id")));
if (actor != null) return "Actor[\"" + DialogueLua.StringToTableIndex(actor.Name) + "\"]";
var item = db.items.Find(x => string.Equals(objectName, x.Name) || string.Equals(objectName, x.LookupValue("Technical Name")) || string.Equals(objectName, x.LookupValue("Articy Id")));
if (item != null) return "Item[\"" + DialogueLua.StringToTableIndex(item.Name) + "\"]";
var location = db.locations.Find(x => string.Equals(objectName, x.Name) || string.Equals(objectName, x.LookupValue("Technical Name")) || string.Equals(objectName, x.LookupValue("Articy Id")));
if (location != null) return "Location[\"" + DialogueLua.StringToTableIndex(location.Name) + "\"]";
var conversation = db.conversations.Find(x => string.Equals(objectName, x.Title) || string.Equals(objectName, x.LookupValue("Technical Name")) || string.Equals(objectName, x.LookupValue("Articy Id")));
if (conversation != null) return "Conversation[\"" + conversation.id + "\"]";
if (objectName.StartsWith("Dialog[")) return objectName;
return null;
}
public static object getProp(string objectIdentifier, string propertyName)
{
if (string.IsNullOrEmpty(objectIdentifier) || string.IsNullOrEmpty(propertyName)) return string.Empty;
if (objectIdentifier.StartsWith("Dialog[") && DialogueManager.isConversationActive)
{
// Handle Dialog[#] specially:
var entryID = Tools.StringToInt(objectIdentifier.Substring(7, objectIdentifier.Length - 8));
var conversationID = DialogueManager.currentConversationState.subtitle.dialogueEntry.conversationID;
if (string.Equals("SimStatus", propertyName)) return DialogueLua.GetSimStatus(conversationID, entryID);
var entry = DialogueManager.masterDatabase.GetDialogueEntry(conversationID, entryID);
if (entry == null) return string.Empty;
var field = Field.Lookup(entry.fields, propertyName);
if (field == null) return string.Empty;
if (field.type == FieldType.Number) return Tools.StringToFloat(field.value);
else if (field.type == FieldType.Boolean) return Tools.StringToBool(field.value);
else return field.value;
}
var result = Lua.Run("return " + objectIdentifier + "." + DialogueLua.StringToTableIndex(GetShortPropertyName(propertyName)), DialogueDebug.logInfo);
if (result.isBool)
{
return result.asBool;
}
else if (result.isNumber)
{
return result.asInt;
}
else
{
return result.asString;
}
}
public static void setProp(string objectIdentifier, string propertyName, object value)
{
string rightSide;
if (value == null)
{
rightSide = "nil";
}
else if (value.GetType() == typeof(string))
{
rightSide = "\"" + value.ToString() + "\"";
}
else if (value.GetType() == typeof(bool))
{
rightSide = value.ToString().ToLower();
}
else
{
rightSide = value.ToString();
}
Lua.Run(objectIdentifier + "." + GetShortPropertyName(propertyName) + " = " + rightSide, DialogueDebug.logInfo);
}
private static string GetShortPropertyName(string propertyName)
{
// In articy, custom feature properties include the feature name.
// In DS, they don't. Remove the feature name if present.
if (propertyName.Contains("."))
{
var lastIndex = propertyName.LastIndexOf('.');
return propertyName.Substring(lastIndex + 1);
}
else
{
return propertyName;
}
}
}
}
#endif