예제 #1
0
        public bool AddValue(object objectValue, bool add, List<uint> addresses = null)
        {
            double? changeValueNullable = ParsingUtilities.ParseDoubleNullable(objectValue);
            if (!changeValueNullable.HasValue) return false;
            double changeValue = changeValueNullable.Value;

            List<object> currentValues = _watchVar.GetValues(addresses);
            List<double?> currentValuesDoubleNullable =
                currentValues.ConvertAll(
                    currentValue => ParsingUtilities.ParseDoubleNullable(currentValue));
            List<object> newValues = currentValuesDoubleNullable.ConvertAll(currentValueDoubleNullable =>
            {
                if (!currentValueDoubleNullable.HasValue) return null;
                double currentValueDouble = currentValueDoubleNullable.Value;
                object convertedValue = ConvertValue(currentValueDouble, false, false);
                // TODO tyler fix this for float logic
                double convertedValueDouble = ParsingUtilities.ParseDouble(convertedValue);
                double modifiedValue = convertedValueDouble + changeValue * (add ? +1 : -1);
                object unconvertedValue = UnconvertValue(modifiedValue);
                return unconvertedValue;
            });

            bool success = _watchVar.SetValues(newValues, addresses);
            if (success && GetLockedBool(addresses))
                WatchVariableLockManager.UpdateLockValues(_watchVar, newValues, addresses);
            return success;
        }
예제 #2
0
        public bool AddValue(object objectValue, bool add, List <uint> addresses = null)
        {
            double?changeValueNullable = ParsingUtilities.ParseDoubleNullable(objectValue);

            if (!changeValueNullable.HasValue)
            {
                return(false);
            }
            double changeValue = changeValueNullable.Value;

            List <object> currentValues   = GetVerifiedValues(addresses);
            List <object> convertedValues = currentValues.ConvertAll(
                currentValue => ConvertValue(currentValue, false, false));
            List <double?> convertedValuesDoubleNullable =
                convertedValues.ConvertAll(
                    convertedValue => ParsingUtilities.ParseDoubleNullable(convertedValue));
            List <object> newValues = convertedValuesDoubleNullable.ConvertAll(convertedValueDoubleNullable =>
            {
                if (!convertedValueDoubleNullable.HasValue)
                {
                    return(null);
                }
                double convertedValueDouble = convertedValueDoubleNullable.Value;
                double modifiedValue        = convertedValueDouble + changeValue * (add ? +1 : -1);
                object unconvertedValue     = UnconvertValue(modifiedValue);
                return(unconvertedValue);
            });

            return(WatchVar.SetValues(newValues, addresses));
        }
예제 #3
0
        public override ContextMenuStrip GetContextMenuStrip()
        {
            if (_contextMenuStrip == null)
            {
                string suffix = string.Format(" ({0})", _radius);
                _itemSetRadius        = new ToolStripMenuItem(SET_RADIUS_TEXT + suffix);
                _itemSetRadius.Click += (sender, e) =>
                {
                    string text   = DialogUtilities.GetStringFromDialog(labelText: "Enter the radius.");
                    double?radius = ParsingUtilities.ParseDoubleNullable(text);
                    if (!radius.HasValue)
                    {
                        return;
                    }
                    MapObjectSettings settings = new MapObjectSettings(
                        changeCameraViewRadius: true, newCameraViewRadius: radius.Value);
                    GetParentMapTracker().ApplySettings(settings);
                };

                _contextMenuStrip = new ContextMenuStrip();
                _contextMenuStrip.Items.Add(_itemSetRadius);
            }

            return(_contextMenuStrip);
        }
예제 #4
0
        protected override ContextMenuStrip GetContextMenuStrip(MapTracker targetTracker)
        {
            if (_contextMenuStrip == null)
            {
                ToolStripMenuItem itemUseFixedSize = new ToolStripMenuItem("Use Fixed Size");
                itemUseFixedSize.Click += (sender, e) =>
                {
                    _useFixedSize            = !_useFixedSize;
                    itemUseFixedSize.Checked = _useFixedSize;
                };

                ToolStripMenuItem itemSetBackwardsSize = new ToolStripMenuItem("Set Backwards Size...");
                itemSetBackwardsSize.Click += (sender, e) =>
                {
                    string text = DialogUtilities.GetStringFromDialog(labelText: "Enter backwards size.");
                    double?backwardsSizeNullable = ParsingUtilities.ParseDoubleNullable(text);
                    if (!backwardsSizeNullable.HasValue)
                    {
                        return;
                    }
                    _backwardsSize = (float)backwardsSizeNullable.Value;
                };

                _contextMenuStrip = new ContextMenuStrip();
                _contextMenuStrip.Items.Add(itemUseFixedSize);
                _contextMenuStrip.Items.Add(itemSetBackwardsSize);
            }

            return(_contextMenuStrip);
        }
예제 #5
0
        public override ContextMenuStrip GetContextMenuStrip()
        {
            if (_contextMenuStrip == null)
            {
                _itemUseColoredMarios        = new ToolStripMenuItem("Use Colored Marios");
                _itemUseColoredMarios.Click += (sender, e) =>
                {
                    MapObjectSettings settings = new MapObjectSettings(
                        changeNextPositionsUseColoredMarios: true, newNextPositionsUseColoredMarios: !_useColoredMarios);
                    GetParentMapTracker().ApplySettings(settings);
                };
                _itemUseColoredMarios.Checked = _useColoredMarios;

                _itemShowQuarterSteps        = new ToolStripMenuItem("Show Quarter Steps");
                _itemShowQuarterSteps.Click += (sender, e) =>
                {
                    MapObjectSettings settings = new MapObjectSettings(
                        changeShowQuarterSteps: true, newShowQuarterSteps: !_showQuarterSteps);
                    GetParentMapTracker().ApplySettings(settings);
                };
                _itemShowQuarterSteps.Checked = _showQuarterSteps;

                string suffix = string.Format(" ({0})", _numFrames);
                _itemSetNumFrames        = new ToolStripMenuItem(SET_NUM_FRAMES_TEXT + suffix);
                _itemSetNumFrames.Click += (sender, e) =>
                {
                    string text = DialogUtilities.GetStringFromDialog(labelText: "Enter num frames to the nearest 1/4th.");
                    double?numFramesNullable = ParsingUtilities.ParseDoubleNullable(text);
                    if (!numFramesNullable.HasValue)
                    {
                        return;
                    }
                    double            numFrames = numFramesNullable.Value;
                    MapObjectSettings settings  = new MapObjectSettings(
                        changeNextPositionsNumFrames: true, newNextPositionsNumFrames: numFrames);
                    GetParentMapTracker().ApplySettings(settings);
                };

                _itemUsePitch        = new ToolStripMenuItem("Use Pitch");
                _itemUsePitch.Click += (sender, e) =>
                {
                    MapObjectSettings settings = new MapObjectSettings(
                        changeUsePitch: true, newUsePitch: !_usePitch);
                    GetParentMapTracker().ApplySettings(settings);
                };
                _itemUsePitch.Checked = _usePitch;

                _contextMenuStrip = new ContextMenuStrip();
                _contextMenuStrip.Items.Add(_itemUseColoredMarios);
                _contextMenuStrip.Items.Add(_itemShowQuarterSteps);
                _contextMenuStrip.Items.Add(_itemSetNumFrames);
                _contextMenuStrip.Items.Add(_itemUsePitch);
            }

            return(_contextMenuStrip);
        }
예제 #6
0
        protected override CheckState ConvertValueToCheckState(object value)
        {
            double?doubleValueNullable = ParsingUtilities.ParseDoubleNullable(value);

            if (!doubleValueNullable.HasValue)
            {
                return(CheckState.Unchecked);
            }
            double doubleValue = doubleValueNullable.Value;

            return(HandleInverting(doubleValue == 0) ? CheckState.Unchecked : CheckState.Checked);
        }
        protected override object HandleAngleUnconverting(object value)
        {
            double?doubleValueNullable = ParsingUtilities.ParseDoubleNullable(value);

            if (!doubleValueNullable.HasValue)
            {
                return(value);
            }
            double doubleValue = doubleValueNullable.Value;

            doubleValue = (doubleValue / GetAngleUnitTypeMaxValue()) * 65536;

            return(doubleValue);
        }
