private static void DecompileAllFallout4Scripts() { var folder = GetSolutionDir() + @"\Source\Test Scripts\Fallout 4\"; var allScripts = Directory.GetFiles(folder, "*.pex", SearchOption.AllDirectories); var clrNamespaceResolver = new NamespaceResolver(); var csharpConverter = new Papyrus2CSharpConverter(clrNamespaceResolver, new TypeReferenceResolver(clrNamespaceResolver, new TypeNameResolver(new PascalCaseNameResolver(new AdvancedConsoleUserInterface(), new PascalCaseNameResolverSettings(null))))); var index = 1; foreach (var s in allScripts) { Console.SetCursorPosition(0, 0); var asm = PapyrusAssemblyDefinition.ReadAssembly(s); var output = csharpConverter.Convert(new PapyrusAssemblyInput(asm)) as MultiCSharpOutput; var targetOutputFolder = "c:\\PapyrusDotNet\\Output\\Decompiled"; if (!Directory.Exists(targetOutputFolder)) { Directory.CreateDirectory(targetOutputFolder); } output?.Save(targetOutputFolder); Console.WriteLine("Decompiled: " + index + "/" + allScripts.Length); index++; } //var pexAssemblies = new PapyrusAssemblyDefinition[] //{ // PapyrusAssemblyDefinition.ReadAssembly(pexFile1), // PapyrusAssemblyDefinition.ReadAssembly(pexFile2), // PapyrusAssemblyDefinition.ReadAssembly(pexFile3) //}; }
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."); }