5e0d58cfad
EN: 1.2.0.60 CN: 1.2.0.61 JP: 1.2.0.63 KR: 1.2.0.67
171 lines
5.9 KiB
Lua
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
|