TriggersDialog.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. //
  2. // Copyright 2020 Electronic Arts Inc.
  3. //
  4. // The Command & Conquer Map Editor and corresponding source code is free
  5. // software: you can redistribute it and/or modify it under the terms of
  6. // the GNU General Public License as published by the Free Software Foundation,
  7. // either version 3 of the License, or (at your option) any later version.
  8. // The Command & Conquer Map Editor and corresponding source code is distributed
  9. // in the hope that it will be useful, but with permitted additional restrictions
  10. // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
  11. // distributed with this program. You should have received a copy of the
  12. // GNU General Public License along with permitted additional restrictions
  13. // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
  14. using MobiusEditor.Interface;
  15. using MobiusEditor.Model;
  16. using MobiusEditor.Utility;
  17. using System;
  18. using System.Collections.Generic;
  19. using System.Data;
  20. using System.Linq;
  21. using System.Windows.Forms;
  22. namespace MobiusEditor.Dialogs
  23. {
  24. public partial class TriggersDialog : Form
  25. {
  26. private readonly IGamePlugin plugin;
  27. private readonly int maxTriggers;
  28. private readonly List<Trigger> triggers;
  29. public IEnumerable<Trigger> Triggers => triggers;
  30. private ListViewItem SelectedItem => (triggersListView.SelectedItems.Count > 0) ? triggersListView.SelectedItems[0] : null;
  31. private Trigger SelectedTrigger => SelectedItem?.Tag as Trigger;
  32. public TriggersDialog(IGamePlugin plugin, int maxTriggers)
  33. {
  34. this.plugin = plugin;
  35. this.maxTriggers = maxTriggers;
  36. InitializeComponent();
  37. switch (plugin.GameType)
  38. {
  39. case GameType.TiberianDawn:
  40. existenceLabel.Text = "Loop";
  41. event1Label.Text = "Event";
  42. action1Label.Text = "Action";
  43. typeLabel.Visible = typeComboBox.Visible = false;
  44. event2Label.Visible = event2ComboBox.Visible = event2Flp.Visible = false;
  45. action2Label.Visible = action2ComboBox.Visible = action2Flp.Visible = false;
  46. break;
  47. case GameType.RedAlert:
  48. teamLabel.Visible = teamComboBox.Visible = false;
  49. break;
  50. }
  51. triggers = new List<Trigger>(plugin.Map.Triggers.Select(t => t.Clone()));
  52. triggersListView.BeginUpdate();
  53. {
  54. foreach (var trigger in triggers)
  55. {
  56. var item = new ListViewItem(trigger.Name)
  57. {
  58. Tag = trigger
  59. };
  60. triggersListView.Items.Add(item).ToolTipText = trigger.Name;
  61. }
  62. }
  63. triggersListView.EndUpdate();
  64. string[] existenceNames = Enum.GetNames(typeof(TriggerPersistantType));
  65. switch (plugin.GameType)
  66. {
  67. case GameType.TiberianDawn:
  68. existenceNames = new string[] { "No", "And", "Or" };
  69. break;
  70. case GameType.RedAlert:
  71. existenceNames = new string[] { "Temporary", "Semi-Constant", "Constant" };
  72. break;
  73. }
  74. string[] typeNames = new string[]
  75. {
  76. "E => A1 [+ A2]",
  77. "E1 && E2 => A1 [+ A2]",
  78. "E1 || E2 => A1 [+ A2]",
  79. "E1 => A1; E2 => A2",
  80. };
  81. houseComboBox.DataSource = "None".Yield().Concat(plugin.Map.Houses.Select(t => t.Type.Name)).ToArray();
  82. existenceComboBox.DataSource = Enum.GetValues(typeof(TriggerPersistantType)).Cast<int>()
  83. .Select(v => new { Name = existenceNames[v], Value = (TriggerPersistantType)v })
  84. .ToArray();
  85. typeComboBox.DataSource = Enum.GetValues(typeof(TriggerMultiStyleType)).Cast<int>()
  86. .Select(v => new { Name = typeNames[v], Value = (TriggerMultiStyleType)v })
  87. .ToArray();
  88. event1ComboBox.DataSource = plugin.Map.EventTypes.Where(t => !string.IsNullOrEmpty(t)).ToArray();
  89. event2ComboBox.DataSource = plugin.Map.EventTypes.Where(t => !string.IsNullOrEmpty(t)).ToArray();
  90. action1ComboBox.DataSource = plugin.Map.ActionTypes.Where(t => !string.IsNullOrEmpty(t)).ToArray();
  91. action2ComboBox.DataSource = plugin.Map.ActionTypes.Where(t => !string.IsNullOrEmpty(t)).ToArray();
  92. teamComboBox.DataSource = "None".Yield().Concat(plugin.Map.TeamTypes.Select(t => t.Name)).ToArray();
  93. triggersTableLayoutPanel.Visible = false;
  94. }
  95. private void triggersListView_SelectedIndexChanged(object sender, EventArgs e)
  96. {
  97. houseComboBox.DataBindings.Clear();
  98. existenceComboBox.DataBindings.Clear();
  99. typeComboBox.DataBindings.Clear();
  100. event1ComboBox.DataBindings.Clear();
  101. event2ComboBox.DataBindings.Clear();
  102. action1ComboBox.DataBindings.Clear();
  103. action2ComboBox.DataBindings.Clear();
  104. teamComboBox.DataBindings.Clear();
  105. if (SelectedTrigger != null)
  106. {
  107. houseComboBox.DataBindings.Add("SelectedItem", SelectedTrigger, "House");
  108. existenceComboBox.DataBindings.Add("SelectedValue", SelectedTrigger, "PersistantType");
  109. event1ComboBox.DataBindings.Add("SelectedItem", SelectedTrigger.Event1, "EventType");
  110. action1ComboBox.DataBindings.Add("SelectedItem", SelectedTrigger.Action1, "ActionType");
  111. UpdateTriggerControls(SelectedTrigger,
  112. SelectedTrigger?.Event1, SelectedTrigger?.Action1,
  113. event1ComboBox, event1Nud, event1ValueComboBox,
  114. action1ComboBox, action1Nud, action1ValueComboBox);
  115. switch (plugin.GameType)
  116. {
  117. case GameType.TiberianDawn:
  118. teamComboBox.DataBindings.Add("SelectedItem", SelectedTrigger.Action1, "Team");
  119. break;
  120. case GameType.RedAlert:
  121. typeComboBox.DataBindings.Add("SelectedValue", SelectedTrigger, "EventControl");
  122. event2ComboBox.DataBindings.Add("SelectedItem", SelectedTrigger.Event2, "EventType");
  123. action2ComboBox.DataBindings.Add("SelectedItem", SelectedTrigger.Action2, "ActionType");
  124. UpdateTriggerControls(SelectedTrigger,
  125. SelectedTrigger?.Event2, SelectedTrigger?.Action2,
  126. event2ComboBox, event2Nud, event2ValueComboBox,
  127. action2ComboBox, action2Nud, action2ValueComboBox);
  128. break;
  129. }
  130. triggersTableLayoutPanel.Visible = true;
  131. }
  132. else
  133. {
  134. triggersTableLayoutPanel.Visible = false;
  135. }
  136. }
  137. private void teamTypesListView_MouseDown(object sender, MouseEventArgs e)
  138. {
  139. if (e.Button == MouseButtons.Right)
  140. {
  141. var hitTest = triggersListView.HitTest(e.Location);
  142. bool canAdd = (hitTest.Item == null) && (triggersListView.Items.Count < maxTriggers);
  143. bool canRemove = hitTest.Item != null;
  144. addTriggerToolStripMenuItem.Visible = canAdd;
  145. removeTriggerToolStripMenuItem.Visible = canRemove;
  146. if (canAdd || canRemove)
  147. {
  148. triggersContextMenuStrip.Show(Cursor.Position);
  149. }
  150. }
  151. }
  152. private void teamTypesListView_KeyDown(object sender, KeyEventArgs e)
  153. {
  154. if ((e.KeyData == Keys.F2) && (triggersListView.SelectedItems.Count > 0))
  155. {
  156. triggersListView.SelectedItems[0].BeginEdit();
  157. }
  158. }
  159. private void addTriggerToolStripMenuItem_Click(object sender, EventArgs e)
  160. {
  161. var nameChars = Enumerable.Range(97, 26).Concat(Enumerable.Range(48, 10));
  162. string name = string.Empty;
  163. foreach (var nameChar in nameChars)
  164. {
  165. name = new string((char)nameChar, 4);
  166. if (!triggers.Where(t => t.Equals(name)).Any())
  167. {
  168. break;
  169. }
  170. }
  171. var trigger = new Trigger { Name = name, House = plugin.Map.HouseTypes.First().Name };
  172. var item = new ListViewItem(trigger.Name)
  173. {
  174. Tag = trigger
  175. };
  176. triggers.Add(trigger);
  177. triggersListView.Items.Add(item).ToolTipText = trigger.Name;
  178. item.Selected = true;
  179. item.BeginEdit();
  180. }
  181. private void removeTriggerToolStripMenuItem_Click(object sender, EventArgs e)
  182. {
  183. if (SelectedItem != null)
  184. {
  185. triggers.Remove(SelectedTrigger);
  186. triggersListView.Items.Remove(SelectedItem);
  187. }
  188. }
  189. private void teamTypesListView_AfterLabelEdit(object sender, LabelEditEventArgs e)
  190. {
  191. int maxLength = int.MaxValue;
  192. switch (plugin.GameType)
  193. {
  194. case GameType.TiberianDawn:
  195. maxLength = 4;
  196. break;
  197. case GameType.RedAlert:
  198. maxLength = 23;
  199. break;
  200. }
  201. if (string.IsNullOrEmpty(e.Label))
  202. {
  203. e.CancelEdit = true;
  204. }
  205. else if (e.Label.Length > maxLength)
  206. {
  207. e.CancelEdit = true;
  208. MessageBox.Show(string.Format("Trigger name is longer than {0} characters.", maxLength), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  209. }
  210. else if (triggers.Where(t => (t != SelectedTrigger) && t.Equals(e.Label)).Any())
  211. {
  212. e.CancelEdit = true;
  213. MessageBox.Show(string.Format("Trigger with name '{0]' already exists", e.Label), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  214. }
  215. else
  216. {
  217. SelectedTrigger.Name = e.Label;
  218. triggersListView.Items[e.Item].ToolTipText = SelectedTrigger.Name;
  219. }
  220. }
  221. private void typeComboBox_SelectedValueChanged(object sender, EventArgs e)
  222. {
  223. if (plugin.GameType == GameType.RedAlert)
  224. {
  225. var eventType = (TriggerMultiStyleType)typeComboBox.SelectedValue;
  226. event2Label.Visible = event2ComboBox.Visible = event2Flp.Visible = eventType != TriggerMultiStyleType.Only;
  227. }
  228. }
  229. private void trigger1ComboBox_SelectedIndexChanged(object sender, EventArgs e)
  230. {
  231. UpdateTriggerControls(SelectedTrigger,
  232. SelectedTrigger?.Event1, SelectedTrigger?.Action1,
  233. event1ComboBox, event1Nud, event1ValueComboBox,
  234. action1ComboBox, action1Nud, action1ValueComboBox);
  235. }
  236. private void trigger2ComboBox_SelectedIndexChanged(object sender, EventArgs e)
  237. {
  238. UpdateTriggerControls(SelectedTrigger,
  239. SelectedTrigger?.Event2, SelectedTrigger?.Action2,
  240. event2ComboBox, event2Nud, event2ValueComboBox,
  241. action2ComboBox, action2Nud, action2ValueComboBox);
  242. }
  243. private void UpdateTriggerControls(Trigger trigger, TriggerEvent triggerEvent, TriggerAction triggerAction, ComboBox eventComboBox, NumericUpDown eventNud, ComboBox eventValueComboBox, ComboBox actionComboBox, NumericUpDown actionNud, ComboBox actionValueComboBox)
  244. {
  245. eventNud.Visible = false;
  246. eventNud.DataBindings.Clear();
  247. eventValueComboBox.Visible = false;
  248. eventValueComboBox.DataBindings.Clear();
  249. eventValueComboBox.DataSource = null;
  250. eventValueComboBox.DisplayMember = null;
  251. eventValueComboBox.ValueMember = null;
  252. if (triggerEvent != null)
  253. {
  254. switch (plugin.GameType)
  255. {
  256. case GameType.TiberianDawn:
  257. switch (eventComboBox.SelectedItem)
  258. {
  259. case TiberianDawn.EventTypes.EVENT_TIME:
  260. case TiberianDawn.EventTypes.EVENT_CREDITS:
  261. case TiberianDawn.EventTypes.EVENT_NUNITS_DESTROYED:
  262. case TiberianDawn.EventTypes.EVENT_NBUILDINGS_DESTROYED:
  263. eventNud.Visible = true;
  264. eventNud.DataBindings.Add("Value", triggerEvent, "Data");
  265. break;
  266. case TiberianDawn.EventTypes.EVENT_BUILD:
  267. eventValueComboBox.Visible = true;
  268. eventValueComboBox.DisplayMember = "Name";
  269. eventValueComboBox.ValueMember = "Value";
  270. eventValueComboBox.DataSource = plugin.Map.BuildingTypes.Select(t => new { Name = t.DisplayName, Value = (long)t.ID }).ToArray();
  271. eventValueComboBox.DataBindings.Add("SelectedValue", triggerEvent, "Data");
  272. break;
  273. default:
  274. break;
  275. }
  276. break;
  277. case GameType.RedAlert:
  278. switch (eventComboBox.SelectedItem)
  279. {
  280. case RedAlert.EventTypes.TEVENT_LEAVES_MAP:
  281. eventValueComboBox.Visible = true;
  282. eventValueComboBox.DataSource = plugin.Map.TeamTypes.Select(t => t.Name).ToArray();
  283. eventValueComboBox.DataBindings.Add("SelectedItem", triggerEvent, "Team");
  284. break;
  285. case RedAlert.EventTypes.TEVENT_PLAYER_ENTERED:
  286. case RedAlert.EventTypes.TEVENT_CROSS_HORIZONTAL:
  287. case RedAlert.EventTypes.TEVENT_CROSS_VERTICAL:
  288. case RedAlert.EventTypes.TEVENT_ENTERS_ZONE:
  289. case RedAlert.EventTypes.TEVENT_LOW_POWER:
  290. case RedAlert.EventTypes.TEVENT_THIEVED:
  291. case RedAlert.EventTypes.TEVENT_HOUSE_DISCOVERED:
  292. case RedAlert.EventTypes.TEVENT_BUILDINGS_DESTROYED:
  293. case RedAlert.EventTypes.TEVENT_UNITS_DESTROYED:
  294. case RedAlert.EventTypes.TEVENT_ALL_DESTROYED:
  295. eventValueComboBox.Visible = true;
  296. eventValueComboBox.DisplayMember = "Name";
  297. eventValueComboBox.ValueMember = "Value";
  298. eventValueComboBox.DataSource = new { Name = "None", Value = (long)-1 }.Yield().Concat(plugin.Map.Houses.Select(t => new { t.Type.Name, Value = (long)t.Type.ID })).ToArray();
  299. eventValueComboBox.DataBindings.Add("SelectedValue", triggerEvent, "Data");
  300. break;
  301. case RedAlert.EventTypes.TEVENT_BUILDING_EXISTS:
  302. case RedAlert.EventTypes.TEVENT_BUILD:
  303. eventValueComboBox.Visible = true;
  304. eventValueComboBox.DisplayMember = "Name";
  305. eventValueComboBox.ValueMember = "Value";
  306. eventValueComboBox.DataSource = plugin.Map.BuildingTypes.Select(t => new { Name = t.DisplayName, Value = (long)t.ID }).ToArray();
  307. eventValueComboBox.DataBindings.Add("SelectedValue", triggerEvent, "Data");
  308. break;
  309. case RedAlert.EventTypes.TEVENT_BUILD_UNIT:
  310. eventValueComboBox.Visible = true;
  311. eventValueComboBox.DisplayMember = "Name";
  312. eventValueComboBox.ValueMember = "Value";
  313. eventValueComboBox.DataSource = plugin.Map.UnitTypes.Where(t => t.IsUnit).Select(t => new { Name = t.DisplayName, Value = (long)t.ID }).ToArray();
  314. eventValueComboBox.DataBindings.Add("SelectedValue", triggerEvent, "Data");
  315. break;
  316. case RedAlert.EventTypes.TEVENT_BUILD_INFANTRY:
  317. eventValueComboBox.Visible = true;
  318. eventValueComboBox.DisplayMember = "Name";
  319. eventValueComboBox.ValueMember = "Value";
  320. eventValueComboBox.DataSource = plugin.Map.InfantryTypes.Select(t => new { Name = t.DisplayName, Value = (long)t.ID }).ToArray();
  321. eventValueComboBox.DataBindings.Add("SelectedValue", triggerEvent, "Data");
  322. break;
  323. case RedAlert.EventTypes.TEVENT_BUILD_AIRCRAFT:
  324. eventValueComboBox.Visible = true;
  325. eventValueComboBox.DisplayMember = "Name";
  326. eventValueComboBox.ValueMember = "Value";
  327. eventValueComboBox.DataSource = plugin.Map.UnitTypes.Where(t => t.IsAircraft).Select(t => new { Name = t.DisplayName, Value = (long)t.ID }).ToArray();
  328. eventValueComboBox.DataBindings.Add("SelectedValue", triggerEvent, "Data");
  329. break;
  330. case RedAlert.EventTypes.TEVENT_NUNITS_DESTROYED:
  331. case RedAlert.EventTypes.TEVENT_NBUILDINGS_DESTROYED:
  332. case RedAlert.EventTypes.TEVENT_CREDITS:
  333. case RedAlert.EventTypes.TEVENT_TIME:
  334. case RedAlert.EventTypes.TEVENT_GLOBAL_SET:
  335. case RedAlert.EventTypes.TEVENT_GLOBAL_CLEAR:
  336. eventNud.Visible = true;
  337. eventNud.DataBindings.Add("Value", triggerEvent, "Data");
  338. break;
  339. default:
  340. break;
  341. }
  342. break;
  343. }
  344. }
  345. actionNud.Visible = false;
  346. actionNud.DataBindings.Clear();
  347. actionNud.Minimum = long.MinValue;
  348. actionNud.Maximum = long.MaxValue;
  349. actionValueComboBox.Visible = false;
  350. actionValueComboBox.DataBindings.Clear();
  351. actionValueComboBox.DataSource = null;
  352. actionValueComboBox.DisplayMember = null;
  353. actionValueComboBox.ValueMember = null;
  354. if (triggerAction != null)
  355. {
  356. switch (plugin.GameType)
  357. {
  358. case GameType.RedAlert:
  359. switch (actionComboBox.SelectedItem)
  360. {
  361. case RedAlert.ActionTypes.TACTION_CREATE_TEAM:
  362. case RedAlert.ActionTypes.TACTION_DESTROY_TEAM:
  363. case RedAlert.ActionTypes.TACTION_REINFORCEMENTS:
  364. actionValueComboBox.Visible = true;
  365. actionValueComboBox.DataSource = plugin.Map.TeamTypes.Select(t => t.Name).ToArray();
  366. actionValueComboBox.DataBindings.Add("SelectedItem", triggerAction, "Team");
  367. break;
  368. case RedAlert.ActionTypes.TACTION_WIN:
  369. case RedAlert.ActionTypes.TACTION_LOSE:
  370. case RedAlert.ActionTypes.TACTION_BEGIN_PRODUCTION:
  371. case RedAlert.ActionTypes.TACTION_FIRE_SALE:
  372. case RedAlert.ActionTypes.TACTION_AUTOCREATE:
  373. case RedAlert.ActionTypes.TACTION_ALL_HUNT:
  374. actionValueComboBox.Visible = true;
  375. actionValueComboBox.DisplayMember = "Name";
  376. actionValueComboBox.ValueMember = "Value";
  377. actionValueComboBox.DataSource = new { Name = "None", Value = (long)-1 }.Yield().Concat(plugin.Map.Houses.Select(t => new { t.Type.Name, Value = (long)t.Type.ID })).ToArray();
  378. actionValueComboBox.DataBindings.Add("SelectedValue", triggerAction, "Data");
  379. break;
  380. case RedAlert.ActionTypes.TACTION_FORCE_TRIGGER:
  381. case RedAlert.ActionTypes.TACTION_DESTROY_TRIGGER:
  382. actionValueComboBox.Visible = true;
  383. actionValueComboBox.DataSource = plugin.Map.Triggers.Select(t => t.Name).ToArray();
  384. actionValueComboBox.DataBindings.Add("SelectedItem", triggerAction, "Trigger");
  385. break;
  386. case RedAlert.ActionTypes.TACTION_DZ:
  387. case RedAlert.ActionTypes.TACTION_REVEAL_SOME:
  388. case RedAlert.ActionTypes.TACTION_REVEAL_ZONE:
  389. actionValueComboBox.Visible = true;
  390. actionValueComboBox.DisplayMember = "Name";
  391. actionValueComboBox.ValueMember = "Value";
  392. actionValueComboBox.DataSource = new { Name = "None", Value = (long)-1 }.Yield().Concat(plugin.Map.Waypoints.Select((t, i) => new { t.Name, Value = (long)i })).ToArray();
  393. actionValueComboBox.DataBindings.Add("SelectedValue", triggerAction, "Data");
  394. break;
  395. case RedAlert.ActionTypes.TACTION_1_SPECIAL:
  396. case RedAlert.ActionTypes.TACTION_FULL_SPECIAL:
  397. actionValueComboBox.Visible = true;
  398. actionValueComboBox.DisplayMember = "Name";
  399. actionValueComboBox.ValueMember = "Value";
  400. actionValueComboBox.DataSource = Enum.GetValues(typeof(RedAlert.ActionDataTypes.SpecialWeaponType)).Cast<int>()
  401. .Select(v => new { Name = Enum.GetName(typeof(RedAlert.ActionDataTypes.SpecialWeaponType), v), Value = (long)v })
  402. .ToArray();
  403. actionValueComboBox.DataBindings.Add("SelectedValue", triggerAction, "Data");
  404. break;
  405. case RedAlert.ActionTypes.TACTION_PLAY_MUSIC:
  406. actionValueComboBox.Visible = true;
  407. actionValueComboBox.DisplayMember = "Name";
  408. actionValueComboBox.ValueMember = "Value";
  409. actionValueComboBox.DataSource = Enum.GetValues(typeof(RedAlert.ActionDataTypes.ThemeType)).Cast<int>()
  410. .Select(v => new { Name = Enum.GetName(typeof(RedAlert.ActionDataTypes.ThemeType), v), Value = (long)v })
  411. .ToArray();
  412. actionValueComboBox.DataBindings.Add("SelectedValue", triggerAction, "Data");
  413. break;
  414. case RedAlert.ActionTypes.TACTION_PLAY_MOVIE:
  415. actionValueComboBox.Visible = true;
  416. actionValueComboBox.DisplayMember = "Name";
  417. actionValueComboBox.ValueMember = "Value";
  418. actionValueComboBox.DataSource = Enum.GetValues(typeof(RedAlert.ActionDataTypes.VQType)).Cast<int>()
  419. .Select(v => new { Name = Enum.GetName(typeof(RedAlert.ActionDataTypes.VQType), v), Value = (long)v })
  420. .ToArray();
  421. actionValueComboBox.DataBindings.Add("SelectedValue", triggerAction, "Data");
  422. break;
  423. case RedAlert.ActionTypes.TACTION_PLAY_SOUND:
  424. actionValueComboBox.Visible = true;
  425. actionValueComboBox.DisplayMember = "Name";
  426. actionValueComboBox.ValueMember = "Value";
  427. actionValueComboBox.DataSource = Enum.GetValues(typeof(RedAlert.ActionDataTypes.VocType)).Cast<int>()
  428. .Select(v => new { Name = Enum.GetName(typeof(RedAlert.ActionDataTypes.VocType), v), Value = (long)v })
  429. .ToArray();
  430. actionValueComboBox.DataBindings.Add("SelectedValue", triggerAction, "Data");
  431. break;
  432. case RedAlert.ActionTypes.TACTION_PLAY_SPEECH:
  433. actionValueComboBox.Visible = true;
  434. actionValueComboBox.DisplayMember = "Name";
  435. actionValueComboBox.ValueMember = "Value";
  436. actionValueComboBox.DataSource = Enum.GetValues(typeof(RedAlert.ActionDataTypes.VoxType)).Cast<int>()
  437. .Select(v => new { Name = Enum.GetName(typeof(RedAlert.ActionDataTypes.VoxType), v), Value = (long)v })
  438. .ToArray();
  439. actionValueComboBox.DataBindings.Add("SelectedValue", triggerAction, "Data");
  440. break;
  441. case RedAlert.ActionTypes.TACTION_PREFERRED_TARGET:
  442. actionValueComboBox.Visible = true;
  443. actionValueComboBox.DisplayMember = "Name";
  444. actionValueComboBox.ValueMember = "Value";
  445. actionValueComboBox.DataSource = Enum.GetValues(typeof(RedAlert.ActionDataTypes.QuarryType)).Cast<int>()
  446. .Select(v => new { Name = Enum.GetName(typeof(RedAlert.ActionDataTypes.QuarryType), v), Value = (long)v })
  447. .ToArray();
  448. actionValueComboBox.DataBindings.Add("SelectedValue", triggerAction, "Data");
  449. break;
  450. case RedAlert.ActionTypes.TACTION_TEXT_TRIGGER:
  451. actionNud.Visible = true;
  452. actionNud.Minimum = 1;
  453. actionNud.Maximum = 209;
  454. actionNud.DataBindings.Add("Value", triggerAction, "Data");
  455. break;
  456. case RedAlert.ActionTypes.TACTION_ADD_TIMER:
  457. case RedAlert.ActionTypes.TACTION_SUB_TIMER:
  458. case RedAlert.ActionTypes.TACTION_SET_TIMER:
  459. case RedAlert.ActionTypes.TACTION_SET_GLOBAL:
  460. case RedAlert.ActionTypes.TACTION_CLEAR_GLOBAL:
  461. case RedAlert.ActionTypes.TACTION_BASE_BUILDING:
  462. actionNud.Visible = true;
  463. actionNud.DataBindings.Add("Value", triggerAction, "Data");
  464. break;
  465. default:
  466. break;
  467. }
  468. break;
  469. }
  470. }
  471. }
  472. }
  473. }