Ejemplo n.º 1
0
        public void TestFallout4Papyrus()
        {
            var falloutScript = "D:\\Spel\\Fallout 4 Scripts\\scripts\\Actor.pex";
            var assembly      = PapyrusAssemblyDefinition.ReadAssembly(falloutScript);

            Assert.IsNotNull(assembly.Header.SourceHeader.Source);
        }
Ejemplo n.º 2
0
        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.
                }
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 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));
 }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
0
        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++;
            }
        }
Ejemplo n.º 8
0
        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();
        }
Ejemplo n.º 9
0
        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)
            //};
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
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.");
        }
Ejemplo n.º 13
0
 private static void ReadDelegatesPex()
 {
     var asm = PapyrusAssemblyDefinition.ReadAssembly(@"C:\PapyrusDotNet\Output\DelegateTests.pex");
 }