This commit is contained in:
2026-02-15 00:32:40 +08:00
parent f9624818f5
commit 98fb8d89c3
2 changed files with 49 additions and 38 deletions

Binary file not shown.

View File

@@ -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.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 (part1 == null || part2 == null || part1 == part2)
return false;
if ((part1Left && part2Right) || (part1Right && part2Left))
// 方法1使用 BodyPartDef.IsMirroredPartMCP验证tags.Contains(BodyPartTagDefOf.Mirrored)
// 镜像部位通常有左右之分
if (part1.def.IsMirroredPart && part2.def.IsMirroredPart && part1.def == part2.def)
{
// 同类型的镜像部位,检查是否是相反侧
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();
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");
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))
if ((part1Left && part2Right) || (part1Right && part2Left))
return true;
// 检查前后对称
string frontKey = "Front".Translate();
string backKey = "Back".Translate();
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");
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))
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>