Files
WulaFallenEmpireRW/Source/WulaFallenEmpire/Damage/DamageWorker_ExplosionWithTerrain.cs
ProjectKoi-Kalo\Kalo 98a0400c78 WulaFallenEmpireSettings.cs - 添加了 public bool enableDebugLogs = false; 字段和保存配置
 WulaLog.cs - 修改了DebugEnabled属性,仅检查enableDebugLogs设置(不检查DevMode)
 WulaFallenEmpireMod.cs - 在DoSettingsWindowContents中添加了UI复选框,显示"Enable Debug Logs"选项
 替换了所有848个Log.Message/Error/Warning调用为WulaLog.Debug()
2025-12-15 13:05:50 +08:00

90 lines
3.1 KiB
C#

using System.Collections.Generic;
using System.Linq;
using RimWorld;
using UnityEngine;
using Verse;
using Verse.Sound;
namespace WulaFallenEmpire
{
public class DamageWorker_ExplosionWithTerrain : DamageWorker_AddInjury
{
// 获取地形覆盖扩展
private DamageDefExtension_TerrainCover GetTerrainCoverExtension(DamageDef damageDef)
{
if (damageDef?.modExtensions == null)
return null;
return damageDef.modExtensions
.OfType<DamageDefExtension_TerrainCover>()
.FirstOrDefault();
}
public override void ExplosionAffectCell(Explosion explosion, IntVec3 c, List<Thing> damagedThings, List<Thing> ignoredThings, bool canThrowMotes)
{
base.ExplosionAffectCell(explosion, c, damagedThings, ignoredThings, canThrowMotes);
var terrainCover = GetTerrainCoverExtension(explosion.damType);
// 处理地形覆盖
ProcessTerrainCover(explosion, c, terrainCover);
}
// 处理地形覆盖
private void ProcessTerrainCover(Explosion explosion, IntVec3 cellsToAffect, DamageDefExtension_TerrainCover terrainCover)
{
if (explosion.Map == null)
return;
Map map = explosion.Map;
ApplyTerrainCoverToCell(cellsToAffect, map, terrainCover, explosion);
}
// 对单个单元格应用地形覆盖
public void ApplyTerrainCoverToCell(IntVec3 cell, Map map,
DamageDefExtension_TerrainCover terrainCover, Explosion explosion = null)
{
// 检查单元格是否可影响
if (!terrainCover.CanAffectCell(cell, map, out string reason))
{
WulaLog.Debug($"Cannot affect cell {cell}: {reason}");
return;
}
TerrainDef currentTerrain = cell.GetTerrain(map);
// 检查框架
Frame frame = cell.GetFirstThing<Frame>(map);
// 检查植物(特别是大型树木)
Plant plant = cell.GetPlant(map);
if (plant != null && plant.def.plant.treeCategory == TreeCategory.Super)
{
WulaLog.Debug($"Large tree at {cell}, skipping");
return;
}
// 尝试设置地形
if (GenConstruct.CanBuildOnTerrain(terrainCover.terrainToSpawn, cell, map, Rot4.North))
{
// 销毁框架(如果需要)
if (frame != null)
{
frame.Destroy(DestroyMode.Vanish);
}
// 保存原始地形(用于临时覆盖)
TerrainDef originalTerrain = map.terrainGrid.TerrainAt(cell);
// 设置新地形
map.terrainGrid.SetTerrain(cell, terrainCover.terrainToSpawn);
WulaLog.Debug($"Applied terrain {terrainCover.terrainToSpawn.defName} to cell {cell}");
}
else
{
WulaLog.Debug($"Cannot build terrain {terrainCover.terrainToSpawn.defName} at cell {cell}");
}
}
}
}