// Determine if enums are unique to specific effect // or general for all effects private static void DetectCommonEnums(List <Effects.Effect> effects) { List <Effects.Property> allProperties = GetAllEffectsProperties(effects); for (int propertyIndex = 0; propertyIndex < allProperties.Count; propertyIndex++) { Effects.EnumValues fields = allProperties[propertyIndex].EnumFields; if (fields == null || fields.Usage != Effects.EnumValues.UsageType.UsedByOneEffect) { continue; } for (int propertyIndex2 = propertyIndex + 1; propertyIndex2 < allProperties.Count; propertyIndex2++) { Effects.EnumValues fields2 = allProperties[propertyIndex2].EnumFields; if (fields2 == null || fields.FieldsList.Count != fields2.FieldsList.Count) { continue; } if (fields.Equals(fields2)) { fields.Usage = Effects.EnumValues.UsageType.UsedByMultipleEffects; fields.IsRepresentative = true; fields2.Usage = Effects.EnumValues.UsageType.UsedByMultipleEffects; fields2.FieldsList = fields.FieldsList; } } } }
private static void AssignD2DEnums(List <Effects.Effect> effects, List <Enum> d2dEnums) { foreach (var property in GetAllEffectsProperties(effects)) { Effects.EnumValues fields = property.EnumFields; if (fields == null) { continue; } // Try to find enum for specific effect foreach (var d2dEnum in d2dEnums) { if (IsEnumEqualD2DEnum(property, d2dEnum, true)) { fields.D2DEnum = d2dEnum; } } // If failed to find enum for specific effect, try general if (fields.D2DEnum == null) { // Try to find enum without name matching foreach (var d2dEnum in d2dEnums) { if (IsEnumEqualD2DEnum(property, d2dEnum, false)) { fields.D2DEnum = d2dEnum; } } } } }
// Determine if enums are unique to specific effect // or general for all effects private static void DetectCommonEnums(List <Effects.Effect> effects) { List <Effects.Property> allProperties = GetAllEffectsProperties(effects); for (int propertyIndex = 0; propertyIndex < allProperties.Count; propertyIndex++) { Effects.EnumValues fields = allProperties[propertyIndex].EnumFields; if (fields == null || fields.Usage != Effects.EnumValues.UsageType.UsedByOneEffect) { continue; } for (int propertyIndex2 = propertyIndex + 1; propertyIndex2 < allProperties.Count; propertyIndex2++) { Effects.EnumValues fields2 = allProperties[propertyIndex2].EnumFields; if (fields2 == null) { continue; } // Allow merging if either enum is a subset of the values of the other, // but not if their value sets are distinct in both directions. var delta1 = fields.FieldsList.Except(fields2.FieldsList); var delta2 = fields2.FieldsList.Except(fields.FieldsList); if (!delta1.Any() || !delta2.Any()) { fields.Usage = Effects.EnumValues.UsageType.UsedByMultipleEffects; fields.IsRepresentative = true; fields2.Usage = Effects.EnumValues.UsageType.UsedByMultipleEffects; fields2.FieldsList = fields.FieldsList; // Exclude any enum values that are supported by one enum but not the other. allProperties[propertyIndex2].ExcludedEnumIndexes.AddRange(delta1.Select(field => fields.FieldsList.IndexOf(field).ToString())); allProperties[propertyIndex].ExcludedEnumIndexes.AddRange(delta2.Select(field => fields2.FieldsList.IndexOf(field).ToString())); } } } }