private void UltimateParty(Rance10 Rance10, Rance10ObjectAnalyzer ana) { // 編成画面のみで機能する // リーダーのパラメータを書き換える // // 以下の手順で実際のゲーム中に反映される // 1.編成画面 // 2."Write params" を押す // 3.クエスト画面に戻る // 4.編成画面 // 5.クエスト画面に戻る var party = new Party(ana, ana.ClassObject["SceneParty"].First()); var data = new byte[8]; Array.Copy(BitConverter.GetBytes(999999), 0, data, 0, 4); // AT Array.Copy(BitConverter.GetBytes(999999), 0, data, 4, 4); // HP foreach (var i in party.Leaders) { if (i.PlayerCard == null) { continue; } System.Diagnostics.Debug.Print("Write: {0:X8}", i.ParamAddress); Rance10.WriteMemory(new IntPtr(i.ParamAddress), data); } }
private void bTurn_Click(object sender, EventArgs e) { try { if (!cbTurn.Checked) { return; } using (var rance10 = Rance10.Create()) { var ana = new Rance10ObjectAnalyzer(); ana.Analyze(rance10); List <Rance10Object> objs; if (!ana.ClassObject.TryGetValue("GameContext", out objs)) { return; } var gamectx = objs[0]; var trun = (int)nudTurn.Value; rance10.WriteMemory(new IntPtr(gamectx.DataPtr + 8), BitConverter.GetBytes(trun)); } } catch (Exception ex) { System.Diagnostics.Debug.Print(ex.ToString()); MessageBox.Show(ex.ToString()); } }
private void AnalyzeObjects(Rance10 rance10) { Log.WriteLine(""); Log.WriteLine("Objects"); var type = 0; foreach (var i in ObjectsByType) { Log.WriteLine($"\t{type++}"); foreach (var j in i.Values) { Log.WriteLine($"\t\t{j}"); } } Log.WriteLine(""); Log.WriteLine("ClassObjects"); foreach (var i in ClassObject) { var cname = i.Key; Log.WriteLine($"\t{cname}"); foreach (var j in i.Value) { AnalyzeObject(rance10, j); } } }
private void SortObjects(Rance10 rance10) { ObjectsByType = new[] { new Dictionary <int, Rance10Object>(), new Dictionary <int, Rance10Object>(), new Dictionary <int, Rance10Object>(), new Dictionary <int, Rance10Object>(), new Dictionary <int, Rance10Object>(), new Dictionary <int, Rance10Object>(), }; foreach (var i in Objects.Where(i => i != null)) { ObjectsByType[i.Type].Add(i.Seq, i); } ClassObject = new Dictionary <string, List <Rance10Object> >(); List <Rance10Object> list; foreach (var i in ObjectsByType[4].Values) { var cname = i.ClassName; if (!ClassObject.TryGetValue(cname, out list)) { ClassObject.Add(cname, list = new List <Rance10Object>()); } list.Add(i); } }
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 void UpdateObjectTree() { using (var rance10 = Rance10.Create()) { var ana = rance10.AnalyzeObjTable(); Analyzer = ana; } }
public static Rance10 Create() { var processes = Process.GetProcessesByName("Rance10"); if (processes == null || processes.Length == 0) { throw new Exception("Process not found"); } var Rance10 = new Rance10(processes[0]); return(Rance10); }
private void bMaxExpFriend_Click(object sender, EventArgs e) { try { using (var rance10 = Rance10.Create()) { var ana = new Rance10ObjectAnalyzer(); ana.Analyze(rance10); List <Rance10Object> objs; if (!ana.ClassObject.TryGetValue("PlayerCommonParam", out objs)) { return; } var param = new CommonParam(ana, objs.First()); if (cbTicket.Checked) { param.WriteTicket(rance10, 3); // 食券 } if (cbFriendship.Checked) { param.WriteFriendship(rance10, 3); // 友情 } if (cbMedal.Checked) { param.WriteMedal(rance10, 2); // 勲章 } if (cbIngot.Checked) { param.WriteIngot(rance10, 3); // 金塊 } if (cbTotalExp.Checked) { param.WriteTotalExp(rance10, 99999999); // 獲得経験値 } if (cbUltimate.Checked) { UltimateParty(rance10, ana); } } } catch (Exception ex) { System.Diagnostics.Debug.Print(ex.ToString()); MessageBox.Show(ex.ToString()); } }
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); }
public void Analyze(Rance10 rance10) { Begin(); rance10.Suspend(); try { ReadTables(rance10); ReadObjects(rance10); SortObjects(rance10); AnalyzeObjects(rance10); } finally { rance10.Resume(); End(); } }
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}"); } } }
private void PartyMembers() { try { using (var rance10 = Rance10.Create()) { var ana = new Rance10ObjectAnalyzer(); ana.Analyze(rance10); var party = new Party(ana, ana.ClassObject["SceneParty"].First()); var sb = new StringBuilder(); sb.AppendLine("AT------ HP------ Rank---- Name----------------"); foreach (var i in party.Leaders) { if (i.PlayerCard == null) { continue; } sb.AppendFormat("{0} {1} {2} {3}", i.AT.ToString("N0").PadLeft(8), i.HP.ToString("N0").PadLeft(8), i.Rank.ToString("N0").PadLeft(8), i.CardName).AppendLine(); } tbInfo.Text = sb.ToString(); } } catch (Exception ex) { System.Diagnostics.Debug.Print(ex.ToString()); MessageBox.Show(ex.ToString()); } }
private void ReadTables(Rance10 rance10) { var buf = new byte[256 * 1000]; var m = rance10.ReadMemory(new IntPtr(0x007FCBB0), buf, 8); if (!m.Success || m.ReadedSize != 8) { return; } var mng1 = BitConverter.ToUInt32(m.Data, 0); var mng2 = BitConverter.ToUInt32(m.Data, 4); m = rance10.ReadMemory(new IntPtr(mng1), buf, 32); if (!m.Success || m.ReadedSize != 32) { return; } var tbl = BitConverter.ToUInt32(m.Data, 8); var cnt = BitConverter.ToInt32(m.Data, 20); var cnt2 = (cnt + 3) / 4; var read = cnt2 * 4; var end = tbl + cnt2 * 4; m = rance10.ReadMemory(new IntPtr(tbl), buf, read); if (!m.Success || m.ReadedSize != read) { return; } ObjectManagerAddress = mng1; ObjectCount = cnt; TableCount = cnt2; TableStart = tbl; TableEnd = (uint)(tbl + cnt2 * 4); TableAddresses = Enumerable.Range(0, TableCount) .Select(i => BitConverter.ToUInt32(m.Data, i * 4)) .ToArray(); var objs = new List <uint>(ObjectCount); var rem = cnt; var idx = 0; System.Diagnostics.Debug.Print($"ObjectManagerAddress: {ObjectManagerAddress:X8}"); System.Diagnostics.Debug.Print($"ObjectCount: {ObjectCount:X8}"); System.Diagnostics.Debug.Print($"TableCount: {TableCount:X8}"); System.Diagnostics.Debug.Print($"TableStart: {TableStart:X8}"); System.Diagnostics.Debug.Print($"TableEnd: {TableEnd:X8}"); Log.WriteLine("ObjectTable"); foreach (var i in TableAddresses) { var tbladdr = TableStart + idx * 4; m = rance10.ReadMemory(new IntPtr(i), buf, 16); if (m.Success && m.ReadedSize == 16) { var a0 = BitConverter.ToUInt32(m.Data, 0); var a1 = BitConverter.ToUInt32(m.Data, 4); var a2 = BitConverter.ToUInt32(m.Data, 8); var a3 = BitConverter.ToUInt32(m.Data, 12); Log.WriteLine("\t#{0}\t{1:X8}->{2:X8}: {3:X8} {4:X8} {5:X8} {6:X8}", idx++, tbladdr, i, a0, a1, a2, a3); if (rem >= 1) { objs.Add(a0); } if (rem >= 2) { objs.Add(a1); } if (rem >= 3) { objs.Add(a2); } if (rem >= 4) { objs.Add(a3); } } else { throw new Exception(); } rem -= 4; } Log.Flush(); ObjectAddresses = objs.ToArray(); System.Diagnostics.Debug.Assert(ObjectAddresses.Length == ObjectCount); }