protected abstract CecilAssemblyOutput ConvertAssembly(PapyrusAssemblyInput input);
        protected override ClrAssemblyOutput ConvertAssembly(PapyrusAssemblyInput input)
        {
            var exeAsm       = Assembly.GetExecutingAssembly();
            var assemblyName = NamespaceResolver.Resolve("Core");

            assembly = Thread.GetDomain().DefineDynamicAssembly(
                new AssemblyName(assemblyName),
                AssemblyBuilderAccess.RunAndSave, outputDirectory);

            mainModule = assembly.DefineDynamicModule(assemblyName, assemblyName + ".dll");

            var i = 1;
            var x = Console.CursorLeft;
            var y = Console.CursorTop;

            foreach (var inputAssembly in input.Assemblies)
            {
                Console.SetCursorPosition(x, y);
                Console.WriteLine("Adding assembly references... " + i++ + "/" + input.Assemblies.Length);
                PrepareTypes(inputAssembly);
            }

            foreach (var inputAssembly in input.Assemblies)
            {
                foreach (var ptype in inputAssembly.Types)
                {
                    foreach (var type in DefinedTypes)
                    {
                        var targetBaseType =
                            ReferenceTypes.FirstOrDefault(t => t.Name.ToLower() == ptype.BaseTypeName.Value.ToLower());

                        if (targetBaseType != null)
                        {
                            type.SetParent(targetBaseType);
                        }
                    }
                }
            }


            i = 1;
            Console.SetCursorPosition(0, y + 1);
            foreach (var papyrusAssembly in input.Assemblies)
            {
                foreach (var type in papyrusAssembly.Types)
                {
                    Console.SetCursorPosition(0, y + 1);
                    Console.WriteLine("Building Classes... " + i++ + "/" + input.Assemblies.Length);
                    var definedType = DefinedTypes.FirstOrDefault(n => n.Name == type.Name.Value);
                    if (definedType == null)
                    {
                        definedType = mainModule.DefineType(type.Name.Value,
                                                            TypeAttributes.Public);
                    }
                    BuildType(definedType, type);
                }
            }

            foreach (var t in DefinedTypes)
            {
                t.CreateType();
            }

            //exeAsm.FindTypes("attribute")
            //    .ForEach(attr => ImportType(mainModule, attr));

            Console.WriteLine("Process Completed.");

            return(new ClrAssemblyOutput(assembly));
        }
        protected override CecilAssemblyOutput ConvertAssembly(PapyrusAssemblyInput input)
        {
            var exeAsm = Assembly.GetExecutingAssembly();
            var name   = "Core";

            clrAssembly = AssemblyDefinition.CreateAssembly(
                new AssemblyNameDefinition(NamespaceResolver.Resolve(name),
                                           new Version(2, 0)), NamespaceResolver.Resolve(name), ModuleKind.Dll);

            mainModule = clrAssembly.MainModule;
            objectType = mainModule.Import(typeof(object));

            int i = 1, ij = 0;

            userInterface.DrawInterface("(2/3) Adding assembly references.");
            foreach (var inputAssembly in input.Assemblies)
            {
                var redrawProgress = ij >= 100 || i == input.Assemblies.Length || input.Assemblies.Length < 500;
                if (redrawProgress)
                {
                    //Console.SetCursorPosition(x, y);
                    //Console.WriteLine("Adding assembly references... " + i + "/" + input.Assemblies.Length);

                    userInterface.DrawProgressBarWithInfo(i, input.Assemblies.Length);
                    ij = 0;
                }
                ij++;
                i++;
                AddAssemblyReferences(inputAssembly);
            }
            i  = 1;
            ij = 0;

            //Console.SetCursorPosition(0, y + 1);
            userInterface.DrawInterface("(3/3) Creating CLR types.");

            foreach (var papyrusAssembly in input.Assemblies)
            {
                foreach (var type in papyrusAssembly.Types)
                {
                    var redrawProgress = ij >= 100 || i == input.Assemblies.Length || input.Assemblies.Length < 500;
                    if (redrawProgress)
                    {
                        //Console.SetCursorPosition(0, y + 1);
                        //Console.WriteLine("Building Classes... " + i + "/" + input.Assemblies.Length);
                        userInterface.DrawProgressBarWithInfo(i, input.Assemblies.Length);
                        ij = 0;
                    }
                    ij++;
                    i++;
                    AddTypeDefinition(null, type.Name, type, false);
                }
            }

            exeAsm.FindTypes("attribute")
            .ForEach(attr => ImportType(mainModule, attr));

            userInterface.DrawResult("Building Core Library Completed.");


            return(new CecilAssemblyOutput(clrAssembly));
        }
