更新
This commit is contained in:
parent
11ddf9fe1f
commit
aa5baf00b5
BIN
excel/cha.xlsx
BIN
excel/cha.xlsx
Binary file not shown.
BIN
excel/enemy.xlsx
BIN
excel/enemy.xlsx
Binary file not shown.
@ -1,5 +1,5 @@
|
|||||||
[
|
[
|
||||||
{"id":1,"type":1,"name":1,"attack":83,"hp":400,"walkSpeed":8,"attackSpeed":1,"model":"Thief"},
|
{"id":1,"type":1,"name":1,"attack":83,"hp":400,"walkSpeed":8,"attackSpeed":1,"model":"Thief"},
|
||||||
{"id":2,"type":1,"name":2,"attack":30,"hp":300,"walkSpeed":8,"attackSpeed":1,"model":"Thief"},
|
{"id":2,"type":1,"name":2,"attack":30,"hp":300,"walkSpeed":8,"attackSpeed":1,"model":"Thief"},
|
||||||
{"id":1000,"type":2,"name":1000,"attack":240,"hp":2000,"walkSpeed":4,"attackSpeed":1,"model":"Thief"}
|
{"id":1000,"type":2,"name":1000,"attack":120,"hp":1000,"walkSpeed":4,"attackSpeed":1,"model":"Thief"}
|
||||||
]
|
]
|
@ -183,6 +183,7 @@ end
|
|||||||
|
|
||||||
-- 挑战关卡(挑战副本用另一个函数)
|
-- 挑战关卡(挑战副本用另一个函数)
|
||||||
function LevelProxy:ChallengeLevel(Player: Player, LevelId: number)
|
function LevelProxy:ChallengeLevel(Player: Player, LevelId: number)
|
||||||
|
print("挑战关卡", LevelId)
|
||||||
local LevelData = Utils:GetIdDataFromJson(JsonLevel, LevelId)
|
local LevelData = Utils:GetIdDataFromJson(JsonLevel, LevelId)
|
||||||
if not LevelData then warn("Level Data not found", LevelId) return end
|
if not LevelData then warn("Level Data not found", LevelId) return end
|
||||||
-- 给前端传数据,做表现
|
-- 给前端传数据,做表现
|
||||||
@ -259,7 +260,7 @@ function LevelProxy:ChallengeEnd(Player: Player, result: boolean)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- 清除剩余怪物
|
-- 清除剩余怪物
|
||||||
for _, mob in LevelProxy.pData[Player.UserId].Mobs do mob:Died(true) end
|
for _, mob in pairs(LevelProxy.pData[Player.UserId].Mobs) do mob:Died(true) end
|
||||||
LevelProxy.pData[Player.UserId].Mobs = {}
|
LevelProxy.pData[Player.UserId].Mobs = {}
|
||||||
|
|
||||||
-- 清除玩家表现
|
-- 清除玩家表现
|
||||||
|
@ -81,13 +81,12 @@ function Mob.new(Player: Player, MobId: number, OnMobDied: ((Player: Player, Mob
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
-- IsSkinOnDied:暂时意义不明,忘了之前为啥写了
|
-- isChallengeFailed 挑战失败清除怪物传参
|
||||||
function Mob:Died(IsSkinOnDied: boolean?)
|
function Mob:Died(isChallengeFailed: boolean?)
|
||||||
MobsProxy:RemoveMob(self.Player, self.Instance)
|
MobsProxy:RemoveMob(self.Player, self.Instance)
|
||||||
-- if not IsSkinOnDied then
|
if not isChallengeFailed then
|
||||||
-- if self.OnDied then self.OnDied(self.Player, self) end
|
|
||||||
-- end
|
|
||||||
if self.OnDied then self.OnDied(self.Player, self) end
|
if self.OnDied then self.OnDied(self.Player, self) end
|
||||||
|
end
|
||||||
Character.Died(self)
|
Character.Died(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -110,7 +109,7 @@ end
|
|||||||
-- 清除玩家单个怪物
|
-- 清除玩家单个怪物
|
||||||
function MobsProxy:RemoveMob(Player: Player, MobInstance: Instance)
|
function MobsProxy:RemoveMob(Player: Player, MobInstance: Instance)
|
||||||
local playerMobsFolder = GetPlayerMobsFolder(Player)
|
local playerMobsFolder = GetPlayerMobsFolder(Player)
|
||||||
if not playerMobsFolder then return end
|
if not playerMobsFolder then warn("playerMobsFolder not found", Player.Name) return end
|
||||||
if not MobsProxy.pData[Player.UserId][MobInstance] then warn("Mob not found", MobInstance) return end
|
if not MobsProxy.pData[Player.UserId][MobInstance] then warn("Mob not found", MobInstance) return end
|
||||||
|
|
||||||
MobsProxy.pData[Player.UserId][MobInstance] = nil
|
MobsProxy.pData[Player.UserId][MobInstance] = nil
|
||||||
|
@ -6,6 +6,7 @@ local ReplicatedStorage = game:GetService("ReplicatedStorage")
|
|||||||
|
|
||||||
--> Events
|
--> Events
|
||||||
local BD_ChallengeEnd = ReplicatedStorage.Events.BD_ChallengeEnd
|
local BD_ChallengeEnd = ReplicatedStorage.Events.BD_ChallengeEnd
|
||||||
|
local RE_ChallengeBoss = ReplicatedStorage.Events.RE_ChallengeBoss
|
||||||
|
|
||||||
--> Dependencies
|
--> Dependencies
|
||||||
local LevelProxy = require(ServerStorage.Proxy.LevelProxy)
|
local LevelProxy = require(ServerStorage.Proxy.LevelProxy)
|
||||||
@ -31,12 +32,16 @@ function LevelLoop.new(Player: Player, PlayerRole: TypeList.Character)
|
|||||||
if Player ~= self.Player then return end
|
if Player ~= self.Player then return end
|
||||||
self:OnChallengeEnd(Player, LevelId)
|
self:OnChallengeEnd(Player, LevelId)
|
||||||
end)
|
end)
|
||||||
|
self.ConChallengeBoss = RE_ChallengeBoss.OnServerEvent:Connect(function(Player: Player)
|
||||||
|
if Player ~= self.Player then return end
|
||||||
|
self:OnChallengeBoss(Player)
|
||||||
|
end)
|
||||||
|
|
||||||
self:AutoChallenge()
|
self:AutoChallenge()
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
function LevelLoop:AutoChallenge()
|
function LevelLoop:AutoChallenge(ignoreBoss: boolean?)
|
||||||
print("AutoChallenge")
|
print("AutoChallenge")
|
||||||
|
|
||||||
-- TODO: 回退有bug,不能一关一关回退
|
-- TODO: 回退有bug,不能一关一关回退
|
||||||
@ -47,7 +52,9 @@ function LevelLoop:AutoChallenge()
|
|||||||
local LevelId = ProgressFolder:FindFirstChild("Main").Value
|
local LevelId = ProgressFolder:FindFirstChild("Main").Value
|
||||||
local FailBossId = ProgressFolder:FindFirstChild("BossFail").Value
|
local FailBossId = ProgressFolder:FindFirstChild("BossFail").Value
|
||||||
-- Boss失败了就去挑战上一个关卡
|
-- Boss失败了就去挑战上一个关卡
|
||||||
if FailBossId == LevelId then
|
if ignoreBoss then
|
||||||
|
LevelId = LevelId
|
||||||
|
elseif FailBossId == LevelId then
|
||||||
LevelId = LevelId - 1
|
LevelId = LevelId - 1
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -55,6 +62,7 @@ function LevelLoop:AutoChallenge()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function LevelLoop:OnChallengeEnd(Player: Player, LevelId: number, result: boolean)
|
function LevelLoop:OnChallengeEnd(Player: Player, LevelId: number, result: boolean)
|
||||||
|
if self.ChallengeBoss then self.ChallengeBoss = nil return end
|
||||||
self.TaskAutoChallenge = task.spawn(function()
|
self.TaskAutoChallenge = task.spawn(function()
|
||||||
task.wait(3)
|
task.wait(3)
|
||||||
-- 重置玩家状态(先临时调用角色复活,之后复杂的内容再说)
|
-- 重置玩家状态(先临时调用角色复活,之后复杂的内容再说)
|
||||||
@ -63,11 +71,26 @@ function LevelLoop:OnChallengeEnd(Player: Player, LevelId: number, result: boole
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function LevelLoop:OnChallengeBoss(Player: Player)
|
||||||
|
self.TaskAutoChallenge = task.spawn(function()
|
||||||
|
self.ChallengeBoss = true
|
||||||
|
LevelProxy:ChallengeEnd(self.Player, false)
|
||||||
|
-- 重置玩家状态(先临时调用角色复活,之后复杂的内容再说)
|
||||||
|
task.wait(1)
|
||||||
|
self.PlayerRole:Respawn()
|
||||||
|
self:AutoChallenge(true)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
function LevelLoop:Destroy()
|
function LevelLoop:Destroy()
|
||||||
if self.TaskAutoChallenge then
|
if self.TaskAutoChallenge then
|
||||||
task.cancel(self.TaskAutoChallenge)
|
task.cancel(self.TaskAutoChallenge)
|
||||||
self.TaskAutoChallenge = nil
|
self.TaskAutoChallenge = nil
|
||||||
end
|
end
|
||||||
|
if self.ConChallengeBoss then
|
||||||
|
self.ConChallengeBoss:Disconnect()
|
||||||
|
self.ConChallengeBoss = nil
|
||||||
|
end
|
||||||
if self.ConChallengeEnd then
|
if self.ConChallengeEnd then
|
||||||
self.ConChallengeEnd:Disconnect()
|
self.ConChallengeEnd:Disconnect()
|
||||||
self.ConChallengeEnd = nil
|
self.ConChallengeEnd = nil
|
||||||
|
@ -6,7 +6,7 @@ local player = Players.LocalPlayer
|
|||||||
local camera = workspace.CurrentCamera
|
local camera = workspace.CurrentCamera
|
||||||
|
|
||||||
local CAMERA_DISTANCE = 30
|
local CAMERA_DISTANCE = 30
|
||||||
local CAMERA_HEIGHT = 40
|
local CAMERA_HEIGHT = 35
|
||||||
local CAMERA_ANGLE = math.rad(-45)
|
local CAMERA_ANGLE = math.rad(-45)
|
||||||
local SCREEN_OFFSET = 5
|
local SCREEN_OFFSET = 5
|
||||||
|
|
||||||
|
@ -7,9 +7,13 @@ local UIEnums = require(ReplicatedStorage.Base.UIEnums)
|
|||||||
|
|
||||||
--> Json
|
--> Json
|
||||||
local JsonLevel = require(ReplicatedStorage.Json.Level)
|
local JsonLevel = require(ReplicatedStorage.Json.Level)
|
||||||
|
local JsonForge = require(ReplicatedStorage.Json.Forge)
|
||||||
|
|
||||||
local Utils = require(ReplicatedStorage.Tools.Utils)
|
local Utils = require(ReplicatedStorage.Tools.Utils)
|
||||||
|
|
||||||
|
--> Events
|
||||||
|
local RE_ChallengeBoss = ReplicatedStorage.Events.RE_ChallengeBoss
|
||||||
|
|
||||||
local LocalPlayer = game:GetService("Players").LocalPlayer
|
local LocalPlayer = game:GetService("Players").LocalPlayer
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
@ -26,8 +30,16 @@ function MainWindow:Init(UIManager: table, Data: table?)
|
|||||||
["_btnMainCha"] = 0,
|
["_btnMainCha"] = 0,
|
||||||
["_btnMainAttributeUpgrade"] = 0,
|
["_btnMainAttributeUpgrade"] = 0,
|
||||||
|
|
||||||
|
-- 关卡
|
||||||
["_tmpNowLevel"] = 0,
|
["_tmpNowLevel"] = 0,
|
||||||
["_imgBoss"] = 0,
|
["_imgBoss"] = 0,
|
||||||
|
["_btnChallengeBoss"] = 0,
|
||||||
|
|
||||||
|
-- 锻造条
|
||||||
|
["_goForgeBar"] = 0,
|
||||||
|
["_goForgeFill"] = 0,
|
||||||
|
["_tmpForgeMoney"] = 0,
|
||||||
|
["_tmpForgeTime"] = 0,
|
||||||
}
|
}
|
||||||
self.UIRootName = "ui_w_main"
|
self.UIRootName = "ui_w_main"
|
||||||
self.UIParentName = UIEnums.UIParent.UIRoot
|
self.UIParentName = UIEnums.UIParent.UIRoot
|
||||||
@ -35,6 +47,7 @@ function MainWindow:Init(UIManager: table, Data: table?)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- 设置关卡显示
|
||||||
function MainWindow:SetShowLevel(level: number)
|
function MainWindow:SetShowLevel(level: number)
|
||||||
self.Variables["_tmpNowLevel"].Text = string.format("第%d关", level)
|
self.Variables["_tmpNowLevel"].Text = string.format("第%d关", level)
|
||||||
local levelData = Utils:GetIdDataFromJson(JsonLevel, level)
|
local levelData = Utils:GetIdDataFromJson(JsonLevel, level)
|
||||||
@ -45,6 +58,46 @@ function MainWindow:SetShowLevel(level: number)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- 设置boss挑战按钮显示
|
||||||
|
function MainWindow:SetShowBossChallenge(newValue: number)
|
||||||
|
local playerDataFolder = game.Workspace:WaitForChild("Level"):WaitForChild(LocalPlayer.UserId)
|
||||||
|
local ProgressFolder = playerDataFolder:WaitForChild("Progress")
|
||||||
|
local mainValue = ProgressFolder:FindFirstChild("Main").Value
|
||||||
|
local levelIdValue = playerDataFolder:WaitForChild("Challenge"):WaitForChild("LevelId").Value
|
||||||
|
|
||||||
|
if levelIdValue == mainValue then
|
||||||
|
self.Variables["_btnChallengeBoss"].Visible = false
|
||||||
|
else
|
||||||
|
self.Variables["_btnChallengeBoss"].Visible = (newValue == mainValue)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- 手动点击按钮,挑战boss
|
||||||
|
function MainWindow:OnClickChallengeBoss()
|
||||||
|
RE_ChallengeBoss:FireServer()
|
||||||
|
|
||||||
|
self.Variables["_btnChallengeBoss"].Visible = false
|
||||||
|
end
|
||||||
|
|
||||||
|
function MainWindow:SetShowForgeBar(nowForgeTime : number, moneyValue: number)
|
||||||
|
local maxForgeId = Utils:GetMaxIdFromJson(JsonForge)
|
||||||
|
local forgeTime = nowForgeTime > maxForgeId and maxForgeId or nowForgeTime
|
||||||
|
local forgeData = Utils:GetIdDataFromJson(JsonForge, forgeTime)
|
||||||
|
|
||||||
|
-- 进度条
|
||||||
|
self.Variables["_goForgeFill"].Size = UDim2.new(math.min(moneyValue / forgeData.cost[2], 1), 0, 1, 0)
|
||||||
|
self.Variables["_tmpForgeMoney"].Text = string.format("%d/%d", moneyValue, forgeData.cost[2])
|
||||||
|
|
||||||
|
-- 右上角红点
|
||||||
|
local timeRecorder = math.ceil(moneyValue / forgeData.cost[2])
|
||||||
|
if timeRecorder > 0 then
|
||||||
|
self.Variables["_tmpForgeTime"].Visible = true
|
||||||
|
self.Variables["_tmpForgeTime"].Text = timeRecorder
|
||||||
|
else
|
||||||
|
self.Variables["_tmpForgeTime"].Visible = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function MainWindow:OnOpenWindow()
|
function MainWindow:OnOpenWindow()
|
||||||
UIWindow.OnOpenWindow(self)
|
UIWindow.OnOpenWindow(self)
|
||||||
|
|
||||||
@ -57,22 +110,73 @@ function MainWindow:OnOpenWindow()
|
|||||||
local attributeUpgradeCon = self.Variables["_btnMainAttributeUpgrade"].Activated:Connect(function()
|
local attributeUpgradeCon = self.Variables["_btnMainAttributeUpgrade"].Activated:Connect(function()
|
||||||
self.UIManager:OpenWindow("AttributeLvupWindow")
|
self.UIManager:OpenWindow("AttributeLvupWindow")
|
||||||
end)
|
end)
|
||||||
|
local challengeBossCon = self.Variables["_btnChallengeBoss"].Activated:Connect(function()
|
||||||
|
self:OnClickChallengeBoss()
|
||||||
|
end)
|
||||||
|
|
||||||
table.insert(self.Connections, createCon)
|
table.insert(self.Connections, createCon)
|
||||||
table.insert(self.Connections, chaCon)
|
table.insert(self.Connections, chaCon)
|
||||||
table.insert(self.Connections, attributeUpgradeCon)
|
table.insert(self.Connections, attributeUpgradeCon)
|
||||||
|
table.insert(self.Connections, challengeBossCon)
|
||||||
|
|
||||||
-- TODO: 暂时用主关卡数显示,我记得之前这里主要是记录的,Challenge中才是正在挑战的内容
|
-- TODO: 暂时用主关卡数显示,我记得之前这里主要是记录的,Challenge中才是正在挑战的内容
|
||||||
-- TODO: 之后LevelProxy也应该挪到ReplicatedStorage下,之前可能是因为觉得Challenge是临时的内容所以放在workspace下,但是逻辑做的不统一
|
-- TODO: 之后LevelProxy也应该挪到ReplicatedStorage下,之前可能是因为觉得Challenge是临时的内容所以放在workspace下,但是逻辑做的不统一
|
||||||
local playerDataFolder = game.Workspace:WaitForChild("Level"):WaitForChild(LocalPlayer.UserId)
|
local playerDataFolder = game.Workspace:WaitForChild("Level"):WaitForChild(LocalPlayer.UserId)
|
||||||
local StatsFolder = playerDataFolder:WaitForChild("Progress")
|
local StatsFolder = playerDataFolder:WaitForChild("Challenge")
|
||||||
local levelCon = StatsFolder.Main.Changed:Connect(function(newValue)
|
local ProgressFolder = playerDataFolder:WaitForChild("Progress")
|
||||||
|
|
||||||
|
local levelCon = StatsFolder.LevelId.Changed:Connect(function(newValue)
|
||||||
self:SetShowLevel(newValue)
|
self:SetShowLevel(newValue)
|
||||||
|
self:SetShowBossChallenge(ProgressFolder.BossFail.Value)
|
||||||
|
end)
|
||||||
|
local bossChallengeCon = ProgressFolder.BossFail.Changed:Connect(function(newValue)
|
||||||
|
self:SetShowBossChallenge(newValue)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
-- 初始值设置
|
-- 初始值设置
|
||||||
self:SetShowLevel(StatsFolder.Main.Value)
|
self:SetShowLevel(StatsFolder.LevelId.Value)
|
||||||
|
self:SetShowBossChallenge(ProgressFolder.BossFail.Value)
|
||||||
|
|
||||||
table.insert(self.Connections, levelCon)
|
table.insert(self.Connections, levelCon)
|
||||||
|
table.insert(self.Connections, bossChallengeCon)
|
||||||
|
|
||||||
|
|
||||||
|
-- 货币进度条显示
|
||||||
|
local rePlayerDataFolder = Utils:GetPlayerDataFolder(LocalPlayer)
|
||||||
|
local playerInfoFolder = rePlayerDataFolder:WaitForChild("PlayerInfo")
|
||||||
|
local forgeInstance = playerInfoFolder:WaitForChild("Stats"):WaitForChild("forge")
|
||||||
|
|
||||||
|
local itemFolder = playerInfoFolder:WaitForChild("Items")
|
||||||
|
local hasItem = playerInfoFolder: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
|
||||||
|
self:SetShowForgeBar(forgeInstance.Value, child.Value)
|
||||||
|
addCon:Disconnect()
|
||||||
|
addCon = nil
|
||||||
|
|
||||||
|
SetForgeCostChange()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
table.insert(self.Connections, addCon)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user