예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
            }
        }
예제 #4
0
 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);
 }