如何优化DCSS法术训练脚本,实现仅训练单个记忆法术?
DCSS RC脚本优化:单法术优先训练,停止其他法术训练
你的问题根源是每个法术的训练逻辑独立触发,导致多个法术同时拉动不同学派的训练,分散了训练效率。下面是修改后的完整脚本,核心思路是统一管理所有待训练法术,选出最急需的那个集中训练,其他所有相关学派先停掉:
修改后的完整代码
-- 所有法术训练配置列表:{法术名, 学派A, 学派B, 学派C, 失败阈值} local spellTrainingList = { {"Passwall", "Earth Magic", "Earth Magic", "Earth Magic", 1}, {"Mephitic Cloud", "Conjurations", "Air Magic", "Alchemy", 5}, {"Ensorcelled Hibernation", "Hexes", "Ice Magic", "Ice Magic", 1}, {"Corpse Rot", "Air", "Necromancy", "Poison", 5}, -- 把你剩下的20+个法术配置补充到这里 } function ready() -- 初始化逻辑,可留空或添加其他初始化操作 end -- 辅助函数:找出当前法术成本最低的最优训练学派 local function getBestSchoolForSpell(schoolA, schoolB, schoolC) local costA = tonumber(you.skill_cost(schoolA)) local costB = tonumber(you.skill_cost(schoolB)) local costC = tonumber(you.skill_cost(schoolC)) local minCost = math.min(costA, costB, costC) if costA == minCost then return schoolA elseif costB == minCost then return schoolB else return schoolC end end -- 主逻辑:仅训练优先级最高的单个法术,停止其他所有学派训练 local function trainSingleSpellOnly() -- 1. 收集所有符合训练条件的法术:已记忆且失败率超过设定阈值 local candidateSpells = {} for _, spellConfig in ipairs(spellTrainingList) do local spellName, schoolA, schoolB, schoolC, failChance = unpack(spellConfig) if spells.memorised(spellName) and spells.fail(spellName) > failChance then table.insert(candidateSpells, { name = spellName, bestSchool = getBestSchoolForSpell(schoolA, schoolB, schoolC), failRate = spells.fail(spellName) }) end end -- 2. 没有符合条件的法术时,停止所有相关学派训练 if #candidateSpells == 0 then local allSchools = {} for _, spellConfig in ipairs(spellTrainingList) do allSchools[spellConfig[2]] = true allSchools[spellConfig[3]] = true allSchools[spellConfig[4]] = true end for school, _ in pairs(allSchools) do you.train_skill(school, 0) end return end -- 3. 选出最急需训练的法术:这里按失败率从高到低排序,可改为按配置的优先级 table.sort(candidateSpells, function(a, b) return a.failRate > b.failRate end) local selectedSpell = candidateSpells[1] -- 4. 先停止所有相关学派的训练,避免同时训练多个 local allSchools = {} for _, spellConfig in ipairs(spellTrainingList) do allSchools[spellConfig[2]] = true allSchools[spellConfig[3]] = true allSchools[spellConfig[4]] = true end for school, _ in pairs(allSchools) do you.train_skill(school, 0) end -- 5. 仅给选中法术的最优学派开启训练 you.train_skill(selectedSpell.bestSchool, 1) end -- 执行主训练逻辑 trainSingleSpellOnly()
关键修改说明
- 统一配置管理:把分散的
SetSpellTraining改成数组存储,方便后续遍历和维护所有法术配置。 - 单法术优先级选择:先筛选出需要训练的法术,按失败率(可自行改为配置的优先级)选出最急需的那个,确保集中资源训练。
- 全局停训再开启:先停止所有相关学派的训练,再只给选中的法术开启最优学派训练,彻底避免多法术同时训练的情况。
- 兼容原有逻辑:最优学派的选择逻辑和你原来的代码一致,保证训练收益最大化。
内容的提问来源于stack exchange,提问作者IK IDK everything
相关产品推荐
相关产品推荐

