private CardArtDefs CreateSampleDefs() { var root = new CardArtDefs(); root.Patch = "1.0.0.0"; root.Cards = new List <ArtCard>(); var card1 = new ArtCard(); card1.Id = "AC_123"; card1.Texture = new Texture() { Name = "WOW_1223", Path = "/tex/fp1_01/de2", Bundle = "shared0" }; card1.Materials = new List <Material>(); var mat1 = new Material(); mat1.Type = MaterialType.Portrait; mat1.Transforms = new List <Transform>() { new Transform() { Type = TransformType.Standard, Offset = new CoordinateTransform(0.0f), Scale = new CoordinateTransform(1.0f) }, new Transform() { Type = TransformType.Shader, Offset = new CoordinateTransform(0.0f), Scale = new CoordinateTransform(1.0f) } }; card1.Materials.Add(mat1); var mat2 = new Material(); mat2.Type = MaterialType.CardBar; mat2.Transforms = new List <Transform>() { new Transform() { Type = TransformType.Standard, Offset = new CoordinateTransform(0.0f), Scale = new CoordinateTransform(1.0f) }, new Transform() { Type = TransformType.Shader, Offset = new CoordinateTransform(-0.3f, 1.2f), Scale = new CoordinateTransform(1.2f) } }; card1.Materials.Add(mat2); root.Cards.Add(card1); return(root); }
private static CardArtDefs LoadCardDefs(string hsDir) { // Load card art data (cards<n>.unity3d) var cardsFiles = new List <string>(Directory.GetFiles(_hsDataPath, "cards?.unity3d")); var artCards = new CardsBundle(cardsFiles); // create CardArtDb defs var defs = new CardArtDefs(); defs.Patch = GetPatchVersion(hsDir).ToString(); defs.Cards = artCards.Cards; return(defs); }
public static void Extract(CardArtExtractorOptions opts) { ValidateDirectories(opts.OutputDir, opts.HearthstoneDir); // Init set and type filters List <CardSet> includeSets = CardEnumConverter.SetIds(opts.Sets); List <CardType> includeTypes = CardEnumConverter.TypeIds(opts.Types); // Load card data from hearthstonejson LoadCardData(GetPatchVersion(opts.HearthstoneDir)); // If a map file was supplied, use that instead of parsing cards files CardArtDefs defs = null; if (File.Exists(opts.MapFile)) { Logger.Log(LogLevel.INFO, "using map file: {0}", opts.MapFile); CardArtDb.Read(opts.MapFile); var loadedPatch = CardArtDb.GamePatch; var currentPatch = GetPatchVersion(opts.HearthstoneDir).ToString(); if (loadedPatch != currentPatch) { Console.WriteLine("Map file patch mismatch, attempting merge: {0} != {1}", loadedPatch, currentPatch); var current = LoadCardDefs(opts.HearthstoneDir); var loaded = CardArtDb.Defs; foreach (var item in current.Cards) { // replace any missing coords, from map defs if possible if (!item.HasBarCoords() && CardArtDb.All.ContainsKey(item.Id)) { var bar = CardArtDb.All[item.Id].GetMaterial(MaterialType.CardBar); if (bar != null) { item.AddMaterial( bar.GetTransform(TransformType.Standard), bar.GetTransform(TransformType.Shader), MaterialType.CardBar); } } } defs = current; } else { defs = CardArtDb.Defs; } } else { // map file not found, using default method Logger.Log(LogLevel.WARN, "map file not found: {0}", opts.MapFile); defs = LoadCardDefs(opts.HearthstoneDir); } // Create the list of cards we want to output List <ArtCard> filteredCards = null; if (opts.NoFiltering) { // don't use default filter, or option filters, just return all filteredCards = defs.Cards.Where(x => CardDb.All.ContainsKey(x.Id)).ToList(); } else if (includeSets.Count > 0 || includeTypes.Count > 0) { // filter db list using options var filteredDb = CardDb.FilterBy(includeSets, includeTypes); // filter art card defs by only including those in filteredDb filteredCards = defs.Cards.Where(x => filteredDb.ContainsKey(x.Id)).ToList(); } else { // filter art card defs by only including those that are in the default filtered db filteredCards = defs.Cards.Where(x => CardDb.Filtered.ContainsKey(x.Id)).ToList(); } Logger.Log("Filtered art cards: " + filteredCards.Count); // get all textures (cardtextures<n>.unity3d) var textureFiles = new List <string>(Directory.GetFiles(_hsDataPath, "cardtextures?.unity3d")); // First pass over texture bundles, collect texture path data var textureRefs = LoadTextureInfo(textureFiles); // Add shared bundles to texture list (shared<n>.unity3d) textureFiles.AddRange(Directory.GetFiles(_hsDataPath, "shared?.unity3d")); // Extract all the texture files using the refs and required cards var tb = new TexturesBundle(textureFiles, opts); var bundleMap = tb.Extract(textureRefs, filteredCards); // Update the cardartdb with found bundle names, and save if (opts.SaveMapFile) { UpdateAndSaveCardArtDefs(bundleMap, defs, opts.OutputDir); } }
private static void UpdateAndSaveCardArtDefs(Dictionary <string, string> map, CardArtDefs defs, string dir) { // bundleMap will only contain cards matching previous filtering foreach (var d in defs.Cards) { // to get entries for all cards, need to use NoFilter option if (map.ContainsKey(d.Id)) { d.Texture.Bundle = StringUtils.GetFilenameNoExt(map[d.Id]); } } // TODO what about json // save to disk CardArt.CardArtDb.Write(Path.Combine(dir, "CardArtDefs.xml"), defs); }