WindowsDebugger.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. using Microsoft.Xna.Framework;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. namespace FF8
  12. {
  13. public partial class MakiDebugger : Form
  14. {
  15. //Maki debugger is a dynamic form that let's you edit FREAKING EVERY SINGLE field that is static, private, whatever
  16. //it's like an Cheat Engine that has pre-made table of ALL variables of n-class available for edit and debug
  17. //so have fun- I'm really proud of this one. Minimalistic code, extreme possibilities
  18. public MakiDebugger()
  19. {
  20. InitializeComponent();
  21. }
  22. private System.Reflection.FieldInfo lastObject;
  23. private object instanceProvider;
  24. public void UpdateWindow()
  25. {
  26. listBox1.Items.Clear();
  27. foreach(var c in
  28. MakiExtended.DebuggerFood)
  29. {
  30. //int controller = FindControllerId(c.DeclaringType.FullName);
  31. //if (controller == -1)
  32. //{
  33. // listBox1.Items.Add(new ListViewItem(c.DeclaringType.FullName));
  34. // controller = listBox1.Items.Count - 1;
  35. //}
  36. listBox1.Items.Add($"{MakiExtended.DebuggerFood.IndexOf(c)}:{c.ReflectedType.FullName}:{c.Name}");
  37. }
  38. }
  39. public void _Refresh()
  40. {
  41. listBox1_SelectedIndexChanged(null, null);
  42. }
  43. private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
  44. {
  45. if (listBox1.Items.Count == 0 || listBox1.SelectedItem == null)
  46. return;
  47. string[] parentDividor = (listBox1.SelectedItem as string).Split(':');
  48. var field = MakiExtended.DebuggerFood[int.Parse(parentDividor[0])];
  49. TypeBeautizer(field);
  50. }
  51. private void TypeBeautizer(System.Reflection.FieldInfo field)
  52. {
  53. flowLayoutPanel1.Controls.Clear();
  54. lastObject = field;
  55. object value = null;
  56. try
  57. {
  58. value = field.GetValue(null);
  59. }
  60. catch //selected type is not accesible due to non-static modifier
  61. {
  62. for(int i = 0;i<MakiExtended.DebuggerInstanceProvider.Count; i++)
  63. {
  64. try { value = field.GetValue(MakiExtended.DebuggerInstanceProvider[i]); if (value != null) { instanceProvider = MakiExtended.DebuggerInstanceProvider[i]; break; } }
  65. catch { continue; }
  66. }
  67. }
  68. if (value == null) //final rescue
  69. return;
  70. Type tp = value.GetType();
  71. if(tp == typeof(int))
  72. {
  73. flowLayoutPanel1.Controls.Add(new NumericUpDown() { Minimum = int.MinValue, Maximum = int.MaxValue, Value=(int)value });
  74. (flowLayoutPanel1.Controls[0] as NumericUpDown).ValueChanged += @int;
  75. return;
  76. }
  77. if (tp == typeof(uint))
  78. {
  79. flowLayoutPanel1.Controls.Add(new NumericUpDown() { Minimum = uint.MinValue, Maximum = uint.MaxValue, Value = (uint)value });
  80. (flowLayoutPanel1.Controls[0] as NumericUpDown).ValueChanged += @uint;
  81. return;
  82. }
  83. if (tp == typeof(Vector3))
  84. {
  85. flowLayoutPanel1.Controls.Add(new TextBox() { Text = ((Vector3)value).X.ToString() });
  86. flowLayoutPanel1.Controls.Add(new TextBox() { Text = ((Vector3)value).Y.ToString() });
  87. flowLayoutPanel1.Controls.Add(new TextBox() { Text = ((Vector3)value).Z.ToString() });
  88. (flowLayoutPanel1.Controls[0] as TextBox).TextChanged += @vectorX;
  89. (flowLayoutPanel1.Controls[1] as TextBox).TextChanged += @vectorY;
  90. (flowLayoutPanel1.Controls[2] as TextBox).TextChanged += @vectorZ;
  91. return;
  92. }
  93. if(tp==typeof(Matrix))
  94. {
  95. DataGridView dgv = new DataGridView();
  96. dgv.Columns.Add("M1", "M1");
  97. dgv.Columns.Add("M2", "M2");
  98. dgv.Columns.Add("M3", "M3");
  99. dgv.Columns.Add("M4", "M4");
  100. Matrix mx = (Matrix)value;
  101. dgv.Rows.Add(mx.M11, mx.M12, mx.M13, mx.M14);
  102. dgv.Rows.Add(mx.M21, mx.M22, mx.M23, mx.M24);
  103. dgv.Rows.Add(mx.M31, mx.M32, mx.M33, mx.M34);
  104. dgv.Rows.Add(mx.M41, mx.M42, mx.M43, mx.M44);
  105. dgv.AutoSize = true;
  106. flowLayoutPanel1.Controls.Add(dgv);
  107. (flowLayoutPanel1.Controls[0] as DataGridView).CellValueChanged += @Matrix;
  108. return;
  109. }
  110. if(tp == typeof(Tuple<Vector3[], Debug_battleDat.ShortVector[], Matrix[]>))
  111. {
  112. DataGridView dgv = new DataGridView();
  113. dgv.Columns.Add("M1", "M1");
  114. dgv.Columns.Add("M2", "M2");
  115. dgv.Columns.Add("M3", "M3");
  116. dgv.Columns.Add("M4", "M4");
  117. var tmx = (Tuple<Vector3[], Debug_battleDat.ShortVector[], Matrix[]>)value;
  118. Matrix[] mxa = tmx.Item3;
  119. Matrix mx = mxa[0];
  120. dgv.Rows.Add(mx.M11, mx.M12, mx.M13, mx.M14);
  121. dgv.Rows.Add(mx.M21, mx.M22, mx.M23, mx.M24);
  122. dgv.Rows.Add(mx.M31, mx.M32, mx.M33, mx.M34);
  123. dgv.Rows.Add(mx.M41, mx.M42, mx.M43, mx.M44);
  124. dgv.AutoSize = true;
  125. flowLayoutPanel1.Controls.Add(dgv);
  126. (flowLayoutPanel1.Controls[0] as DataGridView).CellValueChanged += @_tmx;
  127. return;
  128. }
  129. flowLayoutPanel1.Controls.Add(new Label() { Text = $"UNKNOWN. Type: {tp}", AutoSize=true});
  130. }
  131. //Matrix
  132. private void @Matrix(object sender, DataGridViewCellEventArgs e)
  133. {
  134. var dgv = (sender as DataGridView);
  135. Matrix mm = (Matrix)lastObject.GetValue(instanceProvider);
  136. try
  137. {
  138. mm = new Matrix(
  139. (float)dgv.Rows[0].Cells[0].Value, (float)dgv.Rows[0].Cells[1].Value, (float)dgv.Rows[0].Cells[2].Value, (float)dgv.Rows[0].Cells[3].Value,
  140. (float)dgv.Rows[1].Cells[0].Value, (float)dgv.Rows[1].Cells[1].Value, (float)dgv.Rows[1].Cells[2].Value, (float)dgv.Rows[1].Cells[3].Value,
  141. (float)dgv.Rows[2].Cells[0].Value, (float)dgv.Rows[2].Cells[1].Value, (float)dgv.Rows[2].Cells[2].Value, (float)dgv.Rows[2].Cells[3].Value,
  142. (float)dgv.Rows[3].Cells[0].Value, (float)dgv.Rows[3].Cells[1].Value, (float)dgv.Rows[3].Cells[2].Value, (float)dgv.Rows[3].Cells[3].Value);
  143. }
  144. catch
  145. {
  146. ;
  147. }
  148. lastObject.SetValue(lastObject, mm);
  149. }
  150. //Matrix Tuple3 ShortVec Vec3;
  151. private void @_tmx(object sender, DataGridViewCellEventArgs e)
  152. {
  153. var dgv = (sender as DataGridView);
  154. var mma = (Tuple<Vector3[], Debug_battleDat.ShortVector[], Matrix[]>)lastObject.GetValue(instanceProvider); //yes, instanceprovider may be null
  155. Matrix mm = mma.Item3[0];
  156. try
  157. {
  158. mm = new Matrix(
  159. float.Parse(dgv.Rows[0].Cells[0].Value.ToString()), float.Parse(dgv.Rows[0].Cells[1].Value.ToString()), float.Parse(dgv.Rows[0].Cells[2].Value.ToString()), float.Parse(dgv.Rows[0].Cells[3].Value.ToString()),
  160. float.Parse(dgv.Rows[1].Cells[0].Value.ToString()), float.Parse(dgv.Rows[1].Cells[1].Value.ToString()), float.Parse(dgv.Rows[1].Cells[2].Value.ToString()), float.Parse(dgv.Rows[1].Cells[3].Value.ToString()),
  161. float.Parse(dgv.Rows[2].Cells[0].Value.ToString()), float.Parse(dgv.Rows[2].Cells[1].Value.ToString()), float.Parse(dgv.Rows[2].Cells[2].Value.ToString()), float.Parse(dgv.Rows[2].Cells[3].Value.ToString()),
  162. float.Parse(dgv.Rows[3].Cells[0].Value.ToString()), float.Parse(dgv.Rows[3].Cells[1].Value.ToString()), float.Parse(dgv.Rows[3].Cells[2].Value.ToString()), float.Parse(dgv.Rows[3].Cells[3].Value.ToString()));
  163. }
  164. catch(Exception ee)
  165. {
  166. Console.WriteLine(ee.Message);
  167. }
  168. mma.Item3[0] = mm;
  169. lastObject.SetValue(instanceProvider, mma);
  170. }
  171. //32 bit integer
  172. private void @int(object sender, EventArgs e)
  173. {
  174. try { lastObject.SetValue(instanceProvider, (int)(sender as NumericUpDown).Value); }
  175. catch {; }
  176. }
  177. private void @uint(object sender, EventArgs e)
  178. {
  179. try { lastObject.SetValue(instanceProvider, (uint)(sender as NumericUpDown).Value); }
  180. catch {; }
  181. }
  182. //vector 3x float
  183. private void @vectorX(object sender, EventArgs e)
  184. {
  185. try
  186. {
  187. lastObject.SetValue(instanceProvider,
  188. new Vector3(float.Parse((sender as TextBox).Text),
  189. ((Vector3)lastObject.GetValue(instanceProvider)).Y,
  190. ((Vector3)lastObject.GetValue(instanceProvider)).Z));
  191. }
  192. catch
  193. {
  194. ;
  195. }
  196. }
  197. private void @vectorY(object sender, EventArgs e)
  198. {
  199. try
  200. {
  201. lastObject.SetValue(instanceProvider,
  202. new Vector3(((Vector3)lastObject.GetValue(instanceProvider)).X,
  203. float.Parse((sender as TextBox).Text),
  204. ((Vector3)lastObject.GetValue(instanceProvider)).Z));
  205. }
  206. catch
  207. {
  208. ;
  209. }
  210. }
  211. private void @vectorZ(object sender, EventArgs e)
  212. {
  213. try
  214. {
  215. lastObject.SetValue(instanceProvider,
  216. new Vector3(((Vector3)lastObject.GetValue(instanceProvider)).X,
  217. ((Vector3)lastObject.GetValue(instanceProvider)).Y,
  218. float.Parse((sender as TextBox).Text)));
  219. }
  220. catch
  221. {
  222. ;
  223. }
  224. }
  225. //private int FindControllerId(string d)
  226. //{
  227. // if (listView1.Items.Count == 0)
  228. // return -1;
  229. // for (int i = 0; i < listView1.Items.Count; i++)
  230. // if (listView1.Items[i].Name == d)
  231. // return i;
  232. // return -1;
  233. //}
  234. }
  235. }