PageRenderTime 41ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/ButlerMindControlAgent/Form1.cs

https://gitlab.com/ssternklar/ButlerQuest
C# | 294 lines | 263 code | 27 blank | 4 comment | 32 complexity | f2886019992b8ec91292e57b49114ad1 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Xml.Linq;
  11. using System.IO;
  12. namespace ButlerMindControlAgent
  13. {
  14. public partial class Form1 : Form
  15. {
  16. int lastCommandNumber;
  17. XDocument xDoc;
  18. List<XElement> floors;
  19. List<XElement> currentFloorObjects;
  20. List<XElement> currentCommands;
  21. public Form1()
  22. {
  23. InitializeComponent();
  24. EnemySelectBox.Enabled = false;
  25. CommandList.Enabled = false;
  26. StartPosBox.Enabled = false;
  27. MoveCommandBox.Enabled = false;
  28. WaitCommandBox.Enabled = false;
  29. FloorSelectBox.Enabled = false;
  30. SaveButton.Enabled = false;
  31. }
  32. private void LoadButton_Click(object sender, EventArgs e)
  33. {
  34. SuspendLayout();
  35. EnemySelectBox.Enabled = false;
  36. CommandList.Enabled = false;
  37. StartPosBox.Enabled = false;
  38. MoveCommandBox.Enabled = false;
  39. WaitCommandBox.Enabled = false;
  40. FloorSelectBox.Enabled = false;
  41. if (File.Exists(FileLocBox.Text))
  42. {
  43. xDoc = XDocument.Load(FileLocBox.Text);
  44. var objectGroups = xDoc.Element("map").Elements("objectgroup");
  45. if (objectGroups != null)
  46. {
  47. FloorSelectBox.Items.Clear();
  48. FloorSelectBox.ClearSelected();
  49. floors = new List<XElement>();
  50. foreach (var objGroup in objectGroups)
  51. {
  52. string groupName = ((string)(objGroup.Attribute("name")));
  53. if (groupName.Contains("Entities"))
  54. {
  55. FloorSelectBox.Items.Add(groupName.Substring(0, 6));
  56. floors.Add(objGroup);
  57. }
  58. }
  59. FloorSelectBox.Enabled = true;
  60. }
  61. else
  62. MessageBox.Show("This is not a valid Map file!");
  63. SaveButton.Enabled = true;
  64. }
  65. else
  66. MessageBox.Show("There is no map at this file location!");
  67. ResumeLayout();
  68. }
  69. private void FloorSelectChanged(object sender, EventArgs e)
  70. {
  71. SuspendLayout();
  72. EnemySelectBox.Enabled = false;
  73. CommandList.Enabled = false;
  74. StartPosBox.Enabled = false;
  75. MoveCommandBox.Enabled = false;
  76. WaitCommandBox.Enabled = false;
  77. EnemySelectBox.Items.Clear();
  78. EnemySelectBox.ClearSelected();
  79. currentFloorObjects = new List<XElement>();
  80. foreach (var obj in floors[FloorSelectBox.SelectedIndex].Elements("object"))
  81. {
  82. if (((string)obj.Attribute("type")) == "Enemy")
  83. {
  84. string objName = ((string)obj.Attribute("name")) != null ? ((string)obj.Attribute("name")) : "Unnamed Enemy";
  85. EnemySelectBox.Items.Add(objName);
  86. currentFloorObjects.Add(obj);
  87. }
  88. }
  89. EnemySelectBox.Enabled = true;
  90. ResumeLayout();
  91. }
  92. private void EnemySelectChanged(object sender, EventArgs e)
  93. {
  94. SuspendLayout();
  95. CommandList.Enabled = false;
  96. StartPosBox.Enabled = false;
  97. MoveCommandBox.Enabled = false;
  98. WaitCommandBox.Enabled = false;
  99. currentCommands = new List<XElement>();
  100. CommandList.Items.Clear();
  101. CommandList.ClearSelected();
  102. var selected = currentFloorObjects[EnemySelectBox.SelectedIndex];
  103. XElement propertiesList;
  104. lastCommandNumber = 1;
  105. if ((propertiesList = selected.Element("properties")) != null)
  106. {
  107. foreach (var property in propertiesList.Elements("property"))
  108. {
  109. string name = (string)property.Attribute("name");
  110. string value = (string)property.Attribute("value");
  111. string viewName;
  112. if (name.Contains("MOVE"))
  113. {
  114. viewName = "MOVE";
  115. }
  116. else if (name.Contains("WAIT"))
  117. {
  118. viewName = "WAIT";
  119. }
  120. else if (name.Contains("END"))
  121. {
  122. viewName = "END";
  123. }
  124. else
  125. //undefined
  126. viewName = "UNDF";
  127. CommandList.Items.Add(viewName + "|" + value);
  128. currentCommands.Add(property);
  129. lastCommandNumber++;
  130. }
  131. }
  132. StartXPosBox.Text = "" + (string)selected.Attribute("x");
  133. StartYPosBox.Text = "" + (string)selected.Attribute("y");
  134. CommandList.Enabled = true;
  135. StartPosBox.Enabled = true;
  136. MoveCommandBox.Enabled = true;
  137. WaitCommandBox.Enabled = true;
  138. ResumeLayout();
  139. }
  140. private void RemoveCommand_Click(object sender, EventArgs e)
  141. {
  142. if (CommandList.SelectedIndex < 0)
  143. return;
  144. currentCommands[CommandList.SelectedIndex].Remove();
  145. currentCommands.RemoveAt(CommandList.SelectedIndex);
  146. CommandList.Items.RemoveAt(CommandList.SelectedIndex);
  147. }
  148. private void MoveAddButton_Click(object sender, EventArgs e)
  149. {
  150. int X, Y, Z;
  151. if (int.TryParse(MoveXPosBox.Text, out X) && int.TryParse(MoveYPosBox.Text, out Y) && int.TryParse(MoveZPosBox.Text, out Z))
  152. {
  153. var newNode = new XElement("property", new XAttribute("name", lastCommandNumber + "MOVE"), new XAttribute("value", ""+X+","+Y+","+Z));
  154. lastCommandNumber++;
  155. currentFloorObjects[EnemySelectBox.SelectedIndex].Element("properties").Add(newNode);
  156. currentCommands.Add(newNode);
  157. CommandList.Items.Add("MOVE|" + X + "," + Y + "," + Z);
  158. }
  159. }
  160. private void WaitAddButton_Click(object sender, EventArgs e)
  161. {
  162. int waitTime;
  163. if (int.TryParse(WaitCommandTextBox.Text, out waitTime))
  164. {
  165. var newNode = new XElement("property", new XAttribute("name", lastCommandNumber + "WAIT"), new XAttribute("value", "" + waitTime));
  166. lastCommandNumber++;
  167. currentFloorObjects[EnemySelectBox.SelectedIndex].Element("properties").Add(newNode);
  168. currentCommands.Add(newNode);
  169. CommandList.Items.Add("WAIT|" + waitTime);
  170. }
  171. }
  172. private void StartPosChange_Click(object sender, EventArgs e)
  173. {
  174. int X, Y;
  175. if (int.TryParse(MoveXPosBox.Text, out X) && int.TryParse(MoveYPosBox.Text, out Y))
  176. {
  177. currentFloorObjects[EnemySelectBox.SelectedIndex].Attribute("x").SetValue(X);
  178. currentFloorObjects[EnemySelectBox.SelectedIndex].Attribute("y").SetValue(Y);
  179. }
  180. }
  181. private void SaveButton_Click(object sender, EventArgs e)
  182. {
  183. xDoc.Save(FileLocBox.Text);
  184. }
  185. private void FixCommands_Click(object sender, EventArgs e)
  186. {
  187. EnemySelectBox.Enabled = false;
  188. CommandList.Enabled = false;
  189. StartPosBox.Enabled = false;
  190. MoveCommandBox.Enabled = false;
  191. WaitCommandBox.Enabled = false;
  192. foreach (var floor in floors)
  193. {
  194. foreach (var obj in floor.Elements("object"))
  195. {
  196. if (((string)obj.Attribute("type")) == "Enemy")
  197. {
  198. List<XElement> propertyList = (obj.Element("properties").Elements("property")).ToList<XElement>();
  199. foreach (var element in propertyList)
  200. {
  201. element.Remove();
  202. }
  203. QuicksortCommands(propertyList);
  204. foreach (var element in propertyList)
  205. {
  206. obj.Element("properties").Add(element);
  207. }
  208. }
  209. }
  210. }
  211. }
  212. private int GetCommandNumber(XElement element)
  213. {
  214. string name = (string)element.Attribute("name");
  215. int ret = int.MaxValue;
  216. for (int i = 0; i < name.Length; i++)
  217. {
  218. int tmp;
  219. if (int.TryParse(name.Substring(0,i), out tmp))
  220. ret = tmp;
  221. }
  222. return ret;
  223. }
  224. private void QuicksortCommands(List<XElement> list)
  225. {
  226. if (list.Count < 1)
  227. return;
  228. QuicksortCommands(list, 0, list.Count - 1);
  229. }
  230. public void QuicksortCommands(List<XElement> elements, int start, int end)
  231. {
  232. int left = start;
  233. int right = end;
  234. int mid = GetCommandNumber(elements[(start + end) / 2]);
  235. //Partition the parts
  236. while (left <= right)
  237. {
  238. while (GetCommandNumber(elements[left]) < mid)
  239. {
  240. left++;
  241. }
  242. while (GetCommandNumber(elements[right]) > mid)
  243. {
  244. right--;
  245. }
  246. if (left <= right)
  247. {
  248. //Swap the parts
  249. XElement tmp = elements[left];
  250. elements[left] = elements[right];
  251. elements[right] = tmp;
  252. left++;
  253. right--;
  254. }
  255. }
  256. //Recursion
  257. if (start < right)
  258. {
  259. QuicksortCommands(elements, start, right);
  260. }
  261. if (left < end)
  262. {
  263. QuicksortCommands(elements, left, end);
  264. }
  265. }
  266. }
  267. }