/// <summary> /// returns a field value by its name /// </summary> /// <param name="fieldName">field name</param> /// <returns>value of specified field</returns> public FBValue getFieldValue(string fieldName) { FBValue fieldValue = null; fieldValues.TryGetValue(fieldName, out fieldValue); return(fieldValue); }
/// <summary> /// executes a script /// </summary> /// <param name="text">script content to run</param> /// <returns>true on success, false on failure</returns> public bool run(string text) { if (string.IsNullOrEmpty(text)) { onFinished(); return(false); } cmdIdx = cmdCount = 0; timer = 0; nextCmd = false; cmdData = null; string[] lines = text.Split('\n'); int linesCount = lines.Length; data = new FBValue[linesCount][]; for (int i = 0; i < linesCount; i++) { string[] paramTexts = lines[i].Trim().Split(' '); if (paramTexts == null || paramTexts.Length <= 0) { continue; // empty line } int paramsCount = 0; while (paramsCount < paramTexts.Length && paramTexts[paramsCount].Length > 0 && !paramTexts[paramsCount].StartsWith("//")) { paramsCount++; } if (paramsCount <= 0) { continue; // line commented out } // parse line content data[cmdCount] = new FBValue[paramsCount]; for (int j = 0; j < paramsCount; j++) { data[cmdCount][j] = new FBValue(paramTexts[j], true); } cmdCount++; } if (cmdCount <= 0) { onFinished(); return(false); } gameObject.SetActive(true); return(true); }
/// <summary> /// returns an object which matches the condition /// </summary> /// <param name="fieldName">field name</param> /// <param name="value">value to compare</param> /// <returns>object which matches the condition</returns> public FBClassObject getObject(string fieldName, FBValue value) { foreach (KeyValuePair <int, FBClassObject> p in objects) { if (p.Value.getFieldValue(fieldName).equals(value)) { return(p.Value); } } return(null); }
/// <summary> /// returns a list of objects which match the condition /// </summary> /// <param name="fieldName">field name</param> /// <param name="value">value to compare</param> /// <returns>list of objects which match the condition</returns> public List <FBClassObject> getObjects(string fieldName, FBValue value) { List <FBClassObject> list = new List <FBClassObject>(); foreach (KeyValuePair <int, FBClassObject> p in objects) { if (p.Value.getFieldValue(fieldName).equals(value)) { list.Add(p.Value); } } return(list); }
/// <summary> /// sets a field value by its name /// </summary> /// <param name="fieldName">field name</param> /// <param name="value">value</param> /// <returns>true on success, false on failure</returns> public bool setFieldValue(string fieldName, FBValue value) { fieldValues[fieldName] = value; FBClassData classData = FBGameData.instance.getClassData(classId); if (classData != null) { classData.modified = true; } return(true); }
/// <summary> /// load all objects of a class /// </summary> /// <param name="json">json string</param> /// <returns>true on success, false on failure</returns> bool loadClassObjects(string json) { JObject classDataJson = JsonConvert.DeserializeObject(json) as JObject; FBClassData classData = getClassData((string)classDataJson["name"]); FBClassDefinition classDef = classData.classDef; JArray classObjectsJson = classDataJson["data"] as JArray; for (int i = 0; i < classObjectsJson.Count; i++) { JObject classObjectJson = classObjectsJson[i] as JObject; int id = int.Parse((string)classObjectJson["id"]); FBClassObject classObject = new FBClassObject(); classObject.id = id; classObject.classId = classDef.id; foreach (KeyValuePair <string, FBClassField> p in classDef.fieldsByName) { FBValue val = new FBValue(p.Value.dataType, (string)classObjectJson[p.Value.name]); classObject.setFieldValue(p.Value.name, val); } classData.addObject(classObject); } classData.modified = false; return(true); }
/// <summary> /// compares current value to another value /// </summary> /// <param name="val">value to compare</param> /// <returns>int.MinValue if two values cannot be compared, negative number if current value is smaller, zero if two values are equal, negative number if current value is larger</returns> public int compareTo(FBValue val) { if (val.dataType != dataType) { return(int.MinValue); } if (dataType == FBDataType.Int || dataType >= FBDataType.Class1) { return(intValue == val.intValue ? 0 : (intValue > val.intValue ? 1 : -1)); } if (dataType == FBDataType.Float) { return(floatValue == val.floatValue ? 0 : (floatValue > val.floatValue ? 1 : -1)); } if (dataType == FBDataType.String) { return(stringValue.CompareTo(val.stringValue)); } return(int.MinValue); }
/// <summary> /// checks if current value is equal to another value /// </summary> /// <param name="val">value to check</param> /// <returns>true if two values are equal, false otherwise</returns> public bool equals(FBValue val) { if (val.dataType != dataType) { return(false); } if (dataType == FBDataType.Int || dataType >= FBDataType.Class1) { return(val.intValue == intValue); } if (dataType == FBDataType.Float) { return(val.floatValue == floatValue); } if (dataType == FBDataType.String) { return(val.stringValue == stringValue); } return(false); }
/// <summary> /// returns a string to display on ui /// </summary> /// /// <param name="id2name">convert class object id to name if possible</param> /// <returns>string</returns> public string getDisplayString(bool id2name = false) { if (dataType >= FBDataType.Class1) { if (id2name) { // try to return object name instead of id FBClassData classData = FBGameData.instance.getClassData((int)dataType); FBClassObject classObject = classData.getObject(intValue); if (classObject == null) { return(intValue.ToString()); } FBValue val = classObject.getFieldValue("Name"); if (val != null) { return(val.stringValue); } val = classObject.getFieldValue("name"); if (val != null) { return(val.stringValue); } } return(intValue.ToString()); } if (dataType == FBDataType.Int) { return(intValue.ToString()); } if (dataType == FBDataType.Float) { return(floatValue.ToString()); } return(stringValue); }
/// <summary> /// check whether an FBValue is null or emtpy /// </summary> /// <param name="val">value to check</param> /// <returns>true or false</returns> public static bool isNullOrEmpty(FBValue val) { return(val == null || val.dataType == FBDataType.None); }
/// <summary> /// fills data from an FBClassObject /// </summary> /// <param name="data">source data</param> /// <returns>true on success, false on failure</returns> public bool fillData(FBClassObject data) { this.data = data; if (string.IsNullOrEmpty(fieldName)) { return(false); // not a field } FBValue val = data.getFieldValue(fieldName); if (val == null) { return(false); // not this field } if (text) { text.text = val.getDisplayString(true); } if (image && val.dataType == FBDataType.Image) { string imageName = FBGameData.instance.pathToDatabaseResources + val.stringValue; imageName = imageName.Substring(0, imageName.LastIndexOf(".")); image.sprite = Resources.Load <Sprite>(imageName); } if (isModel3D) { // TODO: clean up and optimize // clean up transform.destroyChildren(); // since we are going to modify the model, we must clone a pooled object instead of directly using it GameObject poolObject = FBPoolManager.instance.getPoolObject(val.stringValue); model3D = GameObject.Instantiate <GameObject>(poolObject, transform); FBPoolManager.instance.returnObjectToPool(poolObject); model3D.transform.localPosition = Vector3.zero; //model3D.transform.localRotation = Quaternion.identity; //model3D.transform.localScale = Vector3.one; model3D.transform.localRotation = Quaternion.Euler(model3D.transform.localRotation.eulerAngles.x, model3D.transform.localRotation.eulerAngles.y - 90, model3D.transform.localRotation.eulerAngles.z); // cannot activate 3d model here // script components will run and mess up Invoke("activateModel3D", 0.1f); // model3D.SetActive(true); // only keep ui components string[] componentsToKeep = new string[] { "Transform", "MeshRenderer", "MeshFilter" }; Component[] components = model3D.GetComponentsInChildren <Component>(true); for (int i = 0; i < components.Length; i++) { string typeName = components[i].GetType().Name; bool remove = true; for (int j = 0; j < componentsToKeep.Length; j++) { if (typeName == componentsToKeep[j]) { remove = false; break; } } if (remove) { GameObject.Destroy(components[i] as UnityEngine.Object); } } model3DSize = 0; } return(true); }