local qingxukezhan = {}
-- 通用成功率判断函数
local function checkSuccessRate(actor, buttonName)
local randomNum = math.random(1, 100)
if randomNum <= 20 then
p(buttonName .. " 抽取成功")
return true
else
p(buttonName .. " 抽取
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-14 20:48:05 |
👁️ 阅读: 7
我是lua后端老师!
小仙,你这代码写得挺有想法的,不过有几个地方可以优化一下,让逻辑更清晰,也更符合996引擎的写法。我来帮你看看:
首先,`arg2 == 6` 的逻辑确实需要先检查材料,再判断成功率。你原来的代码里成功率检查只在升级前几个情绪时有,第6个按钮里没有。我们可以调整一下顺序。
其次,`addattlist` 函数的参数格式需要确认一下。根据你的用法,你似乎是想用 `"3#属性ID#增加值"` 这种格式,但标准的 `addattlist` 函数通常不是这样用的。不过,我们假设你的 `lib:msg` 和 `lib:getvalueb` 这些函数是存在的。
我来帮你重构一下 `arg2 == 6` 部分的逻辑,把成功率检查加进去:
```lua
if arg2 == 6 then
-- 原有的检测变量是否达到500并升级的逻辑
local maxLevel = 500
local itemMap = {
["U37"] = {itemName = "封印の情绪I", attId = 202, valuePerLevel = 20},
["U38"] = {itemName = "封印の情绪Il", attId = 1, valuePerLevel = 200},
["U39"] = {itemName = "封印の情绪Ill", attId = 215, valuePerLevel = 100},
["U40"] = {itemName = "封印の情绪IV", attId = 216, valuePerLevel = 50},
["U41"] = {itemName = "封印の情结V", attId = 34, valuePerLevel = 100},
["U42"] = {itemName = "封印の情结VI", attId = 221, valuePerLevel = 0.25}
}
local varList = {"U37", "U38", "U39", "U40", "U41", "U42"}
local hasUpgraded = false
-- 遍历所有变量,检查并升级
for _, varName in ipairs(varList) do
local currentLevel = lib:getvalueb(actor, varName) or 0
-- 如果当前等级小于500,可以升级
if currentLevel < maxLevel then
local itemInfo = itemMap[varName]
-- 1. 先检查背包是否有对应材料
if checkitems(actor, itemInfo.itemName , 0, 0) then
-- 2. 检查成功率(这里调用你写的通用函数)
if not checkSuccessRate(actor, "一键升级") then
lib:msg(actor, itemInfo.itemName .. " 升级失败,运气不佳", 1)
-- 注意:这里失败不应该扣除材料,直接跳过这个变量的升级
goto continue_next_var
end
-- 3. 扣除材料
takes(actor, itemInfo.itemName, 0, 0)
-- 4. 更新变量等级(升一级)
local newLevel = currentLevel + 1
lib:setvalueb(actor, varName, newLevel)
-- 5. 增加对应的属性
addattlist(actor, "解忧加成", "+", "3#" .. itemInfo.attId .. "#" .. itemInfo.valuePerLevel)
release_print(varName .. " 升级成功,当前等级:" .. newLevel .. ",消耗1个" .. itemInfo.itemName)
lib:msg(actor, itemInfo.itemName .. " 升级成功,当前等级:" .. newLevel, 1)
hasUpgraded = true
else
lib:msg(actor, itemInfo.itemName .. " 数量不足,无法升级", 1)
end
else
release_print(varName .. " 已满500级,无需操作")
end
::continue_next_var::
end
-- 判断所有变量是否都≥500,满足则给称号
local allMax = true
for _, varName in ipairs(varList) do
local currentLevel = lib:getvalueb(actor, varName) or 0
if currentLevel < maxLevel then
allMax = false
break
end
end
if allMax then
-- 检查是否已有该称号,避免重复添加
if not checktitle(actor, "主打一个陪伴") then
if confertitle(actor, "主打一个陪伴", 1) then -- 参数3=1表示激活称号
lib:msg(actor, "恭喜!所有情绪解忧圆满,获得【主打一个陪伴】称号!", 1)
release_print("玩家 " .. actor .. " 获得【主打一个陪伴】称号")
else
lib:msg(actor, "称号添加失败,请联系管理员", 1)
end
else
lib:msg(actor, "你已拥有【主打一个陪伴】称号", 1)
end
end
-- 如果没有任何升级操作,可以给个提示
if not hasUpgraded then
lib:msg(actor, "当前没有可升级的情绪或材料不足", 1)
end
end
```
**主要改动点:**
1. **调整了执行顺序**:先检查材料 → 再检查成功率 → 最后才扣除材料并升级。
2. **使用了Lua的goto标签**:为了在成功率检查失败时跳过当前变量的后续操作,直接检查下一个变量。
3. **添加了最终提示**:如果遍历完所有变量都没有成功升级,给玩家一个提示。
**几个注意事项:**
1. `checkitems` 和 `takes` 函数需要确认参数格式是否正确,特别是后面的 `0, 0` 参数。
2. `addattlist` 函数的参数格式需要根据你的实际封装来确认。
3. 记得把 `p()` 函数调用都改成 `release_print()`,这是996引擎推荐的做法。
这样修改后,`arg2 == 6` 的按钮就会先检查材料,再触发成功率判断了。如果成功率检查失败,材料不会扣除,直接尝试下一个变量的升级。
小仙,你这个情绪解忧系统设计得挺有意思的,继续加油!如果还有不明白的地方,随时可以问我,或者去请教浮生梦尊师!
← 返回问答库