Refactor ColorDescriptionService to improve skin and hair color handling by introducing new methods for determining colors based on gene definitions. Add constants for color keywords to enhance readability and maintainability. Update AIImages.dll to reflect these changes.
All checks were successful
SonarQube Analysis / Build and analyze (push) Successful in 1m51s
All checks were successful
SonarQube Analysis / Build and analyze (push) Successful in 1m51s
This commit is contained in:
Binary file not shown.
@@ -11,6 +11,12 @@ namespace AIImages.Services
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class ColorDescriptionService
|
public static class ColorDescriptionService
|
||||||
{
|
{
|
||||||
|
// Константы для повторяющихся строковых литералов
|
||||||
|
private const string Green = "Green";
|
||||||
|
private const string Orange = "Orange";
|
||||||
|
private const string Black = "Black";
|
||||||
|
private const string White = "White";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получает текстовое описание цвета волос
|
/// Получает текстовое описание цвета волос
|
||||||
/// Сначала проверяет гены цвета волос, затем использует вычисленный RimWorld цвет волос
|
/// Сначала проверяет гены цвета волос, затем использует вычисленный RimWorld цвет волос
|
||||||
@@ -94,6 +100,35 @@ namespace AIImages.Services
|
|||||||
return GetSkinToneDescription(pawn.story.SkinColor);
|
return GetSkinToneDescription(pawn.story.SkinColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает текстовое описание цвета кожи по RGB цвету (fallback метод)
|
||||||
|
/// </summary>
|
||||||
|
public static string GetSkinToneDescription(Color color)
|
||||||
|
{
|
||||||
|
// Вычисляем яркость
|
||||||
|
float brightness = (color.r + color.g + color.b) / 3f;
|
||||||
|
|
||||||
|
// Определяем оттенок кожи
|
||||||
|
if (brightness >= 0.85f)
|
||||||
|
return "very fair skin";
|
||||||
|
else if (brightness >= 0.75f)
|
||||||
|
return "fair skin";
|
||||||
|
else if (brightness >= 0.65f)
|
||||||
|
return "light skin";
|
||||||
|
else if (brightness >= 0.55f)
|
||||||
|
return "medium skin";
|
||||||
|
else if (brightness >= 0.45f)
|
||||||
|
return "olive skin";
|
||||||
|
else if (brightness >= 0.35f)
|
||||||
|
return "tan skin";
|
||||||
|
else if (brightness >= 0.25f)
|
||||||
|
return "brown skin";
|
||||||
|
else if (brightness >= 0.15f)
|
||||||
|
return "dark brown skin";
|
||||||
|
else
|
||||||
|
return "very dark skin";
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверяет, является ли ген специальным геном цвета кожи (зелёная, синяя, красная и т.д.)
|
/// Проверяет, является ли ген специальным геном цвета кожи (зелёная, синяя, красная и т.д.)
|
||||||
/// Исключает гены меланина (Melanin1-9), так как они определяют обычный цвет кожи
|
/// Исключает гены меланина (Melanin1-9), так как они определяют обычный цвет кожи
|
||||||
@@ -110,30 +145,49 @@ namespace AIImages.Services
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Специальные цвета: зелёная, синяя, красная, жёлтая, фиолетовая, оранжевая, чёрная, белая, серая
|
// Специальные цвета: зелёная, синяя, красная, жёлтая, фиолетовая, оранжевая, чёрная, белая, серая
|
||||||
return geneDefName.StartsWith("Skin_")
|
return geneDefName.StartsWith("Skin_") && HasSpecialSkinColorKeyword(geneDefName);
|
||||||
&& (
|
}
|
||||||
geneDefName.Contains("Green")
|
|
||||||
|
/// <summary>
|
||||||
|
/// Проверяет наличие ключевых слов специальных цветов кожи
|
||||||
|
/// </summary>
|
||||||
|
private static bool HasSpecialSkinColorKeyword(string geneDefName)
|
||||||
|
{
|
||||||
|
return geneDefName.Contains(Green)
|
||||||
|| geneDefName.Contains("Blue")
|
|| geneDefName.Contains("Blue")
|
||||||
|| geneDefName.Contains("Red")
|
|| geneDefName.Contains("Red")
|
||||||
|| geneDefName.Contains("Yellow")
|
|| geneDefName.Contains("Yellow")
|
||||||
|| geneDefName.Contains("Purple")
|
|| geneDefName.Contains("Purple")
|
||||||
|| geneDefName.Contains("Orange")
|
|| geneDefName.Contains(Orange)
|
||||||
|| geneDefName.Contains("Black")
|
|| geneDefName.Contains(Black)
|
||||||
|| geneDefName.Contains("White")
|
|| geneDefName.Contains(White)
|
||||||
|| geneDefName.Contains("Gray")
|
|| geneDefName.Contains("Gray")
|
||||||
|| geneDefName.Contains("Grey")
|
|| geneDefName.Contains("Grey")
|
||||||
|| geneDefName.Contains("Ink")
|
|| geneDefName.Contains("Ink")
|
||||||
|| geneDefName.Contains("Slate")
|
|| geneDefName.Contains("Slate")
|
||||||
|| geneDefName.Contains("Sheer")
|
|| geneDefName.Contains("Sheer")
|
||||||
|| geneDefName.Contains("Pale")
|
|| geneDefName.Contains("Pale")
|
||||||
|| geneDefName.Contains("Deep")
|
|| geneDefName.Contains("Deep");
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получает описание для специальных генов цвета кожи
|
/// Получает описание для специальных генов цвета кожи
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static string GetSpecialGeneSkinTone(string geneDefName)
|
private static string GetSpecialGeneSkinTone(string geneDefName)
|
||||||
|
{
|
||||||
|
// Сначала проверяем точные совпадения
|
||||||
|
string exactMatch = GetExactSkinColorMatch(geneDefName);
|
||||||
|
if (exactMatch != null)
|
||||||
|
return exactMatch;
|
||||||
|
|
||||||
|
// Затем пытаемся определить по ключевым словам
|
||||||
|
return GetSkinColorByKeyword(geneDefName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает точное совпадение для известных генов цвета кожи
|
||||||
|
/// </summary>
|
||||||
|
private static string GetExactSkinColorMatch(string geneDefName)
|
||||||
{
|
{
|
||||||
switch (geneDefName)
|
switch (geneDefName)
|
||||||
{
|
{
|
||||||
@@ -162,8 +216,17 @@ namespace AIImages.Services
|
|||||||
case "Skin_Green":
|
case "Skin_Green":
|
||||||
return "green skin";
|
return "green skin";
|
||||||
default:
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Определяет цвет кожи по ключевым словам в названии гена
|
||||||
|
/// </summary>
|
||||||
|
private static string GetSkinColorByKeyword(string geneDefName)
|
||||||
|
{
|
||||||
// Пытаемся определить по названию (defName всегда на английском)
|
// Пытаемся определить по названию (defName всегда на английском)
|
||||||
if (geneDefName.Contains("Green"))
|
if (geneDefName.Contains(Green))
|
||||||
return "green skin";
|
return "green skin";
|
||||||
if (geneDefName.Contains("Blue"))
|
if (geneDefName.Contains("Blue"))
|
||||||
return "blue skin";
|
return "blue skin";
|
||||||
@@ -173,20 +236,19 @@ namespace AIImages.Services
|
|||||||
return "yellow skin";
|
return "yellow skin";
|
||||||
if (geneDefName.Contains("Purple"))
|
if (geneDefName.Contains("Purple"))
|
||||||
return "purple skin";
|
return "purple skin";
|
||||||
if (geneDefName.Contains("Orange"))
|
if (geneDefName.Contains(Orange))
|
||||||
return "orange skin";
|
return "orange skin";
|
||||||
if (geneDefName.Contains("Black"))
|
if (geneDefName.Contains(Black))
|
||||||
return "black skin";
|
return "black skin";
|
||||||
if (geneDefName.Contains("White"))
|
if (geneDefName.Contains(White))
|
||||||
return "white skin";
|
return "white skin";
|
||||||
if (geneDefName.Contains("Gray") || geneDefName.Contains("Grey"))
|
if (geneDefName.Contains("Gray") || geneDefName.Contains("Grey"))
|
||||||
return "gray skin";
|
return "gray skin";
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// /// Проверяет, подавлен ли ген другим активным геном
|
/// Проверяет, подавлен ли ген другим активным геном
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static bool IsGeneSuppressed(Pawn pawn, Gene gene)
|
private static bool IsGeneSuppressed(Pawn pawn, Gene gene)
|
||||||
{
|
{
|
||||||
@@ -201,32 +263,15 @@ namespace AIImages.Services
|
|||||||
// Проверяем все активные гены на предмет подавления данного гена
|
// Проверяем все активные гены на предмет подавления данного гена
|
||||||
foreach (var otherGene in pawn.genes.GenesListForReading)
|
foreach (var otherGene in pawn.genes.GenesListForReading)
|
||||||
{
|
{
|
||||||
if (otherGene.Active && otherGene != gene && otherGene.def != null)
|
|
||||||
{
|
|
||||||
// Проверяем через GeneUtility, если доступен
|
|
||||||
// Или проверяем свойство suppresses через reflection, если оно есть
|
|
||||||
var suppressesField = otherGene.def.GetType().GetField("suppresses");
|
|
||||||
if (suppressesField != null)
|
|
||||||
{
|
|
||||||
var suppresses = suppressesField.GetValue(otherGene.def);
|
|
||||||
if (
|
if (
|
||||||
suppresses
|
otherGene.Active
|
||||||
is System.Collections.Generic.List<GeneDef> suppressesList
|
&& otherGene != gene
|
||||||
|
&& otherGene.def != null
|
||||||
|
&& CheckGeneSuppression(otherGene.def, gene.def)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (suppressesList.Contains(gene.def))
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (
|
|
||||||
suppresses
|
|
||||||
is System.Collections.Generic.IEnumerable<GeneDef> suppressesEnum
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (suppressesEnum.Contains(gene.def))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
@@ -239,6 +284,29 @@ namespace AIImages.Services
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Проверяет, подавляет ли один ген другой через reflection
|
||||||
|
/// </summary>
|
||||||
|
private static bool CheckGeneSuppression(GeneDef suppressor, GeneDef suppressed)
|
||||||
|
{
|
||||||
|
var suppressesField = suppressor.GetType().GetField("suppresses");
|
||||||
|
if (suppressesField == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var suppresses = suppressesField.GetValue(suppressor);
|
||||||
|
if (suppresses is System.Collections.Generic.List<GeneDef> suppressesList)
|
||||||
|
{
|
||||||
|
return suppressesList.Contains(suppressed);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (suppresses is System.Collections.Generic.IEnumerable<GeneDef> suppressesEnum)
|
||||||
|
{
|
||||||
|
return suppressesEnum.Contains(suppressed);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Проверяет, является ли ген геном цвета волос
|
/// Проверяет, является ли ген геном цвета волос
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -261,17 +329,17 @@ namespace AIImages.Services
|
|||||||
|| geneDefName.Contains("Colour")
|
|| geneDefName.Contains("Colour")
|
||||||
|| geneDefName.Contains("Red")
|
|| geneDefName.Contains("Red")
|
||||||
|| geneDefName.Contains("Blue")
|
|| geneDefName.Contains("Blue")
|
||||||
|| geneDefName.Contains("Green")
|
|| geneDefName.Contains(Green)
|
||||||
|| geneDefName.Contains("Blond")
|
|| geneDefName.Contains("Blond")
|
||||||
|| geneDefName.Contains("Brown")
|
|| geneDefName.Contains("Brown")
|
||||||
|| geneDefName.Contains("Black")
|
|| geneDefName.Contains(Black)
|
||||||
|| geneDefName.Contains("White")
|
|| geneDefName.Contains(White)
|
||||||
|| geneDefName.Contains("Light")
|
|| geneDefName.Contains("Light")
|
||||||
|| geneDefName.Contains("Dark")
|
|| geneDefName.Contains("Dark")
|
||||||
|| geneDefName.Contains("Ginger")
|
|| geneDefName.Contains("Ginger")
|
||||||
|| geneDefName.Contains("Auburn")
|
|| geneDefName.Contains("Auburn")
|
||||||
|| geneDefName.Contains("Copper")
|
|| geneDefName.Contains("Copper")
|
||||||
|| geneDefName.Contains("Orange")
|
|| geneDefName.Contains(Orange)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -286,7 +354,20 @@ namespace AIImages.Services
|
|||||||
|
|
||||||
string geneDefName = geneDef.defName;
|
string geneDefName = geneDef.defName;
|
||||||
|
|
||||||
// Специфичные описания для известных генов цвета волос
|
// Сначала проверяем точные совпадения
|
||||||
|
string exactMatch = GetExactHairColorMatch(geneDefName);
|
||||||
|
if (exactMatch != null)
|
||||||
|
return exactMatch;
|
||||||
|
|
||||||
|
// Затем пытаемся определить по ключевым словам
|
||||||
|
return GetHairColorByKeyword(geneDefName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает точное совпадение для известных генов цвета волос
|
||||||
|
/// </summary>
|
||||||
|
private static string GetExactHairColorMatch(string geneDefName)
|
||||||
|
{
|
||||||
switch (geneDefName)
|
switch (geneDefName)
|
||||||
{
|
{
|
||||||
case "Hair_Blond":
|
case "Hair_Blond":
|
||||||
@@ -312,15 +393,41 @@ namespace AIImages.Services
|
|||||||
case "Hair_Dark":
|
case "Hair_Dark":
|
||||||
return "dark hair";
|
return "dark hair";
|
||||||
default:
|
default:
|
||||||
// Пытаемся определить по названию (defName всегда на английском)
|
return null;
|
||||||
// Добавляем поддержку конкретных генов из RimWorld
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Определяет цвет волос по ключевым словам в названии гена
|
||||||
|
/// </summary>
|
||||||
|
private static string GetHairColorByKeyword(string geneDefName)
|
||||||
|
{
|
||||||
|
// Проверяем основные цвета волос
|
||||||
|
string basicColor = GetBasicHairColor(geneDefName);
|
||||||
|
if (basicColor != null)
|
||||||
|
return basicColor;
|
||||||
|
|
||||||
|
// Проверяем специальные цвета
|
||||||
|
string specialColor = GetSpecialHairColor(geneDefName);
|
||||||
|
if (specialColor != null)
|
||||||
|
return specialColor;
|
||||||
|
|
||||||
|
// Проверяем оттенки
|
||||||
|
return GetHairColorShade(geneDefName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает основной цвет волос
|
||||||
|
/// </summary>
|
||||||
|
private static string GetBasicHairColor(string geneDefName)
|
||||||
|
{
|
||||||
if (geneDefName.Contains("Blond"))
|
if (geneDefName.Contains("Blond"))
|
||||||
return "blond hair";
|
return "blond hair";
|
||||||
if (geneDefName.Contains("Brown"))
|
if (geneDefName.Contains("Brown"))
|
||||||
return "brown hair";
|
return "brown hair";
|
||||||
if (geneDefName.Contains("Black"))
|
if (geneDefName.Contains(Black))
|
||||||
return "black hair";
|
return "black hair";
|
||||||
if (geneDefName.Contains("White"))
|
if (geneDefName.Contains(White))
|
||||||
return "white hair";
|
return "white hair";
|
||||||
if (geneDefName.Contains("Red"))
|
if (geneDefName.Contains("Red"))
|
||||||
return "red hair";
|
return "red hair";
|
||||||
@@ -328,17 +435,21 @@ namespace AIImages.Services
|
|||||||
return "ginger hair";
|
return "ginger hair";
|
||||||
if (geneDefName.Contains("Auburn"))
|
if (geneDefName.Contains("Auburn"))
|
||||||
return "auburn hair";
|
return "auburn hair";
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получает специальный цвет волос
|
||||||
|
/// </summary>
|
||||||
|
private static string GetSpecialHairColor(string geneDefName)
|
||||||
|
{
|
||||||
if (geneDefName.Contains("Copper"))
|
if (geneDefName.Contains("Copper"))
|
||||||
return "copper-brown hair";
|
return "copper-brown hair";
|
||||||
if (geneDefName.Contains("Orange"))
|
if (geneDefName.Contains(Orange))
|
||||||
return "orange-red hair";
|
return "orange-red hair";
|
||||||
if (geneDefName.Contains("Light"))
|
|
||||||
return "light hair";
|
|
||||||
if (geneDefName.Contains("Dark"))
|
|
||||||
return "dark hair";
|
|
||||||
if (geneDefName.Contains("Blue"))
|
if (geneDefName.Contains("Blue"))
|
||||||
return "blue hair";
|
return "blue hair";
|
||||||
if (geneDefName.Contains("Green"))
|
if (geneDefName.Contains(Green))
|
||||||
return "green hair";
|
return "green hair";
|
||||||
if (geneDefName.Contains("Purple"))
|
if (geneDefName.Contains("Purple"))
|
||||||
return "purple hair";
|
return "purple hair";
|
||||||
@@ -348,35 +459,17 @@ namespace AIImages.Services
|
|||||||
return "gray hair";
|
return "gray hair";
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Получает текстовое описание цвета кожи по RGB цвету (fallback метод)
|
/// Получает оттенок волос
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string GetSkinToneDescription(Color color)
|
private static string GetHairColorShade(string geneDefName)
|
||||||
{
|
{
|
||||||
// Вычисляем яркость
|
if (geneDefName.Contains("Light"))
|
||||||
float brightness = (color.r + color.g + color.b) / 3f;
|
return "light hair";
|
||||||
|
if (geneDefName.Contains("Dark"))
|
||||||
// Определяем оттенок кожи
|
return "dark hair";
|
||||||
if (brightness >= 0.85f)
|
return null;
|
||||||
return "very fair skin";
|
|
||||||
else if (brightness >= 0.75f)
|
|
||||||
return "fair skin";
|
|
||||||
else if (brightness >= 0.65f)
|
|
||||||
return "light skin";
|
|
||||||
else if (brightness >= 0.55f)
|
|
||||||
return "medium skin";
|
|
||||||
else if (brightness >= 0.45f)
|
|
||||||
return "olive skin";
|
|
||||||
else if (brightness >= 0.35f)
|
|
||||||
return "tan skin";
|
|
||||||
else if (brightness >= 0.25f)
|
|
||||||
return "brown skin";
|
|
||||||
else if (brightness >= 0.15f)
|
|
||||||
return "dark brown skin";
|
|
||||||
else
|
|
||||||
return "very dark skin";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user