You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
9.1 KiB
263 lines
9.1 KiB
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<string> iconnames;
|
|
private List<TMP_Sprite> sprites;
|
|
private List<Texture2D> 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<string>();
|
|
sprites = new List<TMP_Sprite>();
|
|
textures = new List<Texture2D>();
|
|
|
|
Debug.Log(deckFile.text);
|
|
|
|
deckFileLines = deckFile.text.Replace("\r","").Split('\n');
|
|
for (int i = 0;i<deckFileLines.Length;i++) {
|
|
var line = deckFileLines[i];
|
|
if(line.StartsWith("[") && line.EndsWith("]")) {
|
|
actualType = line.Substring(1, line.Length - 2);
|
|
Debug.Log(actualType);
|
|
switch (actualType) {
|
|
case "Settings":
|
|
i = ParseSettings(i + 1);
|
|
break;
|
|
case "Icon":
|
|
i = ParseIcon(i+1);
|
|
break;
|
|
case "Card":
|
|
card = Instantiate(cardPrefab, Vector3.zero, Quaternion.identity, deckUI.transform);
|
|
i = ParseCard(i+1);
|
|
card.transform.localScale = new Vector3(0.15f,0.15f,1f);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
var sheet = new Texture2D(8192,8192);
|
|
var rects = sheet.PackTextures(textures.ToArray(), 0, 8192, false);
|
|
int j = 0;
|
|
int x = 0;
|
|
int y = 0;
|
|
int maxX = sheet.width/spritesize;
|
|
List<TMP_SpriteCharacter> chars = new List<TMP_SpriteCharacter>();
|
|
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<TMP_Text>().spriteAsset = iconsheet;
|
|
cardPreview.GetComponentInChildren<TMP_Text>().spriteAsset.UpdateLookupTables();
|
|
for(j=0;j<iconsheet.spriteCharacterTable.Count;j++) {
|
|
iconsheet.spriteCharacterTable[j].glyphIndex = (uint)j;
|
|
}
|
|
cardPreview.GetComponentInChildren<TMP_Text>().spriteAsset.UpdateLookupTables();
|
|
foreach(Transform deckCard in deckUI.transform) {
|
|
deckCard.gameObject.GetComponentInChildren<TMP_Text>().spriteAsset = iconsheet;
|
|
deckCard.gameObject.GetComponentInChildren<TMP_Text>().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<RawImage>()[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<Text>()[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<Text>()[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<RawImage>()[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<TMP_Text>().text = text;
|
|
i--;
|
|
break;
|
|
case "bg":
|
|
bgimage = new Texture2D(2, 2);
|
|
bgpath = Application.streamingAssetsPath + "/" + statement[1];
|
|
bgimage.LoadImage(File.ReadAllBytes(bgpath));
|
|
card.GetComponentsInChildren<RawImage>()[0].texture = bgimage;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
card.GetComponentsInChildren<Text>()[1].text = (typemod == "" ? "" : typemod + " ") + basetype + " - " + type;
|
|
return i-1;
|
|
}
|
|
|
|
string ReplaceSprites(Match m) {
|
|
return "<sprite=" + iconnames.IndexOf(m.Groups[1].Value) + ">";
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|
|
|