using System; using RimWorld; using Verse; namespace WulaFallenEmpire.EventSystem.AI.Tools { /// /// 征召殖民者工具 - 将殖民者置于征召状态以便直接控制 /// public class Tool_DraftPawn : AITool { public override string Name => "draft_pawn"; public override string Description => "征召或解除征召殖民者。征召后可以直接控制殖民者移动和攻击。"; public override string UsageSchema => "殖民者名字true征召/false解除"; public override string Execute(string args) { try { var argsDict = ParseXmlArgs(args); // 解析殖民者名字 if (!argsDict.TryGetValue("pawn_name", out string pawnName) || string.IsNullOrWhiteSpace(pawnName)) { // 尝试其他常见参数名 if (!argsDict.TryGetValue("name", out pawnName) || string.IsNullOrWhiteSpace(pawnName)) { return "Error: 缺少殖民者名字 (pawn_name)"; } } // 解析征召状态 bool draft = true; if (argsDict.TryGetValue("draft", out string draftStr)) { draft = draftStr.ToLowerInvariant() != "false" && draftStr != "0"; } // 获取地图 Map map = Find.CurrentMap; if (map == null) { return "Error: 没有活动的地图"; } // 查找殖民者 Pawn targetPawn = null; foreach (var pawn in map.mapPawns.FreeColonists) { if (pawn.LabelShortCap.Equals(pawnName, StringComparison.OrdinalIgnoreCase) || pawn.Name?.ToStringShort?.Equals(pawnName, StringComparison.OrdinalIgnoreCase) == true || pawn.LabelCap.ToString().IndexOf(pawnName, StringComparison.OrdinalIgnoreCase) >= 0) { targetPawn = pawn; break; } } if (targetPawn == null) { return $"Error: 找不到殖民者 '{pawnName}'"; } // 检查是否可以征召 if (targetPawn.Downed) { return $"Error: {targetPawn.LabelShortCap} 已倒地,无法征召"; } if (targetPawn.Dead) { return $"Error: {targetPawn.LabelShortCap} 已死亡"; } if (targetPawn.drafter == null) { return $"Error: {targetPawn.LabelShortCap} 无法被征召"; } // 执行征召/解除 bool wasDrafted = targetPawn.Drafted; targetPawn.drafter.Drafted = draft; string action = draft ? "征召" : "解除征召"; if (wasDrafted == draft) { return $"Info: {targetPawn.LabelShortCap} 已经处于{(draft ? "征召" : "非征召")}状态"; } Messages.Message($"AI: {action}了 {targetPawn.LabelShortCap}", targetPawn, MessageTypeDefOf.NeutralEvent); return $"Success: 已{action} {targetPawn.LabelShortCap},当前位置 ({targetPawn.Position.x}, {targetPawn.Position.z})"; } catch (Exception ex) { WulaLog.Debug($"[Tool_DraftPawn] Error: {ex}"); return $"Error: 征召操作失败 - {ex.Message}"; } } } }