예제 #8
0
        protected override string HandleAngleUnconverting(string stringValue)
        {
            double?doubleValueNullable = ParsingUtilities.ParseDoubleNullable(stringValue);

            if (!doubleValueNullable.HasValue)
            {
                return(stringValue);
            }
            double doubleValue = doubleValueNullable.Value;

            doubleValue = (doubleValue / GetAngleUnitTypeMaxValue()) * 65536;

            return(doubleValue.ToString());
        }
예제 #9
0
파일: TasTab.cs 프로젝트: chaosBrick/STROOP
        public void SetScheduler(string text, bool useFloats)
        {
            List <string>         lines         = text.Split('\n').ToList();
            List <List <string> > linePartsList = lines.ConvertAll(line => ParsingUtilities.ParseStringList(line));

            Dictionary <uint, (double, double, double, double, List <double>)> schedule =
                new Dictionary <uint, (double, double, double, double, List <double>)>();

            foreach (List <string> lineParts in linePartsList)
            {
                if (lineParts.Count == 0)
                {
                    continue;
                }
                uint?globalTimerNullable = ParsingUtilities.ParseUIntNullable(lineParts[0]);
                if (!globalTimerNullable.HasValue)
                {
                    continue;
                }
                uint globalTimer = globalTimerNullable.Value;

                double x     = lineParts.Count >= 2 ? ParsingUtilities.ParseDoubleNullable(lineParts[1]) ?? Double.NaN : Double.NaN;
                double y     = lineParts.Count >= 3 ? ParsingUtilities.ParseDoubleNullable(lineParts[2]) ?? Double.NaN : Double.NaN;
                double z     = lineParts.Count >= 4 ? ParsingUtilities.ParseDoubleNullable(lineParts[3]) ?? Double.NaN : Double.NaN;
                double angle = lineParts.Count >= 5 ? ParsingUtilities.ParseDoubleNullable(lineParts[4]) ?? Double.NaN : Double.NaN;

                if (useFloats)
                {
                    x     = (float)x;
                    y     = (float)y;
                    z     = (float)z;
                    angle = (float)angle;
                }

                List <double> doubleList = new List <double>();
                for (int i = 5; i < lineParts.Count; i++)
                {
                    double value = ParsingUtilities.ParseDoubleNullable(lineParts[i]) ?? Double.NaN;
                    if (useFloats)
                    {
                        value = (float)value;
                    }
                    doubleList.Add(value);
                }

                schedule[globalTimer] = (x, y, z, angle, doubleList);
            }

            SetScheduler(schedule);
        }
예제 #10
0
        protected override string HandleNegating(string stringValue)
        {
            double?doubleValueNullable = ParsingUtilities.ParseDoubleNullable(stringValue);

            if (!doubleValueNullable.HasValue)
            {
                return(stringValue);
            }
            double doubleValue = doubleValueNullable.Value;

            if (_displayAsNegated)
            {
                doubleValue = -1 * doubleValue;
            }
            return(doubleValue.ToString());
        }
예제 #11
0
        protected override string HandleRounding(string stringValue)
        {
            double?doubleValueNullable = ParsingUtilities.ParseDoubleNullable(stringValue);

            if (!doubleValueNullable.HasValue)
            {
                return(stringValue);
            }
            double doubleValue = doubleValueNullable.Value;

            if (_roundingLimit.HasValue)
            {
                doubleValue = Math.Round(doubleValue, _roundingLimit.Value);
            }
            return(doubleValue.ToString());
        }
예제 #12
0
        protected override string HandleAngleRoundingOut(string stringValue)
        {
            double?doubleValueNullable = ParsingUtilities.ParseDoubleNullable(stringValue);

            if (!doubleValueNullable.HasValue)
            {
                return(stringValue);
            }
            double doubleValue = doubleValueNullable.Value;

            if (doubleValue == GetAngleUnitTypeAndMaybeSignedMaxValue())
            {
                doubleValue = GetAngleUnitTypeAndMaybeSignedMinValue();
            }

            return(doubleValue.ToString());
        }
        protected override object HandleAngleConverting(object value)
        {
            double?doubleValueNullable = ParsingUtilities.ParseDoubleNullable(value);

            if (!doubleValueNullable.HasValue)
            {
                return(value);
            }
            double doubleValue = doubleValueNullable.Value;

            if (_truncateToMultipleOf16)
            {
                doubleValue = MoreMath.TruncateToMultipleOf16(doubleValue);
            }
            doubleValue = MoreMath.NormalizeAngleUsingType(doubleValue, _effectiveType);
            doubleValue = (doubleValue / 65536) * GetAngleUnitTypeMaxValue();

            return(doubleValue);
        }
예제 #14
0
        protected override string HandleAngleConverting(string stringValue)
        {
            double?doubleValueNullable = ParsingUtilities.ParseDoubleNullable(stringValue);

            if (!doubleValueNullable.HasValue)
            {
                return(stringValue);
            }
            double doubleValue = doubleValueNullable.Value;

            if (_truncateToMultipleOf16 != (_angleUnitType == AngleUnitType.HAU))
            {
                doubleValue = MoreMath.TruncateToMultipleOf16(doubleValue);
            }
            doubleValue = MoreMath.NormalizeAngleUsingType(doubleValue, _effectiveType);
            doubleValue = (doubleValue / 65536) * GetAngleUnitTypeMaxValue();

            return(doubleValue.ToString());
        }
예제 #15
0
        protected override ContextMenuStrip GetContextMenuStrip(MapTracker targetTracker)
        {
            if (_contextMenuStrip == null)
            {
                ToolStripMenuItem itemUseColoredMarios = new ToolStripMenuItem("Use Colored Marios");
                itemUseColoredMarios.Click += (sender, e) =>
                {
                    _useColoredMarios            = !_useColoredMarios;
                    itemUseColoredMarios.Checked = _useColoredMarios;
                };
                itemUseColoredMarios.Checked = _useColoredMarios;

                ToolStripMenuItem itemShowQuarterSteps = new ToolStripMenuItem("Show Quarter Steps");
                itemShowQuarterSteps.Click += (sender, e) =>
                {
                    _showQuarterSteps            = !_showQuarterSteps;
                    itemShowQuarterSteps.Checked = _showQuarterSteps;
                };
                itemShowQuarterSteps.Checked = _showQuarterSteps;

                ToolStripMenuItem itemSetNumFrames = new ToolStripMenuItem("Set Num Frames...");
                itemSetNumFrames.Click += (sender, e) =>
                {
                    string text = DialogUtilities.GetStringFromDialog(labelText: "Enter num frames to the nearest 1/4th.");
                    double?numFramesNullable = ParsingUtilities.ParseDoubleNullable(text);
                    if (!numFramesNullable.HasValue)
                    {
                        return;
                    }
                    double numFrames = numFramesNullable.Value;
                    _numFrames = numFrames;
                };

                _contextMenuStrip = new ContextMenuStrip();
                _contextMenuStrip.Items.Add(itemUseColoredMarios);
                _contextMenuStrip.Items.Add(itemShowQuarterSteps);
                _contextMenuStrip.Items.Add(itemSetNumFrames);
            }

            return(_contextMenuStrip);
        }
예제 #16
0
        public override void Update(bool updateView)
        {
            if (!updateView)
            {
                return;
            }

            double?hSpeedScaleNullable = ParsingUtilities.ParseDoubleNullable(textBoxCoinHSpeedScale.Text);

            if (hSpeedScaleNullable.HasValue)
            {
                double hSpeedScale = hSpeedScaleNullable.Value;
                double hSpeedMin   = 0;
                double hSpeedMax   = hSpeedScale;
                labelCoinHSpeedRange.Text = String.Format("HSpeed Range: [{0}, {1})", hSpeedMin, hSpeedMax);
            }
            else
            {
                labelCoinHSpeedRange.Text = "HSpeed Range:";
            }

            double?vSpeedScaleNullable  = ParsingUtilities.ParseDoubleNullable(textBoxCoinVSpeedScale.Text);
            double?vSpeedOffsetNullable = ParsingUtilities.ParseDoubleNullable(textBoxCoinVSpeedOffset.Text);

            if (vSpeedScaleNullable.HasValue && vSpeedOffsetNullable.HasValue)
            {
                double vSpeedScale  = vSpeedScaleNullable.Value;
                double vSpeedOffset = vSpeedOffsetNullable.Value;
                double vSpeedMin    = vSpeedOffset;
                double vSpeedMax    = vSpeedScale + vSpeedOffset;
                labelCoinVSpeedRange.Text = String.Format("VSpeed Range: [{0}, {1})", vSpeedMin, vSpeedMax);
            }
            else
            {
                labelCoinVSpeedRange.Text = "VSpeed Range:";
            }

            labelCoinTableEntries.Text = "Table Entries: " + dataGridViewCoin.Rows.Count;
        }
