{"record":{"id":"d1db28b699c3cc2a","repo":"babalae/better-genshin-impact","slug":"error-d1db28","errorCode":null,"errorMessage":"没有可用战斗脚本","messagePattern":"没有可用战斗脚本","errorType":"exception","errorClass":"Exception","httpStatus":null,"severity":"error","filePath":"BetterGenshinImpact/GameTask/AutoBoss/AutoBossTask.cs","lineNumber":885,"sourceCode":"                Sleep(1000, _ct);\n            }\n        }\n\n        throw new Exception(\"识别队伍角色失败（已重试 5 次）\");\n    }\n\n    /// <summary>\n    /// 根据当前队伍匹配战斗脚本，并切换到脚本中的首个角色。\n    /// </summary>\n    /// <param name=\"combatScenes\">已初始化的战斗场景。</param>\n    /// <returns>匹配到的战斗指令列表。</returns>\n    /// <exception cref=\"Exception\">没有可用战斗脚本时抛出。</exception>\n    private List<CombatCommand> FindCombatScriptAndSwitchAvatar(CombatScenes combatScenes)\n    {\n        var combatCommands = _combatScriptBag.FindCombatScript(combatScenes.GetAvatars());\n        if (combatCommands.Count == 0)\n        {\n            throw new Exception(\"没有可用战斗脚本\");\n        }\n\n        var avatar = combatScenes.SelectAvatar(combatCommands[0].Name);\n        avatar?.SwitchWithoutCts();\n        Sleep(200, _ct);\n        return combatCommands;\n    }\n\n    /// <summary>\n    /// 使用所选自动战斗策略执行首领战斗，并复用自动战斗的结束检测。\n    /// </summary>\n    private async Task RunAutoFight()\n    {\n        _logger.LogInformation(\"{Name}：执行战斗策略\", Name);\n\n        if (_jsonCombatStrategyPath != null)\n        {\n            await StartJsonFight();","sourceCodeStart":867,"sourceCodeEnd":903,"githubUrl":"https://github.com/babalae/better-genshin-impact/blob/a7cb36712dcb409be610257d877fcea3597e9d6b/BetterGenshinImpact/GameTask/AutoBoss/AutoBossTask.cs#L867-L903","documentation":"FindCombatScriptAndSwitchAvatar 用 _combatScriptBag.FindCombatScript(avatars) 匹配当前队伍的战斗脚本，返回空列表即没有可执行脚本，抛 Exception。这通常发生在构造函数用 CombatScriptParser.ReadAndParse 解析的策略包里没有覆盖当前队伍组合的脚本。","triggerScenarios":"队伍角色组合在策略文件中无对应脚本；策略文件格式为 JSON 引擎（_jsonCombatStrategyPath 分支）但运行时走到了 _combatScriptBag（注意：JSON 分支下 _combatScriptBag 为 null 会先 NRE，此处针对非 JSON 分支）；策略文件只定义了部分角色。","commonSituations":"用户换了队伍但未更新战斗策略；策略文件遗漏某角色组合；新角色未在策略中配置；策略文件夹路径错误导致解析到空包。","solutions":["确认 _taskParam.CombatStrategyPath 指向包含当前队伍角色脚本的策略文件。","在策略文件中补充覆盖当前队伍组合（4 个角色名均需匹配）的脚本。","若使用 JSON 战斗引擎，确认 CombatStrategyPath 以 .json 结尾走 _jsonCombatStrategyPath 分支。","在 Validate 中预检 _combatScriptBag 是否覆盖常见队伍，提前报错而非战斗中失败。"],"exampleFix":"// before\nvar combatCommands = _combatScriptBag.FindCombatScript(combatScenes.GetAvatars());\nif (combatCommands.Count == 0)\n{\n    throw new Exception(\"没有可用战斗脚本\");\n}\n\n// after\nvar avatars = combatScenes.GetAvatars();\nvar combatCommands = _combatScriptBag.FindCombatScript(avatars);\nif (combatCommands.Count == 0)\n{\n    throw new Exception($\"没有匹配队伍 [{string.Join(\",\", avatars.Select(a => a.Name))}] 的可用战斗脚本\");\n}","handlingStrategy":"validation","validationCode":"// Validate 中预检战斗脚本是否覆盖当前队伍（仅非 JSON 引擎）\nif (_combatScriptBag is not null)\n{\n    // 无法在战斗前知道实际队伍，可改为校验策略包非空\n    // 或在战斗中失败时给出队伍名提示\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["策略文件需覆盖实际使用的所有队伍组合。","区分 JSON 引擎与脚本引擎路径（.json 后缀）。","失败信息附带当前队伍角色名便于补脚本。"],"tags":["autofight","combat-script","config","genshin","autoboss"],"backgroundTag":null,"analyzedSha":"a7cb36712dcb409be610257d877fcea3597e9d6b","analyzedAt":"2026-08-13T16:44:57.548Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}