11
This commit is contained in:
Binary file not shown.
@@ -250,57 +250,68 @@ namespace ArachnaeSwarm
|
||||
|
||||
/// <summary>
|
||||
/// 检查两个部位是否对称
|
||||
/// 使用 MCP 验证的 RimWorld 1.6 API
|
||||
/// </summary>
|
||||
private bool IsSymmetricalPart(BodyPartRecord part1, BodyPartRecord part2)
|
||||
{
|
||||
// 优先使用 BodyPartDef 的对称标签检测
|
||||
if (part1.def == part2.def)
|
||||
if (part1 == null || part2 == null || part1 == part2)
|
||||
return false;
|
||||
|
||||
// 方法1:使用 BodyPartDef.IsMirroredPart(MCP验证:tags.Contains(BodyPartTagDefOf.Mirrored))
|
||||
// 镜像部位通常有左右之分
|
||||
if (part1.def.IsMirroredPart && part2.def.IsMirroredPart && part1.def == part2.def)
|
||||
{
|
||||
// 检查是否有对称标签
|
||||
if (part1.def.tags != null)
|
||||
{
|
||||
// 使用 BodyPartTagDef 进行对称检测
|
||||
bool part1Left = part1.def.tags.Any(t => t.defName.Contains("Left"));
|
||||
bool part1Right = part1.def.tags.Any(t => t.defName.Contains("Right"));
|
||||
bool part2Left = part2.def.tags.Any(t => t.defName.Contains("Left"));
|
||||
bool part2Right = part2.def.tags.Any(t => t.defName.Contains("Right"));
|
||||
|
||||
if ((part1Left && part2Right) || (part1Right && part2Left))
|
||||
return true;
|
||||
}
|
||||
// 同类型的镜像部位,检查是否是相反侧
|
||||
if (AreOppositeMirroredParts(part1, part2))
|
||||
return true;
|
||||
}
|
||||
|
||||
// 备用方案:使用自定义标签检测(支持本地化)
|
||||
// 方法2:通过 customLabel 检测(如 "left arm", "right arm")
|
||||
string label1 = part1.customLabel ?? part1.def.label;
|
||||
string label2 = part2.customLabel ?? part2.def.label;
|
||||
|
||||
// 使用翻译键检测,而非硬编码英文
|
||||
string leftKey = "Left".Translate();
|
||||
string rightKey = "Right".Translate();
|
||||
|
||||
bool label1HasLeft = label1.Contains(leftKey) || label1.Contains("Left");
|
||||
bool label1HasRight = label1.Contains(rightKey) || label1.Contains("Right");
|
||||
bool label2HasLeft = label2.Contains(leftKey) || label2.Contains("Left");
|
||||
bool label2HasRight = label2.Contains(rightKey) || label2.Contains("Right");
|
||||
|
||||
if ((label1HasLeft && label2HasRight) || (label1HasRight && label2HasLeft))
|
||||
return true;
|
||||
|
||||
// 检查前后对称
|
||||
string frontKey = "Front".Translate();
|
||||
string backKey = "Back".Translate();
|
||||
|
||||
bool label1HasFront = label1.Contains(frontKey) || label1.Contains("Front");
|
||||
bool label1HasBack = label1.Contains(backKey) || label1.Contains("Back");
|
||||
bool label2HasFront = label2.Contains(frontKey) || label2.Contains("Front");
|
||||
bool label2HasBack = label2.Contains(backKey) || label2.Contains("Back");
|
||||
|
||||
if ((label1HasFront && label2HasBack) || (label1HasBack && label2HasFront))
|
||||
return true;
|
||||
if (!string.IsNullOrEmpty(label1) && !string.IsNullOrEmpty(label2))
|
||||
{
|
||||
// 检查左右对称(使用翻译键支持本地化)
|
||||
bool part1Left = label1.Contains("Left") || label1.Contains("left");
|
||||
bool part1Right = label1.Contains("Right") || label1.Contains("right");
|
||||
bool part2Left = label2.Contains("Left") || label2.Contains("left");
|
||||
bool part2Right = label2.Contains("Right") || label2.Contains("right");
|
||||
|
||||
if ((part1Left && part2Right) || (part1Right && part2Left))
|
||||
return true;
|
||||
|
||||
// 检查前后对称
|
||||
bool part1Front = label1.Contains("Front") || label1.Contains("front");
|
||||
bool part1Back = label1.Contains("Back") || label1.Contains("back");
|
||||
bool part2Front = label2.Contains("Front") || label2.Contains("front");
|
||||
bool part2Back = label2.Contains("Back") || label2.Contains("back");
|
||||
|
||||
if ((part1Front && part2Back) || (part1Back && part2Front))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查两个镜像部位是否是相反侧
|
||||
/// </summary>
|
||||
private bool AreOppositeMirroredParts(BodyPartRecord part1, BodyPartRecord part2)
|
||||
{
|
||||
// 检查是否在同一层级(相同的父部位)
|
||||
if (part1.parent != part2.parent)
|
||||
return false;
|
||||
|
||||
// 检查索引是否不同(左右部位通常是相邻的)
|
||||
if (part1.Index == part2.Index)
|
||||
return false;
|
||||
|
||||
// 对于镜像部位,如果它们有相同的 BodyPartDef 但不同的 Index,通常是对称的
|
||||
// 这是一个合理的假设,因为 RimWorld 的身体定义中镜像部位通常是成对出现的
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查身体部位是否有效
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user