2025-08-05 15:19:19 +08:00

211 lines
7.6 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--> Services
local ReplicatedStorage = game:GetService("ReplicatedStorage")
--> Dependencies
local UIWindow = require(ReplicatedStorage.Base.UIWindow)
local UIEnums = require(ReplicatedStorage.Base.UIEnums)
local Signal = require(ReplicatedStorage.Tools.Signal)
--> Json
local JsonLevel = require(ReplicatedStorage.Json.Level)
local JsonForge = require(ReplicatedStorage.Json.Forge)
local Utils = require(ReplicatedStorage.Tools.Utils)
--> Events
local RE_ChallengeBoss = ReplicatedStorage.Events.RE_ChallengeBoss
local RE_ChallengeLevel = ReplicatedStorage.Events.RE_ChallengeLevel
--> Local
local LocalPlayer = game:GetService("Players").LocalPlayer
local forgeRedPointSignal = Signal.new(Signal.ENUM.FORGE_RED_POINT)
local challengeLevelEndSignal = Signal.new(Signal.ENUM.CHALLENGE_LEVEL_END)
--------------------------------------------------------------------------------
-- 简单的递增消耗计算函数
local function GetIncrementalCost(currentLevel: number, configData: table, costIndex: number?)
costIndex = costIndex or 2 -- 默认使用第二个消耗值
-- 获取配置表的最大ID
local maxId = Utils:GetMaxIdFromJson(configData)
-- 如果当前等级超过最大ID使用最大ID的消耗配置
local effectiveLevel = math.min(currentLevel, maxId)
-- 根据有效等级获取对应的消耗配置
local levelData = Utils:GetIdDataFromJson(configData, effectiveLevel)
if not levelData or not levelData.cost then
warn("无法获取等级", effectiveLevel, "的消耗配置")
return 0
end
-- 确保costIndex在有效范围内
if costIndex > #levelData.cost then
warn("消耗索引超出范围:", costIndex, "最大索引:", #levelData.cost)
return 0
end
return levelData.cost[costIndex]
end
-- 计算可以进行的操作次数(累加消耗)
local function GetOperationCount(currentValue: number, currentLevel: number, configData: table, costIndex: number?)
local remainingMoney = currentValue
local forgeCount = 0
local currentForgeLevel = currentLevel
local maxId = Utils:GetMaxIdFromJson(configData)
-- 循环计算每次锻造的消耗,直到货币不足
while remainingMoney > 0 do
local cost = GetIncrementalCost(currentForgeLevel, configData, costIndex)
if cost <= 0 then break end -- 无效消耗
if remainingMoney >= cost then
remainingMoney = remainingMoney - cost
forgeCount = forgeCount + 1
currentForgeLevel = currentForgeLevel + 1
else
break -- 货币不足,停止计算
end
end
return forgeCount
end
--------------------------------------------------------------------------------
local MainWindow = {}
MainWindow.__index = MainWindow
setmetatable(MainWindow, {__index = UIWindow})
function MainWindow:Init(UIManager: table, Data: table?)
local self = UIWindow:Init(UIManager, Data)
setmetatable(self, MainWindow)
self.Variables = {
["_btnMainCreate"] = 0,
["_btnMainCha"] = 0,
["_btnMainAttributeUpgrade"] = 0,
["_btnStartChallenge"] = 0,
-- 锻造条
["_goForgeBar"] = 0,
["_goForgeFill"] = 0,
["_tmpForgeMoney"] = 0,
["_tmpForgeTime"] = 0,
-- 锻造临时红点
["_tmpRedCreate"] = 0,
}
self.UIRootName = "ui_w_main"
self.UIParentName = UIEnums.UIParent.UIRoot
return self
end
function MainWindow:OnClickChallengeButton()
self.Variables["_btnStartChallenge"].Visible = false
-- TODO: 之后这里做临时传送特效可以打断要不就独立个脚本用signal触发对应特效
task.wait(2)
RE_ChallengeLevel:FireServer(true)
self.UIManager:OpenWindow("LevelStageWindow")
end
function MainWindow:SetShowForgeBar(nowForgeTime : number, moneyValue: number)
local maxForgeId = Utils:GetMaxIdFromJson(JsonForge)
local forgeTime = math.min(nowForgeTime, maxForgeId)
-- 获取当前锻造次数对应的消耗用于UI显示
local currentCost = GetIncrementalCost(forgeTime, JsonForge, 2)
-- 进度条 - 使用当前锻造次数对应的消耗显示
self.Variables["_goForgeFill"].Size = UDim2.new(math.min(moneyValue / currentCost, 1), 0, 1, 0)
self.Variables["_tmpForgeMoney"].Text = string.format("%d/%d", moneyValue, currentCost)
-- 右上角红点 - 使用累加消耗计算可以进行的操作次数
local timeRecorder = GetOperationCount(moneyValue, forgeTime, JsonForge, 2)
if timeRecorder > 0 then
self.Variables["_tmpForgeTime"].Visible = true
self.Variables["_tmpRedCreate"].Visible = true
self.Variables["_tmpForgeTime"].Text = timeRecorder
self.Variables["_goForgeFill"].BackgroundColor3 = Color3.fromRGB(255, 255, 0)
else
self.Variables["_tmpForgeTime"].Visible = false
self.Variables["_tmpRedCreate"].Visible = false
self.Variables["_goForgeFill"].BackgroundColor3 = Color3.fromRGB(12, 227, 209)
end
end
function MainWindow:OnOpenWindow()
UIWindow.OnOpenWindow(self)
local createCon = self.Variables["_btnMainCreate"].Activated:Connect(function()
self.UIManager:OpenWindow("CreateWindow")
end)
local chaCon = self.Variables["_btnMainCha"].Activated:Connect(function()
self.UIManager:OpenWindow("ChaWindow")
end)
local attributeUpgradeCon = self.Variables["_btnMainAttributeUpgrade"].Activated:Connect(function()
self.UIManager:OpenWindow("AttributeLvupWindow")
end)
local startChallengeCon = self.Variables["_btnStartChallenge"].Activated:Connect(function()
self:OnClickChallengeButton()
end)
table.insert(self.Connections, createCon)
table.insert(self.Connections, chaCon)
table.insert(self.Connections, attributeUpgradeCon)
table.insert(self.Connections, startChallengeCon)
local forgeRedPointCon = forgeRedPointSignal:Connect(function(show: boolean)
self.Variables["_tmpRedCreate"].Visible = show
end)
table.insert(self.Connections, forgeRedPointCon)
local challengeLevelEndCon = challengeLevelEndSignal:Connect(function(result: boolean)
self.Variables["_btnStartChallenge"].Visible = true
end)
table.insert(self.Connections, challengeLevelEndCon)
-- 货币进度条显示
local rePlayerDataFolder = Utils:WaitPlayerDataFolder(LocalPlayer)
local playerInfoFolder = rePlayerDataFolder:WaitForChild("PlayerInfo")
local forgeInstance = playerInfoFolder:WaitForChild("Stats"):WaitForChild("forge")
local itemFolder = playerInfoFolder:WaitForChild("Items")
local hasItem = itemFolder:FindFirstChild("2")
-- 设置锻造货币变动链接
local function SetForgeCostChange()
local costChangeCon = hasItem.Changed:Connect(function(newValue)
self:SetShowForgeBar(forgeInstance.Value, newValue)
end)
table.insert(self.Connections, costChangeCon)
end
if hasItem then
-- 后续变动设置
SetForgeCostChange()
-- 初始化设置
self:SetShowForgeBar(forgeInstance.Value, hasItem.Value)
else
-- 没有货币时监听设置
local addCon
addCon = itemFolder.ChildAdded:Connect(function(child)
if child.Name == "2" then
hasItem = child
self:SetShowForgeBar(forgeInstance.Value, hasItem.Value)
addCon:Disconnect()
addCon = nil
-- 设置显示
SetForgeCostChange()
end
end)
table.insert(self.Connections, addCon)
-- 初始化设置
self:SetShowForgeBar(forgeInstance.Value, 0)
end
end
return MainWindow