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); }
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."); }
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(); } } }