using System; using System.Reflection; using HarmonyLib; using UnityEngine; using Verse; using WulaFallenEmpire.Utils; namespace WulaFallenEmpire { [StaticConstructorOnStartup] public class WulaFallenEmpireMod : Mod { public static WulaFallenEmpireSettings settings; public static bool _showApiKey = false; public static bool _showVlmApiKey = false; private string _maxContextTokensBuffer; public WulaFallenEmpireMod(ModContentPack content) : base(content) { settings = GetSettings(); // 初始化Harmony var harmony = new Harmony("tourswen.wulafallenempire"); // 替换为您的唯一Mod ID harmony.PatchAll(Assembly.GetExecutingAssembly()); WulaLog.Debug("[WulaFallenEmpire] Harmony patches applied."); } public override void DoSettingsWindowContents(Rect inRect) { Listing_Standard listingStandard = new Listing_Standard(); listingStandard.Begin(inRect); listingStandard.Label("Wula_AISettings_Title".Translate()); listingStandard.Label("Wula_AISettings_ApiKey".Translate()); Rect apiKeyRect = listingStandard.GetRect(30f); // 这里我们手动实现一个带切换功能的密码输入框 float toggleWidth = 60f; Rect passwordRect = new Rect(apiKeyRect.x, apiKeyRect.y, apiKeyRect.width - toggleWidth - 5f, apiKeyRect.height); Rect toggleRect = new Rect(apiKeyRect.xMax - toggleWidth, apiKeyRect.y, toggleWidth, apiKeyRect.height); // 使用静态布尔值或类成员来记住显示状态 if (WulaFallenEmpireMod._showApiKey) { settings.apiKey = Widgets.TextField(passwordRect, settings.apiKey); } else { settings.apiKey = GUI.PasswordField(passwordRect, settings.apiKey, '•'); } Widgets.CheckboxLabeled(toggleRect, "Show", ref WulaFallenEmpireMod._showApiKey); listingStandard.Gap(listingStandard.verticalSpacing); listingStandard.Label("Wula_AISettings_BaseUrl".Translate()); settings.baseUrl = listingStandard.TextEntry(settings.baseUrl); listingStandard.Label("Wula_AISettings_Model".Translate()); settings.model = listingStandard.TextEntry(settings.model); listingStandard.Gap(5f); listingStandard.Label("API 协议格式:"); if (listingStandard.RadioButton("OpenAI / 常用兼容格式 (默认)", !settings.useGeminiProtocol)) settings.useGeminiProtocol = false; if (listingStandard.RadioButton("Google Gemini 原生格式", settings.useGeminiProtocol)) settings.useGeminiProtocol = true; listingStandard.Gap(5f); listingStandard.GapLine(); listingStandard.Label("Wula_AISettings_MaxContextTokens".Translate()); listingStandard.Label("Wula_AISettings_MaxContextTokensDesc".Translate()); Rect tokensRect = listingStandard.GetRect(Text.LineHeight); Widgets.TextFieldNumeric(tokensRect, ref settings.maxContextTokens, ref _maxContextTokensBuffer, 1000, 200000); listingStandard.GapLine(); listingStandard.CheckboxLabeled("Wula_EnableDebugLogs".Translate(), ref settings.enableDebugLogs, "Wula_EnableDebugLogsDesc".Translate()); // 视觉设置部分 listingStandard.GapLine(); listingStandard.Label("视觉与多模态设置"); listingStandard.CheckboxLabeled("启用视觉交互能力", ref settings.enableVlmFeatures, "启用后 AI 可以截取屏幕并理解游戏画面"); if (settings.enableVlmFeatures) { listingStandard.CheckboxLabeled("优先使用原生多模态模式", ref settings.useNativeMultimodal, "直接在思考阶段将截图发送给主模型(推荐,速度更快,需模型支持视角)"); listingStandard.CheckboxLabeled("在 UI 中显示中间思考过程", ref settings.showThinkingProcess, "显示 AI 执行工具时的状态反馈"); } listingStandard.GapLine(); listingStandard.Label("Translation tools"); Rect exportRect = listingStandard.GetRect(30f); if (Widgets.ButtonText(exportRect, "Export DefInjected template (CN source)")) { DefInjectedExportUtility.ExportDefInjectedTemplateFromDefs(Content); } listingStandard.End(); base.DoSettingsWindowContents(inRect); } public override string SettingsCategory() { return "Wula Fallen Empire"; } } [StaticConstructorOnStartup] public static class StartupLogger { static StartupLogger() { WulaLog.Debug("WulaFallenEmpire Mod DLL, version 1.0.2, has been loaded."); } } }