11
This commit is contained in:
Binary file not shown.
@@ -250,57 +250,68 @@ namespace ArachnaeSwarm
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 检查两个部位是否对称
|
/// 检查两个部位是否对称
|
||||||
|
/// 使用 MCP 验证的 RimWorld 1.6 API
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private bool IsSymmetricalPart(BodyPartRecord part1, BodyPartRecord part2)
|
private bool IsSymmetricalPart(BodyPartRecord part1, BodyPartRecord part2)
|
||||||
{
|
{
|
||||||
// 优先使用 BodyPartDef 的对称标签检测
|
if (part1 == null || part2 == null || part1 == part2)
|
||||||
if (part1.def == part2.def)
|
return false;
|
||||||
{
|
|
||||||
// 检查是否有对称标签
|
|
||||||
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))
|
// 方法1:使用 BodyPartDef.IsMirroredPart(MCP验证:tags.Contains(BodyPartTagDefOf.Mirrored))
|
||||||
|
// 镜像部位通常有左右之分
|
||||||
|
if (part1.def.IsMirroredPart && part2.def.IsMirroredPart && part1.def == part2.def)
|
||||||
|
{
|
||||||
|
// 同类型的镜像部位,检查是否是相反侧
|
||||||
|
if (AreOppositeMirroredParts(part1, part2))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// 备用方案:使用自定义标签检测(支持本地化)
|
// 方法2:通过 customLabel 检测(如 "left arm", "right arm")
|
||||||
string label1 = part1.customLabel ?? part1.def.label;
|
string label1 = part1.customLabel ?? part1.def.label;
|
||||||
string label2 = part2.customLabel ?? part2.def.label;
|
string label2 = part2.customLabel ?? part2.def.label;
|
||||||
|
|
||||||
// 使用翻译键检测,而非硬编码英文
|
if (!string.IsNullOrEmpty(label1) && !string.IsNullOrEmpty(label2))
|
||||||
string leftKey = "Left".Translate();
|
{
|
||||||
string rightKey = "Right".Translate();
|
// 检查左右对称(使用翻译键支持本地化)
|
||||||
|
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");
|
if ((part1Left && part2Right) || (part1Right && part2Left))
|
||||||
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;
|
return true;
|
||||||
|
|
||||||
// 检查前后对称
|
// 检查前后对称
|
||||||
string frontKey = "Front".Translate();
|
bool part1Front = label1.Contains("Front") || label1.Contains("front");
|
||||||
string backKey = "Back".Translate();
|
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");
|
if ((part1Front && part2Back) || (part1Back && part2Front))
|
||||||
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;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
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>
|
||||||
/// 检查身体部位是否有效
|
/// 检查身体部位是否有效
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user