Esempio n. 1
0
        public static void Main(string[] args)
        {
            FmbUtil.IsTEST = true;

            if (args.Length < 1)
            {
                Console.WriteLine("FmbLib requires at least one parameter: the path to the xnb.");
                Console.WriteLine("Example: FmbLib.exe level.xnb");
                Console.WriteLine("Alternatively, run with --preparse / -pp + path as parameters");
                Console.WriteLine("to generate the .cs sources for the TypeHandlerBase .txts.");
                Console.WriteLine("Using default testing args instead.");
                args = new string[] {
                    //"../../../cmycave.xnb"
                    //"../../../gateao.xnb"
                    //"../../../fox.xnb"
                    //"../../../waterfront.xnb"
                    "../../../gametext.xnb" // FIXME: Reading back. The dictionary generic types went missing?
                    //-pp", "../../../PreParsedBases/" + (FmbUtil.IsUNITY ? "UNITY" : "XNAFEZ")
                };
            }

            if (args.Length == 2 && (args[0] == "-pp" || args[0] == "--preparse"))
            {
                Console.WriteLine("Pre-parsing all TypeHandlerBases...");

                Directory.CreateDirectory(args[1]);

                Assembly assembly = typeof(FmbUtil).Assembly;
                string[] manifestResourceNames = assembly.GetManifestResourceNames();

                for (int i = 0; i < manifestResourceNames.Length; i++)
                {
                    if (!(
                            manifestResourceNames[i].EndsWith("Reader.txt") ||
                            manifestResourceNames[i].EndsWith("Handler.txt")
                            ))
                    {
                        continue;
                    }

                    string path = manifestResourceNames[i];
                    if (path.EndsWith("Reader.txt"))
                    {
                        path = path.Substring(0, path.Length - 10);
                    }
                    else if (path.EndsWith("Handler.txt"))
                    {
                        path = path.Substring(0, path.Length - 11);
                    }

                    string[] split = path.Split('.');

                    string source;
                    using (Stream s = assembly.GetManifestResourceStream(manifestResourceNames[i])) {
                        if (s == null)
                        {
                            Console.WriteLine(manifestResourceNames[i] + " cannot be loaded.");
                            continue;
                        }
                        using (StreamReader sr = new StreamReader(s)) {
                            source = FmbUtil.GenerateHandlerSource(sr, split[split.Length - 1], null, split[split.Length - 1] + "Handler", "FmbLib.TypeHandlers." + split[split.Length - 2]);
                        }
                    }

                    Console.Write(source);

                    string pathExternal = Path.Combine(args[1], split[split.Length - 1] + "Handler.cs");
                    if (File.Exists(pathExternal))
                    {
                        File.Delete(pathExternal);
                    }
                    using (Stream s = File.OpenWrite(pathExternal)) {
                        using (StreamWriter sw = new StreamWriter(s)) {
                            sw.Write(source);
                        }
                    }
                }

                return;
            }

            for (int i = 0; i < args.Length; i++)
            {
                Console.WriteLine("asset " + i + ": " + args[i]);

                Console.WriteLine("reading xnb");
                object obj = FmbUtil.ReadObject(args[i]);
                Print(obj);

                Console.WriteLine("writing fmb");
                string fmbPath = args[i].Substring(0, args[i].Length - 3) + "fmb";
                if (File.Exists(fmbPath))
                {
                    File.Delete(fmbPath);
                }
                FmbUtil.WriteObject(fmbPath, obj);

                Console.WriteLine("reading fmb");
                obj = FmbUtil.ReadObject(fmbPath);
                Print(obj);
            }
        }