private void ReadObjects(Rance10 rance10) { var idx = 0; Objects = new Rance10Object[ObjectAddresses.Length]; foreach (var i in ObjectAddresses) { var tbladdr = TableStart + (idx / 4) * 4; Log.WriteLine($"\t#{idx/4}\t{tbladdr:X8}...{i:X8}"); try { var obj = ReadObject(rance10, i, idx); Objects[idx++] = obj; if (null != obj) { obj.Analyze(rance10); } } catch (Exception ex) { Log.WriteLine(ex.ToString()); Log.Flush(); throw; } } }
private TreeNode AddNode(TreeNodeCollection nodes, Rance10Object obj) { var node = nodes.Add(NodeText(obj)); node.Tag = obj; if (null != obj.ObjectData) { foreach (var i in obj.ObjectData) { AddNode(node.Nodes, i); } } return(node); }
private Rance10Object ReadObject(Rance10 rance10, uint addr, int idx) { if (addr == 0) { return(null); } var buf = new byte[64]; var m = rance10.ReadMemory(new IntPtr(addr), buf, 8); if (!m.Success) { System.Diagnostics.Debug.Print($"Failed to read memory: {addr:X8}"); return(null); } var type = BitConverter.ToInt32(m.Data, 4); switch (type) { case 0: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject0.Size); break; case 1: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject1_Value.Size); break; case 2: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject2_String.Size); break; case 3: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject3_Array.Size); break; case 4: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject4_Class.Size); break; case 5: m = rance10.ReadMemory(new IntPtr(addr), buf, Rance10SubObject5.Size); break; default: throw new Exception($"Invalid type no: {type} @{addr:X8}"); } if (!m.Success) { System.Diagnostics.Debug.Print($"Failed to read memory: {addr:X8}"); return(null); } var obj = Rance10Object.New(null, (uint)m.Address.ToInt64(), m.Data); obj.Seq = idx; return(obj); }
private string NodeText(Rance10Object value) { switch (value.Type) { case 0: return($"#{value.Seq:X8} @{value.Address:X8} 0"); case 1: return($"#{value.Seq:X8} @{value.Address:X8} 1"); case 2: return($"#{value.Seq:X8} @{value.Address:X8} 2 \"{value.ValueString}\""); case 3: return($"#{value.Seq:X8} @{value.Address:X8} 3"); case 4: return($"#{value.Seq:X8} @{value.Address:X8} 4 {value.ClassName}"); case 5: return($"#{value.Seq:X8} @{value.Address:X8} 5"); default: throw new Exception(); } }
private void AnalyzeObject(Rance10 rance10, Rance10Object obj) { Log.WriteLine($"\t\t{obj}"); if (null == obj.ObjectData) { return; } foreach (var i in obj.ObjectData) { var assoc = GetObject((int)i); if (null == assoc) { Log.WriteLine($"\t\t\t{i:X8}->\tnull"); } else { Log.WriteLine($"\t\t\t{i:X8}->\t{assoc}"); } } }
public Leader(Rance10ObjectAnalyzer ana, Rance10Object obj) : base(ana, obj) { }
public Party(Rance10ObjectAnalyzer ana, Rance10Object obj) : base(ana, obj) { }
public CommonParam(Rance10ObjectAnalyzer ana, Rance10Object obj) : base(ana, obj) { }
public ObjectBase(Rance10ObjectAnalyzer ana, Rance10Object obj) { Analyzer = ana; BaseObject = obj; }