예제 #17
0
        public bool AddValue(string stringValue, bool add, List <uint> addresses = null)
        {
            double?doubleValueNullable = ParsingUtilities.ParseDoubleNullable(stringValue);

            if (!doubleValueNullable.HasValue)
            {
                return(false);
            }
            double doubleValue = doubleValueNullable.Value;

            string currentValueString   = GetStringValue(false, false, addresses);
            double?currentValueNullable = ParsingUtilities.ParseDoubleNullable(currentValueString);

            if (!currentValueNullable.HasValue)
            {
                return(false);
            }
            double currentValue = currentValueNullable.Value;

            double newValue = currentValue + doubleValue * (add ? +1 : -1);

            return(SetStringValue(newValue.ToString(), addresses));
        }
예제 #18
0
        private bool ValueQualifies(object memoryObject, object oldMemoryObject, object searchObject1, object searchObject2, Type type)
        {
            if (type == typeof(byte))
            {
                byte?memoryValue = ParsingUtilities.ParseByteNullable(memoryObject);
                if (!memoryValue.HasValue)
                {
                    return(false);
                }
                byte?oldMemoryValue = ParsingUtilities.ParseByteNullable(oldMemoryObject);
                byte?searchValue1   = ParsingUtilities.ParseByteNullable(searchObject1);
                byte?searchValue2   = ParsingUtilities.ParseByteNullable(searchObject2);
                ValueRelationship valueRelationship = (ValueRelationship)comboBoxSearchValueRelationship.SelectedItem;
                switch (valueRelationship)
                {
                case ValueRelationship.EqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == searchValue1.Value);

                case ValueRelationship.NotEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != searchValue1.Value);

                case ValueRelationship.GreaterThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > searchValue1.Value);

                case ValueRelationship.LessThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < searchValue1.Value);

                case ValueRelationship.GreaterThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value >= searchValue1.Value);

                case ValueRelationship.LessThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value <= searchValue1.Value);

                case ValueRelationship.Changed:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != oldMemoryValue.Value);

                case ValueRelationship.DidNotChange:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value);

                case ValueRelationship.Increased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > oldMemoryValue.Value);

                case ValueRelationship.Decreased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < oldMemoryValue.Value);

                case ValueRelationship.IncreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value + searchValue1.Value);

                case ValueRelationship.DecreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value - searchValue1.Value);

                case ValueRelationship.BetweenExclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value < memoryValue.Value && memoryValue.Value < searchValue2.Value);

                case ValueRelationship.BetweenInclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value <= memoryValue.Value && memoryValue.Value <= searchValue2.Value);

                case ValueRelationship.EverythingPasses:
                    return(true);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            if (type == typeof(sbyte))
            {
                sbyte?memoryValue = ParsingUtilities.ParseSByteNullable(memoryObject);
                if (!memoryValue.HasValue)
                {
                    return(false);
                }
                sbyte?            oldMemoryValue    = ParsingUtilities.ParseSByteNullable(oldMemoryObject);
                sbyte?            searchValue1      = ParsingUtilities.ParseSByteNullable(searchObject1);
                sbyte?            searchValue2      = ParsingUtilities.ParseSByteNullable(searchObject2);
                ValueRelationship valueRelationship = (ValueRelationship)comboBoxSearchValueRelationship.SelectedItem;
                switch (valueRelationship)
                {
                case ValueRelationship.EqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == searchValue1.Value);

                case ValueRelationship.NotEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != searchValue1.Value);

                case ValueRelationship.GreaterThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > searchValue1.Value);

                case ValueRelationship.LessThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < searchValue1.Value);

                case ValueRelationship.GreaterThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value >= searchValue1.Value);

                case ValueRelationship.LessThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value <= searchValue1.Value);

                case ValueRelationship.Changed:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != oldMemoryValue.Value);

                case ValueRelationship.DidNotChange:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value);

                case ValueRelationship.Increased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > oldMemoryValue.Value);

                case ValueRelationship.Decreased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < oldMemoryValue.Value);

                case ValueRelationship.IncreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value + searchValue1.Value);

                case ValueRelationship.DecreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value - searchValue1.Value);

                case ValueRelationship.BetweenExclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value < memoryValue.Value && memoryValue.Value < searchValue2.Value);

                case ValueRelationship.BetweenInclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value <= memoryValue.Value && memoryValue.Value <= searchValue2.Value);

                case ValueRelationship.EverythingPasses:
                    return(true);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            if (type == typeof(short))
            {
                short?memoryValue = ParsingUtilities.ParseShortNullable(memoryObject);
                if (!memoryValue.HasValue)
                {
                    return(false);
                }
                short?            oldMemoryValue    = ParsingUtilities.ParseShortNullable(oldMemoryObject);
                short?            searchValue1      = ParsingUtilities.ParseShortNullable(searchObject1);
                short?            searchValue2      = ParsingUtilities.ParseShortNullable(searchObject2);
                ValueRelationship valueRelationship = (ValueRelationship)comboBoxSearchValueRelationship.SelectedItem;
                switch (valueRelationship)
                {
                case ValueRelationship.EqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == searchValue1.Value);

                case ValueRelationship.NotEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != searchValue1.Value);

                case ValueRelationship.GreaterThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > searchValue1.Value);

                case ValueRelationship.LessThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < searchValue1.Value);

                case ValueRelationship.GreaterThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value >= searchValue1.Value);

                case ValueRelationship.LessThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value <= searchValue1.Value);

                case ValueRelationship.Changed:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != oldMemoryValue.Value);

                case ValueRelationship.DidNotChange:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value);

                case ValueRelationship.Increased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > oldMemoryValue.Value);

                case ValueRelationship.Decreased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < oldMemoryValue.Value);

                case ValueRelationship.IncreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value + searchValue1.Value);

                case ValueRelationship.DecreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value - searchValue1.Value);

                case ValueRelationship.BetweenExclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value < memoryValue.Value && memoryValue.Value < searchValue2.Value);

                case ValueRelationship.BetweenInclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value <= memoryValue.Value && memoryValue.Value <= searchValue2.Value);

                case ValueRelationship.EverythingPasses:
                    return(true);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            if (type == typeof(ushort))
            {
                ushort?memoryValue = ParsingUtilities.ParseUShortNullable(memoryObject);
                if (!memoryValue.HasValue)
                {
                    return(false);
                }
                ushort?           oldMemoryValue    = ParsingUtilities.ParseUShortNullable(oldMemoryObject);
                ushort?           searchValue1      = ParsingUtilities.ParseUShortNullable(searchObject1);
                ushort?           searchValue2      = ParsingUtilities.ParseUShortNullable(searchObject2);
                ValueRelationship valueRelationship = (ValueRelationship)comboBoxSearchValueRelationship.SelectedItem;
                switch (valueRelationship)
                {
                case ValueRelationship.EqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == searchValue1.Value);

                case ValueRelationship.NotEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != searchValue1.Value);

                case ValueRelationship.GreaterThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > searchValue1.Value);

                case ValueRelationship.LessThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < searchValue1.Value);

                case ValueRelationship.GreaterThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value >= searchValue1.Value);

                case ValueRelationship.LessThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value <= searchValue1.Value);

                case ValueRelationship.Changed:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != oldMemoryValue.Value);

                case ValueRelationship.DidNotChange:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value);

                case ValueRelationship.Increased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > oldMemoryValue.Value);

                case ValueRelationship.Decreased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < oldMemoryValue.Value);

                case ValueRelationship.IncreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value + searchValue1.Value);

                case ValueRelationship.DecreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value - searchValue1.Value);

                case ValueRelationship.BetweenExclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value < memoryValue.Value && memoryValue.Value < searchValue2.Value);

                case ValueRelationship.BetweenInclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value <= memoryValue.Value && memoryValue.Value <= searchValue2.Value);

                case ValueRelationship.EverythingPasses:
                    return(true);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            if (type == typeof(int))
            {
                int?memoryValue = ParsingUtilities.ParseIntNullable(memoryObject);
                if (!memoryValue.HasValue)
                {
                    return(false);
                }
                int?oldMemoryValue = ParsingUtilities.ParseIntNullable(oldMemoryObject);
                int?searchValue1   = ParsingUtilities.ParseIntNullable(searchObject1);
                int?searchValue2   = ParsingUtilities.ParseIntNullable(searchObject2);
                ValueRelationship valueRelationship = (ValueRelationship)comboBoxSearchValueRelationship.SelectedItem;
                switch (valueRelationship)
                {
                case ValueRelationship.EqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == searchValue1.Value);

                case ValueRelationship.NotEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != searchValue1.Value);

                case ValueRelationship.GreaterThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > searchValue1.Value);

                case ValueRelationship.LessThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < searchValue1.Value);

                case ValueRelationship.GreaterThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value >= searchValue1.Value);

                case ValueRelationship.LessThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value <= searchValue1.Value);

                case ValueRelationship.Changed:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != oldMemoryValue.Value);

                case ValueRelationship.DidNotChange:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value);

                case ValueRelationship.Increased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > oldMemoryValue.Value);

                case ValueRelationship.Decreased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < oldMemoryValue.Value);

                case ValueRelationship.IncreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value + searchValue1.Value);

                case ValueRelationship.DecreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value - searchValue1.Value);

                case ValueRelationship.BetweenExclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value < memoryValue.Value && memoryValue.Value < searchValue2.Value);

                case ValueRelationship.BetweenInclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value <= memoryValue.Value && memoryValue.Value <= searchValue2.Value);

                case ValueRelationship.EverythingPasses:
                    return(true);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            if (type == typeof(uint))
            {
                uint?memoryValue = ParsingUtilities.ParseUIntNullable(memoryObject);
                if (!memoryValue.HasValue)
                {
                    return(false);
                }
                uint?oldMemoryValue = ParsingUtilities.ParseUIntNullable(oldMemoryObject);
                uint?searchValue1   = ParsingUtilities.ParseUIntNullable(searchObject1);
                uint?searchValue2   = ParsingUtilities.ParseUIntNullable(searchObject2);
                ValueRelationship valueRelationship = (ValueRelationship)comboBoxSearchValueRelationship.SelectedItem;
                switch (valueRelationship)
                {
                case ValueRelationship.EqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == searchValue1.Value);

                case ValueRelationship.NotEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != searchValue1.Value);

                case ValueRelationship.GreaterThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > searchValue1.Value);

                case ValueRelationship.LessThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < searchValue1.Value);

                case ValueRelationship.GreaterThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value >= searchValue1.Value);

                case ValueRelationship.LessThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value <= searchValue1.Value);

                case ValueRelationship.Changed:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != oldMemoryValue.Value);

                case ValueRelationship.DidNotChange:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value);

                case ValueRelationship.Increased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > oldMemoryValue.Value);

                case ValueRelationship.Decreased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < oldMemoryValue.Value);

                case ValueRelationship.IncreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value + searchValue1.Value);

                case ValueRelationship.DecreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value - searchValue1.Value);

                case ValueRelationship.BetweenExclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value < memoryValue.Value && memoryValue.Value < searchValue2.Value);

                case ValueRelationship.BetweenInclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value <= memoryValue.Value && memoryValue.Value <= searchValue2.Value);

                case ValueRelationship.EverythingPasses:
                    return(true);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            if (type == typeof(float))
            {
                float?memoryValue = ParsingUtilities.ParseFloatNullable(memoryObject);
                if (!memoryValue.HasValue)
                {
                    return(false);
                }
                float?            oldMemoryValue    = ParsingUtilities.ParseFloatNullable(oldMemoryObject);
                float?            searchValue1      = ParsingUtilities.ParseFloatNullable(searchObject1);
                float?            searchValue2      = ParsingUtilities.ParseFloatNullable(searchObject2);
                ValueRelationship valueRelationship = (ValueRelationship)comboBoxSearchValueRelationship.SelectedItem;
                switch (valueRelationship)
                {
                case ValueRelationship.EqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == searchValue1.Value);

                case ValueRelationship.NotEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != searchValue1.Value);

                case ValueRelationship.GreaterThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > searchValue1.Value);

                case ValueRelationship.LessThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < searchValue1.Value);

                case ValueRelationship.GreaterThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value >= searchValue1.Value);

                case ValueRelationship.LessThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value <= searchValue1.Value);

                case ValueRelationship.Changed:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != oldMemoryValue.Value);

                case ValueRelationship.DidNotChange:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value);

                case ValueRelationship.Increased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > oldMemoryValue.Value);

                case ValueRelationship.Decreased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < oldMemoryValue.Value);

                case ValueRelationship.IncreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value + searchValue1.Value);

                case ValueRelationship.DecreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value - searchValue1.Value);

                case ValueRelationship.BetweenExclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value < memoryValue.Value && memoryValue.Value < searchValue2.Value);

                case ValueRelationship.BetweenInclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value <= memoryValue.Value && memoryValue.Value <= searchValue2.Value);

                case ValueRelationship.EverythingPasses:
                    return(true);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            if (type == typeof(double))
            {
                double?memoryValue = ParsingUtilities.ParseDoubleNullable(memoryObject);
                if (!memoryValue.HasValue)
                {
                    return(false);
                }
                double?           oldMemoryValue    = ParsingUtilities.ParseDoubleNullable(oldMemoryObject);
                double?           searchValue1      = ParsingUtilities.ParseDoubleNullable(searchObject1);
                double?           searchValue2      = ParsingUtilities.ParseDoubleNullable(searchObject2);
                ValueRelationship valueRelationship = (ValueRelationship)comboBoxSearchValueRelationship.SelectedItem;
                switch (valueRelationship)
                {
                case ValueRelationship.EqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == searchValue1.Value);

                case ValueRelationship.NotEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != searchValue1.Value);

                case ValueRelationship.GreaterThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > searchValue1.Value);

                case ValueRelationship.LessThan:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < searchValue1.Value);

                case ValueRelationship.GreaterThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value >= searchValue1.Value);

                case ValueRelationship.LessThanOrEqualTo:
                    if (!searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value <= searchValue1.Value);

                case ValueRelationship.Changed:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value != oldMemoryValue.Value);

                case ValueRelationship.DidNotChange:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value);

                case ValueRelationship.Increased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value > oldMemoryValue.Value);

                case ValueRelationship.Decreased:
                    if (!oldMemoryValue.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value < oldMemoryValue.Value);

                case ValueRelationship.IncreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value + searchValue1.Value);

                case ValueRelationship.DecreasedBy:
                    if (!oldMemoryValue.HasValue || !searchValue1.HasValue)
                    {
                        return(false);
                    }
                    return(memoryValue.Value == oldMemoryValue.Value - searchValue1.Value);

                case ValueRelationship.BetweenExclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value < memoryValue.Value && memoryValue.Value < searchValue2.Value);

                case ValueRelationship.BetweenInclusive:
                    if (!searchValue1.HasValue || !searchValue2.HasValue)
                    {
                        return(false);
                    }
                    return(searchValue1.Value <= memoryValue.Value && memoryValue.Value <= searchValue2.Value);

                case ValueRelationship.EverythingPasses:
                    return(true);

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            throw new ArgumentOutOfRangeException();
        }
        public static List <ToolStripItem> CreateSelectionToolStripItems(
            Func <List <WatchVariableControl> > getVars,
            WatchVariableFlowLayoutPanel panel)
        {
            Action <WatchVariableControlSettings, List <WatchVariableControl> > apply2 =
                (WatchVariableControlSettings settings, List <WatchVariableControl> vars) =>
            {
                if (KeyboardUtilities.IsCtrlHeld())
                {
                    WatchVariableControlSettingsManager.AddSettings(settings);
                }
                else
                {
                    vars.ForEach(control => control.ApplySettings(settings));
                }
            };

            Action <WatchVariableControlSettings> apply = (WatchVariableControlSettings settings) => apply2(settings, getVars());

            ToolStripMenuItem itemHighlight = new ToolStripMenuItem("Highlight...");

            ControlUtilities.AddDropDownItems(
                itemHighlight,
                new List <string>()
            {
                "Highlight", "Don't Highlight"
            },
                new List <Action>()
            {
                () => apply(new WatchVariableControlSettings(changeHighlighted: true, newHighlighted: true)),
                () => apply(new WatchVariableControlSettings(changeHighlighted: true, newHighlighted: false)),
            });
            ToolStripMenuItem itemHighlightColor = new ToolStripMenuItem("Color...");

            ControlUtilities.AddDropDownItems(
                itemHighlightColor,
                new List <string>()
            {
                "Red",
                "Orange",
                "Yellow",
                "Green",
                "Blue",
                "Purple",
                "Pink",
                "Brown",
                "Black",
                "White",
            },
                new List <Action>()
            {
                () => apply(new WatchVariableControlSettings(changeHighlightColor: true, newHighlightColor: Color.Red)),
                () => apply(new WatchVariableControlSettings(changeHighlightColor: true, newHighlightColor: Color.Orange)),
                () => apply(new WatchVariableControlSettings(changeHighlightColor: true, newHighlightColor: Color.Yellow)),
                () => apply(new WatchVariableControlSettings(changeHighlightColor: true, newHighlightColor: Color.Green)),
                () => apply(new WatchVariableControlSettings(changeHighlightColor: true, newHighlightColor: Color.Blue)),
                () => apply(new WatchVariableControlSettings(changeHighlightColor: true, newHighlightColor: Color.Purple)),
                () => apply(new WatchVariableControlSettings(changeHighlightColor: true, newHighlightColor: Color.Pink)),
                () => apply(new WatchVariableControlSettings(changeHighlightColor: true, newHighlightColor: Color.Brown)),
                () => apply(new WatchVariableControlSettings(changeHighlightColor: true, newHighlightColor: Color.Black)),
                () => apply(new WatchVariableControlSettings(changeHighlightColor: true, newHighlightColor: Color.White)),
            });
            itemHighlight.DropDownItems.Add(itemHighlightColor);

            ToolStripMenuItem itemLock = new ToolStripMenuItem("Lock...");

            ControlUtilities.AddDropDownItems(
                itemLock,
                new List <string>()
            {
                "Lock", "Don't Lock"
            },
                new List <Action>()
            {
                () => apply(new WatchVariableControlSettings(changeLocked: true, newLocked: true)),
                () => apply(new WatchVariableControlSettings(changeLocked: true, newLocked: false)),
            });

            ToolStripMenuItem itemFixAddress = new ToolStripMenuItem("Fix Address...");

            ControlUtilities.AddDropDownItems(
                itemFixAddress,
                new List <string>()
            {
                "Default", "Fix Address", "Don't Fix Address"
            },
                new List <Action>()
            {
                () => apply(new WatchVariableControlSettings(changeFixedAddress: true, changeFixedAddressToDefault: true)),
                () => apply(new WatchVariableControlSettings(changeFixedAddress: true, newFixedAddress: true)),
                () => apply(new WatchVariableControlSettings(changeFixedAddress: true, newFixedAddress: false)),
            });

            ToolStripMenuItem itemCopy = new ToolStripMenuItem("Copy...");

            CopyUtilities.AddDropDownItems(itemCopy, getVars);

            ToolStripMenuItem itemPaste = new ToolStripMenuItem("Paste");

            itemPaste.Click += (sender, e) =>
            {
                List <WatchVariableControl> varList = getVars();
                List <string> stringList            = ParsingUtilities.ParseStringList(Clipboard.GetText());
                if (stringList.Count == 0)
                {
                    return;
                }

                Config.Stream.Suspend();
                for (int i = 0; i < varList.Count; i++)
                {
                    varList[i].SetValue(stringList[i % stringList.Count]);
                }
                Config.Stream.Resume();
            };

            ToolStripMenuItem itemRoundTo        = new ToolStripMenuItem("Round to...");
            ToolStripMenuItem itemRoundToDefault = new ToolStripMenuItem("Default");

            itemRoundToDefault.Click += (sender, e) =>
                                        apply(new WatchVariableControlSettings(
                                                  changeRoundingLimit: true, changeRoundingLimitToDefault: true));
            ToolStripMenuItem itemRoundToNoRounding = new ToolStripMenuItem("No Rounding");

            itemRoundToNoRounding.Click += (sender, e) =>
                                           apply(new WatchVariableControlSettings(
                                                     changeRoundingLimit: true, newRoundingLimit: -1));
            List <ToolStripMenuItem> itemsRoundToNumDecimalPlaces = new List <ToolStripMenuItem>();

            for (int i = 0; i <= 10; i++)
            {
                int index = i;
                itemsRoundToNumDecimalPlaces.Add(new ToolStripMenuItem(index + " decimal place(s)"));
                itemsRoundToNumDecimalPlaces[index].Click += (sender, e) =>
                                                             apply(new WatchVariableControlSettings(
                                                                       changeRoundingLimit: true, newRoundingLimit: index));
            }
            itemRoundTo.DropDownItems.Add(itemRoundToDefault);
            itemRoundTo.DropDownItems.Add(itemRoundToNoRounding);
            itemsRoundToNumDecimalPlaces.ForEach(setAllRoundingLimitsNumberItem =>
            {
                itemRoundTo.DropDownItems.Add(setAllRoundingLimitsNumberItem);
            });

            ToolStripMenuItem itemDisplayAsHex = new ToolStripMenuItem("Display as Hex...");

            ControlUtilities.AddDropDownItems(
                itemDisplayAsHex,
                new List <string>()
            {
                "Default", "Hex", "Decimal"
            },
                new List <Action>()
            {
                () => apply(new WatchVariableControlSettings(changeDisplayAsHex: true, changeDisplayAsHexToDefault: true)),
                () => apply(new WatchVariableControlSettings(changeDisplayAsHex: true, newDisplayAsHex: true)),
                () => apply(new WatchVariableControlSettings(changeDisplayAsHex: true, newDisplayAsHex: false)),
            });

            ToolStripMenuItem itemAngleSigned = new ToolStripMenuItem("Angle: Signed...");

            ControlUtilities.AddDropDownItems(
                itemAngleSigned,
                new List <string>()
            {
                "Default", "Unsigned", "Signed"
            },
                new List <Action>()
            {
                () => apply(new WatchVariableControlSettings(changeAngleSigned: true, changeAngleSignedToDefault: true)),
                () => apply(new WatchVariableControlSettings(changeAngleSigned: true, newAngleSigned: false)),
                () => apply(new WatchVariableControlSettings(changeAngleSigned: true, newAngleSigned: true)),
            });

            ToolStripMenuItem itemAngleUnits        = new ToolStripMenuItem("Angle: Units...");
            ToolStripMenuItem itemAngleUnitsDefault = new ToolStripMenuItem("Default");

            itemAngleUnitsDefault.Click += (sender, e) =>
                                           apply(new WatchVariableControlSettings(
                                                     changeAngleUnits: true, changeAngleUnitsToDefault: true));
            List <ToolStripMenuItem> itemsAngleUnitsValue = new List <ToolStripMenuItem>();

            foreach (AngleUnitType angleUnitType in Enum.GetValues(typeof(AngleUnitType)))
            {
                AngleUnitType angleUnitTypeFixed = angleUnitType;
                string        stringValue        = angleUnitTypeFixed.ToString();
                if (stringValue == AngleUnitType.InGameUnits.ToString())
                {
                    stringValue = "In-Game Units";
                }
                ToolStripMenuItem itemAngleUnitsValue = new ToolStripMenuItem(stringValue);
                itemAngleUnitsValue.Click += (sender, e) =>
                                             apply(new WatchVariableControlSettings(
                                                       changeAngleUnits: true, newAngleUnits: angleUnitTypeFixed));
                itemsAngleUnitsValue.Add(itemAngleUnitsValue);
            }
            itemAngleUnits.DropDownItems.Add(itemAngleUnitsDefault);
            itemsAngleUnitsValue.ForEach(setAllAngleUnitsValuesItem =>
            {
                itemAngleUnits.DropDownItems.Add(setAllAngleUnitsValuesItem);
            });

            ToolStripMenuItem itemAngleTruncateToMultipleOf16 = new ToolStripMenuItem("Angle: Truncate to Multiple of 16...");

            ControlUtilities.AddDropDownItems(
                itemAngleTruncateToMultipleOf16,
                new List <string>()
            {
                "Default", "Truncate to Multiple of 16", "Don't Truncate to Multiple of 16"
            },
                new List <Action>()
            {
                () => apply(new WatchVariableControlSettings(changeAngleTruncateToMultipleOf16: true, changeAngleTruncateToMultipleOf16ToDefault: true)),
                () => apply(new WatchVariableControlSettings(changeAngleTruncateToMultipleOf16: true, newAngleTruncateToMultipleOf16: true)),
                () => apply(new WatchVariableControlSettings(changeAngleTruncateToMultipleOf16: true, newAngleTruncateToMultipleOf16: false)),
            });

            ToolStripMenuItem itemAngleConstrainToOneRevolution = new ToolStripMenuItem("Angle: Constrain to One Revolution...");

            ControlUtilities.AddDropDownItems(
                itemAngleConstrainToOneRevolution,
                new List <string>()
            {
                "Default", "Constrain to One Revolution", "Don't Constrain to One Revolution"
            },
                new List <Action>()
            {
                () => apply(new WatchVariableControlSettings(changeAngleConstrainToOneRevolution: true, changeAngleConstrainToOneRevolutionToDefault: true)),
                () => apply(new WatchVariableControlSettings(changeAngleConstrainToOneRevolution: true, newAngleConstrainToOneRevolution: true)),
                () => apply(new WatchVariableControlSettings(changeAngleConstrainToOneRevolution: true, newAngleConstrainToOneRevolution: false)),
            });

            ToolStripMenuItem itemAngleReverse = new ToolStripMenuItem("Angle: Reverse...");

            ControlUtilities.AddDropDownItems(
                itemAngleReverse,
                new List <string>()
            {
                "Default", "Reverse", "Don't Reverse"
            },
                new List <Action>()
            {
                () => apply(new WatchVariableControlSettings(changeAngleReverse: true, changeAngleReverseToDefault: true)),
                () => apply(new WatchVariableControlSettings(changeAngleReverse: true, newAngleReverse: true)),
                () => apply(new WatchVariableControlSettings(changeAngleReverse: true, newAngleReverse: false)),
            });

            ToolStripMenuItem itemAngleDisplayAsHex = new ToolStripMenuItem("Angle: Display as Hex...");

            ControlUtilities.AddDropDownItems(
                itemAngleDisplayAsHex,
                new List <string>()
            {
                "Default", "Hex", "Decimal"
            },
                new List <Action>()
            {
                () => apply(new WatchVariableControlSettings(changeAngleDisplayAsHex: true, changeAngleDisplayAsHexToDefault: true)),
                () => apply(new WatchVariableControlSettings(changeAngleDisplayAsHex: true, newAngleDisplayAsHex: true)),
                () => apply(new WatchVariableControlSettings(changeAngleDisplayAsHex: true, newAngleDisplayAsHex: false)),
            });

            ToolStripMenuItem itemShowVariableXml = new ToolStripMenuItem("Show Variable XML");

            itemShowVariableXml.Click += (sender, e) =>
            {
                InfoForm infoForm = new InfoForm();
                infoForm.SetText(
                    "Variable Info",
                    "Variable XML",
                    String.Join("\r\n", getVars().ConvertAll(control => control.ToXml(true))));
                infoForm.Show();
            };

            ToolStripMenuItem itemShowVariableInfo = new ToolStripMenuItem("Show Variable Info");

            itemShowVariableInfo.Click += (sender, e) =>
            {
                InfoForm infoForm = new InfoForm();
                infoForm.SetText(
                    "Variable Info",
                    "Variable Info",
                    String.Join("\t",
                                WatchVariableWrapper.GetVarInfoLabels()) +
                    "\r\n" +
                    String.Join(
                        "\r\n",
                        getVars().ConvertAll(control => control.GetVarInfo())
                        .ConvertAll(infoList => String.Join("\t", infoList))));
                infoForm.Show();
            };

            void createBinaryMathOperationVariable(BinaryMathOperation operation)
            {
                List <WatchVariableControl> controls = getVars();

                if (controls.Count % 2 == 1)
                {
                    controls.RemoveAt(controls.Count - 1);
                }

                for (int i = 0; i < controls.Count / 2; i++)
                {
                    WatchVariableControl control1 = controls[i];
                    WatchVariableControl control2 = controls[i + controls.Count / 2];
                    string specialType            = WatchVariableSpecialUtilities.AddBinaryMathOperationEntry(control1, control2, operation);

                    WatchVariable watchVariable =
                        new WatchVariable(
                            memoryTypeName: null,
                            specialType: specialType,
                            baseAddressType: BaseAddressTypeEnum.None,
                            offsetUS: null,
                            offsetJP: null,
                            offsetSH: null,
                            offsetEU: null,
                            offsetDefault: null,
                            mask: null,
                            shift: null,
                            handleMapping: true);
                    WatchVariableControlPrecursor precursor =
                        new WatchVariableControlPrecursor(
                            name: string.Format("{0} {1} {2}", control1.VarName, MathOperationUtilities.GetSymbol(operation), control2.VarName),
                            watchVar: watchVariable,
                            subclass: WatchVariableSubclass.Number,
                            backgroundColor: null,
                            displayType: null,
                            roundingLimit: null,
                            useHex: null,
                            invertBool: null,
                            isYaw: null,
                            coordinate: null,
                            groupList: new List <VariableGroup>()
                    {
                        VariableGroup.Custom
                    });
                    WatchVariableControl control = precursor.CreateWatchVariableControl();
                    panel.AddVariable(control);
                }
            }

            void createAggregateMathOperationVariable(AggregateMathOperation operation)
            {
                List <WatchVariableControl> controls = getVars();

                if (controls.Count == 0)
                {
                    return;
                }
                string        specialType   = WatchVariableSpecialUtilities.AddAggregateMathOperationEntry(controls, operation);
                WatchVariable watchVariable =
                    new WatchVariable(
                        memoryTypeName: null,
                        specialType: specialType,
                        baseAddressType: BaseAddressTypeEnum.None,
                        offsetUS: null,
                        offsetJP: null,
                        offsetSH: null,
                        offsetEU: null,
                        offsetDefault: null,
                        mask: null,
                        shift: null,
                        handleMapping: true);
                WatchVariableControlPrecursor precursor =
                    new WatchVariableControlPrecursor(
                        name: operation.ToString(),
                        watchVar: watchVariable,
                        subclass: WatchVariableSubclass.Number,
                        backgroundColor: null,
                        displayType: null,
                        roundingLimit: null,
                        useHex: null,
                        invertBool: null,
                        isYaw: null,
                        coordinate: null,
                        groupList: new List <VariableGroup>()
                {
                    VariableGroup.Custom
                });
                WatchVariableControl control = precursor.CreateWatchVariableControl();

                panel.AddVariable(control);
            }

            void createDistanceMathOperationVariable(bool use3D)
            {
                List <WatchVariableControl> controls = getVars();
                bool satisfies2D = !use3D && controls.Count >= 4;
                bool satisfies3D = use3D && controls.Count >= 6;

                if (!satisfies2D && !satisfies3D)
                {
                    return;
                }
                string specialType = WatchVariableSpecialUtilities.AddDistanceMathOperationEntry(controls, use3D);
                string name        = use3D ?
                                     string.Format(
                    "({0},{1},{2}) to ({3},{4},{5})",
                    controls[0].VarName,
                    controls[1].VarName,
                    controls[2].VarName,
                    controls[3].VarName,
                    controls[4].VarName,
                    controls[5].VarName) :
                                     string.Format(
                    "({0},{1}) to ({2},{3})",
                    controls[0].VarName,
                    controls[1].VarName,
                    controls[2].VarName,
                    controls[3].VarName);
                WatchVariable watchVariable =
                    new WatchVariable(
                        memoryTypeName: null,
                        specialType: specialType,
                        baseAddressType: BaseAddressTypeEnum.None,
                        offsetUS: null,
                        offsetJP: null,
                        offsetSH: null,
                        offsetEU: null,
                        offsetDefault: null,
                        mask: null,
                        shift: null,
                        handleMapping: true);
                WatchVariableControlPrecursor precursor =
                    new WatchVariableControlPrecursor(
                        name: name,
                        watchVar: watchVariable,
                        subclass: WatchVariableSubclass.Number,
                        backgroundColor: null,
                        displayType: null,
                        roundingLimit: null,
                        useHex: null,
                        invertBool: null,
                        isYaw: null,
                        coordinate: null,
                        groupList: new List <VariableGroup>()
                {
                    VariableGroup.Custom
                });
                WatchVariableControl control = precursor.CreateWatchVariableControl();

                panel.AddVariable(control);
            }

            void createRealTimeVariable()
            {
                List <WatchVariableControl> controls = getVars();

                for (int i = 0; i < controls.Count; i++)
                {
                    WatchVariableControl control = controls[i];
                    string specialType           = WatchVariableSpecialUtilities.AddRealTimeEntry(control);

                    WatchVariable watchVariable =
                        new WatchVariable(
                            memoryTypeName: null,
                            specialType: specialType,
                            baseAddressType: BaseAddressTypeEnum.None,
                            offsetUS: null,
                            offsetJP: null,
                            offsetSH: null,
                            offsetEU: null,
                            offsetDefault: null,
                            mask: null,
                            shift: null,
                            handleMapping: true);
                    WatchVariableControlPrecursor precursor =
                        new WatchVariableControlPrecursor(
                            name: string.Format("{0} Real Time", control.VarName),
                            watchVar: watchVariable,
                            subclass: WatchVariableSubclass.String,
                            backgroundColor: null,
                            displayType: null,
                            roundingLimit: null,
                            useHex: null,
                            invertBool: null,
                            isYaw: null,
                            coordinate: null,
                            groupList: new List <VariableGroup>()
                    {
                        VariableGroup.Custom
                    });
                    WatchVariableControl control2 = precursor.CreateWatchVariableControl();
                    panel.AddVariable(control2);
                }
            }

            ToolStripMenuItem itemAddVariables = new ToolStripMenuItem("Add Variable(s)...");

            ControlUtilities.AddDropDownItems(
                itemAddVariables,
                new List <string>()
            {
                "Addition",
                "Subtraction",
                "Multiplication",
                "Division",
                "Modulo",
                "Non-Negative Modulo",
                "Exponent",
                null,
                "Mean",
                "Median",
                "Min",
                "Max",
                null,
                "2D Distance",
                "3D Distance",
                null,
                "Real Time",
            },
                new List <Action>()
            {
                () => createBinaryMathOperationVariable(BinaryMathOperation.Add),
                () => createBinaryMathOperationVariable(BinaryMathOperation.Subtract),
                () => createBinaryMathOperationVariable(BinaryMathOperation.Multiply),
                () => createBinaryMathOperationVariable(BinaryMathOperation.Divide),
                () => createBinaryMathOperationVariable(BinaryMathOperation.Modulo),
                () => createBinaryMathOperationVariable(BinaryMathOperation.NonNegativeModulo),
                () => createBinaryMathOperationVariable(BinaryMathOperation.Exponent),
                () => { },
                () => createAggregateMathOperationVariable(AggregateMathOperation.Mean),
                () => createAggregateMathOperationVariable(AggregateMathOperation.Median),
                () => createAggregateMathOperationVariable(AggregateMathOperation.Min),
                () => createAggregateMathOperationVariable(AggregateMathOperation.Max),
                () => { },
                () => createDistanceMathOperationVariable(use3D: false),
                () => createDistanceMathOperationVariable(use3D: true),
                () => { },
                () => createRealTimeVariable(),
            });

            ToolStripMenuItem itemSetCascadingValues = new ToolStripMenuItem("Set Cascading Values");

            itemSetCascadingValues.Click += (sender, e) =>
            {
                List <WatchVariableControl> controls = getVars();
                object value1 = DialogUtilities.GetStringFromDialog(labelText: "Base Value:");
                object value2 = DialogUtilities.GetStringFromDialog(labelText: "Offset Value:");
                if (value1 == null || value2 == null)
                {
                    return;
                }
                double?number1 = ParsingUtilities.ParseDoubleNullable(value1);
                double?number2 = ParsingUtilities.ParseDoubleNullable(value2);
                if (!number1.HasValue || !number2.HasValue)
                {
                    return;
                }
                List <Func <object, bool> > setters = controls.SelectMany(control => control.GetSetters()).ToList();
                for (int i = 0; i < setters.Count; i++)
                {
                    setters[i](number1.Value + i * number2.Value);
                }
            };

            List <string> backgroundColorStringList = new List <string>();
            List <Action> backgroundColorActionList = new List <Action>();

            backgroundColorStringList.Add("Default");
            backgroundColorActionList.Add(
                () => apply(new WatchVariableControlSettings(changeBackgroundColor: true, changeBackgroundColorToDefault: true)));
            foreach (KeyValuePair <string, string> pair in ColorUtilities.ColorToParamsDictionary)
            {
                Color  color       = ColorTranslator.FromHtml(pair.Value);
                string colorString = pair.Key;
                if (colorString == "LightBlue")
                {
                    colorString = "Light Blue";
                }
                backgroundColorStringList.Add(colorString);
                backgroundColorActionList.Add(
                    () => apply(new WatchVariableControlSettings(changeBackgroundColor: true, newBackgroundColor: color)));
            }
            backgroundColorStringList.Add("Control (No Color)");
            backgroundColorActionList.Add(
                () => apply(new WatchVariableControlSettings(changeBackgroundColor: true, newBackgroundColor: SystemColors.Control)));
            backgroundColorStringList.Add("Custom Color");
            backgroundColorActionList.Add(
                () =>
            {
                List <WatchVariableControl> vars = getVars();
                Color?newColor = ColorUtilities.GetColorFromDialog(SystemColors.Control);
                if (newColor.HasValue)
                {
                    apply2(new WatchVariableControlSettings(changeBackgroundColor: true, newBackgroundColor: newColor.Value), vars);
                    ColorUtilities.LastCustomColor = newColor.Value;
                }
            });
            backgroundColorStringList.Add("Last Custom Color");
            backgroundColorActionList.Add(
                () => apply(new WatchVariableControlSettings(changeBackgroundColor: true, newBackgroundColor: ColorUtilities.LastCustomColor)));
            ToolStripMenuItem itemBackgroundColor = new ToolStripMenuItem("Background Color...");

            ControlUtilities.AddDropDownItems(
                itemBackgroundColor,
                backgroundColorStringList,
                backgroundColorActionList);

            ToolStripMenuItem itemMove = new ToolStripMenuItem("Move...");

            ControlUtilities.AddDropDownItems(
                itemMove,
                new List <string>()
            {
                "Start Move", "End Move", "Clear Move"
            },
                new List <Action>()
            {
                () => panel.NotifyOfReorderingStart(getVars()),
                () => panel.NotifyOfReorderingEnd(getVars()),
                () => panel.NotifyOfReorderingClear(),
            });

            ToolStripMenuItem itemRemove = new ToolStripMenuItem("Remove");

            itemRemove.Click += (sender, e) => panel.RemoveVariables(getVars());

            ToolStripMenuItem itemRename = new ToolStripMenuItem("Rename...");

            itemRename.Click += (sender, e) =>
            {
                List <WatchVariableControl> watchVars = getVars();
                string template = DialogUtilities.GetStringFromDialog("$");
                if (template == null)
                {
                    return;
                }
                foreach (WatchVariableControl control in watchVars)
                {
                    control.VarName = template.Replace("$", control.VarName);
                }
            };

            ToolStripMenuItem itemOpenController = new ToolStripMenuItem("Open Controller");

            itemOpenController.Click += (sender, e) =>
            {
                List <WatchVariableControl> vars          = getVars();
                VariableControllerForm      varController =
                    new VariableControllerForm(
                        vars.ConvertAll(control => control.VarName),
                        vars.ConvertAll(control => control.WatchVarWrapper),
                        vars.ConvertAll(control => control.FixedAddressList));
                varController.Show();
            };

            ToolStripMenuItem itemOpenTripletController = new ToolStripMenuItem("Open Triplet Controller");

            itemOpenTripletController.Click += (sender, e) =>
            {
                VariableTripletControllerForm form = new VariableTripletControllerForm();
                form.Initialize(getVars().ConvertAll(control => control.CreateCopy()));
                form.ShowForm();
            };

            ToolStripMenuItem itemOpenPopOut = new ToolStripMenuItem("Open Pop Out");

            itemOpenPopOut.Click += (sender, e) =>
            {
                VariablePopOutForm form = new VariablePopOutForm();
                form.Initialize(getVars().ConvertAll(control => control.CreateCopy()));
                form.ShowForm();
            };

            ToolStripMenuItem itemAddToTab = new ToolStripMenuItem("Add to Tab...");

            ControlUtilities.AddDropDownItems(
                itemAddToTab,
                new List <string>()
            {
                "Regular", "Fixed", "Grouped by Base Address", "Grouped by Variable"
            },
                new List <Action>()
            {
                () => SelectionForm.ShowDataManagerSelectionForm(getVars(), AddToTabTypeEnum.Regular),
                () => SelectionForm.ShowDataManagerSelectionForm(getVars(), AddToTabTypeEnum.Fixed),
                () => SelectionForm.ShowDataManagerSelectionForm(getVars(), AddToTabTypeEnum.GroupedByBaseAddress),
                () => SelectionForm.ShowDataManagerSelectionForm(getVars(), AddToTabTypeEnum.GroupedByVariable),
            });

            ToolStripMenuItem itemAddToCustomTab = new ToolStripMenuItem("Add to Custom Tab...");

            ControlUtilities.AddDropDownItems(
                itemAddToCustomTab,
                new List <string>()
            {
                "Regular", "Fixed", "Grouped by Base Address", "Grouped by Variable"
            },
                new List <Action>()
            {
                () => WatchVariableControl.AddVarsToTab(getVars(), Config.CustomManager, AddToTabTypeEnum.Regular),
                () => WatchVariableControl.AddVarsToTab(getVars(), Config.CustomManager, AddToTabTypeEnum.Fixed),
                () => WatchVariableControl.AddVarsToTab(getVars(), Config.CustomManager, AddToTabTypeEnum.GroupedByBaseAddress),
                () => WatchVariableControl.AddVarsToTab(getVars(), Config.CustomManager, AddToTabTypeEnum.GroupedByVariable),
            });

            return(new List <ToolStripItem>()
            {
                itemHighlight,
                itemLock,
                itemFixAddress,
                itemCopy,
                itemPaste,
                new ToolStripSeparator(),
                itemRoundTo,
                itemDisplayAsHex,
                new ToolStripSeparator(),
                itemAngleSigned,
                itemAngleUnits,
                itemAngleTruncateToMultipleOf16,
                itemAngleConstrainToOneRevolution,
                itemAngleReverse,
                itemAngleDisplayAsHex,
                new ToolStripSeparator(),
                itemShowVariableXml,
                itemShowVariableInfo,
                new ToolStripSeparator(),
                itemAddVariables,
                itemSetCascadingValues,
                new ToolStripSeparator(),
                itemBackgroundColor,
                itemMove,
                itemRemove,
                itemRename,
                itemOpenController,
                itemOpenTripletController,
                itemOpenPopOut,
                itemAddToTab,
                itemAddToCustomTab,
            });
        }
