查看: 59|回复: 3

[Lua] 装备洗练系统:锁定指定词条 + 消耗指数增长 + 最优词条记忆

[复制链接]

46

主题

42

回帖

1212

积分

金牌会员

积分
1212
发表于 2026-6-5 00:06:45 | 显示全部楼层 |阅读模式
本帖最后由 tibaiwan1888 于 2026-6-5 00:08 编辑

-- Reforge.lua
-- 支持锁定词条、消耗随次数指数增长、自动记录历史最优

local Identify = require("IdentifySystem")

local M = {}

-- 每次洗练的消耗计算(指数曲线,越洗越贵)
local BASE_COST = 100  -- 基础消耗(元宝)
local COST_MUL  = 1.3  -- 每次乘以1.3

local function calcCost(times)
    return math.floor(BASE_COST * (COST_MUL ^ times))
end

-- 评分函数:根据词条value加权求和,用于比较优劣
local SCORE_WEIGHT = {
    atk=2.0, crit=2.5, pen=2.0, vamp=1.8,
    def=1.2, hp=1.0, all=1.5
}

local function scoreAffixes(affixes)
    local total = 0
    for _, a in ipairs(affixes) do
        local w = SCORE_WEIGHT[a.group] or 1.0
        total = total + a.value * w
    end
    return total
end

-- 洗练会话:每个装备独立维护状态
function M.newSession(equip)
    return {
        equip       = equip,         -- 原始装备数据
        current     = equip.affixes, -- 当前词条
        best        = equip.affixes, -- 历史最优
        bestScore   = scoreAffixes(equip.affixes),
        times       = 0,             -- 已洗次数
        locked      = {},            -- 锁定的词条index集合
    }
end

-- 锁定/解锁某个词条槽位(index: 1~5)
function M.toggleLock(session, index)
    session.locked[index] = not session.locked[index]
end

-- 执行一次洗练
-- 返回 { newAffixes, cost, improved }
function M.reforge(session, quality)
    local cost = calcCost(session.times)
    session.times = session.times + 1

    -- 只重新鉴定未锁定的槽位
    local unlockCount = 0
    for i, a in ipairs(session.current) do
        if not session.locked then unlockCount = unlockCount + 1 end
    end

    -- 对未锁定位重新生成
    local newPart = Identify.identify(quality, unlockCount)
    local result  = {}
    local newIdx  = 1
    for i, a in ipairs(session.current) do
        if session.locked then
            table.insert(result, a)           -- 保留锁定词条
        else
            table.insert(result, newPart[newIdx] or a)
            newIdx = newIdx + 1
        end
    end

    session.current = result

    -- 更新最优记录
    local score    = scoreAffixes(result)
    local improved = score > session.bestScore
    if improved then
        session.best      = result
        session.bestScore = score
    end

    return { affixes = result, cost = cost, improved = improved, score = score }
end

-- 回滚到历史最优
function M.rollback(session)
    session.current = session.best
    return session.best
end






完整交互示例:

local Reforge  = require("Reforge")
local Identify = require("IdentifySystem")

-- 玩家拥有一件史诗装备
local equip = {
    name    = "裂魂剑",
    quality = 4,
    affixes = Identify.identify(4),
}

local session = Reforge.newSession(equip)

print("=== 原始词条 ===")
for i, a in ipairs(session.current) do
    print(i .. ". " .. a.desc)
end

-- 玩家锁定第1、3条,只洗其余
Reforge.toggleLock(session, 1)
Reforge.toggleLock(session, 3)

-- 洗3次
for i = 1, 3 do
    local r = Reforge.reforge(session, 4)
    print(string.format("\n第%d次洗练 消耗:%d 得分:%.1f %s",
        i, r.cost, r.score, r.improved and "★最优" or ""))for j, a in ipairs(r.affixes) do
        local lock = session.locked[j] and "[锁]" or "    "
        print(lock .. j .. ". " .. a.desc)
    end
end

-- 不满意,回滚到最优
local best = Reforge.rollback(session)
print("\n=== 已回滚到历史最优 ===")
for i, a in ipairs(best) do
    print(i .. ". " .. a.desc)
end

return M

1

主题

228

回帖

1585

积分

金牌会员

积分
1585
发表于 2026-6-5 09:51:29 | 显示全部楼层
快了快了,马上就能用VV了

1

主题

228

回帖

1585

积分

金牌会员

积分
1585
发表于 2026-6-5 10:11:42 | 显示全部楼层

快了快了,马上就能用VV了

25

主题

89

回帖

1323

积分

金牌会员

积分
1323
发表于 2026-6-5 10:26:26 | 显示全部楼层
快了快了,马上就能用VV了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表