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 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); }