Esempio n. 1
0
        public void Clr2PapyrusConverter_Convert()
        {
            var papyrusCompiler = new Clr2PapyrusConverter(new NoopUserInterface(), new ClrInstructionProcessor(
                                                               new LoadProcessor(),
                                                               new StoreProcessor(new PapyrusValueTypeConverter()),
                                                               new BranchProcessor(),
                                                               new CallProcessor(new PapyrusValueTypeConverter()),
                                                               new ConditionalProcessor(),
                                                               new ReturnProcessor(new PapyrusValueTypeConverter()),
                                                               new StringConcatProcessor()
                                                               ),
                                                           PapyrusCompilerOptions.Strict);
            var value = papyrusCompiler.Convert(new ClrAssemblyInput(
                                                    AssemblyDefinition.ReadAssembly(
                                                        @"D:\Git\PapyrusDotNet\Examples\Fallout4Example\bin\Debug\Fallout4Example.dll"),
                                                    PapyrusVersionTargets.Fallout4));

            var papyrusOutput = value as PapyrusAssemblyOutput;

            Assert.IsNotNull(papyrusOutput);
            var assemblies = papyrusOutput.Assemblies;

            Assert.IsNotNull(assemblies);
            Assert.IsTrue(assemblies.Length > 0);
        }
Esempio n. 2
0
        private static void ReadAndWritePex()
        {
            var drive        = "d";
            var dir          = @":\Git\PapyrusDotNet\Examples\Fallout4Example\bin\Debug\";
            var targetFolder = drive + dir;

            if (!Directory.Exists(targetFolder))
            {
                targetFolder = "c" + dir;
            }

            //            var provider = new Mono.Cecil.Pdb.PdbReaderProvider();

            //            provider.GetSymbolReader()

            //            PdbFactory factory = new PdbFactory();
            //            ISymbolReader reader =
            //factory.CreateReader(assdef.MainModule, ass_file);

            var readerParameters = new ReaderParameters {
                ReadSymbols = true
            };

            var converter = new Clr2PapyrusConverter(new NoopUserInterface(), new ClrInstructionProcessor(
                                                         new LoadProcessor(),
                                                         new StoreProcessor(new PapyrusValueTypeConverter()),
                                                         new BranchProcessor(),
                                                         new CallProcessor(new PapyrusValueTypeConverter()),
                                                         new ConditionalProcessor(),
                                                         new ReturnProcessor(new PapyrusValueTypeConverter()),
                                                         new StringConcatProcessor()
                                                         ),
                                                     PapyrusCompilerOptions.Strict);
            var assemblyDefinition = AssemblyDefinition.ReadAssembly(
                targetFolder + "fallout4example.dll", readerParameters);

            try
            {
                assemblyDefinition.MainModule.ReadSymbols();
            }
            catch
            {
            }

            var value = converter.Convert(
                new ClrAssemblyInput(
                    assemblyDefinition,
                    PapyrusVersionTargets.Fallout4)) as PapyrusAssemblyOutput;

#if false
            var folder   = @"d:\git\PapyrusDotNet\Source\Test Scripts\Fallout 4\";
            var pexFile1 = folder + @"AssaultronHeadModStealthScript.pex";
            var pexFile2 = folder + @"BobbleheadStandContainerScript.pex";
            var pexFile3 = folder + @"DN035QuestScript.pex";

            var pexAssemblies = new PapyrusAssemblyDefinition[]
            {
                PapyrusAssemblyDefinition.ReadAssembly(pexFile1),
                PapyrusAssemblyDefinition.ReadAssembly(pexFile2),
                PapyrusAssemblyDefinition.ReadAssembly(pexFile3)
            };
#else
            var pexAssemblies = new PapyrusAssemblyDefinition[0];
#endif
            var asm = value.Assemblies;

            var defs = new List <PapyrusAssemblyDefinition>(pexAssemblies);


            var targetOutputFolder = "c:\\PapyrusDotNet\\Output";
            if (!Directory.Exists(targetOutputFolder))
            {
                Directory.CreateDirectory(targetOutputFolder);
            }

            value.Save(targetOutputFolder);

            var scripts = Directory.GetFiles(targetOutputFolder, "*.pex").Select(PapyrusAssemblyDefinition.ReadAssembly);

            defs.AddRange(scripts);

            //defs.AddRange(asm);

            var clrNamespaceResolver = new NamespaceResolver();
            var csharpConverter      = new Papyrus2CSharpConverter(clrNamespaceResolver,
                                                                   new TypeReferenceResolver(clrNamespaceResolver,
                                                                                             new TypeNameResolver(new PascalCaseNameResolver(new AdvancedConsoleUserInterface(), new PascalCaseNameResolverSettings(null)))));

            var output = csharpConverter.Convert(new PapyrusAssemblyInput(defs.ToArray())) as MultiCSharpOutput;

            output.Save(targetOutputFolder);


            //var sourceScript = "D:\\Spel\\Fallout 4 Scripts\\scripts\\Actor.pex";
            //var destinationScript = "D:\\Spel\\Fallout 4 Scripts\\scripts\\Actor.pex_new";

            //var src = PapyrusAssemblyDefinition.ReadAssembly(sourceScript);
            //Assert.IsNotNull(src);
            //Assert.IsNotNull(src.Header.SourceHeader.Source);

            //src.Write(destinationScript);

            //var dest = PapyrusAssemblyDefinition.ReadAssembly(destinationScript);
            //Assert.IsNotNull(src);
            //Assert.IsNotNull(dest.Header.SourceHeader.Source);

            //Assert.AreEqual(src.Header.SourceHeader.Source, dest.Header.SourceHeader.Source);


            //   TestManySkyrimPapyrus();

            //var startTime = DateTime.Now;
            //var fallout4ScriptFolder = @"D:\Spel\Fallout 4 Scripts\scripts\";
            //var fallout4Script = "D:\\Spel\\Fallout 4 Scripts\\scripts\\Actor.pex";
            //var skyrimScript = @"C:\CreationKit\Data\scripts\activemagiceffect.pex";

            ////var assembly = PapyrusAssemblyDefinition.LoadAssembly(skyrimScript, true);

            //var allScriptFiles = Directory.GetFiles(fallout4ScriptFolder, "*.pex", SearchOption.AllDirectories);

            //var assemblies = allScriptFiles.Select(PapyrusAssemblyDefinition.LoadAssembly);

            //var namespaceResolver = new ClrNamespaceResolver();
            //var converter = new PapyrusToClrConverter(namespaceResolver,
            //    new ClrTypeReferenceResolver(namespaceResolver, new ClrTypeNameResolver()));
            //var output = converter.Convert(new PapyrusAssemblyInput(assemblies.ToArray()));
            //var clr = output as ClrAssemblyOutput;
            //clr.OutputAssembly.Write(
            //    @"D:\Git\PapyrusDotNet\Source\PapyrusDotNet.ConsoleTests\bin\Debug\PapyrusDotNet.Core.dll");
            //Console.WriteLine("Build Time: " + (DateTime.Now - startTime).TotalSeconds + " seconds.");
        }
Esempio n. 3
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();
                }
            }
        }