private static void DumpPackage(string packageName, string gameDir, string outDir, bool scriptSource) { using (Stream s = new FileStream(packageName, FileMode.Open, FileAccess.Read, FileShare.Read)) { var package = UE3PackageReader.ReadPackage(new BinaryReader(s, Encoding.ASCII), gameDir); foreach (var export in package.TopLevelExports) { if (export.ClassName == "Class") { Directory.CreateDirectory(outDir); if (scriptSource) { var scriptText = export.Children.SingleOrDefault(e => e.ObjectName == "ScriptText"); if (scriptText != null) { var text = (string) scriptText.ReadInstance(); DumpOutput(export, outDir, text); continue; } } var instance = (UnClass)export.ReadInstance(); var builder = new TextBuilder(); instance.Decompile(builder); DumpOutput(export, outDir, builder.ToString()); } } ProblemRegistry.LogProblems(Path.Combine(outDir, "unhood.log")); } }
public override void Decompile(TextBuilder result) { result.Indent().Append("state ").Append(_self.ObjectName).NewLine(); result.Indent().Append("{").NewLine(); result.PushIndent(); DecompileChildren(result, false); result.PopIndent(); StatementList bytecode = ReadBytecode(); DecompileBytecode(bytecode, result, true); result.Indent().Append("}").NewLine().NewLine(); }
public override void Decompile(TextBuilder result) { result.Indent().Append("struct "); if (Native) result.Append("native "); if (Transient) result.Append("transient "); result.Append(_self.ObjectName); if (_super != null) { result.Append(" extends ").Append(_super.ObjectName); } result.NewLine(); result.Append("{").NewLine(); result.PushIndent(); DecompileChildren(result, true); result.PopIndent(); result.Indent().Append("}").NewLine().NewLine(); }
public virtual void Decompile(TextBuilder result) { result.Indent(); result.Append("var"); if (_flags.HasFlag("Edit")) { result.Append("("); if (_category != null && _category.Name != _export.Parent.ObjectName) { result.Append(_category.Name); } result.Append(")"); } _flags.Except("Edit", "Net").Each(f => result.Append(" " + f.ToLower())); result.Append(" ").Append(GetPropertyType()).Append(" "); result.Append(_export.ObjectName); if (_arraySize != 1) { result.Append("[").Append(_arraySize).Append("]"); } result.Append(";\n\n"); }
public override void Decompile(TextBuilder result) { result.Append("class ").Append(_self.ObjectName); if (_super != null) { result.Append(" extends ").Append(_super.ObjectName); } if (_outerInstance != null && _outerInstance.ObjectName != "Object") { result.NewLine().Append(" within ").Append(_outerInstance.ObjectName); } if (_hideCategories.Count > 0) { result.NewLine().Append(" hidecategories(").Append(string.Join(",", _hideCategories.ToArray())).Append(")"); } if (_interfaces.Count > 0) { var intfNames = _interfaces.ConvertAll(e => e.ObjectName).ToArray(); result.NewLine().Append(" implements(").Append(string.Join(",", intfNames)).Append(")"); } if (_config != "None") { result.NewLine().Append(" config(").Append(_config).Append(")"); } _flags.Except("Compiled", "Parsed", "Config", "Localized").Each(f => result.NewLine().Append(" ").Append(f.ToLower())); result.Append(";").NewLine().NewLine(); DecompileChildren(result, false); var statementList = ReadBytecode(); if (statementList.Count > 0) { DecompileReplicationBlock(result, statementList); } if (_defaults != null) { DecompileDefaultProperties(result); } }
public override void Decompile(TextBuilder result) { result.Indent().Append("struct "); if (Native) { result.Append("native "); } if (Transient) { result.Append("transient "); } result.Append(_self.ObjectName); if (_super != null) { result.Append(" extends ").Append(_super.ObjectName); } result.NewLine(); result.Append("{").NewLine(); result.PushIndent(); DecompileChildren(result, true); result.PopIndent(); result.Indent().Append("}").NewLine().NewLine(); }
private void DecompileReplicationBlock(TextBuilder result, StatementList statementList) { result.Append("replication\n{\n").PushIndent(); for (int i = 0; i < statementList.Count; i++) { List <String> names = FindReplicatedProperties(statementList [i].StartOffset); if (names.Count > 0) { result.Indent().Append("if (").Append(statementList[i].Token.ToString()).Append(")").NewLine(); result.Indent().Append(" "); foreach (string name in names) { result.Append(name); if (name != names.Last()) { result.Append(", "); } } result.Append(";").NewLine().NewLine(); } } result.Append("}").NewLine().NewLine().PopIndent(); }
protected void DecompileBytecode(StatementList statements, TextBuilder result, bool createControlStatements) { var labelTableStatement = statements.Find(s => s.Token is LabelTableToken); var labelTable = labelTableStatement != null ? (LabelTableToken) labelTableStatement.Token : null; result.HasErrors = statements.HasErrors(); if (createControlStatements) { try { statements.CreateControlStatements(); } catch (Exception) { ProblemRegistry.RegisterIncompleteControlFlow(this); } if (statements.IsIncompleteControlFlow()) { ProblemRegistry.RegisterIncompleteControlFlow(this); } statements.RemoveRedundantReturns(); } statements.Print(result, labelTable, !createControlStatements); }
protected void DecompileBytecode(StatementList statements, TextBuilder result, bool createControlStatements) { var labelTableStatement = statements.Find(s => s.Token is LabelTableToken); var labelTable = labelTableStatement != null ? (LabelTableToken)labelTableStatement.Token : null; result.HasErrors = statements.HasErrors(); if (createControlStatements) { try { statements.CreateControlStatements(); } catch (Exception) { ProblemRegistry.RegisterIncompleteControlFlow(this); } if (statements.IsIncompleteControlFlow()) { ProblemRegistry.RegisterIncompleteControlFlow(this); } statements.RemoveRedundantReturns(); } statements.Print(result, labelTable, !createControlStatements); }
protected void DecompileChildren(TextBuilder result, bool reverse) { var collection = reverse ? _self.Children.Reverse() : _self.Children; foreach (UnExport export in collection) { try { object instance = export.ReadInstance(); if (instance is Decompilable) { ((Decompilable)instance).Decompile(result); } else { result.Append("// ").Append(export.ToString()).Append("\n"); } } catch (Exception e) { result.Append("//!!! Error decompiling " + export.ObjectName + ": " + e.Message); } } }
public override void Print(TextBuilder result, LabelTableToken labelTable, bool offset) { result.Indent().Append(_text).Append(";").NewLine(); }
protected abstract void PrintHead(TextBuilder result);
public void Print(TextBuilder result, LabelTableToken labelTable, bool showStartOffset) { result.PushIndent(); _statements.ForEach(s => s.Print(result, labelTable, showStartOffset)); result.PopIndent(); }
public virtual void Decompile(TextBuilder result) { result.Indent(); result.Append("var"); if (_flags.HasFlag("Edit")) { result.Append("("); if (_category != null && _category.Name != _export.Parent.ObjectName) result.Append(_category.Name); result.Append(")"); } _flags.Except("Edit", "Net").Each(f => result.Append(" " + f.ToLower())); result.Append(" ").Append(GetPropertyType()).Append(" "); result.Append(_export.ObjectName); if (_arraySize != 1) result.Append("[").Append(_arraySize).Append("]"); result.Append(";\n\n"); }
protected override void PrintHead(TextBuilder result) { result.Append("switch (").Append(Token.ToString()).Append(")"); }
public abstract void Decompile(TextBuilder result);
protected override void PrintHead(TextBuilder result) { var foreachToken = (ForeachToken)Token; result.Append("foreach ").Append(foreachToken.Expr.ToString()); if (foreachToken.IteratorExpr != null) { result.Append("(").Append(foreachToken.IteratorExpr.ToString()).Append(")"); } }
private void DecompileReplicationBlock(TextBuilder result, StatementList statementList) { result.Append("replication\n{\n").PushIndent(); for(int i=0; i<statementList.Count; i++) { List<String> names = FindReplicatedProperties(statementList [i].StartOffset); if (names.Count > 0) { result.Indent().Append("if (").Append(statementList[i].Token.ToString()).Append(")").NewLine(); result.Indent().Append(" "); foreach (string name in names) { result.Append(name); if (name != names.Last()) result.Append(", "); } result.Append(";").NewLine().NewLine(); } } result.Append("}").NewLine().NewLine().PopIndent(); }
private void DecompileDefaultProperties(TextBuilder result) { result.Append("defaultproperties\n{\n").PushIndent(); var defaultsExport = _defaults.Resolve(); UnPropertyList propertyList = Package.ReadPropertyList(defaultsExport, this); foreach(UnProperty prop in propertyList.Properties) { var name = prop.Name; if (name.StartsWith("__") && name.EndsWith("__Delegate")) { name = name.Substring(2, name.Length - 2 - 10); } if (prop.Value is UnPropertyArray) { var array = (UnPropertyArray) prop.Value; for(int i=0; i<array.Count; i++) { result.Indent().Append(name).Append("(").Append(i).Append(")=") .Append(ValueToString(array [i], array.ElementType)).NewLine(); } } else { result.Indent().Append(name).Append("=").Append(ValueToString(prop.Value, prop.Type)).NewLine(); } } foreach(UnExport export in defaultsExport.Children) { result.Indent().Append("// child object " + export.ObjectName + " of type " + export.ClassName).NewLine(); } result.Append("}").NewLine().PopIndent(); }
public override void Decompile(TextBuilder result) { result.Append("class ").Append(_self.ObjectName); if (_super != null) result.Append(" extends ").Append(_super.ObjectName); if (_outerInstance != null && _outerInstance.ObjectName != "Object") { result.NewLine().Append(" within ").Append(_outerInstance.ObjectName); } if (_hideCategories.Count > 0) { result.NewLine().Append(" hidecategories(").Append(string.Join(",", _hideCategories.ToArray())).Append(")"); } if (_interfaces.Count > 0) { var intfNames = _interfaces.ConvertAll(e => e.ObjectName).ToArray(); result.NewLine().Append(" implements(").Append(string.Join(",", intfNames)).Append(")"); } if (_config != "None") { result.NewLine().Append(" config(").Append(_config).Append(")"); } _flags.Except("Compiled", "Parsed", "Config", "Localized").Each(f => result.NewLine().Append(" ").Append(f.ToLower())); result.Append(";").NewLine().NewLine(); DecompileChildren(result, false); var statementList = ReadBytecode(); if (statementList.Count > 0) { DecompileReplicationBlock(result, statementList); } if (_defaults != null) { DecompileDefaultProperties(result); } }
public override void Print(TextBuilder result, LabelTableToken labelTable, bool showStartOffsets) { PrintLabel(labelTable, result); result.Indent(); PrintHead(result); result.Append("\n"); result.Indent().Append("{\n"); PrintChildren(result, labelTable, showStartOffsets); result.Indent().Append("}"); // result.Append(" // ").Append(_endOffset.ToString()); result.NewLine(); }
protected override void PrintHead(TextBuilder result) { result.Append("while (").Append(Token.ToString()).Append(")"); }
protected virtual void PrintChildren(TextBuilder result, LabelTableToken labelTable, bool showStartOffsets) { _children.Print(result, labelTable, showStartOffsets); }
protected void PrintLabel(LabelTableToken labelTable, TextBuilder result) { if (labelTable != null) { var label = labelTable.GetLabel(StartOffset); if (label != null) { result.Append(label).Append(":").NewLine(); } } }
protected override void PrintHead(TextBuilder result) { result.Append("else"); }
protected override void PrintChildren(TextBuilder result, LabelTableToken labelTable, bool showStartOffsets) { result.PushIndent(); bool indented = false; for (int i = 0; i < Children.Count; i++) { var stmt = Children[i]; if (stmt.Token is CaseToken || stmt.Token is DefaultToken) { if (indented) { result.PopIndent(); indented = false; } result.Indent().Append(stmt.Token.ToString()).Append(":").NewLine(); } else { if (!indented) { indented = true; result.PushIndent(); } stmt.Print(result, labelTable, showStartOffsets); } } if (indented) result.PopIndent(); result.PopIndent(); }
public void Decompile(TextBuilder result) { result.Append("const ").Append(_export.ObjectName).Append(" = ").Append(_value).Append(";").NewLine(); }
public virtual void Print(TextBuilder result, LabelTableToken labelTable, bool showStartOffset) { if (Token.ToString() == "") return; PrintLabel(labelTable, result); result.Indent(); if (showStartOffset) { result.Append("/* ").Append(StartOffset).Append(" */ "); } result.Append(Token.ToString(), StartOffset, EndOffset).Append(";"); result.Append("\n"); }
public void Decompile(TextBuilder result) { result.Append("enum ").Append(_export.ObjectName).Append("\n{\n"); _values.GetRange(0, _values.Count - 1).ForEach(v => result.Append(" ").Append(v).Append(",\n")); result.Append("};\n\n"); }
public void Decompile(TextBuilder result, bool createControlStatements) { result.Indent(); if (Native) { result.Append("native"); if (_nativeIndex > 0) result.Append("(").Append(_nativeIndex).Append(")"); result.Append(" "); } _flags.Except("Native", "Event", "Delegate", "Defined", "Public", "HasDefaults", "HasOutParms").Each(f => result.Append(f.ToLower() + " ")); if (HasFlag("Event")) result.Append("event "); else if (HasFlag("Delegate")) result.Append("delegate "); else result.Append("function "); string type = GetReturnType(); if (type != null) { result.Append(type).Append(" "); } result.Append(_self.ObjectName).Append("("); int paramCount = 0; var locals = new List<UnClassProperty>(); var statements = ReadBytecode(); foreach (UnExport export in _self.Children.Reverse()) { object instance = export.ReadInstance(); if (instance is UnClassProperty) { var prop = (UnClassProperty)instance; if (prop.Parm) { if (!prop.ReturnParm) { if (paramCount > 0) result.Append(", "); prop.Flags.Except("Parm").Each(f => result.Append(f.ToLower() + " ")); result.Append(prop.GetPropertyType()).Append(" ").Append(export.ObjectName); if (prop.OptionalParm && statements.Count > 0) { if (statements[0].Token is NothingToken) statements.RemoveRange(0, 1); else if (statements [0].Token is DefaultParamValueToken) { result.Append(" = ").Append(statements[0].Token.ToString()); statements.RemoveRange(0, 1); } } paramCount++; } } else { locals.Add(prop); } } } result.Append(")"); if (HasFlag("Defined")) { result.NewLine().Indent().Append("{").NewLine(); result.PushIndent(); foreach (var local in locals) { result.Indent().Append("local ").Append(local.GetPropertyType()).Append(" ").Append(local.Name).Append(";").NewLine(); } result.PopIndent(); // will be pushed again in DecompileBytecode() DecompileBytecode(statements, result, createControlStatements); result.Indent().Append("}").NewLine().NewLine(); } else { result.Append(";").NewLine().NewLine(); } }
public void Decompile(TextBuilder result) { result.Append("enum ").Append(_export.ObjectName).Append("\n{\n"); _values.GetRange(0, _values.Count-1).ForEach(v => result.Append(" ").Append(v).Append(",\n")); result.Append("};\n\n"); }
public override void Decompile(TextBuilder result) { if (_export.ObjectName.StartsWith("__") && _export.ObjectName.EndsWith("__Delegate")) { // skip synthetic property return; } base.Decompile(result); }
public void Decompile(TextBuilder result, bool createControlStatements) { result.Indent(); if (Native) { result.Append("native"); if (_nativeIndex > 0) { result.Append("(").Append(_nativeIndex).Append(")"); } result.Append(" "); } _flags.Except("Native", "Event", "Delegate", "Defined", "Public", "HasDefaults", "HasOutParms").Each(f => result.Append(f.ToLower() + " ")); if (HasFlag("Event")) { result.Append("event "); } else if (HasFlag("Delegate")) { result.Append("delegate "); } else { result.Append("function "); } string type = GetReturnType(); if (type != null) { result.Append(type).Append(" "); } result.Append(_self.ObjectName).Append("("); int paramCount = 0; var locals = new List <UnClassProperty>(); var statements = ReadBytecode(); foreach (UnExport export in _self.Children.Reverse()) { object instance = export.ReadInstance(); if (instance is UnClassProperty) { var prop = (UnClassProperty)instance; if (prop.Parm) { if (!prop.ReturnParm) { if (paramCount > 0) { result.Append(", "); } prop.Flags.Except("Parm").Each(f => result.Append(f.ToLower() + " ")); result.Append(prop.GetPropertyType()).Append(" ").Append(export.ObjectName); if (prop.OptionalParm && statements.Count > 0) { if (statements[0].Token is NothingToken) { statements.RemoveRange(0, 1); } else if (statements [0].Token is DefaultParamValueToken) { result.Append(" = ").Append(statements[0].Token.ToString()); statements.RemoveRange(0, 1); } } paramCount++; } } else { locals.Add(prop); } } } result.Append(")"); if (HasFlag("Defined")) { result.NewLine().Indent().Append("{").NewLine(); result.PushIndent(); foreach (var local in locals) { result.Indent().Append("local ").Append(local.GetPropertyType()).Append(" ").Append(local.Name).Append(";").NewLine(); } result.PopIndent(); // will be pushed again in DecompileBytecode() DecompileBytecode(statements, result, createControlStatements); result.Indent().Append("}").NewLine().NewLine(); } else { result.Append(";").NewLine().NewLine(); } }
public override void Decompile(TextBuilder result) { Decompile(result, true); }
private static string PrintText(StatementListBuilder builder) { builder.List.CreateControlStatements(); builder.List.RemoveRedundantReturns(); var result = new TextBuilder(); builder.List.Print(result, null, false); return result.ToString(); }