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