예제 #20
0
        private void CalculateCoinTrajectories()
        {
            ClearCoinTrajectories();

            double?hSpeedScale          = ParsingUtilities.ParseIntNullable(textBoxCoinHSpeedScale.Text);
            double?vSpeedScale          = ParsingUtilities.ParseIntNullable(textBoxCoinVSpeedScale.Text);
            double?vSpeedOffset         = ParsingUtilities.ParseIntNullable(textBoxCoinVSpeedOffset.Text);
            bool   coinParamOrderParsed = Enum.TryParse(textBoxCoinParamOrder.Text, out CoinParamOrder coinParamOrder);
            int?   numCoins             = ParsingUtilities.ParseIntNullable(textBoxCoinNumCoins.Text);

            if (!hSpeedScale.HasValue ||
                !vSpeedScale.HasValue ||
                !vSpeedOffset.HasValue ||
                !coinParamOrderParsed ||
                !numCoins.HasValue)
            {
                DialogUtilities.DisplayMessage(
                    "Could not parse coin param fields.",
                    "Parsing Error");
                return;
            }

            CoinObject coinObject = new CoinObject(
                hSpeedScale: hSpeedScale.Value,
                vSpeedScale: vSpeedScale.Value,
                vSpeedOffset: vSpeedOffset.Value,
                coinParamOrder: coinParamOrder,
                numCoins: numCoins.Value,
                name: "Dummy");

            int?startingRngIndexNullable = ParsingUtilities.ParseIntNullable(
                textBoxCoinCustomizatonStartingRngIndex.Text);
            int startingRngIndex = startingRngIndexNullable ?? RngIndexer.GetRngIndex();

            int?numDecimalDigitsNullable = ParsingUtilities.ParseIntNullable(
                textBoxCoinCustomizatonNumDecimalDigits.Text);
            int numDecimalDigits = numDecimalDigitsNullable ?? 3;

            List <int> rngIndexes = Enumerable.Range(0, 65114).ToList();

            foreach (int rngIndex in rngIndexes)
            {
                // rng based values
                ushort rngValue = RngIndexer.GetRngValue(rngIndex);
                int    rngToGo  = MoreMath.NonNegativeModulus(rngIndex - startingRngIndex, 65114);

                // coin trajectory
                List <CoinTrajectory> coinTrajectories = coinObject.CalculateCoinTrajectories(rngIndex);

                // filter the values
                CoinTrajectoryFilter filter = new CoinTrajectoryFilter(
                    ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterHSpeedMin.Text),
                    ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterHSpeedMax.Text),
                    ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterVSpeedMin.Text),
                    ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterVSpeedMax.Text),
                    ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterAngleMin.Text),
                    ParsingUtilities.ParseDoubleNullable(textBoxCoinFilterAngleMax.Text),
                    ParsingUtilities.ParseIntNullable(textBoxCoinFilterRequiredNumOfQualifiedCoins.Text));
                if (!filter.Qualifies(coinTrajectories))
                {
                    continue;
                }

                if (!checkBoxCoinCustomizatonDisplayNonQualifiedCoinsOfAQualifiedCoinGroup.Checked)
                {
                    coinTrajectories = coinTrajectories.FindAll(
                        coinTrajectory => filter.Qualifies(coinTrajectory));
                }

                List <double> hSpeedList = coinTrajectories.ConvertAll(
                    coinTrajectory => Math.Round(coinTrajectory.HSpeed, numDecimalDigits));
                List <double> vSpeedList = coinTrajectories.ConvertAll(
                    coinTrajectory => Math.Round(coinTrajectory.VSpeed, numDecimalDigits));
                List <ushort> angleList = coinTrajectories.ConvertAll(
                    coinTrajectory => coinTrajectory.Angle);

                object hSpeedJoined = hSpeedList.Count == 1 ? hSpeedList[0] : (object)String.Join(", ", hSpeedList);
                object vSpeedJoined = vSpeedList.Count == 1 ? vSpeedList[0] : (object)String.Join(", ", vSpeedList);
                object angleJoined  = angleList.Count == 1 ? angleList[0] : (object)String.Join(", ", angleList);

                // add a new row to the table
                dataGridViewCoin.Rows.Add(
                    rngIndex, rngValue, rngToGo, hSpeedJoined, vSpeedJoined, angleJoined);
            }
        }