This commit is contained in:
2025-11-27 17:30:18 +08:00
parent 0cca8b0516
commit 5322cdba9a
4 changed files with 38 additions and 41 deletions

View File

@@ -1052,10 +1052,6 @@
</li>
</tools>
<comps>
<li Class="CompProperties_Glower">
<glowRadius>6</glowRadius>
<glowColor>(120,240,252,0)</glowColor>
</li>
<li Class="WulaFallenEmpire.CompProperties_MultiTurretGun">
<ID>0</ID>
<turretDef>WULA_Cat_Bunker_TurretGun</turretDef>

View File

@@ -6,5 +6,4 @@
<WULA_Intro_Spy.questDescriptionRules.rulesStrings>
<li>questDescription->乌拉帝国行星封锁机关的总控AI向殖民地发送了一个请求。一位乌拉帝国密探已经暴露正在遭受其他派系追杀——密探手无寸铁且携带重要信息殖民地需要掩护它直到乌拉帝国的穿梭机抵达并将其接走。虽然对方未透露更多信息不过她指明袭击不会太剧烈密探已经甩掉了大部分敌人。</li>
</WULA_Intro_Spy.questDescriptionRules.rulesStrings>
</LanguageData>

View File

@@ -42,8 +42,8 @@ namespace WulaFallenEmpire
if (!IsWithinMapBounds(buildingDef, center, map, out failReason))
return false;
// 4. 检查地形affordance
if (!HasValidTerrainAffordance(buildingDef, center, map, out failReason))
// 4. 检查地形是否可建造
if (!HasBuildableTerrain(buildingDef, center, map, out failReason))
return false;
// 5. 检查其他建筑挤占(排除要忽略的物体)
@@ -54,7 +54,7 @@ namespace WulaFallenEmpire
if (!MeetsSpecialPlacementConditions(buildingDef, center, map, out failReason))
return false;
// 7. 使用RimWorld原生的放置检查最终验证
// 7. 使用RimWorld原生的放置检查最终验证- 移除派系限制
if (!GenConstruct.CanPlaceBlueprintAt(buildingDef, center, Rot4.North, map, false, null, null, null))
{
failReason = "该位置不符合建筑放置要求";
@@ -90,18 +90,10 @@ namespace WulaFallenEmpire
}
/// <summary>
/// 检查地形affordance
/// 检查地形是否可建造 - 重新设计的逻辑
/// </summary>
private static bool HasValidTerrainAffordance(ThingDef buildingDef, IntVec3 center, Map map, out string failReason)
private static bool HasBuildableTerrain(ThingDef buildingDef, IntVec3 center, Map map, out string failReason)
{
TerrainAffordanceDef requiredAffordance = buildingDef.terrainAffordanceNeeded;
if (requiredAffordance == null)
{
// 如果没有指定affordance要求则跳过检查
failReason = null;
return true;
}
CellRect occupiedRect = GenAdj.OccupiedRect(center, Rot4.North, buildingDef.Size);
foreach (IntVec3 cell in occupiedRect)
@@ -110,9 +102,23 @@ namespace WulaFallenEmpire
continue;
TerrainDef terrain = map.terrainGrid.TerrainAt(cell);
if (terrain == null || !terrain.affordances.Contains(requiredAffordance))
if (terrain == null)
{
failReason = $"地形 {terrain?.LabelCap ?? ""} 不支持放置 {buildingDef.LabelCap}";
failReason = "未知地形";
return false;
}
// 检查是否在水体上
if (terrain.IsWater)
{
failReason = $"无法在水体 ({terrain.LabelCap}) 上放置建筑";
return false;
}
// 检查affordance - 使用更宽松的逻辑
if (!HasValidAffordance(buildingDef, terrain))
{
failReason = $"地形 {terrain.LabelCap} 不支持放置 {buildingDef.LabelCap}";
return false;
}
}
@@ -121,6 +127,23 @@ namespace WulaFallenEmpire
return true;
}
/// <summary>
/// 检查affordance兼容性 - 重新设计的逻辑
/// </summary>
private static bool HasValidAffordance(ThingDef buildingDef, TerrainDef terrain)
{
// 如果建筑没有指定affordance要求则跳过检查
if (buildingDef.terrainAffordanceNeeded == null)
return true;
// 如果地形没有affordances列表则检查失败
if (terrain.affordances == null || terrain.affordances.Count == 0)
return false;
// 检查地形是否提供建筑所需的affordance
return terrain.affordances.Contains(buildingDef.terrainAffordanceNeeded);
}
/// <summary>
/// 检查区域是否被其他建筑阻挡(排除指定物体)
/// </summary>
@@ -182,27 +205,6 @@ namespace WulaFallenEmpire
{
CellRect occupiedRect = GenAdj.OccupiedRect(center, Rot4.North, buildingDef.Size);
// 检查是否在水体上
foreach (IntVec3 cell in occupiedRect)
{
if (!cell.InBounds(map))
continue;
TerrainDef terrain = map.terrainGrid.TerrainAt(cell);
if (terrain != null && (terrain.IsWater || terrain.defName.Contains("Water")))
{
failReason = "无法在水体上放置建筑";
return false;
}
// 检查是否在不可建造的地形上
if (terrain != null && !terrain.BuildableByPlayer)
{
failReason = $"地形 {terrain.LabelCap} 不可建造";
return false;
}
}
failReason = null;
return true;
}