public void TestFallout4Papyrus() { var falloutScript = "D:\\Spel\\Fallout 4 Scripts\\scripts\\Actor.pex"; var assembly = PapyrusAssemblyDefinition.ReadAssembly(falloutScript); Assert.IsNotNull(assembly.Header.SourceHeader.Source); }
public static void Decompile_FollowersScript() { var asm = PapyrusAssemblyDefinition.ReadAssembly( GetSolutionDir() + @"\Source\Test Scripts\Bad\test.pex"); var decompiler = new PapyrusDecompiler(asm); var ctx = decompiler.CreateContext(); var methods = asm.Types.First() .States.SelectMany(s => s.Methods) .Where(m => m.Body.Instructions.Count > 2) .OrderBy(m => m.Body.Instructions.Count); foreach (var method in methods) { var result = decompiler.Decompile(ctx, method); if (result.DecompiledSourceCode.Contains("If (") || result.DecompiledSourceCode.Contains("While (")) { // 1. Conditionet i IF satserna uppdateras aldrig och stannar som "If (false) ..." // - Detta gör att värden som skall användas saknas (om de är en direkt referens till en boolean variable) // - Eller att Expressions används och "mergas", ex: A == B // 2. Indenten på första raden i en If Sats är fel. // 3. Return kan ibland ha en "Undefined = return EXPRESSION", varför den sista "assign" vid "CheckAssign" sker // är fortfarande ett frågetecken. Den bör inte göras om destinationen (GetResult()) är undefined. // men eftersom detta inte händer i källan så är det något som kontrolleras fel eller så har inte alla noder rätt värden. } } }
public void TestSkyrimPapyrus() { var str = @"C:\CreationKit\Data\scripts\activemagiceffect.pex"; var assembly = PapyrusAssemblyDefinition.ReadAssembly(str); Assert.IsNotNull(assembly.Header.SourceHeader.Source); Assert.AreNotEqual(0, assembly.Types.Count); }
private PapyrusAssemblyDefinition ReadPapyrusAssembly(string arg, int maxCount) { assembliesReadTick++; assembliesRead++; if (assembliesReadTick >= 100 || assembliesRead == maxCount || maxCount < 1000) { ui.DrawProgressBarWithInfo(assembliesRead, maxCount); assembliesReadTick = 0; } return(PapyrusAssemblyDefinition.ReadAssembly(arg)); }
public void Decompile_FollowersScript() { var asm = PapyrusAssemblyDefinition.ReadAssembly( @"D:\Git\PapyrusDotNet\Source\Test Scripts\Fallout 4\followersscript.pex"); var decompiler = new PapyrusDecompiler(asm); var ctx = decompiler.CreateContext(); var method = asm.Types.First().States.First().Methods.OrderBy(m => m.Body.Instructions.Count).First(m => m.HasBody); var result = decompiler.Decompile(ctx, method); }
public void TestManySkyrimPapyrus() { var scripts = Directory.GetFiles(@"C:\CreationKit\Data\scripts\", "*.pex", SearchOption.AllDirectories); var success = 0; foreach (var script in scripts) { var assembly = PapyrusAssemblyDefinition.ReadAssembly(script); Assert.IsNotNull(assembly.Header.SourceHeader.Source); Assert.AreNotEqual(0, assembly.Types.Count); success++; } Assert.AreNotEqual(0, success); }
public static void TestManySkyrimPapyrus() { var scripts = Directory.GetFiles(@"C:\CreationKit\Data\scripts\", "*.pex", SearchOption.AllDirectories); var success = 0; foreach (var script in scripts) { var assembly = PapyrusAssemblyDefinition.ReadAssembly(script); if (assembly == null || assembly.IsCorrupted) { throw new Exception($"TEST FAILED AT {success}!"); } success++; } }
public void LoadPex(string fileName) { var name = Path.GetFileName(fileName); var directoryName = Path.GetDirectoryName(fileName); if (name != null && loadedAssemblyNames.ContainsKey(name.ToLower())) { if (MessageBox.Show("This file has already been loaded.\r\nDo you want to reload it?", "Reload?", MessageBoxButton.YesNo) != MessageBoxResult.Yes) { return; } } var loadedAssembly = PapyrusAssemblyDefinition.ReadAssembly(fileName); var loadIndex = -1; if (name != null && loadedAssemblyNames.ContainsKey(name.ToLower())) { loadIndex = Array.IndexOf(loadedAssemblyNames.Values.ToArray(), name.ToLower()); } if (loadIndex == -1) { loadedAssemblies.Add(loadedAssembly); if (name != null) { loadedAssemblyNames.Add(name.ToLower(), name.ToLower()); } } else { loadedAssemblies[loadIndex] = loadedAssembly; } if (!loadedAssemblyFolders.Contains(directoryName)) { loadedAssemblyFolders.Add(directoryName); } //BuildPexTree(ref PexTree); //RaiseCommandsCanExecute(); }
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) //}; }
public void Fo4_ReadPex_SaveTheAssembly_ReadAgain_Compare_ReturnsEqual() { 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); Assert.AreEqual(new FileInfo(sourceScript).Length, new FileInfo(destinationScript).Length); }
public void TestManyFallout4Papyrus() { var scripts = Directory.GetFiles(@"D:\Spel\Fallout 4 Scripts\scripts\", "*.pex", SearchOption.AllDirectories); var success = 0; var items = scripts.Length; var corruptCount = 0; var failedScripts = ""; foreach (var script in scripts) { var assembly = PapyrusAssemblyDefinition.ReadAssembly(script); if (assembly.IsCorrupted) { corruptCount++; failedScripts += script + Environment.NewLine; } Assert.IsNotNull(assembly.Header.SourceHeader.Source); Assert.AreNotEqual(0, assembly.Types.Count); success++; } Assert.AreEqual(0, corruptCount, failedScripts); Assert.AreEqual(items, success); }
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."); }
private static void ReadDelegatesPex() { var asm = PapyrusAssemblyDefinition.ReadAssembly(@"C:\PapyrusDotNet\Output\DelegateTests.pex"); }