private int AddRule()
        {
            if (startDistance >= endDistance && useEndDistance) {
                return 1;
            }

            if (((!minDistanceSameObjectType || minObjectSeperation > 0) && targetObject == null))
                return 2;

            // no point in adding the rule if both of these values are zero
            if (minDistance == 0 && minObjectSeperation == 0)
                return 3;

            List<ObjectRuleMap> appearanceRules;
            AppearanceRules targetRules = target as AppearanceRules;
            if (avoidObjectRule) {
                if (targetRules.avoidObjectRuleMaps == null) {
                    targetRules.avoidObjectRuleMaps = new List<ObjectRuleMap>();
                }
                appearanceRules = targetRules.avoidObjectRuleMaps;
            } else {
                if (targetRules.probabilityAdjustmentMaps == null) {
                    targetRules.probabilityAdjustmentMaps = new List<ObjectRuleMap>();
                }
                appearanceRules = targetRules.probabilityAdjustmentMaps;
            }

            int ruleInsertIndex = 0;
            int subRuleInsertIndex = 0;
            bool parentBreak = false;
            bool infiniteObjectFound = false;
            for (; ruleInsertIndex < appearanceRules.Count; ++ruleInsertIndex) {
                if (targetObject == appearanceRules[ruleInsertIndex].targetObject) {
                    List<ScoreObjectCountRule> scoreObjectCountRules = appearanceRules[ruleInsertIndex].rules;
                    for (; subRuleInsertIndex < scoreObjectCountRules.Count; ++subRuleInsertIndex) {
                        // error if the current probability is overlapping an existing probability or within it
                        DistanceValue prob = scoreObjectCountRules[subRuleInsertIndex].probability;
                        if ((startDistance < prob.startDistance && endDistance > prob.startDistance) ||
                            (startDistance > prob.startDistance && endDistance < prob.endDistance) ||
                            (startDistance < prob.endDistance && endDistance > prob.endDistance) ||
                            (!prob.useEndDistance && startDistance > prob.startDistance) ||
                            (!useEndDistance && startDistance < prob.endDistance)) {
                            return 4;
                        }

                        // two probabilities can't ignore the end distance
                        if (!useEndDistance && !prob.useEndDistance) {
                            return 5;
                        }

                        // found our place
                        if (endDistance <= prob.startDistance) {
                            parentBreak = true;
                            break;
                        }
                    }
                    infiniteObjectFound = true;
                    break;
                }
                if (parentBreak)
                    break;
            }

            DistanceValue distanceProb = new DistanceValue(startDistance, startProbability, endDistance, endProbability, useEndDistance);
            ScoreObjectCountRule scoreObjectCountRule = new ScoreObjectCountRule(minDistance, minDistanceSameObjectType, minObjectSeperation, distanceProb, forceOccurance);
            if (infiniteObjectFound) {
                List<ScoreObjectCountRule> scoreObjectCountRules = appearanceRules[ruleInsertIndex].rules;
                scoreObjectCountRules.Insert(subRuleInsertIndex, scoreObjectCountRule);
            } else {
                ObjectRuleMap objectRuleMap = new ObjectRuleMap(targetObject, scoreObjectCountRule);
                appearanceRules.Insert(ruleInsertIndex, objectRuleMap);
            }

            EditorUtility.SetDirty(target);
            return 0;
        }
        private int AddRule()
        {
            if (startDistance >= endDistance && useEndDistance)
            {
                return(1);
            }

            if (((!minDistanceSameObjectType || minObjectSeperation > 0) && targetObject == null))
            {
                return(2);
            }

            // no point in adding the rule if both of these values are zero
            if (minDistance == 0 && minObjectSeperation == 0)
            {
                return(3);
            }

            List <ObjectRuleMap> appearanceRules;
            AppearanceRules      targetRules = target as AppearanceRules;

            if (avoidObjectRule)
            {
                if (targetRules.avoidObjectRuleMaps == null)
                {
                    targetRules.avoidObjectRuleMaps = new List <ObjectRuleMap>();
                }
                appearanceRules = targetRules.avoidObjectRuleMaps;
            }
            else
            {
                if (targetRules.probabilityAdjustmentMaps == null)
                {
                    targetRules.probabilityAdjustmentMaps = new List <ObjectRuleMap>();
                }
                appearanceRules = targetRules.probabilityAdjustmentMaps;
            }

            int  ruleInsertIndex     = 0;
            int  subRuleInsertIndex  = 0;
            bool parentBreak         = false;
            bool infiniteObjectFound = false;

            for (; ruleInsertIndex < appearanceRules.Count; ++ruleInsertIndex)
            {
                if (targetObject == appearanceRules[ruleInsertIndex].targetObject)
                {
                    List <ScoreObjectCountRule> scoreObjectCountRules = appearanceRules[ruleInsertIndex].rules;
                    for (; subRuleInsertIndex < scoreObjectCountRules.Count; ++subRuleInsertIndex)
                    {
                        // error if the current probability is overlapping an existing probability or within it
                        DistanceValue prob = scoreObjectCountRules[subRuleInsertIndex].probability;
                        if ((startDistance < prob.startDistance && endDistance > prob.startDistance) ||
                            (startDistance > prob.startDistance && endDistance < prob.endDistance) ||
                            (startDistance < prob.endDistance && endDistance > prob.endDistance) ||
                            (!prob.useEndDistance && startDistance > prob.startDistance) ||
                            (!useEndDistance && startDistance < prob.endDistance))
                        {
                            return(4);
                        }

                        // two probabilities can't ignore the end distance
                        if (!useEndDistance && !prob.useEndDistance)
                        {
                            return(5);
                        }

                        // found our place
                        if (endDistance <= prob.startDistance)
                        {
                            parentBreak = true;
                            break;
                        }
                    }
                    infiniteObjectFound = true;
                    break;
                }
                if (parentBreak)
                {
                    break;
                }
            }

            DistanceValue        distanceProb         = new DistanceValue(startDistance, startProbability, endDistance, endProbability, useEndDistance);
            ScoreObjectCountRule scoreObjectCountRule = new ScoreObjectCountRule(minDistance, minDistanceSameObjectType, minObjectSeperation, distanceProb, forceOccurance);

            if (infiniteObjectFound)
            {
                List <ScoreObjectCountRule> scoreObjectCountRules = appearanceRules[ruleInsertIndex].rules;
                scoreObjectCountRules.Insert(subRuleInsertIndex, scoreObjectCountRule);
            }
            else
            {
                ObjectRuleMap objectRuleMap = new ObjectRuleMap(targetObject, scoreObjectCountRule);
                appearanceRules.Insert(ruleInsertIndex, objectRuleMap);
            }

            EditorUtility.SetDirty(target);
            return(0);
        }