using System.Collections; using System.IO; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System.Text.RegularExpressions; using TMPro; using UnityEngine.U2D; public class DeckGenerator : MonoBehaviour { public GameObject cardPreview; public GameObject deckUI; public GameObject cardPrefab; public string deckFileName; private GameObject card; private string[] deckFileLines; private TMP_SpriteAsset iconsheet; private List iconnames; private List sprites; private List textures; private int spritesize = 0; private string defaultbg; // Start is called before the first frame update void Start() { if(deckUI && cardPrefab && deckFileName != "") { string path = Application.streamingAssetsPath + "/" + deckFileName; var deckFile = new TextAsset(File.ReadAllText(path)); var actualType = ""; iconnames = new List(); sprites = new List(); textures = new List(); Debug.Log(deckFile.text); deckFileLines = deckFile.text.Replace("\r","").Split('\n'); for (int i = 0;i chars = new List(); foreach(Rect r in rects) { Vector2 pivot = new Vector2(spritesize/2f, spritesize/2f); sprites[j].sprite = Sprite.Create(sheet, r, pivot); sprites[j].name = iconnames[j]; sprites[j].x = sheet.width * r.x; sprites[j].y = sheet.height * r.y; sprites[j].width = spritesize; sprites[j].height = spritesize; sprites[j].yOffset = spritesize; sprites[j].xAdvance = spritesize; sprites[j].scale = 1; var character = new TMP_SpriteCharacter(); character.glyphIndex = (uint)j; chars.Add(character); x++; if(x >= maxX) { y++; x=0; } j++; } iconsheet.spriteSheet = sheet; iconsheet.spriteInfoList = sprites; //iconsheet.spriteCharacterTable = chars; if(iconsheet.material == null) { Material mat = new Material(Shader.Find("TextMeshPro/Sprite")); mat.mainTexture = sheet; iconsheet.material = mat; }else{ iconsheet.material.mainTexture = sheet; } cardPreview.GetComponentInChildren().spriteAsset = iconsheet; cardPreview.GetComponentInChildren().spriteAsset.UpdateLookupTables(); for(j=0;j().spriteAsset.UpdateLookupTables(); foreach(Transform deckCard in deckUI.transform) { deckCard.gameObject.GetComponentInChildren().spriteAsset = iconsheet; deckCard.gameObject.GetComponentInChildren().spriteAsset.UpdateLookupTables(); } } } int ParseIcon(int i) { TMP_Sprite spr = new TMP_Sprite(); string name = ""; if(iconsheet == null) { iconsheet = new TMP_SpriteAsset(); } for (; i < deckFileLines.Length; i++) { if (deckFileLines[i].Trim() == "") break; if (deckFileLines[i].StartsWith("//")) continue; var statement = deckFileLines[i].Split(':'); statement[1] = statement[1].Trim(); switch(statement[0]) { case "name": name = statement[1]; break; case "icon": Texture2D icon = new Texture2D(2, 2); string path = Application.streamingAssetsPath + "/" + statement[1]; icon.LoadImage(File.ReadAllBytes(path)); //icon.alphaIsTransparency = true; Vector2 pivot = new Vector2(spritesize/2f, spritesize/2f); spr.sprite = Sprite.Create(icon, new Rect(0, 0, spritesize, spritesize), pivot); spr.pivot = pivot; sprites.Add(spr); textures.Add(icon); iconnames.Add(name); break; } } return i; } int ParseSettings(int i) { int size = 0; for (; i < deckFileLines.Length; i++) { if (deckFileLines[i] == "") break; if (deckFileLines[i].StartsWith("//")) continue; var statement = deckFileLines[i].Split(':'); statement[1] = statement[1].Trim(); switch (statement[0]) { case "iconsize": size = int.Parse(statement[1]); spritesize = size; break; case "basecard": defaultbg = statement[1]; break; } } return i-1; } int ParseCard(int i) { var basetype = ""; var typemod = ""; var type = ""; Texture2D bgimage = new Texture2D(2, 2); string bgpath = Application.streamingAssetsPath + "/" + defaultbg; bgimage.LoadImage(File.ReadAllBytes(bgpath)); card.GetComponentsInChildren()[0].texture = bgimage; for (; i < deckFileLines.Length; i++) { if (deckFileLines[i] == "") break; if (deckFileLines[i].StartsWith("//")) continue; var statement = deckFileLines[i].Split(':'); statement[1] = statement[1].Trim(); switch (statement[0]) { case "name": card.GetComponentsInChildren()[0].text = statement[1]; break; case "basetype": basetype = statement[1]; break; case "typemod": typemod = statement[1] == "None" ? "" : statement[1]; break; case "typename": type = statement[1]; break; case "description": var descText = ""; if(statement[1] == ""){ i++; while(deckFileLines[i].StartsWith("\t") || deckFileLines[i].StartsWith("//\t")) { if(deckFileLines[i].StartsWith("//\t")) { i++; continue; } descText += deckFileLines[i].Substring(1)+"\n"; i++; } i--; } else{ descText = statement[1]; } card.GetComponentsInChildren()[2].text = descText; break; case "image": Texture2D image = new Texture2D(2, 2); string path = Application.streamingAssetsPath + "/" + statement[1]; image.LoadImage(File.ReadAllBytes(path)); card.GetComponentsInChildren()[1].texture = image; break; case "action": var multilinetext = ""; i++; while(deckFileLines[i].StartsWith("\t") || deckFileLines[i].StartsWith("//\t")) { if(deckFileLines[i].StartsWith("//\t")) { i++; continue; } multilinetext += deckFileLines[i].Substring(1)+"\n"; i++; } var text = Regex.Replace(multilinetext, "\\{(.+?)\\}", new MatchEvaluator(ReplaceSprites)); card.GetComponentInChildren().text = text; i--; break; case "bg": bgimage = new Texture2D(2, 2); bgpath = Application.streamingAssetsPath + "/" + statement[1]; bgimage.LoadImage(File.ReadAllBytes(bgpath)); card.GetComponentsInChildren()[0].texture = bgimage; break; default: break; } } card.GetComponentsInChildren()[1].text = (typemod == "" ? "" : typemod + " ") + basetype + " - " + type; return i-1; } string ReplaceSprites(Match m) { return ""; } int ParseDeck(int i) { int size = 0; for (; i < deckFileLines.Length; i++) { if (deckFileLines[i] == "") break; if (deckFileLines[i].StartsWith("//")) continue; var statement = deckFileLines[i].Split(':'); statement[1] = statement[1].Trim(); switch (statement[0]) { case "iconsize": size = int.Parse(statement[1]); spritesize = size; break; } } return i-1; } }