CnC_Remastered_Collection

Command and Conquer: Red Alert
Log | Files | Refs | README | LICENSE

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 }