Files
SL1900 5e0d58cfad Initial version - 1.2.0.60
EN: 1.2.0.60
CN: 1.2.0.61
JP: 1.2.0.63
KR: 1.2.0.67
2025-12-03 01:00:00 +09:00

171 lines
5.9 KiB
Lua

local NpcHudCtrl = class("NpcHudCtrl", BaseCtrl)
local AdventureModuleHelper = CS.AdventureModuleHelper
local TimerManager = require("GameCore.Timer.TimerManager")
NpcHudCtrl._mapNodeConfig = {
rtRoot = {},
rtTop = {},
rtNpc = {},
rtChat = {},
txtChat = {sComponentName = "TMP_Text"},
txtNPCType = {sComponentName = "TMP_Text"},
rtStrength = {},
txtStrength = {sComponentName = "TMP_Text"},
rtCost = {},
txtCost = {sComponentName = "TMP_Text"},
imgCost = {sComponentName = "Image"},
rtFree = {},
txtFree = {
sComponentName = "TMP_Text",
sLanguageId = "ST_StrengthenMachine_Free"
},
rtBottom = {},
txtNPCName = {sComponentName = "TMP_Text"},
txtNPCTag = {sComponentName = "TMP_Text"}
}
NpcHudCtrl._mapEventConfig = {
RefreshStarTowerCoin = "OnEvent_RefreshStarTowerCoin",
InteractiveNpc = "OnEvent_InteractiveNpc",
InteractiveNpcFinish = "OnEvent_InteractiveNpcFinish"
}
local colorGreen = Color(0.9803921568627451, 0.9803921568627451, 0.9803921568627451, 1)
local colorRed = Color(1.0, 0.44313725490196076, 0.5411764705882353, 1)
local nInterval = 0.2
local chatMinTime = 1
local chatMaxTime = 4
function NpcHudCtrl:CalChatContentShowTime(sContent)
local sPureContent = string.gsub(sContent, "<.->", "")
sPureContent = string.gsub(sPureContent, "\n", "")
local nDuration = string.utf8len(sPureContent) * nInterval
nDuration = math.min(chatMaxTime, nDuration)
nDuration = math.max(chatMinTime, nDuration)
return nDuration
end
function NpcHudCtrl:ShowStrengthNpc(sName, nCostCount, nHasCount)
self._mapNode.rtStrength.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtStrength, sName)
self.nCostCount = nCostCount
self:RefreshStrengthCost(nHasCount)
end
function NpcHudCtrl:RefreshStrengthCost(nHasCount)
self._mapNode.rtCost.gameObject:SetActive(self.nCostCount > 0)
self._mapNode.rtFree.gameObject:SetActive(self.nCostCount <= 0)
if self.nCostCount > 0 then
NovaAPI.SetTMPText(self._mapNode.txtCost, self.nCostCount)
NovaAPI.SetTMPColor(self._mapNode.txtCost, nHasCount >= self.nCostCount and colorGreen or colorRed)
self:SetSprite_Coin(self._mapNode.imgCost, AllEnum.CoinItemId.FixedRogCurrency)
end
end
function NpcHudCtrl:ShowNpc(nId, nUId, nCostCount, nHasCount)
self.nNpcId = nId
self.nNpcUId = nUId
self.nCostCount = nCostCount
self:Clear()
local mapNpcCfg = ConfigTable.GetData("NPCConfig", nId)
if mapNpcCfg ~= nil then
self._mapNode.rtRoot.gameObject:SetActive(true)
self.tbChatPool = mapNpcCfg.Chat
self.nChatProp = mapNpcCfg.ChatProp
if mapNpcCfg.type == GameEnum.npcNewType.Upgrade and nCostCount ~= nil then
self:ShowStrengthNpc(mapNpcCfg.Literary, nCostCount, nHasCount)
else
self._mapNode.rtBottom.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtNPCName, mapNpcCfg.Name)
NovaAPI.SetTMPText(self._mapNode.txtNPCTag, mapNpcCfg.Desc)
if mapNpcCfg.type ~= GameEnum.npcNewType.Narrate then
self._mapNode.rtNpc.gameObject:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtNPCType, mapNpcCfg.Literary)
self:ShowChat()
if self.chatTimer == nil then
self.chatTimer = TimerManager.Add(0, mapNpcCfg.ChatTime, self, function()
self:ShowChat()
end, true, true, false)
end
end
end
AdventureModuleHelper.SetHudFollowTarget(nUId, self._mapNode.rtTop.gameObject, Vector3(0, 1.2, 0), true)
AdventureModuleHelper.SetHudFollowTarget(nUId, self._mapNode.rtBottom.gameObject, Vector3(0, -0.7, 0), false)
end
end
function NpcHudCtrl:ShowChat()
if self.tbChatPool == nil then
return
end
local bTrigger = math.random(1, 100) <= self.nChatProp and true or false
self._mapNode.rtChat.gameObject:SetActive(bTrigger)
if bTrigger then
local nAllCount = #self.tbChatPool
local nIndex = math.random(1, nAllCount)
local nChatId = self.tbChatPool[nIndex]
local mapChatCfg = ConfigTable.GetData("StarTowerTalk", nChatId)
NovaAPI.SetTMPText(self._mapNode.txtChat, mapChatCfg.Content)
local nDuration = self:CalChatContentShowTime(mapChatCfg.Content)
self:AddTimer(1, nDuration, function()
self._mapNode.rtChat.gameObject:SetActive(false)
end, true, true, true, nil)
end
end
function NpcHudCtrl:Clear()
self._mapNode.rtNpc.gameObject:SetActive(false)
self._mapNode.rtChat.gameObject:SetActive(false)
self._mapNode.rtStrength.gameObject:SetActive(false)
self._mapNode.rtBottom.gameObject:SetActive(false)
self.tbChatPool = nil
self.nChatProp = nil
end
function NpcHudCtrl:HideNpc()
if self.chatTimer ~= nil then
TimerManager.Remove(self.chatTimer, false)
end
self.chatTimer = nil
self:Clear()
self._mapNode.rtRoot.gameObject:SetActive(false)
end
function NpcHudCtrl:Awake()
self._mapNode.rtRoot.gameObject:SetActive(false)
end
function NpcHudCtrl:OnDisable()
self:HideNpc()
self.nNpcId = nil
self.nNpcUId = nil
self.nCostCount = nil
end
function NpcHudCtrl:OnEvent_InteractiveNpc(nId)
if nId ~= self.nNpcId then
return
end
if self.chatTimer ~= nil then
TimerManager.Remove(self.chatTimer, false)
end
self.chatTimer = nil
self._mapNode.rtChat.gameObject:SetActive(false)
end
function NpcHudCtrl:OnEvent_InteractiveNpcFinish(nId, nCostCount, nHasCount)
if nId ~= self.nNpcId then
return
end
local mapNpcCfg = ConfigTable.GetData("NPCConfig", nId)
if mapNpcCfg == nil then
printError("读取NPCConfig配置失败!!!id = " .. tostring(nId))
return
end
self:ShowChat()
if self.chatTimer == nil then
self.chatTimer = TimerManager.Add(0, mapNpcCfg.ChatTime, self, function()
self:ShowChat()
end, true, true, false)
end
if mapNpcCfg.type == GameEnum.npcNewType.Upgrade and nCostCount ~= nil then
self.nCostCount = nCostCount
self:RefreshStrengthCost(nHasCount)
end
end
function NpcHudCtrl:OnEvent_RefreshStarTowerCoin(nCoin)
if self.nNpcId ~= nil and self.nCostCount ~= nil then
local mapNpcCfg = ConfigTable.GetData("NPCConfig", self.nNpcId)
if mapNpcCfg ~= nil and mapNpcCfg.type == GameEnum.npcNewType.Upgrade then
self:RefreshStrengthCost(nCoin)
end
end
end
return NpcHudCtrl