using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using UnityEngine; using static FIMSpace.Generating.TileMeshSetup; namespace FIMSpace.Generating { [System.Serializable] public partial class TileDesign { public string DesignName = "New Tile"; public List TileMeshes = new List(); public static TileDesign _CopyFrom = null; public static string CommandsInfo { get { return "Example:\n[0] set height 2;[0] set collapse 1\n[0] curve2 points 0,1 0,0 1,1\n[0] set U 2 (U is UV.x)\n[0] set V 2 (V is UV.y)\n[0] inst[0] enable;[0] inst[1] disable" + "\nOther commands\nLoft Only: [0] cornerIN {subdivs} {offset}, and cornerOUT. For example '[0] cornerOUT 2'\nor '[0] cornerIN 2 0.2' \n[0] fillIN and [0] fillOUT\npush {x y curve points push}\n" + "\nMain Setup Commands (without [NR]) : 'collider 0' 0 = box 5 = combined mesh collider\n" + "\nUse semicolons ';' for multiple commands."; } } public void ApplyCustomCommand(string designModifyCommand) { string[] commands = designModifyCommand.Split(';'); bool curve1Cleared = false; bool curve2Cleared = false; for (int i = 0; i < commands.Length; i++) { string[] arguments = commands[i].Split(' '); if (arguments.Length < 2) continue; // Arg 0 = [NR] if (arguments[0].Length < 3) continue; //if (arguments[0][0] != '[') continue; TileMeshSetup tile = null; #region Choose Tile int id = -1; if (arguments[0][2] == ']') { if (!int.TryParse(arguments[0][1].ToString(), out id)) continue; } else if (arguments[0][3] == ']') { if (!int.TryParse((arguments[0][1] + arguments[0][2]).ToString(), out id)) continue; } else if (arguments[0] == "collider") { if (arguments.Length > 1) { int arg1Value; if (int.TryParse(arguments[1], out arg1Value)) { if (arg1Value >= 0 && arg1Value <= 5) ColliderMode = (EColliderMode)arg1Value; } } continue; } else { continue; } if (!TileMeshes.ContainsIndex(id)) continue; tile = TileMeshes[id]; #endregion if (tile == null) { UnityEngine.Debug.Log("no tile!"); continue; } int a = 1; string arg = arguments[a]; if (arg == "set") // arg = arguments[a] { if (a + 1 >= arguments.Length) continue; // No args if (a + 2 >= arguments.Length) break; // No args string setWhat = arguments[a + 1]; string valStr = ""; for (int v = a + 2; v < arguments.Length; v++) valStr += arguments[v]; float val = -1f; if (!float.TryParse(valStr, NumberStyles.Any, CultureInfo.InvariantCulture, out val)) continue; if (setWhat == "height") { tile.height = val; } else if (setWhat == "width") { tile.width = val; } else if (setWhat == "depth") { tile.depth = val; } else if (setWhat == "collapse") { tile._loft_Collapse = val; } else if (setWhat == "U") { tile.UVMul = new Vector2(val, tile.UVMul.y); } else if (setWhat == "V") { tile.UVMul = new Vector2(tile.UVMul.x, val); } } else if (arg.StartsWith("inst")) // arg = arguments[a] { if (a + 1 >= arguments.Length) continue; // No args int len = "inst".Length; if (arg.Length < len + 3) continue; if (arg[len] != '[') continue; if (arg[len + 2] != ']') continue; int instID; if (int.TryParse(arg[len + 1].ToString(), out instID) == false) continue; if (tile.Instances.ContainsIndex(instID) == false) continue; var inst = tile.Instances[instID]; string action = arguments[a + 1]; if (action == "enable") inst.Enabled = true; else if (action == "disable") inst.Enabled = false; } else if (arg.StartsWith("curve")) // arg = arguments[a] { if (a + 1 >= arguments.Length) continue; // No args List curvePoints; if (arg == "curve2") { curvePoints = tile.GetCurve2(); if (curve2Cleared == false) { curvePoints.Clear(); curve2Cleared = true; } } else { curvePoints = tile.GetCurve1(); if (curve1Cleared == false) { curvePoints.Clear(); curve1Cleared = true; } } string nextA = arguments[a + 1]; if (nextA == "points") { for (int n = a + 2; n < arguments.Length; n += 1) { string numArg = arguments[n]; if (numArg.Contains(",") == false) continue; int indexOfComma = numArg.IndexOf(','); string x = numArg.Substring(0, indexOfComma); string y = numArg.Substring(indexOfComma + 1, numArg.Length - (indexOfComma + 1)); float xVal, yVal; if (!float.TryParse(x, NumberStyles.Any, CultureInfo.InvariantCulture, out xVal)) continue; if (!float.TryParse(y, NumberStyles.Any, CultureInfo.InvariantCulture, out yVal)) continue; curvePoints.Add(new CurvePoint(xVal, yVal, true)); } } } else if (arg == "push") // arg = arguments[a] { if (arguments.ContainsIndex(a + 1, true)) { var curvePoints = tile.GetCurve1(); float x = 0f; float.TryParse(arguments[a + 1], NumberStyles.Any, CultureInfo.InvariantCulture, out x); if (arguments.ContainsIndex(a + 2, true)) // Just X push { for (int c = 0; c < curvePoints.Count; c++) curvePoints[c].localPos += new Vector2(x, 0); } else // XY push { float y = 0f; float.TryParse(arguments[a + 2], NumberStyles.Any, CultureInfo.InvariantCulture, out y); for (int c = 0; c < curvePoints.Count; c++) curvePoints[c].localPos += new Vector2(x, y); } } } else if (arg == "cornerOUT") // arg = arguments[a] { float sp = 1f; // Seapration / spacing float subdivs = 1f; if (arguments.ContainsIndex(a + 1, true)) { float.TryParse(arguments[a + 1], NumberStyles.Any, CultureInfo.InvariantCulture, out subdivs); if (arguments.ContainsIndex(a + 2, true)) { float mul = 1f; float.TryParse(arguments[a + 2], NumberStyles.Any, CultureInfo.InvariantCulture, out mul); sp *= mul; if (sp == 0f) sp = 1f; } } Command_Curve_CornerOUTShape(sp, subdivs, tile.GetCurve2()); } else if (arg == "cornerIN") // arg = arguments[a] { float sp = 1f; // Seapration / spacing float subdivs = 1f; if (arguments.ContainsIndex(a + 1, true)) { float.TryParse(arguments[a + 1], NumberStyles.Any, CultureInfo.InvariantCulture, out subdivs); if (arguments.ContainsIndex(a + 2, true)) { float mul = 1f; float.TryParse(arguments[a + 2], NumberStyles.Any, CultureInfo.InvariantCulture, out mul); sp *= mul; if (sp == 0f) sp = 1f; } } Command_Curve_CornerOUTShape(sp, subdivs, tile.GetCurve2()); tile.GetCurve2().Reverse(); //var curvePoints = tile.GetCurve2(); //curvePoints.Clear(); //curvePoints.Add(new CurvePoint(new Vector2(sp, 0f), true)); //curvePoints.Add(new CurvePoint(new Vector2(0f, 0f), true)); //curvePoints.Add(new CurvePoint(new Vector2(0f, sp), true)); //if (subdivs >= 2f) //{ // if (subdivs >= 3f) // { // curvePoints.Add(new CurvePoint(new Vector2(0f, axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(0f, 0.2f * axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(0.05f * axisMul.y, 0.1f * axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(0.1f * axisMul.y, 0.05f * axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(0.1f * axisMul.y, 0.05f * axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(0.2f * axisMul.y, 0f), true)); // curvePoints.Add(new CurvePoint(new Vector2(axisMul.x, 0f), true)); // } // else // { // curvePoints.Add(new CurvePoint(new Vector2(0f, axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(0f, 0.125f * axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(0.05f * axisMul.y, 0.05f * axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(0.125f * axisMul.y, 0f), true)); // curvePoints.Add(new CurvePoint(new Vector2(axisMul.x, 0f), true)); // } //} //else //{ // if (subdivs < 0f) // { // float mul = Mathf.Abs(subdivs); // curvePoints.Add(new CurvePoint(new Vector2(0f, axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(0f, mul * axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(mul * axisMul.y, 0f), true)); // curvePoints.Add(new CurvePoint(new Vector2(axisMul.x, 0f), true)); // } // else // { // curvePoints.Add(new CurvePoint(new Vector2(1f, axisMul.y), true)); // curvePoints.Add(new CurvePoint(new Vector2(1f, 1f), true)); // curvePoints.Add(new CurvePoint(new Vector2(axisMul.x, 1f), true)); // } //} } else if (arg == "fillIN") { //[0] cornerIN 2 0.2 tile._loft_Collapse = 1f; var curvef = tile.GetCurve2(); curvef.Clear(); curvef.Add(new CurvePoint(0, 0, true)); curvef.Add(new CurvePoint(0, 1, true)); curvef.Add(new CurvePoint(1, 1, true)); } else if (arg == "fillOUT") { tile._loft_Collapse = 1f; var curvef = tile.GetCurve2(); curvef.Clear(); curvef.Add(new CurvePoint(1, 1, true)); curvef.Add(new CurvePoint(0, 1, true)); curvef.Add(new CurvePoint(0, 0, true)); //[0] set collapse 1; [0] curve2 points 1,1 0,1 0,0 } } } void Command_Curve_CornerOUTShape(float spacing, float subdivs, List curvePoints) { float sp = spacing; // Seapration / spacing curvePoints.Clear(); if (subdivs >= 2f) { if (subdivs >= 3f) { curvePoints.Add(new CurvePoint(new Vector2(0f, sp), true)); curvePoints.Add(new CurvePoint(new Vector2(0f, 0.2f * sp), true)); curvePoints.Add(new CurvePoint(new Vector2(0.05f * sp, 0.1f * sp), true)); curvePoints.Add(new CurvePoint(new Vector2(0.1f * sp, 0.05f * sp), true)); curvePoints.Add(new CurvePoint(new Vector2(0.1f * sp, 0.05f * sp), true)); curvePoints.Add(new CurvePoint(new Vector2(0.2f * sp, 0f), true)); curvePoints.Add(new CurvePoint(new Vector2(sp, 0f), true)); } else { curvePoints.Add(new CurvePoint(new Vector2(0f, sp), true)); curvePoints.Add(new CurvePoint(new Vector2(0f, 0.125f * sp), true)); curvePoints.Add(new CurvePoint(new Vector2(0.05f * sp, 0.05f * sp), true)); curvePoints.Add(new CurvePoint(new Vector2(0.125f * sp, 0f), true)); curvePoints.Add(new CurvePoint(new Vector2(sp, 0f), true)); } } else { if (subdivs < 0f) { float mul = Mathf.Abs(subdivs); curvePoints.Add(new CurvePoint(new Vector2(0f, sp), true)); curvePoints.Add(new CurvePoint(new Vector2(0f, mul * sp), true)); curvePoints.Add(new CurvePoint(new Vector2(mul * sp, 0f), true)); curvePoints.Add(new CurvePoint(new Vector2(sp, 0f), true)); } else { curvePoints.Add(new CurvePoint(new Vector2(0f, sp), true)); curvePoints.Add(new CurvePoint(new Vector2(0f, 0f), true)); curvePoints.Add(new CurvePoint(new Vector2(sp, 0f), true)); } } } public void PasteEverythingFrom(TileDesign from) { DesignName = from.DesignName; DefaultMaterial = from.DefaultMaterial; TileMeshes.Clear(); for (int t = 0; t < from.TileMeshes.Count; t++) { TileMeshSetup meshSet = new TileMeshSetup(from.TileMeshes[t].Name); from.TileMeshes[t].PasteAllSetupTo(meshSet, true); TileMeshes.Add(meshSet); } PostFilters = new List(); for (int p = 0; p < from.PostFilters.Count; p++) { PostFilters.Add(from.PostFilters[p].Copy()); } PasteColliderParameters(from, this); PasteGameObjectParameters(from, this); } } }