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

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;
}
}