Example #4
0
 protected abstract MultiCSharpOutput ConvertAssembly(PapyrusAssemblyInput input);
Example #5
0
        public int Run()
        {
            IAssemblyConverter converter;
            IAssemblyInput     inputData;

            if (args.Length < 2)
            {
                // ui.WriteLine("  Missing Important Arguments.");
                ui.DrawHelp();
                return(128);
            }

            ui.Clear();
            ui.DrawInterface("Magic is about to happen!");

            var clr2Papyrus = !Enumerable.Contains(args, "-clr");
            var input       = args[0];

            if (args.Contains("-i"))
            {
                input = args[Array.IndexOf(args, "-i") + 1];
            }
            var output = args[1];

            if (args.Contains("-o"))
            {
                output = args[Array.IndexOf(args, "-o") + 1];
            }
            var autoClose = args.Contains("x") || args.Contains("X") || args.Contains("-x") || args.Contains("-X");

            if (clr2Papyrus)
            {
                var targetVersion = Enumerable.Contains(args, "-skyrim")
                    ? PapyrusVersionTargets.Skyrim
                    : PapyrusVersionTargets.Fallout4;

                var compilerOptions = !Enumerable.Contains(args, "-easy")
                    ? PapyrusCompilerOptions.Strict
                    : PapyrusCompilerOptions.Easy;
                var readerParameters = new ReaderParameters {
                    ReadSymbols = true
                };

                converter = new Clr2PapyrusConverter(ui, instructorProcessor, compilerOptions);

                var assemblyDefinition = AssemblyDefinition.ReadAssembly(input, readerParameters);

                assemblyDefinition.MainModule.ReadSymbols();

                inputData = new ClrAssemblyInput(assemblyDefinition, targetVersion);
            }
            else
            {
                var nsResolver = new NamespaceResolver();
                //var camelCaseResolver = new PascalCaseNameResolver(ui, "wordlist-fo4.txt");
                // Papyrus2ClrCecilConverter
                converter = new Papyrus2ClrCecilConverter(
                    ui, nameResolver, nsResolver,
                    new TypeReferenceResolver(nsResolver, new TypeNameResolver(nameResolver)));

                var pexFiles = Directory.GetFiles(input, "*.pex", SearchOption.AllDirectories);

                ui.DrawInterface("(1/3) Reading Papyrus Assemblies.");

                var papyrusAssemblyDefinitions = pexFiles.Select(f => ReadPapyrusAssembly(f, pexFiles.Length)).ToArray();

                inputData = new PapyrusAssemblyInput(
                    papyrusAssemblyDefinitions
                    );
            }

            var outputData = converter.Convert(inputData);

            if (outputData != null)
            {
                outputData.Save(output);

                // Do something...
            }

            if (autoClose)
            {
                return(0);
            }

            while (true)
            {
                var openTargetDir = new Hotkeys("Open target directory", ConsoleKey.A, () => { Process.Start(output); });

                var exit = new Hotkeys("Exit", ConsoleKey.X, () => { });

                ui.DrawHotkeys(openTargetDir, exit);

                var posx = Console.CursorLeft;

                var k = Console.ReadKey();

                Console.CursorLeft = posx;
                Console.Write(" ");

                if (k.Key == exit.Key)
                {
                    return(0);
                }

                if (k.Key == openTargetDir.Key)
                {
                    openTargetDir.Action();
                }
            }
        }
Example #6
0
 protected override MultiCSharpOutput ConvertAssembly(PapyrusAssemblyInput input)
 {
     return(new MultiCSharpOutput(input.Assemblies.Select(CreateCSharpDump).ToList()));
 }